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