29 #define DEBUG_LEVEL 15 35 static int tcp_server_listen(
char *,
char *,
int,
socklen_t *);
37 static int local_server_listen(
char *,
socklen_t *);
46 tcp_server_listen(ip, service, port, addrlen)
52 struct sockaddr_in srv_sock;
56 ASSERT(ip != NULL || service != NULL);
59 struct addrinfo hints;
60 struct addrinfo *result, *rp;
63 char iport[32], *sport;
65 snprintf(iport,
sizeof (iport),
"%d", port);
66 sport = (service != NULL ? service : iport);
71 memset(&hints, 0,
sizeof (
struct addrinfo));
72 hints.ai_family = AF_UNSPEC;
73 hints.ai_socktype = SOCK_STREAM;
74 hints.ai_flags = AI_PASSIVE;
75 hints.ai_protocol = 0;
76 hints.ai_canonname = NULL;
80 s = getaddrinfo(ip, sport, &hints, &result);
87 for (rp = result; rp != NULL; rp = rp->ai_next)
89 sd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
95 if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (
void *) &sopt,
103 if (bind(sd, rp->ai_addr, rp->ai_addrlen) == 0)
115 freeaddrinfo(result);
126 *addrlen =
sizeof (srv_sock);
136 local_server_listen(sname, addrlen)
140 struct sockaddr_un srv_sock;
143 if ((sname == NULL) || (strlen(sname) == 0))
148 memset(&srv_sock, 0,
sizeof (srv_sock));
149 srv_sock.sun_family = AF_UNIX;
151 strlcpy(srv_sock.sun_path, sname, sizeof (srv_sock.sun_path));
154 if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
160 if (bind(sd, (
struct sockaddr *) &srv_sock,
sizeof (srv_sock)) < 0)
175 *addrlen =
sizeof (srv_sock);
187 inet_server_listen(node, service, socktype, server)
194 struct addrinfo hints;
195 struct addrinfo *addrinfo, *rp;
198 ASSERT(node != NULL || service != NULL);
200 if (socktype != SOCK_STREAM && socktype != SOCK_DGRAM)
201 socktype = SOCK_STREAM;
205 socktype == SOCK_STREAM ?
"tcp" :
"udp");
207 memset(&hints, 0,
sizeof (
struct addrinfo));
208 hints.ai_family = AF_UNSPEC;
209 hints.ai_socktype = socktype;
210 hints.ai_flags = AI_PASSIVE;
211 hints.ai_protocol = 0;
212 hints.ai_canonname = NULL;
213 hints.ai_addr = NULL;
214 hints.ai_next = NULL;
216 s = getaddrinfo(node, service, &hints, &addrinfo);
223 for (rp = addrinfo; rp != NULL; rp = rp->ai_next)
227 sd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
232 if (setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (
void *) &sopt,
241 if (bind(sd, rp->ai_addr, rp->ai_addrlen) != 0)
249 if (socktype == SOCK_STREAM)
262 server->
socklen = rp->ai_addrlen;
263 server->
family = rp->ai_family;
276 memset(server, 0,
sizeof (server));
279 freeaddrinfo(addrinfo);
289 #define STRPREFIX(s,pfx) STRNCASEEQUAL((s),(pfx),strlen(pfx)) 340 if ((spec == NULL) || (strlen(spec) == 0))
345 if ((s = tcp_prefix(spec)) != NULL)
348 char sport[32], shost[128];
353 p = spec + strlen(s);
355 memset(sport, 0,
sizeof (sport));
356 memset(shost, 0,
sizeof (shost));
358 if ((ts = strdup(p)) == NULL)
367 strlcpy(sport, argv[0],
sizeof (sport));
369 strlcpy(shost, argv[1],
sizeof (shost));
371 strlcpy(shost,
"127.0.0.1",
sizeof (shost));
375 ZE_MessageInfo(10,
"Launching inet server on port [%s/tcp] of [%s]", sport,
377 fd = inet_server_listen(shost, sport, SOCK_STREAM, server);
382 if ((s = udp_prefix(spec)) != NULL)
385 char sport[32], shost[128];
390 p = spec + strlen(s);
392 memset(sport, 0,
sizeof (sport));
393 memset(shost, 0,
sizeof (shost));
395 if ((ts = strdup(p)) == NULL)
407 strlcpy(sport, argv[0],
sizeof (sport));
409 strlcpy(shost, argv[1],
sizeof (shost));
411 strlcpy(shost,
"127.0.0.1",
sizeof (shost));
415 ZE_MessageInfo(10,
"Launching inet server on port [%s/udp] of [%s]", sport,
417 fd = inet_server_listen(shost, sport, SOCK_DGRAM, server);
423 if ((s = unix_prefix(spec)) != NULL)
428 p = spec + strlen(s);
434 fd = local_server_listen(p, &addrlen);
435 if (fd >= 0 && server != NULL)
#define STRPREFIX(s, pfx)
int server_listen(char *spec, server_T *server)
#define ZE_LogMsgError(level,...)
int zeStr2Tokens(char *, int, char **, char *)
#define ZE_MessageInfo(level,...)
#define ZE_LogSysError(...)