xref: /illumos-gate/usr/src/contrib/ast/src/cmd/ksh93/features/poll (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
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