Here is a response I got by forwarding this to the pthreads maintainer:
A return status of 0 from write is not interpreted as an End-Of-Tape.
The threads library isn't smart enough to know that the file
is a tape device and that a 0 status should break it out of the
loop. Thus, it continues writing.
Use libkse :-)
Nate: thanks for getting in touch with him.
It is interesting to note that the code works OK on Linux and
Solaris. Why is FreeBSD different in this case?
I don't know. Our pthreads implementation is purely userland so it's
likely that it is difficult to differentiate a non-blocking read from an
Perhaps FreeBSD is different from Linux, but my understanding of
non-blocking reads is that you get a -1 status with errno set
to EWOULDBLOCK (or EAGAIN), while an EOF should return a
Kern: I can't comment on libkse. I don't know it and I don't know
what effect it would have on Bacula.
libkse is a drop-in replacement for libpthreads. Unfortunately, it's only