pid_t forkchild_fd(int *sin, int *sout, int *serr, const char *path, char * const argv[]) { pid_t pid; int sinfds[2]; int soutfds[2]; int serrfds[2]; if((sin && pipe(sinfds)) || (sout && pipe(soutfds)) || (serr && pipe(serrfds))) return -1; if(sin) *sin=sinfds[1]; if(sout) *sout=soutfds[0]; if(serr) *serr=serrfds[0]; pid=do_forkchild(sin?sinfds[0]:-1, sout?soutfds[1]:-1, serr?serrfds[1]:-1, path, argv); if(sin) close(sinfds[0]); if(sout) close(soutfds[1]); if(serr) close(serrfds[1]); return pid; }
pid_t forkchild(struct fzp **sin, struct fzp **sout, struct fzp **serr, const char *path, char * const argv[]) { pid_t pid; int sinfds[2]; int soutfds[2]; int serrfds[2]; if((sin && pipe(sinfds)) || (sout && pipe(soutfds)) || (serr && pipe(serrfds))) return -1; if((sin && !(*sin=fzp_dopen(sinfds[1], "w"))) || (sout && !(*sout=fzp_dopen(soutfds[0], "r"))) || (serr && !(*serr=fzp_dopen(serrfds[0], "r")))) return -1; pid=do_forkchild(sin?sinfds[0]:-1, sout?soutfds[1]:-1, serr?serrfds[1]:-1, path, argv); if(sin) close(sinfds[0]); if(sout) close(soutfds[1]); if(serr) close(serrfds[1]); return pid; }
pid_t forkchild_no_wait(FILE **sin, FILE **sout, FILE **serr, const char *path, char * const argv[]) { return do_forkchild(sin, sout, serr, path, argv, 0 /* do not wait */); }
pid_t forkchild(FILE **sin, FILE **sout, FILE **serr, const char *path, char * const argv[]) { return do_forkchild(sin, sout, serr, path, argv, 1 /* wait */); }