diff options
Diffstat (limited to 'src/cmd/ksh93/features/poll')
-rw-r--r-- | src/cmd/ksh93/features/poll | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/cmd/ksh93/features/poll b/src/cmd/ksh93/features/poll new file mode 100644 index 0000000..da21990 --- /dev/null +++ b/src/cmd/ksh93/features/poll @@ -0,0 +1,157 @@ +ref -lsocket -lnsl +hdr,sys poll,socket,netinet/in +lib select,poll,socket +lib htons,htonl sys/types.h sys/socket.h netinet/in.h +lib getaddrinfo sys/types.h sys/socket.h netdb.h +typ fd_set sys/socket.h sys/select.h +typ socklen_t unistd.h sys/socket.h = unsigned int +tst pipe_socketpair note{ use socketpair() for peekable pipe() }end execute{ + #include <ast.h> + #include <signal.h> + #include <sys/types.h> + #include <sys/socket.h> + #ifndef SHUT_RD + #define SHUT_RD 0 + #endif + #ifndef SHUT_WR + #define SHUT_WR 1 + #endif + static void handler(sig) + int sig; + { + _exit(0); + } + int main() + { + int n; + int pfd[2]; + int sfd[2]; + char buf[256]; + pid_t pid; + static char msg[] = "hello world\n"; + close(0); + if (pipe(pfd) < 0 || + socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || + shutdown(sfd[1], SHUT_RD) < 0 || + shutdown(sfd[0], SHUT_WR) < 0) + return(1); + if ((pid = fork()) < 0) + return(1); + if (pid) + { + close(pfd[1]); + close(sfd[1]); + wait(&n); + if (sfpkrd(pfd[0], buf, sizeof(buf), '\n', -1, 1) >= 0 || + sfpkrd(sfd[0], buf, sizeof(buf), '\n', -1, 1) < 0) + return(1); + } + else + { + close(pfd[0]); + close(sfd[0]); + write(pfd[1], msg, sizeof(msg) - 1); + write(sfd[1], msg, sizeof(msg) - 1); + return(0); + } + close(pfd[0]); + close(sfd[0]); + signal(SIGPIPE, handler); + if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || + shutdown(sfd[1], SHUT_RD) < 0 || + shutdown(sfd[0], SHUT_WR) < 0) + return(1); + close(sfd[0]); + write(sfd[1], msg, sizeof(msg) - 1); + return(1); + } +}end +tst socketpair_devfd note{ /dev/fd/N handles socketpair() }end execute{ + #include <ast.h> + #include <fs3d.h> + #include <sys/types.h> + #include <sys/socket.h> + int main() + { + int devfd; + int n; + int sfd[2]; + fs3d(FS3D_OFF); + close(0); + open("/dev/null", O_RDONLY); + if ((n = open("/dev/fd/0", O_RDONLY)) < 0) + return(1); + close(n); + if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || + shutdown(sfd[0], 1) < 0 || + shutdown(sfd[1], 0) < 0) + return(1); + close(0); + dup(sfd[0]); + close(sfd[0]); + if ((n = open("/dev/fd/0", O_RDONLY)) < 0) + return(1); + return(0); + } +}end +tst socketpair_shutdown_mode note{ fchmod() after socketpair() shutdown() }end execute{ + #include <ast.h> + #include <sys/types.h> + #include <sys/stat.h> + #include <sys/socket.h> + int main() + { + int sfd[2]; + struct stat st0; + struct stat st1; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, sfd) < 0 || + shutdown(sfd[0], 1) < 0 || + shutdown(sfd[1], 0) < 0) + return(1); + if (fstat(sfd[0], &st0) < 0 || fstat(sfd[1], &st1) < 0) + return(1); + if ((st0.st_mode & (S_IRUSR|S_IWUSR)) == S_IRUSR && + (st1.st_mode & (S_IRUSR|S_IWUSR)) == S_IWUSR) + return(1); + if (fchmod(sfd[0], S_IRUSR) < 0 || + fstat(sfd[0], &st0) < 0 || + (st0.st_mode & (S_IRUSR|S_IWUSR)) != S_IRUSR) + return(1); + if (fchmod(sfd[1], S_IWUSR) < 0 || + fstat(sfd[1], &st1) < 0 || + (st1.st_mode & (S_IRUSR|S_IWUSR)) != S_IWUSR) + return(1); + return(0); + } +}end +cat{ + #pragma prototyped + #ifdef _lib_poll + # define poll _SYS_poll + #else + # undef _hdr_poll + # undef _sys_poll + #endif /* _lib_poll */ + #ifdef _hdr_poll + # include <poll.h> + #else + # ifdef _sys_poll + # include <sys/poll.h> + # endif /* _sys_poll */ + #endif /* _hdr_poll */ + #ifdef _lib_poll + # undef poll + extern int poll(struct pollfd*,unsigned long,int); + #endif /* _lib_poll */ + #ifdef _lib_select + # ifndef FD_ZERO + # define FD_ZERO(x) (*(x)=0) + # endif /* FD_ZERO */ + # ifndef FD_SET + # define FD_SET(n,x) (*(x)|=(1L<<(n))) + # endif /* FD_SET */ + # ifndef _typ_fd_set + typedef long fd_set; + # endif /*_typ_fd_set */ + #endif /* _lib_select */ +}end |