aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2019-09-28 00:56:33 +0200
committerChristian Grothoff <christian@grothoff.org>2019-09-28 00:56:33 +0200
commit31aee41701fa2cd92ec566bd459e3425ee1f0b7d (patch)
tree7a8e25a7eee5a0de025d6595041f96cf76a06278 /src/util
parent9388822eb43827ee4f343a881d86a6225beca939 (diff)
downloadgnunet-31aee41701fa2cd92ec566bd459e3425ee1f0b7d.tar.gz
gnunet-31aee41701fa2cd92ec566bd459e3425ee1f0b7d.zip
handle arm -s completion nicely via signaling pipe
Diffstat (limited to 'src/util')
-rw-r--r--src/util/service.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/src/util/service.c b/src/util/service.c
index 25c1ba338..21b99547c 100644
--- a/src/util/service.c
+++ b/src/util/service.c
@@ -175,6 +175,7 @@ struct GNUNET_SERVICE_Handle
175 */ 175 */
176 void *task_cls; 176 void *task_cls;
177 177
178
178 /** 179 /**
179 * IPv4 addresses that are not allowed to connect. 180 * IPv4 addresses that are not allowed to connect.
180 */ 181 */
@@ -408,18 +409,16 @@ service_shutdown (void *cls)
408{ 409{
409 struct GNUNET_SERVICE_Handle *sh = cls; 410 struct GNUNET_SERVICE_Handle *sh = cls;
410 411
411 switch (sh->options) 412 switch (sh->options & GNUNET_SERVICE_OPTION_SHUTDOWN_BITMASK)
412 { 413 {
413 case GNUNET_SERVICE_OPTION_NONE: 414 case GNUNET_SERVICE_OPTION_NONE:
414 GNUNET_SERVICE_shutdown (sh); 415 GNUNET_SERVICE_shutdown (sh);
415 break; 416 break;
416
417 case GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN: 417 case GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN:
418 /* This task should never be run if we are using 418 /* This task should never be run if we are using
419 the manual shutdown. */ 419 the manual shutdown. */
420 GNUNET_assert (0); 420 GNUNET_assert (0);
421 break; 421 break;
422
423 case GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN: 422 case GNUNET_SERVICE_OPTION_SOFT_SHUTDOWN:
424 if (0 == (sh->suspend_state & SUSPEND_STATE_SHUTDOWN)) 423 if (0 == (sh->suspend_state & SUSPEND_STATE_SHUTDOWN))
425 do_suspend (sh, SUSPEND_STATE_SHUTDOWN); 424 do_suspend (sh, SUSPEND_STATE_SHUTDOWN);
@@ -902,7 +901,8 @@ service_main (void *cls)
902{ 901{
903 struct GNUNET_SERVICE_Handle *sh = cls; 902 struct GNUNET_SERVICE_Handle *sh = cls;
904 903
905 if (GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN != sh->options) 904 if (GNUNET_SERVICE_OPTION_MANUAL_SHUTDOWN !=
905 (sh->options & GNUNET_SERVICE_OPTION_SHUTDOWN_BITMASK))
906 GNUNET_SCHEDULER_add_shutdown (&service_shutdown, sh); 906 GNUNET_SCHEDULER_add_shutdown (&service_shutdown, sh);
907 do_resume (sh, SUSPEND_STATE_NONE); 907 do_resume (sh, SUSPEND_STATE_NONE);
908 908
@@ -1361,15 +1361,12 @@ open_listen_socket (const struct sockaddr *server_addr,
1361 case AF_INET: 1361 case AF_INET:
1362 port = ntohs (((const struct sockaddr_in *) server_addr)->sin_port); 1362 port = ntohs (((const struct sockaddr_in *) server_addr)->sin_port);
1363 break; 1363 break;
1364
1365 case AF_INET6: 1364 case AF_INET6:
1366 port = ntohs (((const struct sockaddr_in6 *) server_addr)->sin6_port); 1365 port = ntohs (((const struct sockaddr_in6 *) server_addr)->sin6_port);
1367 break; 1366 break;
1368
1369 case AF_UNIX: 1367 case AF_UNIX:
1370 port = 0; 1368 port = 0;
1371 break; 1369 break;
1372
1373 default: 1370 default:
1374 GNUNET_break (0); 1371 GNUNET_break (0);
1375 port = 0; 1372 port = 0;
@@ -1463,13 +1460,16 @@ static int
1463setup_service (struct GNUNET_SERVICE_Handle *sh) 1460setup_service (struct GNUNET_SERVICE_Handle *sh)
1464{ 1461{
1465 int tolerant; 1462 int tolerant;
1463 struct GNUNET_NETWORK_Handle **csocks = NULL;
1466 struct GNUNET_NETWORK_Handle **lsocks; 1464 struct GNUNET_NETWORK_Handle **lsocks;
1467 const char *nfds; 1465 const char *nfds;
1468 unsigned int cnt; 1466 unsigned int cnt;
1469 int flags; 1467 int flags;
1470 char dummy[2]; 1468 char dummy[2];
1471 1469
1472 if (GNUNET_CONFIGURATION_have_value (sh->cfg, sh->service_name, "TOLERANT")) 1470 if (GNUNET_CONFIGURATION_have_value (sh->cfg,
1471 sh->service_name,
1472 "TOLERANT"))
1473 { 1473 {
1474 if (GNUNET_SYSERR == 1474 if (GNUNET_SYSERR ==
1475 (tolerant = GNUNET_CONFIGURATION_get_value_yesno (sh->cfg, 1475 (tolerant = GNUNET_CONFIGURATION_get_value_yesno (sh->cfg,
@@ -1487,7 +1487,6 @@ setup_service (struct GNUNET_SERVICE_Handle *sh)
1487 tolerant = GNUNET_NO; 1487 tolerant = GNUNET_NO;
1488 1488
1489 lsocks = NULL; 1489 lsocks = NULL;
1490
1491 errno = 0; 1490 errno = 0;
1492 if ((NULL != (nfds = getenv ("LISTEN_FDS"))) && 1491 if ((NULL != (nfds = getenv ("LISTEN_FDS"))) &&
1493 (1 == sscanf (nfds, "%u%1s", &cnt, dummy)) && (cnt > 0) && 1492 (1 == sscanf (nfds, "%u%1s", &cnt, dummy)) && (cnt > 0) &&
@@ -1515,13 +1514,17 @@ setup_service (struct GNUNET_SERVICE_Handle *sh)
1515 } 1514 }
1516 unsetenv ("LISTEN_FDS"); 1515 unsetenv ("LISTEN_FDS");
1517 } 1516 }
1517 if ( (0 != (GNUNET_SERVICE_OPTION_CLOSE_LSOCKS & sh->options)) &&
1518 (NULL != lsocks) )
1519 {
1520 csocks = lsocks;
1521 lsocks = NULL;
1522 }
1518 1523
1519 if (NULL != lsocks) 1524 if (NULL != lsocks)
1520 { 1525 {
1521 /* listen only on inherited sockets if we have any */ 1526 /* listen only on inherited sockets if we have any */
1522 struct GNUNET_NETWORK_Handle **ls; 1527 for (struct GNUNET_NETWORK_Handle **ls = lsocks; NULL != *ls; ls++)
1523
1524 for (ls = lsocks; NULL != *ls; ls++)
1525 { 1528 {
1526 struct ServiceListenContext *slc; 1529 struct ServiceListenContext *slc;
1527 1530
@@ -1567,10 +1570,17 @@ setup_service (struct GNUNET_SERVICE_Handle *sh)
1567 GNUNET_ERROR_TYPE_ERROR, 1570 GNUNET_ERROR_TYPE_ERROR,
1568 _ ( 1571 _ (
1569 "Could not bind to any of the ports I was supposed to, refusing to run!\n")); 1572 "Could not bind to any of the ports I was supposed to, refusing to run!\n"));
1573 GNUNET_free_non_null (csocks);
1570 return GNUNET_SYSERR; 1574 return GNUNET_SYSERR;
1571 } 1575 }
1572 } 1576 }
1573 1577 if (NULL != csocks)
1578 {
1579 /* close inherited sockets to signal parent that we are ready */
1580 for (struct GNUNET_NETWORK_Handle **ls = csocks; NULL != *ls; ls++)
1581 GNUNET_NETWORK_socket_close (*ls);
1582 GNUNET_free (csocks);
1583 }
1574 sh->require_found = tolerant ? GNUNET_NO : GNUNET_YES; 1584 sh->require_found = tolerant ? GNUNET_NO : GNUNET_YES;
1575 sh->match_uid = GNUNET_CONFIGURATION_get_value_yesno (sh->cfg, 1585 sh->match_uid = GNUNET_CONFIGURATION_get_value_yesno (sh->cfg,
1576 sh->service_name, 1586 sh->service_name,
@@ -1981,9 +1991,8 @@ GNUNET_SERVICE_run_ (int argc,
1981 int ret; 1991 int ret;
1982 int err; 1992 int err;
1983 const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get (); 1993 const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
1984 1994 struct GNUNET_GETOPT_CommandLineOption service_options[] = {
1985 struct GNUNET_GETOPT_CommandLineOption service_options[] = 1995 GNUNET_GETOPT_option_cfgfile (&opt_cfg_filename),
1986 { GNUNET_GETOPT_option_cfgfile (&opt_cfg_filename),
1987 GNUNET_GETOPT_option_flag ('d', 1996 GNUNET_GETOPT_option_flag ('d',
1988 "daemonize", 1997 "daemonize",
1989 gettext_noop ( 1998 gettext_noop (
@@ -1993,7 +2002,8 @@ GNUNET_SERVICE_run_ (int argc,
1993 GNUNET_GETOPT_option_loglevel (&loglev), 2002 GNUNET_GETOPT_option_loglevel (&loglev),
1994 GNUNET_GETOPT_option_logfile (&logfile), 2003 GNUNET_GETOPT_option_logfile (&logfile),
1995 GNUNET_GETOPT_option_version (pd->version), 2004 GNUNET_GETOPT_option_version (pd->version),
1996 GNUNET_GETOPT_OPTION_END }; 2005 GNUNET_GETOPT_OPTION_END
2006 };
1997 2007
1998 err = 1; 2008 err = 1;
1999 memset (&sh, 0, sizeof(sh)); 2009 memset (&sh, 0, sizeof(sh));
@@ -2036,7 +2046,10 @@ GNUNET_SERVICE_run_ (int argc,
2036 textdomain (pd->gettext_domain); 2046 textdomain (pd->gettext_domain);
2037 } 2047 }
2038#endif 2048#endif
2039 ret = GNUNET_GETOPT_run (service_name, service_options, argc, argv); 2049 ret = GNUNET_GETOPT_run (service_name,
2050 service_options,
2051 argc,
2052 argv);
2040 if (GNUNET_SYSERR == ret) 2053 if (GNUNET_SYSERR == ret)
2041 goto shutdown; 2054 goto shutdown;
2042 if (GNUNET_NO == ret) 2055 if (GNUNET_NO == ret)
@@ -2044,7 +2057,9 @@ GNUNET_SERVICE_run_ (int argc,
2044 err = 0; 2057 err = 0;
2045 goto shutdown; 2058 goto shutdown;
2046 } 2059 }
2047 if (GNUNET_OK != GNUNET_log_setup (service_name, loglev, logfile)) 2060 if (GNUNET_OK != GNUNET_log_setup (service_name,
2061 loglev,
2062 logfile))
2048 { 2063 {
2049 GNUNET_break (0); 2064 GNUNET_break (0);
2050 goto shutdown; 2065 goto shutdown;