X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fservice.c;h=25a9b08dc3ef3032341491c1bd01346d4878684f;hb=f1252a5b29869c7641c348514fe16d913b2d26ea;hp=44d72f37649708fec944b57a59c495964c5c8dba;hpb=539288eab5294b4c29c1d43cb6f085cc88ce077c;p=oweals%2Fgnunet.git diff --git a/src/util/service.c b/src/util/service.c index 44d72f376..25a9b08dc 100644 --- a/src/util/service.c +++ b/src/util/service.c @@ -429,11 +429,6 @@ struct GNUNET_SERVICE_Context */ struct GNUNET_SERVER_Handle *server; - /** - * Scheduler for the server. - */ - struct GNUNET_SCHEDULER_Handle *sched; - /** * NULL-terminated array of addresses to bind to, NULL if we got pre-bound * listen sockets. @@ -498,11 +493,6 @@ struct GNUNET_SERVICE_Context */ struct GNUNET_TIME_Relative timeout; - /** - * Maximum buffer size for the server. - */ - size_t maxbuf; - /** * Overall success/failure of the service start. */ @@ -877,6 +867,16 @@ GNUNET_SERVICE_get_server_addresses (const char *serviceName, &unixpath)); /* probe UNIX support */ + struct sockaddr_un s_un; + if (strlen(unixpath) >= sizeof(s_un.sun_path)) + { + GNUNET_log (GNUNET_ERROR_TYPE_WARNING, + _("UNIXPATH `%s' too long, maximum length is %llu\n"),unixpath, sizeof(s_un.sun_path)); + GNUNET_free_non_null (hostname); + GNUNET_free (unixpath); + return GNUNET_SYSERR; + } + desc = GNUNET_NETWORK_socket_create (AF_UNIX, SOCK_STREAM, 0); if (NULL == desc) { @@ -895,6 +895,11 @@ GNUNET_SERVICE_get_server_addresses (const char *serviceName, GNUNET_free (unixpath); unixpath = NULL; } + else + { + GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc)); + desc = NULL; + } } else unixpath = NULL; @@ -908,11 +913,20 @@ GNUNET_SERVICE_get_server_addresses (const char *serviceName, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Have neither PORT nor UNIXPATH for service `%s', but one is required\n"), serviceName); - if (desc != NULL) - GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc)); GNUNET_free_non_null(hostname); return GNUNET_SYSERR; } + if (port == 0) + { + saddrs = GNUNET_malloc (2 * sizeof(struct sockaddr*)); + saddrlens = GNUNET_malloc (2 * sizeof (socklen_t)); + add_unixpath (saddrs, saddrlens, unixpath); + GNUNET_free_non_null (unixpath); + GNUNET_free_non_null(hostname); + *addrs = saddrs; + *addr_lens = saddrlens; + return 1; + } if (hostname != NULL) { @@ -933,8 +947,6 @@ GNUNET_SERVICE_get_server_addresses (const char *serviceName, hostname, gai_strerror (ret)); GNUNET_free (hostname); GNUNET_free (unixpath); - if (desc != NULL) - GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc)); return GNUNET_SYSERR; } next = res; @@ -1061,21 +1073,18 @@ GNUNET_SERVICE_get_server_addresses (const char *serviceName, GNUNET_free_non_null (unixpath); *addrs = saddrs; *addr_lens = saddrlens; - if (desc != NULL) - GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (desc)); return resi; } /** - * Setup addr, addrlen, maxbuf, idle_timeout + * Setup addr, addrlen, idle_timeout * based on configuration! * * Configuration may specify: * - PORT (where to bind to for TCP) * - UNIXPATH (where to bind to for UNIX domain sockets) * - TIMEOUT (after how many ms does an inactive service timeout); - * - MAXBUF (maximum incoming message size supported) * - DISABLEV6 (disable support for IPv6, otherwise we use dual-stack) * - BINDTO (hostname or IP address to bind to, otherwise we take everything) * - ACCEPT_FROM (only allow connections from specified IPv4 subnets) @@ -1088,14 +1097,15 @@ GNUNET_SERVICE_get_server_addresses (const char *serviceName, static int setup_service (struct GNUNET_SERVICE_Context *sctx) { - unsigned long long maxbuf; struct GNUNET_TIME_Relative idleout; int tolerant; +#ifndef MINGW const char *lpid; unsigned int pid; const char *nfds; unsigned int cnt; int flags; +#endif if (GNUNET_CONFIGURATION_have_value (sctx->cfg, sctx->serviceName, "TIMEOUT")) @@ -1115,23 +1125,6 @@ setup_service (struct GNUNET_SERVICE_Context *sctx) } else sctx->timeout = GNUNET_TIME_UNIT_FOREVER_REL; - if (GNUNET_CONFIGURATION_have_value (sctx->cfg, - sctx->serviceName, "MAXBUF")) - { - if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_number (sctx->cfg, - sctx->serviceName, - "MAXBUF", &maxbuf)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _("Specified value for `%s' of service `%s' is invalid\n"), - "MAXBUF", - sctx->serviceName); - return GNUNET_SYSERR; - } - } - else - maxbuf = GNUNET_SERVER_MAX_MESSAGE_SIZE; if (GNUNET_CONFIGURATION_have_value (sctx->cfg, sctx->serviceName, "TOLERANT")) @@ -1158,7 +1151,9 @@ setup_service (struct GNUNET_SERVICE_Context *sctx) (getpid () == (pid_t) pid) && (NULL != (nfds = getenv ("LISTEN_FDS"))) && (1 == sscanf (nfds, "%u", &cnt)) && - (cnt > 0) ) + (cnt > 0) && + (cnt < FD_SETSIZE) && + (cnt + 4 < FD_SETSIZE) ) { sctx->lsocks = GNUNET_malloc (sizeof(struct GNUNET_NETWORK_Handle*) * (cnt+1)); while (0 < cnt--) @@ -1173,7 +1168,7 @@ setup_service (struct GNUNET_SERVICE_Context *sctx) (unsigned int) 3 +cnt); cnt++; while (sctx->lsocks[cnt] != NULL) - GNUNET_NETWORK_socket_close (sctx->lsocks[cnt++]); + GNUNET_break (0 == GNUNET_NETWORK_socket_close (sctx->lsocks[cnt++])); GNUNET_free (sctx->lsocks); sctx->lsocks = NULL; break; @@ -1192,15 +1187,6 @@ setup_service (struct GNUNET_SERVICE_Context *sctx) &sctx->addrlens)) ) return GNUNET_SYSERR; sctx->require_found = tolerant ? GNUNET_NO : GNUNET_YES; - sctx->maxbuf = (size_t) maxbuf; - if (sctx->maxbuf != maxbuf) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - _ - ("Value in configuration for `%s' and service `%s' too large!\n"), - "MAXBUF", sctx->serviceName); - return GNUNET_SYSERR; - } process_acl4 (&sctx->v4_denied, sctx, "REJECT_FROM"); process_acl4 (&sctx->v4_allowed, sctx, "ACCEPT_FROM"); @@ -1309,21 +1295,16 @@ service_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) struct GNUNET_SERVICE_Context *sctx = cls; unsigned int i; - sctx->sched = tc->sched; if (sctx->lsocks != NULL) - sctx->server = GNUNET_SERVER_create_with_sockets (tc->sched, - &check_access, + sctx->server = GNUNET_SERVER_create_with_sockets (&check_access, sctx, sctx->lsocks, - sctx->maxbuf, sctx->timeout, sctx->require_found); else - sctx->server = GNUNET_SERVER_create (tc->sched, - &check_access, + sctx->server = GNUNET_SERVER_create (&check_access, sctx, sctx->addrs, sctx->addrlens, - sctx->maxbuf, sctx->timeout, sctx->require_found); if (sctx->server == NULL) { @@ -1346,8 +1327,7 @@ service_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) { /* install a task that will kill the server process if the scheduler ever gets a shutdown signal */ - GNUNET_SCHEDULER_add_delayed (tc->sched, - GNUNET_TIME_UNIT_FOREVER_REL, + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_FOREVER_REL, &shutdown_task, sctx->server); } sctx->my_handlers = GNUNET_malloc (sizeof (defhandlers)); @@ -1375,7 +1355,7 @@ service_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) i++; } } - sctx->task (sctx->task_cls, tc->sched, sctx->server, sctx->cfg); + sctx->task (sctx->task_cls, sctx->server, sctx->cfg); } @@ -1439,10 +1419,12 @@ detach_terminal (struct GNUNET_SERVICE_Context *sctx) return GNUNET_SYSERR; /* set stdin/stdout to /dev/null */ if ((dup2 (nullfd, 0) < 0) || (dup2 (nullfd, 1) < 0)) - { + { GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "dup2"); + (void) CLOSE (nullfd); return GNUNET_SYSERR; } + (void) CLOSE (nullfd); /* Detach from controlling terminal */ pid = setsid (); if (pid == -1) @@ -1568,8 +1550,8 @@ GNUNET_SERVICE_run (int argc, sctx.ready_confirm_fd = -1; sctx.ret = GNUNET_OK; sctx.timeout = GNUNET_TIME_UNIT_FOREVER_REL; - sctx.maxbuf = GNUNET_SERVER_MAX_MESSAGE_SIZE; sctx.task = task; + sctx.task_cls = task_cls; sctx.serviceName = serviceName; sctx.cfg = cfg = GNUNET_CONFIGURATION_create (); /* setup subsystems */ @@ -1631,13 +1613,11 @@ shutdown: * initialized system. * * @param serviceName our service name - * @param sched scheduler to use * @param cfg configuration to use * @return NULL on error, service handle */ struct GNUNET_SERVICE_Context * GNUNET_SERVICE_start (const char *serviceName, - struct GNUNET_SCHEDULER_Handle *sched, const struct GNUNET_CONFIGURATION_Handle *cfg) { int i; @@ -1647,10 +1627,8 @@ GNUNET_SERVICE_start (const char *serviceName, sctx->ready_confirm_fd = -1; /* no daemonizing */ sctx->ret = GNUNET_OK; sctx->timeout = GNUNET_TIME_UNIT_FOREVER_REL; - sctx->maxbuf = GNUNET_SERVER_MAX_MESSAGE_SIZE; sctx->serviceName = serviceName; sctx->cfg = cfg; - sctx->sched = sched; /* setup subsystems */ if (GNUNET_OK != setup_service (sctx)) @@ -1659,19 +1637,15 @@ GNUNET_SERVICE_start (const char *serviceName, return NULL; } if (sctx->lsocks != NULL) - sctx->server = GNUNET_SERVER_create_with_sockets (sched, - &check_access, + sctx->server = GNUNET_SERVER_create_with_sockets (&check_access, sctx, sctx->lsocks, - sctx->maxbuf, sctx->timeout, sctx->require_found); else - sctx->server = GNUNET_SERVER_create (sched, - &check_access, + sctx->server = GNUNET_SERVER_create (&check_access, sctx, sctx->addrs, sctx->addrlens, - sctx->maxbuf, sctx->timeout, sctx->require_found);