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