#include #include #include #include #include #include #include #include #include #include #define NODEFINE #include #include #include #include "fd.h" int pm_pipe(int *p) { int up[2]; File *f[2]; /* * This would preserve message boundaries, * but seems to interact badly with programs that * expect a real file descriptor that you can read from. * Oh well. * if(socketpair(PF_LOCAL, SOCK_DGRAM, 0, up) < 0){ pm_oserror(); return -1; } * */ if(pipe(up) < 0){ pm_oserror(); return -1; } if((f[0] = pm_allocfile(up[0])) == nil){ close(up[0]); close(up[1]); return -1; } if((f[1] = pm_allocfile(up[1])) == nil){ close(up[0]); close(up[1]); pm_closefile(f[0]); return -1; } f[0]->type = Tpipe; f[0]->ufd = up[0]; f[0]->path = nil; f[1]->type = Tpipe; f[1]->ufd = up[1]; f[1]->path = nil; pm_qunlock(&f[0]->lk); pm_qunlock(&f[1]->lk); p[0] = f[0]->pmfd; p[1] = f[1]->pmfd; return 0; }