25
25
26
26
#include <sys/socket.h>
27
27
#include <sys/types.h>
28
+ #include <sys/un.h>
29
+
30
+ #include <execinfo.h>
31
+ #include <signal.h>
32
+
28
33
#ifdef USE_KQUEUE
29
34
#include <sys/sysctl.h>
30
35
#endif
@@ -35,6 +40,10 @@ reload_context reload;
35
40
union addr_common {
36
41
struct sockaddr_in6 v6 ;
37
42
struct sockaddr_in v4 ;
43
+ #ifdef UNIX_BASED
44
+ struct sockaddr_un ux ;
45
+ #endif
46
+ struct sockaddr_storage any ;
38
47
};
39
48
40
49
typedef void * pvoid ;
@@ -201,10 +210,12 @@ int main(int argc, const char **argv) {
201
210
const int cli = get_arg ("--cli" , 0 , 1 , argc , argv );
202
211
const int workers = get_arg ("-c" , cli ? 1 : get_cpus (), 0 , argc , argv );
203
212
const int show_cfg = get_arg ("--cfg" , 0 , 1 , argc , argv );
204
- char resolved [100 ], * p , * q ;
213
+
214
+ size_t client_len = 0 ;
215
+
216
+ char resolved [200 ], * p , * q ;
205
217
int optval , i ,
206
- portno = get_arg ("-p" , 8080 , 0 , argc , argv ),
207
- v6 = get_arg ("--6" , 0 , 1 , argc , argv );
218
+ portno = get_arg ("-p" , 8080 , 0 , argc , argv );
208
219
fd_t parentfd ;
209
220
union addr_common serveraddr ;
210
221
module_extension * module = NULL ,
@@ -213,7 +224,10 @@ int main(int argc, const char **argv) {
213
224
const char * entrypoint ;
214
225
const char * module_list = get_sz_arg ("-m" , argc , argv , NULL , NULL );
215
226
const char * node_name = get_sz_arg ("-n" , argc , argv , "HOSTNAME" , "localhost" );
216
- const char * addr = v6 ? "::" : "0.0.0.0" ;
227
+ const char * addr = "0.0.0.0" ;
228
+ int protocol = AF_INET ;
229
+ int sock_type = SOCK_STREAM ;
230
+ int ip_proto = IPPROTO_TCP ;
217
231
char * module_names = NULL ;
218
232
serve_params * params = (serve_params * )calloc (workers , sizeof (serve_params ));
219
233
node_id node ;
@@ -234,7 +248,6 @@ int main(int argc, const char **argv) {
234
248
printf ("Concurrency: %d\n" , workers );
235
249
printf ("Address: %s\n" , addr );
236
250
printf ("Port: %d\n" , portno );
237
- printf ("IPv6: %s\n" , v6 ? "yes" : "no" );
238
251
printf ("CLI: %s\n" , cli ? "yes" : "no" );
239
252
printf ("Modules: %s\n" , module_list ? module_list : "no modules" );
240
253
}
@@ -338,7 +351,42 @@ int main(int argc, const char **argv) {
338
351
#endif
339
352
340
353
if (!cli ) {
341
- parentfd = (fd_t )socket (v6 ? AF_INET6 : AF_INET , SOCK_STREAM , IPPROTO_TCP );
354
+
355
+ memset ((void * )& serveraddr , 0 , sizeof (serveraddr ));
356
+
357
+ if (strstr (addr , "unix:" ) == addr ) {
358
+ protocol = AF_UNIX ;
359
+ ip_proto = 0 ;
360
+ #ifdef UNIX_BASED
361
+ serveraddr .ux .sun_family = protocol ;
362
+ addr += 5 ;
363
+ strncpy (serveraddr .ux .sun_path , addr , sizeof (serveraddr .ux .sun_path ));
364
+ strncpy (resolved , addr , sizeof (resolved ));
365
+ client_len = sizeof (serveraddr .ux );
366
+ #else
367
+ error ("main: UDS not supported on Windows" );
368
+ exit (1 );
369
+ #endif
370
+ } else if (strstr (addr , "v6:" ) == addr ) {
371
+ protocol = AF_INET6 ;
372
+ addr += 3 ;
373
+ serveraddr .v6 .sin6_family = protocol ;
374
+ serveraddr .v6 .sin6_port = htons ((unsigned short )portno );
375
+ if (inet_pton (AF_INET6 , addr , & serveraddr .v6 .sin6_addr ) <= 0 ) {
376
+ error ("failed to resolve bind IP address" );
377
+ }
378
+ inet_ntop (AF_INET6 , & serveraddr .v6 .sin6_addr , resolved , sizeof (resolved ));
379
+ client_len = sizeof (serveraddr .v6 );
380
+ } else {
381
+ protocol = AF_INET ;
382
+ serveraddr .v4 .sin_family = protocol ;
383
+ serveraddr .v4 .sin_addr .s_addr = inet_addr (addr );
384
+ serveraddr .v4 .sin_port = htons ((unsigned short )portno );
385
+ inet_ntop (AF_INET , & serveraddr .v4 .sin_addr , resolved , sizeof (resolved ));
386
+ client_len = sizeof (serveraddr .v4 );
387
+ }
388
+
389
+ parentfd = (fd_t )socket (protocol , sock_type , ip_proto );
342
390
343
391
#ifdef _WIN32
344
392
if (parentfd == (fd_t )INVALID_SOCKET )
@@ -353,23 +401,8 @@ int main(int argc, const char **argv) {
353
401
#else
354
402
setsockopt ((sock_t )parentfd , SOL_SOCKET , SO_REUSEADDR , (const void * )& optval , sizeof (int ));
355
403
#endif
356
- memset ((void * )& serveraddr , 0 , sizeof (serveraddr ));
357
-
358
- if (v6 ) {
359
- serveraddr .v6 .sin6_family = AF_INET6 ;
360
- serveraddr .v6 .sin6_port = htons ((unsigned short )portno );
361
- if (inet_pton (AF_INET6 , addr , & serveraddr .v6 .sin6_addr ) <= 0 ) {
362
- error ("failed to resolve bind IP address" );
363
- }
364
- inet_ntop (AF_INET6 , & serveraddr .v6 .sin6_addr , resolved , sizeof (resolved ));
365
- } else {
366
- serveraddr .v4 .sin_family = AF_INET ;
367
- serveraddr .v4 .sin_addr .s_addr = inet_addr (addr );
368
- serveraddr .v4 .sin_port = htons ((unsigned short )portno );
369
- inet_ntop (AF_INET , & serveraddr .v4 .sin_addr , resolved , sizeof (resolved ));
370
- }
371
404
372
- if (bind ((sock_t )parentfd , (struct sockaddr * )( v6 ? ( void * ) & serveraddr . v6 : ( void * ) & serveraddr . v4 ), v6 ? sizeof ( serveraddr . v6 ) : sizeof ( serveraddr . v4 ) ) < 0 )
405
+ if (bind ((sock_t )parentfd , (struct sockaddr * )& serveraddr , client_len ) < 0 )
373
406
error ("main: failed to bind server socket" );
374
407
375
408
if (listen ((sock_t )parentfd , 20000 ) < 0 )
0 commit comments