diff options
author | Christian Grothoff <christian@grothoff.org> | 2019-09-28 00:56:33 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2019-09-28 00:56:33 +0200 |
commit | 31aee41701fa2cd92ec566bd459e3425ee1f0b7d (patch) | |
tree | 7a8e25a7eee5a0de025d6595041f96cf76a06278 /src/util | |
parent | 9388822eb43827ee4f343a881d86a6225beca939 (diff) | |
download | gnunet-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.c | 53 |
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 | |||
1463 | setup_service (struct GNUNET_SERVICE_Handle *sh) | 1460 | setup_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; |