1*b30d1939SAndy Fiddamanref -lsocket -lnsl 2*b30d1939SAndy Fiddamanhdr,sys poll,socket,netinet/in 3*b30d1939SAndy Fiddamanlib select,poll,socket 4*b30d1939SAndy Fiddamanlib htons,htonl sys/types.h sys/socket.h netinet/in.h 5*b30d1939SAndy Fiddamanlib getaddrinfo sys/types.h sys/socket.h netdb.h 6*b30d1939SAndy Fiddamantyp fd_set sys/socket.h sys/select.h 7*b30d1939SAndy Fiddamantyp socklen_t unistd.h sys/socket.h = unsigned int 8*b30d1939SAndy Fiddamantst pipe_socketpair note{ use socketpair() for peekable pipe() }end execute{ 9*b30d1939SAndy Fiddaman #include <ast.h> 10*b30d1939SAndy Fiddaman #include <signal.h> 11*b30d1939SAndy Fiddaman #include <sys/types.h> 12*b30d1939SAndy Fiddaman #include <sys/socket.h> 13*b30d1939SAndy Fiddaman #ifndef SHUT_RD 14*b30d1939SAndy Fiddaman #define SHUT_RD 0 15*b30d1939SAndy Fiddaman #endif 16*b30d1939SAndy Fiddaman #ifndef SHUT_WR 17*b30d1939SAndy Fiddaman #define SHUT_WR 1 18*b30d1939SAndy Fiddaman #endif 19*b30d1939SAndy Fiddaman static void handler(sig) 20*b30d1939SAndy Fiddaman int sig; 21*b30d1939SAndy Fiddaman { 22*b30d1939SAndy Fiddaman _exit(0); 23*b30d1939SAndy Fiddaman } 24*b30d1939SAndy Fiddaman int main() 25*b30d1939SAndy Fiddaman { 26*b30d1939SAndy Fiddaman int n; 27*b30d1939SAndy Fiddaman int pfd[2]; 28*b30d1939SAndy Fiddaman int sfd[2]; 29*b30d1939SAndy Fiddaman char buf[256]; 30*b30d1939SAndy Fiddaman pid_t pid; 31*b30d1939SAndy Fiddaman static char msg[] = "hello world\n"; 32*b30d1939SAndy Fiddaman close(0); 33*b30d1939SAndy Fiddaman if (pipe(pfd) < 0 || 34*b30d1939SAndy Fiddaman socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || 35*b30d1939SAndy Fiddaman shutdown(sfd[1], SHUT_RD) < 0 || 36*b30d1939SAndy Fiddaman shutdown(sfd[0], SHUT_WR) < 0) 37*b30d1939SAndy Fiddaman return(1); 38*b30d1939SAndy Fiddaman if ((pid = fork()) < 0) 39*b30d1939SAndy Fiddaman return(1); 40*b30d1939SAndy Fiddaman if (pid) 41*b30d1939SAndy Fiddaman { 42*b30d1939SAndy Fiddaman close(pfd[1]); 43*b30d1939SAndy Fiddaman close(sfd[1]); 44*b30d1939SAndy Fiddaman wait(&n); 45*b30d1939SAndy Fiddaman if (sfpkrd(pfd[0], buf, sizeof(buf), '\n', -1, 1) >= 0 || 46*b30d1939SAndy Fiddaman sfpkrd(sfd[0], buf, sizeof(buf), '\n', -1, 1) < 0) 47*b30d1939SAndy Fiddaman return(1); 48*b30d1939SAndy Fiddaman } 49*b30d1939SAndy Fiddaman else 50*b30d1939SAndy Fiddaman { 51*b30d1939SAndy Fiddaman close(pfd[0]); 52*b30d1939SAndy Fiddaman close(sfd[0]); 53*b30d1939SAndy Fiddaman write(pfd[1], msg, sizeof(msg) - 1); 54*b30d1939SAndy Fiddaman write(sfd[1], msg, sizeof(msg) - 1); 55*b30d1939SAndy Fiddaman return(0); 56*b30d1939SAndy Fiddaman } 57*b30d1939SAndy Fiddaman close(pfd[0]); 58*b30d1939SAndy Fiddaman close(sfd[0]); 59*b30d1939SAndy Fiddaman signal(SIGPIPE, handler); 60*b30d1939SAndy Fiddaman if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || 61*b30d1939SAndy Fiddaman shutdown(sfd[1], SHUT_RD) < 0 || 62*b30d1939SAndy Fiddaman shutdown(sfd[0], SHUT_WR) < 0) 63*b30d1939SAndy Fiddaman return(1); 64*b30d1939SAndy Fiddaman close(sfd[0]); 65*b30d1939SAndy Fiddaman write(sfd[1], msg, sizeof(msg) - 1); 66*b30d1939SAndy Fiddaman return(1); 67*b30d1939SAndy Fiddaman } 68*b30d1939SAndy Fiddaman}end 69*b30d1939SAndy Fiddamantst socketpair_devfd note{ /dev/fd/N handles socketpair() }end execute{ 70*b30d1939SAndy Fiddaman #include <ast.h> 71*b30d1939SAndy Fiddaman #include <fs3d.h> 72*b30d1939SAndy Fiddaman #include <sys/types.h> 73*b30d1939SAndy Fiddaman #include <sys/socket.h> 74*b30d1939SAndy Fiddaman int main() 75*b30d1939SAndy Fiddaman { 76*b30d1939SAndy Fiddaman int devfd; 77*b30d1939SAndy Fiddaman int n; 78*b30d1939SAndy Fiddaman int sfd[2]; 79*b30d1939SAndy Fiddaman fs3d(FS3D_OFF); 80*b30d1939SAndy Fiddaman close(0); 81*b30d1939SAndy Fiddaman open("/dev/null", O_RDONLY); 82*b30d1939SAndy Fiddaman if ((n = open("/dev/fd/0", O_RDONLY)) < 0) 83*b30d1939SAndy Fiddaman return(1); 84*b30d1939SAndy Fiddaman close(n); 85*b30d1939SAndy Fiddaman if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || 86*b30d1939SAndy Fiddaman shutdown(sfd[0], 1) < 0 || 87*b30d1939SAndy Fiddaman shutdown(sfd[1], 0) < 0) 88*b30d1939SAndy Fiddaman return(1); 89*b30d1939SAndy Fiddaman close(0); 90*b30d1939SAndy Fiddaman dup(sfd[0]); 91*b30d1939SAndy Fiddaman close(sfd[0]); 92*b30d1939SAndy Fiddaman if ((n = open("/dev/fd/0", O_RDONLY)) < 0) 93*b30d1939SAndy Fiddaman return(1); 94*b30d1939SAndy Fiddaman return(0); 95*b30d1939SAndy Fiddaman } 96*b30d1939SAndy Fiddaman}end 97*b30d1939SAndy Fiddamantst socketpair_shutdown_mode note{ fchmod() after socketpair() shutdown() }end execute{ 98*b30d1939SAndy Fiddaman #include <ast.h> 99*b30d1939SAndy Fiddaman #include <sys/types.h> 100*b30d1939SAndy Fiddaman #include <sys/stat.h> 101*b30d1939SAndy Fiddaman #include <sys/socket.h> 102*b30d1939SAndy Fiddaman int main() 103*b30d1939SAndy Fiddaman { 104*b30d1939SAndy Fiddaman int sfd[2]; 105*b30d1939SAndy Fiddaman struct stat st0; 106*b30d1939SAndy Fiddaman struct stat st1; 107*b30d1939SAndy Fiddaman if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || 108*b30d1939SAndy Fiddaman shutdown(sfd[0], 1) < 0 || 109*b30d1939SAndy Fiddaman shutdown(sfd[1], 0) < 0) 110*b30d1939SAndy Fiddaman return(1); 111*b30d1939SAndy Fiddaman if (fstat(sfd[0], &st0) < 0 || fstat(sfd[1], &st1) < 0) 112*b30d1939SAndy Fiddaman return(1); 113*b30d1939SAndy Fiddaman if ((st0.st_mode & (S_IRUSR|S_IWUSR)) == S_IRUSR && 114*b30d1939SAndy Fiddaman (st1.st_mode & (S_IRUSR|S_IWUSR)) == S_IWUSR) 115*b30d1939SAndy Fiddaman return(1); 116*b30d1939SAndy Fiddaman if (fchmod(sfd[0], S_IRUSR) < 0 || 117*b30d1939SAndy Fiddaman fstat(sfd[0], &st0) < 0 || 118*b30d1939SAndy Fiddaman (st0.st_mode & (S_IRUSR|S_IWUSR)) != S_IRUSR) 119*b30d1939SAndy Fiddaman return(1); 120*b30d1939SAndy Fiddaman if (fchmod(sfd[1], S_IWUSR) < 0 || 121*b30d1939SAndy Fiddaman fstat(sfd[1], &st1) < 0 || 122*b30d1939SAndy Fiddaman (st1.st_mode & (S_IRUSR|S_IWUSR)) != S_IWUSR) 123*b30d1939SAndy Fiddaman return(1); 124*b30d1939SAndy Fiddaman return(0); 125*b30d1939SAndy Fiddaman } 126*b30d1939SAndy Fiddaman}end 127*b30d1939SAndy Fiddamancat{ 128*b30d1939SAndy Fiddaman #pragma prototyped 129*b30d1939SAndy Fiddaman #ifdef _lib_poll 130*b30d1939SAndy Fiddaman # define poll _SYS_poll 131*b30d1939SAndy Fiddaman #else 132*b30d1939SAndy Fiddaman # undef _hdr_poll 133*b30d1939SAndy Fiddaman # undef _sys_poll 134*b30d1939SAndy Fiddaman #endif /* _lib_poll */ 135*b30d1939SAndy Fiddaman #ifdef _hdr_poll 136*b30d1939SAndy Fiddaman # include <poll.h> 137*b30d1939SAndy Fiddaman #else 138*b30d1939SAndy Fiddaman # ifdef _sys_poll 139*b30d1939SAndy Fiddaman # include <sys/poll.h> 140*b30d1939SAndy Fiddaman # endif /* _sys_poll */ 141*b30d1939SAndy Fiddaman #endif /* _hdr_poll */ 142*b30d1939SAndy Fiddaman #ifdef _lib_poll 143*b30d1939SAndy Fiddaman # undef poll 144*b30d1939SAndy Fiddaman extern int poll(struct pollfd*,unsigned long,int); 145*b30d1939SAndy Fiddaman #endif /* _lib_poll */ 146*b30d1939SAndy Fiddaman #ifdef _lib_select 147*b30d1939SAndy Fiddaman # ifndef FD_ZERO 148*b30d1939SAndy Fiddaman # define FD_ZERO(x) (*(x)=0) 149*b30d1939SAndy Fiddaman # endif /* FD_ZERO */ 150*b30d1939SAndy Fiddaman # ifndef FD_SET 151*b30d1939SAndy Fiddaman # define FD_SET(n,x) (*(x)|=(1L<<(n))) 152*b30d1939SAndy Fiddaman # endif /* FD_SET */ 153*b30d1939SAndy Fiddaman # ifndef _typ_fd_set 154*b30d1939SAndy Fiddaman typedef long fd_set; 155*b30d1939SAndy Fiddaman # endif /*_typ_fd_set */ 156*b30d1939SAndy Fiddaman #endif /* _lib_select */ 157*b30d1939SAndy Fiddaman}end 158