SCSI tape data loss
Kern Sibbald
kern at sibbald.com
Tue Jun 3 10:19:59 PDT 2003
On Tue, 2003-06-03 at 19:04, Justin T. Gibbs wrote:
> > Yes, I probably should move the clrerror() and the
> > check/set of errno inside the check for "stat == -1".
> > However, the code though odd is correct since
> > I do not use errno unless the status is -1.
>
> No, the code is not correct. clrerror() has side effects
> in many cases when errno is non-zero.
Yes, you are right. I'll fix it. However, this is not
the problem because the only side effect that can
occur is that Bacula would abort. The -1 second argument
guarantees that.
>
> > By the way, the funny casting is mandatory in C++,
> > because ssize_t as returned by the write is not the
> > same as size_t (what is written).
If I remove the (uint32_t) cast, I get an error message:
c++ -c -I. -I.. -g -O2 -Wall block.c
block.c: In function `int write_block_to_dev (JCR *, DEVICE *,
DEV_BLOCK *)':
block.c:381: warning: comparison between signed and unsigned integer
expressions
Line 381 reads:
if ((stat=write(dev->fd, block->buf, (size_t)wlen)) != wlen) {
so I will stick with my funny casting.
> Integer type conversions are still valid in C++:
>
> #include <stdio.h>
> #include <inttypes.h>
>
> int
> subroutine(uint8_t small_type)
> {
> printf("small_type is %d\n", small_type);
>
> return (0);
> }
>
> int
> main(int argc, char *argv[])
> {
> uint8_t foo;
> uint32_t bigger_foo;
>
> foo = 100;
> bigger_foo = argc;
>
> if (foo != bigger_foo) {
> printf("Foos differ\n");
> }
>
> subroutine(bigger_foo);
>
> return (0);
> }
>
> % g++ -Wall -pedantic foo.cc
>
> Produces no output.
>
> --
> Justin
More information about the freebsd-scsi
mailing list