Hi All,

We have been working for a couple weeks with the Amanda developers to get
their latest release working on OpenBSD 4.5. Amanda stopped working with
OpenBSD somewhere around version 2.5.1 (3 years ago). We've been focusing on
a failure in the dump process on the client.

On the client side, dump(8) is started with its output to a blocking pipe.
However, dump fails with EAGAIN, which we understand should be impossible.
One of the developers outlined the basic process as follows:

In amandad process:
 pipe(pipefd)
 dup2(pipefd[1],b)
 fork
 in the child:
    exec sendbackup process
    dup2(b,c)
    write c #fail with EAGAIN

We added some debug messages to verify that the pipe was blocking. In so
doing, we discovered that the debug messages "fixed" the problem, and the
dump succeeded. Narrowing this down, we found the absolute minimal patch was
simply inserting the following line before the dup2 above:
     fcntl(datafd, F_GETFL, 0);

This adds to the mystery; why would doing a call that simply returns a flag
change the behavior of the program? Is there some side effect of this call?

We have tried this on several machines (at least the sparc64, amd64
platforms), all running 4.5. dump is invoked as follows:
    /sbin/dump dump 0usf 1048576 - /dev/rsd0a

I don't know what other details might be helpful; let me know and I'll send
them.

Thank you for any insight.

-- Michael

Reply via email to