summaryrefslogtreecommitdiff
path: root/src/cmd/ksh93/features/poll
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/ksh93/features/poll')
-rw-r--r--src/cmd/ksh93/features/poll157
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