GNUnet is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 2, or (at your
+ by the Free Software Foundation; either version 3, or (at your
option) any later version.
GNUnet is distributed in the hope that it will be useful, but
* Actually start the process for the given service.
*
* @param sl identifies service to start
+ * @param lsocks -1 terminated list of listen sockets to pass (systemd style), or NULL
*/
static void
-start_process (struct ServiceList *sl)
+start_process (struct ServiceList *sl,
+ const int *lsocks)
{
char *loprefix;
char *options;
while (NULL != (optpos = strstr (options, "$")))
{
optend = optpos + 1;
- while (isupper (*optend)) optend++;
+ while (isupper ( (unsigned char) *optend)) optend++;
b = *optend;
if ('\0' == b)
next = "";
sl->name, sl->binary, sl->config);
#endif
if (GNUNET_YES == use_debug)
- sl->pid = do_start_process (loprefix,
+ sl->pid = do_start_process (lsocks,
+ loprefix,
sl->binary,
"-c", sl->config,
"-L", "DEBUG",
options,
NULL);
else
- sl->pid = do_start_process (loprefix,
+ sl->pid = do_start_process (lsocks,
+ loprefix,
sl->binary,
"-c", sl->config,
options,
*
* @param client who is asking for this
* @param servicename name of the service to start
+ * @param lsocks -1 terminated list of listen sockets to pass (systemd style), or NULL
+ * @return GNUNET_OK on success, GNUNET_SYSERR on error
*/
-void
-start_service (struct GNUNET_SERVER_Client *client, const char *servicename)
+int
+start_service (struct GNUNET_SERVER_Client *client,
+ const char *servicename,
+ const int *lsocks)
{
struct ServiceList *sl;
char *binary;
_("ARM is shutting down, service `%s' not started.\n"),
servicename);
signal_result (client, servicename, GNUNET_MESSAGE_TYPE_ARM_IS_DOWN);
- return;
+ return GNUNET_SYSERR;
}
sl = find_name (servicename);
if (sl != NULL)
sl->next = running;
running = sl;
signal_result (client, servicename, GNUNET_MESSAGE_TYPE_ARM_IS_UP);
- return;
+ return GNUNET_SYSERR;
}
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_string (cfg,
_("Binary implementing service `%s' not known!\n"),
servicename);
signal_result (client, servicename, GNUNET_MESSAGE_TYPE_ARM_IS_DOWN);
- return;
+ return GNUNET_SYSERR;
}
if ((GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_filename (cfg,
signal_result (client, servicename, GNUNET_MESSAGE_TYPE_ARM_IS_DOWN);
GNUNET_free (binary);
GNUNET_free_non_null (config);
- return;
+ return GNUNET_SYSERR;
}
(void) stop_listening (servicename);
sl = GNUNET_malloc (sizeof (struct ServiceList));
sl->restartAt = GNUNET_TIME_UNIT_FOREVER_ABS;
running = sl;
- start_process (sl);
+ start_process (sl, lsocks);
if (NULL != client)
signal_result (client, servicename, GNUNET_MESSAGE_TYPE_ARM_IS_UP);
+ return GNUNET_OK;
}
GNUNET_SERVER_receive_done (client, GNUNET_SYSERR);
return;
}
- start_service (client, servicename);
+ start_service (client, servicename, NULL);
GNUNET_SERVER_receive_done (client, GNUNET_OK);
}
{
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
_("Restarting service `%s'.\n"), pos->name);
- start_process (pos);
+ start_process (pos, NULL);
}
else
{
}
-/**
- * List of handlers for the messages understood by this service.
- */
-static struct GNUNET_SERVER_MessageHandler handlers[] = {
- {&handle_start, NULL, GNUNET_MESSAGE_TYPE_ARM_START, 0},
- {&handle_stop, NULL, GNUNET_MESSAGE_TYPE_ARM_STOP, 0},
- {&handle_shutdown, NULL, GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN,
- sizeof (struct GNUNET_MessageHeader)},
- {NULL, NULL, 0, 0}
-};
-
/**
* Signal handler called for SIGCHLD. Triggers the
* respective handler by writing to the trigger pipe.
sighandler_child_death ()
{
static char c;
+ int old_errno = errno; /* back-up errno */
GNUNET_break (1 ==
GNUNET_DISK_file_write (GNUNET_DISK_pipe_handle
(sigpipe, GNUNET_DISK_PIPE_END_WRITE), &c,
sizeof (c)));
+ errno = old_errno; /* restore errno */
}
struct GNUNET_SERVER_Handle *serv,
const struct GNUNET_CONFIGURATION_Handle *c)
{
+ static const struct GNUNET_SERVER_MessageHandler handlers[] = {
+ {&handle_start, NULL, GNUNET_MESSAGE_TYPE_ARM_START, 0},
+ {&handle_stop, NULL, GNUNET_MESSAGE_TYPE_ARM_STOP, 0},
+ {&handle_shutdown, NULL, GNUNET_MESSAGE_TYPE_ARM_SHUTDOWN,
+ sizeof (struct GNUNET_MessageHeader)},
+ {NULL, NULL, 0, 0}
+ };
char *defaultservices;
char *pos;
pos = strtok (defaultservices, " ");
while (pos != NULL)
{
- start_service (NULL, pos);
+ start_service (NULL, pos, NULL);
pos = strtok (NULL, " ");
}
}