1 /* ======================================================================
2 * Copyright (c) 1998-1999 The Johns Hopkins University.
3 * All rights reserved.
4 * The following code was written by Theo Schlossnagle for use in the
5 * Backhand project at The Center for Networking and Distributed Systems
6 * at The Johns Hopkins University.
7 * Please refer to the LICENSE file before using this software.
8 * ======================================================================
9 */
10
11 #include "config.h"
12 #include "alarm.h"
13
14 #define FIFO_MODE (S_IRUSR|S_IWUSR)
15 #ifdef USE_FATTACH
serv_listen(const char * name)16 int serv_listen(const char *name) {
17 int tempfd, fd[2], len;
18
19 unlink(name);
20 if((tempfd = creat(name, FIFO_MODE)) < 0)
21 return(-1);
22 if (close(tempfd) < 0)
23 return(-2);
24
25 if(pipe(fd) < 0)
26 return(-3);
27 if(ioctl(fd[1], I_PUSH, "connld") < 0)
28 return(-4);
29 if(fattach(fd[1], name) < 0)
30 return(-5);
31
32 return(fd[0]);
33 }
cli_conn(const char * name)34 int cli_conn(const char *name) {
35 int fd;
36
37 if((fd = open(name, O_RDWR)) < 0)
38 return(-1);
39 if(isastream(fd) == 0)
40 return(-2);
41 return(fd);
42 }
43
44 #elif defined(WIN32)
45 /* TCP sockets. Should use named pipes, but I doubt spread can schedule/select on those */
46
serv_accept(int listenfd)47 int serv_accept(int listenfd) {
48 int clifd;
49 unsigned int len;
50 struct sockaddr_in addr;
51
52 len = sizeof(addr);
53 if((clifd = accept(listenfd, (struct sockaddr *) &addr, &len)) < 0)
54 return -1;
55
56 return clifd;
57 }
58
serv_listen(const char * name)59 int serv_listen(const char *name) {
60 int fd, len, oldmask;
61 struct sockaddr_in addr;
62
63 /* create a Unix domain stream socket */
64 if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
65 wack_alarm(PRINT, "could not open socket");
66 return -1;
67 }
68
69 len = sizeof(addr);
70 if (WSAStringToAddress((char*)name, AF_INET, NULL, (struct sockaddr*)&addr,&len) != 0) {
71 wack_alarm(PRINT, "couldn't resolve address string %s\n", name);
72 return -1;
73 }
74
75 if(bind(fd, (struct sockaddr *) &addr, len) < 0) {
76 wack_alarm(PRINT, "bind %s failed.", name);
77 close(fd);
78 return -1;
79 }
80 if(listen(fd, 5) < 0) {
81 wack_alarm(PRINT, "listen on %s failed.", name);
82 close(fd);
83 return -1;
84 }
85 return(fd);
86 }
87
cli_conn(const char * name)88 int cli_conn(const char *name) {
89 int fd, len;
90 struct sockaddr_in addr;
91
92 /* create a Unix domain stream socket */
93 if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
94 return(-1);
95
96 len = sizeof(addr);
97 if (WSAStringToAddress((char*)name, AF_INET, NULL, (struct sockaddr*)&addr,&len) != 0) {
98 wack_alarm(PRINT, "couldn't resolve address string %s\n", name);
99 return -1;
100 }
101
102 if(connect(fd, (struct sockaddr *) &addr, len) < 0) {
103 close(fd);
104 fd=-1;
105 wack_alarm(PRINT, "connect to: %s failed.", name);
106 }
107 return(fd);
108 }
109
110
111 #else
serv_accept(int listenfd)112 int serv_accept(int listenfd) {
113 int clifd;
114 unsigned int len;
115 struct sockaddr_un unix_addr;
116
117 len = sizeof(unix_addr);
118 if((clifd = accept(listenfd, (struct sockaddr *) &unix_addr, &len)) < 0)
119 return -1;
120
121 return clifd;
122 }
123
serv_listen(const char * name)124 int serv_listen(const char *name) {
125 int fd, len, oldmask;
126 struct sockaddr_un unix_addr;
127
128 /* create a Unix domain stream socket */
129 if((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
130 wack_alarm(PRINT, "could not open socket");
131 return -1;
132 }
133 unlink(name);
134 memset(&unix_addr, 0, sizeof(unix_addr));
135 unix_addr.sun_family = AF_UNIX;
136 strcpy(unix_addr.sun_path, name);
137 len = SUN_LEN(&unix_addr);
138 /* bind the name to the descriptor */
139 oldmask = umask((~FIFO_MODE)&0777);
140 if(bind(fd, (struct sockaddr *) &unix_addr, len) < 0) {
141 wack_alarm(PRINT, "bind to %s failed.", name);
142 umask(oldmask);
143 close(fd);
144 return -1;
145 }
146 umask(oldmask);
147 if(listen(fd, 5) < 0) {
148 wack_alarm(PRINT, "listen on %s failed.", name);
149 close(fd);
150 return -1;
151 }
152 return(fd);
153 }
154
cli_conn(const char * name)155 int cli_conn(const char *name) {
156 int fd, len;
157 struct sockaddr_un unix_addr;
158
159 /* create a Unix domain stream socket */
160 if((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
161 return(-1);
162 memset(&unix_addr, 0, sizeof(unix_addr));
163 unix_addr.sun_family = AF_UNIX;
164 strcpy(unix_addr.sun_path, name);
165 unix_addr.sun_path[strlen(name)]='\0';
166 len = SUN_LEN(&unix_addr);
167
168 if(connect(fd, (struct sockaddr *) &unix_addr, len) < 0) {
169 close(fd);
170 fd=-1;
171 wack_alarm(PRINT, "connect to: %s failed.", name);
172 }
173 return(fd);
174 }
175 #endif
176 /* vim:se ts=2 sw=2 et: */
177