3 FIXME: Check and tidy it up first!
9 #include <sys/socket.h>
16 #include <netinet/in.h>
20 int main(int argc,char **argv)
22 int fdunix,fdtcp,fdtcplisten;
23 struct sockaddr_un sockaddr_unix;
24 struct sockaddr_in sockaddr_tcp;
25 const char *pathnameunix,*nametcp;
26 struct pollfd pollfds[2];
28 socklen_t sockaddr_tcp_len;
29 int setsockopt_SO_REUSEADDR_on;
32 fprintf(stderr,"%s: <pathname UNIX socket> <name TCP>\n",argv[0]);
38 if (-1==(fdunix=socket(PF_UNIX,SOCK_STREAM,0))) {
39 fprintf(stderr,"socket(PF_UNIX,SOCK_STREAM,0)=%d: %m\n",fdunix);
42 memset(&sockaddr_unix,0,sizeof(sockaddr_unix));
43 sockaddr_unix.sun_family=AF_UNIX;
44 strncpy(sockaddr_unix.sun_path,pathnameunix,sizeof(sockaddr_unix.sun_path));
45 if (connect(fdunix,(const struct sockaddr *)&sockaddr_unix,sizeof(sockaddr_unix))) {
46 fprintf(stderr,"connect(UNIX socket,\"%s\"): %m\n",pathnameunix);
50 if (-1==(fdtcplisten=socket(PF_INET,SOCK_STREAM,0))) {
51 fprintf(stderr,"socket(PF_INET,SOCK_STREAM,0)=%d: %m\n",fdtcplisten);
54 setsockopt_SO_REUSEADDR_on=1;
55 if (setsockopt(fdtcplisten,SOL_SOCKET,SO_REUSEADDR,&setsockopt_SO_REUSEADDR_on,sizeof(setsockopt_SO_REUSEADDR_on))) {
56 fprintf(stderr,"setsockopt(TCP socket,SOL_SOCKET,SO_REUSEADDR,&1,sizeof(1)): %m\n");
59 memset(&sockaddr_tcp,0,sizeof(sockaddr_tcp));
60 sockaddr_tcp.sin_family=AF_INET;
61 sockaddr_tcp.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
62 sockaddr_tcp.sin_port=htons(atoi(nametcp));
63 if (bind(fdtcplisten,(const struct sockaddr *)&sockaddr_tcp,sizeof(sockaddr_tcp))) {
64 fprintf(stderr,"bind(TCP socket,127.0.0.1:%s): %m\n",nametcp);
67 if (listen(fdtcplisten,1)) {
68 fprintf(stderr,"listen(TCP socket,1): %m\n");
71 sockaddr_tcp_len=sizeof(sockaddr_tcp);
72 fprintf(stderr,"accept... ");
73 if (-1==(fdtcp=accept(fdtcplisten,(struct sockaddr *)&sockaddr_tcp,&sockaddr_tcp_len))) {
74 fprintf(stderr,"accept(TCP socket): %m\n");
77 fprintf(stderr,"done\n");
78 if (close(fdtcplisten)) {
79 fprintf(stderr,"close(TCP listen socket): %m\n");
85 pollfds[0].events=POLLIN;
87 pollfds[1].events=POLLIN;
88 if (0>=poll(pollfds,sizeof(pollfds)/sizeof(*pollfds),-1)) {
89 fprintf(stderr,"poll(UNIX socket,PIPE socket): %m\n");
92 if (pollfds[0].revents & (POLLERR|POLLHUP|POLLNVAL)) {
93 fprintf(stderr,"poll(UNIX socket): revents=0x%X\n",(unsigned)pollfds[0].revents);
96 if (pollfds[1].revents & (POLLERR|POLLHUP|POLLNVAL)) {
97 fprintf(stderr,"poll(PIPE socket): revents=0x%X\n",(unsigned)pollfds[1].revents);
100 for (fdi=0;fdi<sizeof(pollfds)/sizeof(*pollfds);fdi++) {
105 if (fcntl(pollfds[fdi].fd,F_SETFL,O_NONBLOCK)) {
106 fprintf(stderr,"fcntl(%s socket,F_SETFL,O_NONBLOCK): %m\n",
107 (fdi==0 ? "UNIX" : (fdi==1 ? "PIPE" : "<UNKNOWN>")));
110 got=read(pollfds[fdi].fd,buf,sizeof(buf));
114 fprintf(stderr,"read(%s socket): %m\n",
115 (fdi==0 ? "UNIX" : (fdi==1 ? "PIPE" : "<UNKNOWN>")));
120 for (fdo=0;fdo<sizeof(pollfds)/sizeof(*pollfds);fdo++) {
123 if (fcntl(pollfds[fdo].fd,F_SETFL,0 /* !O_NONBLOCK */)) {
124 fprintf(stderr,"fcntl(%s socket,F_SETFL,0 /* !O_NONBLOCK */): %m\n",
125 (fdi==0 ? "UNIX" : (fdi==1 ? "PIPE" : "<UNKNOWN>")));
128 if (got!=write(pollfds[fdo].fd,buf,got)) {
129 fprintf(stderr,"write(%s socket,%ld): %m\n",
130 (fdo==0 ? "UNIX" : (fdo==1 ? "PIPE" : "<UNKNOWN>")),