#include #include #include #include FILE *popen(command, rw) char *command; char *rw; { int pipe_fd[2]; int pid, reading; if (pipe(pipe_fd) < 0) return NULL; reading = (rw[0] == 'r'); pid = vfork(); if (pid < 0) { close(pipe_fd[0]); close(pipe_fd[1]); return NULL; } if (pid == 0) { close(pipe_fd[!reading]); close(reading); if (pipe_fd[reading] != reading) { dup2(pipe_fd[reading], reading); close(pipe_fd[reading]); } execl("/bin/sh", "sh", "-c", command, (char *) 0); _exit(255); } close(pipe_fd[reading]); return fdopen(pipe_fd[!reading], rw); } int pclose(fd) FILE *fd; { int waitstat; if (fclose(fd) != 0) return EOF; wait(&waitstat); return waitstat; }