23 #include "wvlinklist.h"
25 #define MAX_FD sysconf(_SC_OPEN_MAX) + 1
27 DeclareWvList(WvForkCallback);
28 static WvForkCallbackList *callbacks;
34 {
if (callbacks)
delete callbacks; }
43 static WvForkCallbackList &get_callbacks()
46 callbacks =
new WvForkCallbackList;
55 WvForkCallbackList::Iter i(get_callbacks());
56 for (i.rewind(); i.next(); )
59 get_callbacks().append(
new WvForkCallback(cb),
true);
63 void remove_wvfork_callback(WvForkCallback cb)
65 WvForkCallbackList::Iter i(get_callbacks());
66 for (i.rewind(); i.next(); )
67 if (*i == cb) i.xunlink();
71 pid_t
wvfork(
int dontclose1,
int dontclose2)
75 t.add(&dontclose1,
false);
77 t.add(&dontclose2,
false);
85 if (pipe(waitpipe) < 0)
90 WvForkCallbackList::Iter i(get_callbacks());
91 for (i.rewind(); i.next(); )
93 WvForkCallback *cb = i.ptr();
105 read(waitpipe[0], &buf, 1);
112 *waitfd = waitpipe[1];
118 pid_t
wvfork(intTable &dontclose)
131 for (
int fd = 0; fd < MAX_FD; fd++)
133 if (!dontclose[fd] && fd != waitfd &&
134 (fcntl(fd, F_GETFD) & FD_CLOEXEC) > 0)