xref: /netbsd-src/external/ibm-public/postfix/dist/src/util/stream_test.c (revision 41fbaed053f8fbfdf9d2a4ee0a7386a3c83f8505)
1*41fbaed0Stron /*	$NetBSD: stream_test.c,v 1.1.1.1 2009/06/23 10:09:01 tron Exp $	*/
2*41fbaed0Stron 
3*41fbaed0Stron #include "sys_defs.h"
4*41fbaed0Stron #include <sys/stat.h>
5*41fbaed0Stron #include <unistd.h>
6*41fbaed0Stron #include <stdlib.h>
7*41fbaed0Stron #include <fcntl.h>
8*41fbaed0Stron 
9*41fbaed0Stron #include "iostuff.h"
10*41fbaed0Stron #include "msg.h"
11*41fbaed0Stron #include "msg_vstream.h"
12*41fbaed0Stron #include "listen.h"
13*41fbaed0Stron #include "connect.h"
14*41fbaed0Stron 
15*41fbaed0Stron #ifdef SUNOS5
16*41fbaed0Stron #include <stropts.h>
17*41fbaed0Stron 
18*41fbaed0Stron #define FIFO	"/tmp/test-fifo"
19*41fbaed0Stron 
20*41fbaed0Stron static const char *progname;
21*41fbaed0Stron 
print_fstat(int fd)22*41fbaed0Stron static void print_fstat(int fd)
23*41fbaed0Stron {
24*41fbaed0Stron     struct stat st;
25*41fbaed0Stron 
26*41fbaed0Stron     if (fstat(fd, &st) < 0)
27*41fbaed0Stron 	msg_fatal("fstat: %m");
28*41fbaed0Stron     vstream_printf("fd	%d\n", fd);
29*41fbaed0Stron     vstream_printf("dev	%ld\n", (long) st.st_dev);
30*41fbaed0Stron     vstream_printf("ino	%ld\n", (long) st.st_ino);
31*41fbaed0Stron     vstream_fflush(VSTREAM_OUT);
32*41fbaed0Stron }
33*41fbaed0Stron 
usage(void)34*41fbaed0Stron static NORETURN usage(void)
35*41fbaed0Stron {
36*41fbaed0Stron     msg_fatal("usage: %s [-p] [-n count] [-v]", progname);
37*41fbaed0Stron }
38*41fbaed0Stron 
main(int argc,char ** argv)39*41fbaed0Stron int     main(int argc, char **argv)
40*41fbaed0Stron {
41*41fbaed0Stron     int     server_fd;
42*41fbaed0Stron     int     client_fd;
43*41fbaed0Stron     int     fd;
44*41fbaed0Stron     int     print_fstats = 0;
45*41fbaed0Stron     int     count = 1;
46*41fbaed0Stron     int     ch;
47*41fbaed0Stron     int     i;
48*41fbaed0Stron 
49*41fbaed0Stron     progname = argv[0];
50*41fbaed0Stron     msg_vstream_init(argv[0], VSTREAM_ERR);
51*41fbaed0Stron 
52*41fbaed0Stron     /*
53*41fbaed0Stron      * Parse JCL.
54*41fbaed0Stron      */
55*41fbaed0Stron     while ((ch = GETOPT(argc, argv, "pn:v")) > 0) {
56*41fbaed0Stron 	switch (ch) {
57*41fbaed0Stron 	default:
58*41fbaed0Stron 	    usage();
59*41fbaed0Stron 	case 'p':
60*41fbaed0Stron 	    print_fstats = 1;
61*41fbaed0Stron 	    break;
62*41fbaed0Stron 	case 'n':
63*41fbaed0Stron 	    if ((count = atoi(optarg)) < 1)
64*41fbaed0Stron 		usage();
65*41fbaed0Stron 	    break;
66*41fbaed0Stron 	case 'v':
67*41fbaed0Stron 	    msg_verbose++;
68*41fbaed0Stron 	    break;
69*41fbaed0Stron 	}
70*41fbaed0Stron     }
71*41fbaed0Stron     server_fd = stream_listen(FIFO, 0, 0);
72*41fbaed0Stron     if (readable(server_fd))
73*41fbaed0Stron 	msg_fatal("server fd is readable after create");
74*41fbaed0Stron 
75*41fbaed0Stron     /*
76*41fbaed0Stron      * Connect in client.
77*41fbaed0Stron      */
78*41fbaed0Stron     for (i = 0; i < count; i++) {
79*41fbaed0Stron 	msg_info("connect attempt %d", i);
80*41fbaed0Stron 	if ((client_fd = stream_connect(FIFO, 0, 0)) < 0)
81*41fbaed0Stron 	    msg_fatal("open %s as client: %m", FIFO);
82*41fbaed0Stron 	if (readable(server_fd))
83*41fbaed0Stron 	    msg_info("server fd is readable after client open");
84*41fbaed0Stron 	if (close(client_fd) < 0)
85*41fbaed0Stron 	    msg_fatal("close client fd: %m");
86*41fbaed0Stron     }
87*41fbaed0Stron 
88*41fbaed0Stron     /*
89*41fbaed0Stron      * Accept in server.
90*41fbaed0Stron      */
91*41fbaed0Stron     for (i = 0; i < count; i++) {
92*41fbaed0Stron 	msg_info("receive attempt %d", i);
93*41fbaed0Stron 	if (!readable(server_fd)) {
94*41fbaed0Stron 	    msg_info("wait for server fd to become readable");
95*41fbaed0Stron 	    read_wait(server_fd, -1);
96*41fbaed0Stron 	}
97*41fbaed0Stron 	if ((fd = stream_accept(server_fd)) < 0)
98*41fbaed0Stron 	    msg_fatal("receive fd: %m");
99*41fbaed0Stron 	if (print_fstats)
100*41fbaed0Stron 	    print_fstat(fd);
101*41fbaed0Stron 	if (close(fd) < 0)
102*41fbaed0Stron 	    msg_fatal("close received fd: %m");
103*41fbaed0Stron     }
104*41fbaed0Stron     if (close(server_fd) < 0)
105*41fbaed0Stron 	msg_fatal("close server fd");
106*41fbaed0Stron     return (0);
107*41fbaed0Stron }
108*41fbaed0Stron #else
main(int argc,char ** argv)109*41fbaed0Stron int     main(int argc, char **argv)
110*41fbaed0Stron {
111*41fbaed0Stron     return (0);
112*41fbaed0Stron }
113*41fbaed0Stron #endif
114