diff --git a/commandline.c b/commandline.c index 0ba7fb4d..01986014 100644 --- a/commandline.c +++ b/commandline.c @@ -88,19 +88,6 @@ int commandline_main(struct cli_context *context, const char *argv0, int argc, c // undefined reference to `__start_tr_cmd_cleanup' // undefined reference to `__stop_tr_cmd_cleanup' -static void __dummy_on_cmd_cleanup(); -DEFINE_TRIGGER(cmd_cleanup, __dummy_on_cmd_cleanup); static void __dummy_on_cmd_cleanup() {} +DEFINE_TRIGGER(cmd_cleanup, __dummy_on_cmd_cleanup); -int commandline_main_stdio(FILE *output, const char *argv0, int argc, const char *const *args) -{ - struct cli_context_stdio cli_context_stdio = { - .fp = output - }; - struct cli_context cli_context = { - .vtable = &cli_vtable_stdio, - .context = &cli_context_stdio - }; - - return commandline_main(&cli_context, argv0, argc, args); -} diff --git a/directory_client.c b/directory_client.c index 82012d5f..d5fbcb4e 100644 --- a/directory_client.c +++ b/directory_client.c @@ -41,6 +41,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "keyring.h" #include "serval.h" // for overlay_send_frame() #include "route_link.h" +#include "server.h" +#include "feature.h" + +DEFINE_FEATURE(directory_client); __thread struct subscriber *directory_service; @@ -112,7 +116,7 @@ static void directory_update(struct sched_ent *alarm){ } } -int directory_service_init(){ +static void directory_service_init(){ if (is_sid_t_any(config.directory.service)) { directory_service = NULL; }else{ @@ -126,8 +130,8 @@ int directory_service_init(){ } unschedule(&directory_alarm); directory_update(&directory_alarm); - return 0; } +DEFINE_TRIGGER(conf_change, directory_service_init); // called when we discover a route to the directory service SID int directory_registration(){ @@ -140,10 +144,9 @@ int directory_registration(){ } static void interface_change(struct overlay_interface *UNUSED(interface), unsigned count){ + unschedule(&directory_alarm); if (count) - directory_registration(); - else - unschedule(&directory_alarm); + directory_update(&directory_alarm); } DEFINE_TRIGGER(iupdown, interface_change); diff --git a/dna_helper.c b/dna_helper.c index b8b06948..b51f1da1 100644 --- a/dna_helper.c +++ b/dna_helper.c @@ -62,6 +62,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "overlay_address.h" #include "server.h" #include "debug.h" +#include "mdp_services.h" +#include "feature.h" + + +DEFINE_FEATURE(dna_helper); static void dna_helper_shutdown(); @@ -84,38 +89,6 @@ static void dna_helper_shutdown(); main loop. */ -int -parseDnaReply(const char *buf, size_t len, char *token, char *did, char *name, char *uri, const char **bufp) -{ - /* Replies look like: TOKEN|URI|DID|NAME| where TOKEN is usually a hex SID */ - const char *b = buf; - const char *e = buf + len; - char *p, *q; - for (p = token, q = token + SID_STRLEN; b != e && *b != '|' && p != q; ++p, ++b) - *p = *b; - *p = '\0'; - if (b == e || *b++ != '|') - return 0; - for (p = uri, q = uri + 511; b != e && *b != '|' && p != q; ++p, ++b) - *p = *b; - *p = '\0'; - if (b == e || *b++ != '|') - return 0; - for (p = did, q = did + DID_MAXSIZE; b != e && *b != '|' && p != q; ++p, ++b) - *p = *b; - *p = '\0'; - if (b == e || *b++ != '|') - return 0; - for (p = name, q = name + ID_NAME_MAXSIZE; b != e && *b != '|' && p != q; ++p, ++b) - *p = *b; - *p = '\0'; - if (b == e || *b++ != '|') - return 0; - if (bufp) - *bufp = b; - return 1; -} - static pid_t dna_helper_pid = -1; static int dna_helper_stdin = -1; static int dna_helper_stdout = -1; @@ -179,25 +152,29 @@ dna_helper_close_pipes() } } -int -dna_helper_start() +static void dna_helper_start() { dna_helper_shutdown(); + if (!serverMode) + return; + if (!config.dna.helper.executable[0]) { INFO("DNAHELPER none configured"); - return 0; + return; } const char *mysid = alloca_tohex_sid_t(get_my_subscriber(1)->sid); int stdin_fds[2], stdout_fds[2], stderr_fds[2]; - if (pipe(stdin_fds) == -1) - return WHY_perror("pipe"); + if (pipe(stdin_fds) == -1){ + WHY_perror("pipe"); + return; + } if (pipe(stdout_fds) == -1) { WHY_perror("pipe"); close(stdin_fds[0]); close(stdin_fds[1]); - return -1; + return; } if (pipe(stderr_fds) == -1) { WHY_perror("pipe"); @@ -205,7 +182,7 @@ dna_helper_start() close(stdin_fds[1]); close(stdout_fds[0]); close(stdout_fds[1]); - return -1; + return; } // Construct argv[] for execv() and log messages. const char *argv[config.dna.helper.argv.ac + 2]; @@ -246,7 +223,8 @@ dna_helper_start() close(stdout_fds[1]); close(stderr_fds[0]); close(stderr_fds[1]); - return -1; + return; + default: /* Parent, should put file descriptors into place for use */ close(stdin_fds[0]); @@ -279,10 +257,9 @@ dna_helper_start() watch(&sched_replies); watch(&sched_errors); schedule(&sched_harvester); - return 0; } - return -1; } +DEFINE_TRIGGER(conf_change, dna_helper_start); static int dna_helper_kill() @@ -581,17 +558,21 @@ static void reply_timeout(struct sched_ent *alarm) } } -int -dna_helper_enqueue(struct subscriber *source, mdp_port_t source_port, const char *did) +static void dna_helper_enqueue(struct internal_mdp_header *header, const char *did) { + struct subscriber *source = header->source; + mdp_port_t source_port = header->source_port; + DEBUGF(dnahelper, "DNAHELPER request did=%s sid=%s", did, alloca_tohex_sid_t(source->sid)); if (dna_helper_pid == 0) - return 0; + return; // Only try to restart a DNA helper process if the previous one is well and truly gone. if (dna_helper_pid == -1 && dna_helper_stdin == -1 && dna_helper_stdout == -1 && dna_helper_stderr == -1) { - if (dna_helper_start() == -1) { + dna_helper_start(); + if (dna_helper_pid == -1 && dna_helper_stdin == -1 && dna_helper_stdout == -1 && dna_helper_stderr == -1) { /* Something broke, bail out */ - return WHY("DNAHELPER start failed"); + WHY("DNAHELPER start failed"); + return; } } /* Write request to dna helper. @@ -601,14 +582,14 @@ dna_helper_enqueue(struct subscriber *source, mdp_port_t source_port, const char which will include the requestor's SID. */ if (dna_helper_stdin == -1) - return 0; + return; if (request_bufptr && request_bufptr != request_buffer) { WARNF("DNAHELPER currently sending request %s -- dropping new request", request_buffer); - return 0; + return; } if (awaiting_reply) { WARN("DNAHELPER currently awaiting reply -- dropping new request"); - return 0; + return; } char buffer[sizeof request_buffer]; strbuf b = request_bufptr == request_buffer ? strbuf_local_buf(buffer) : strbuf_local_buf(request_buffer); @@ -636,5 +617,6 @@ dna_helper_enqueue(struct subscriber *source, mdp_port_t source_port, const char sched_requests.poll.fd = dna_helper_stdin; watch(&sched_requests); } - return 1; } +DEFINE_TRIGGER(dna_lookup, dna_helper_enqueue); + diff --git a/mdp_services.h b/mdp_services.h new file mode 100644 index 00000000..a41f1b78 --- /dev/null +++ b/mdp_services.h @@ -0,0 +1,27 @@ +/* +Copyright (C) 2012-2015 Serval Project Inc. +Copyright (C) 2016 Flinders University + +This program 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 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#ifndef __SERVAL_DNA__MDP_SERVICES_H +#define __SERVAL_DNA__MDP_SERVICES_H + +#include "trigger.h" + +DECLARE_TRIGGER(dna_lookup, struct internal_mdp_header *header, const char *did); + +#endif diff --git a/monitor.c b/monitor.c index 028a8172..dfce1e7d 100644 --- a/monitor.c +++ b/monitor.c @@ -72,6 +72,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "server.h" #include "route_link.h" #include "debug.h" +#include "mdp_services.h" #ifdef HAVE_UCRED_H #include @@ -117,8 +118,11 @@ struct sched_ent named_socket; struct profile_total named_stats; struct profile_total client_stats; -int monitor_setup_sockets() +static void monitor_setup_sockets() { + if (serverMode==0) + return; + int sock = -1; if ((sock = esocket(AF_UNIX, SOCK_STREAM, 0)) == -1) goto error; @@ -139,13 +143,14 @@ int monitor_setup_sockets() named_socket.poll.events=POLLIN; watch(&named_socket); INFOF("Monitor socket: fd=%d %s", sock, alloca_socket_address(&addr)); - return 0; + return; error: if (sock != -1) close(sock); - return -1; + serverMode=0; } +DEFINE_TRIGGER(startup, monitor_setup_sockets); #define monitor_write_error(C,E) _monitor_write_error(__WHENCE__, C, E) static int _monitor_write_error(struct __sourceloc __whence, struct monitor_context *c, const char *error){ @@ -452,7 +457,11 @@ static int monitor_set(const struct cli_parsed *parsed, struct cli_context *cont c->flags|=MONITOR_QUIT_ON_DISCONNECT; }else if (strcase_startswith(parsed->args[1],"interface", NULL)){ c->flags|=MONITOR_INTERFACE; - overlay_interface_monitor_up(); + unsigned i; + for (i=0;isource->sid), header->source_port, + did); +} +DEFINE_TRIGGER(dna_lookup, monitor_dna_helper); + + static void monitor_interface_change(struct overlay_interface *interface, unsigned UNUSED(count)){ unsigned i = interface - overlay_interfaces; if (interface->state==INTERFACE_STATE_UP) diff --git a/overlay_interface.c b/overlay_interface.c index e10c2050..becef6f3 100644 --- a/overlay_interface.c +++ b/overlay_interface.c @@ -116,15 +116,6 @@ static void overlay_interface_close_all() } DEFINE_TRIGGER(shutdown, overlay_interface_close_all); -void overlay_interface_monitor_up() -{ - unsigned i; - for (i=0;istate){ @@ -307,7 +298,7 @@ overlay_interface * overlay_interface_find_name_addr(const char *name, struct so int i; assert(name || addr); for(i = 0; i < OVERLAY_MAX_INTERFACES; i++){ - if (overlay_interfaces[i].state==INTERFACE_STATE_DOWN) + if (overlay_interfaces[i].state!=INTERFACE_STATE_UP) continue; if ((!addr || cmp_sockaddr(addr, &overlay_interfaces[i].address)==0) @@ -1475,8 +1466,11 @@ static void rescan_soon(time_ms_t run_at){ RESCHEDULE(alarm, run_at, run_at, run_at); } -void overlay_interface_config_change() +static void overlay_interface_config_change() { + if (!serverMode) + return; + unsigned i; int real_interface = 0; @@ -1522,6 +1516,7 @@ void overlay_interface_config_change() if (real_interface) rescan_soon(gettime_ms()); } +DEFINE_TRIGGER(conf_change, overlay_interface_config_change); void logServalPacket(int level, struct __sourceloc __whence, const char *message, const unsigned char *packet, size_t len) { struct mallocbuf mb = STRUCT_MALLOCBUF_NULL; diff --git a/overlay_interface.h b/overlay_interface.h index fb67cdd8..637fabea 100644 --- a/overlay_interface.h +++ b/overlay_interface.h @@ -108,7 +108,6 @@ struct network_destination * create_unicast_destination(struct socket_address *a struct network_destination * add_destination_ref(struct network_destination *ref); void release_destination_ref(struct network_destination *ref); int set_destination_ref(struct network_destination **ptr, struct network_destination *ref); -void overlay_interface_config_change(); struct config_mdp_iftype; int overlay_destination_configure(struct network_destination *dest, const struct config_mdp_iftype *ifconfig); diff --git a/overlay_link.c b/overlay_link.c index da6d8729..f33e946e 100644 --- a/overlay_link.c +++ b/overlay_link.c @@ -113,6 +113,15 @@ struct network_destination *load_subscriber_address(struct subscriber *subscribe addr.inet.sin_addr = hostc->address; } addr.inet.sin_port = htons(hostc->port); + + if (!interface && addr.addr.sa_family == AF_INET) + interface = overlay_interface_find(addr.inet.sin_addr, 1); + + if (!interface){ + WARNF("Can't find interface for %s", alloca_socket_address(&addr)); + return NULL; + } + DEBUGF(overlayrouting, "Loaded address %s for %s", alloca_socket_address(&addr), alloca_tohex_sid_t(subscriber->sid)); return create_unicast_destination(&addr, interface); } diff --git a/overlay_mdp.c b/overlay_mdp.c index c653279e..8369d8fd 100644 --- a/overlay_mdp.c +++ b/overlay_mdp.c @@ -246,23 +246,30 @@ static void overlay_mdp_shutdown() } DEFINE_TRIGGER(shutdown, overlay_mdp_shutdown); -int overlay_mdp_setup_sockets() +static void overlay_mdp_setup_sockets() { + if (serverMode==0) + return; + /* Delete stale socket files from instance directory. */ overlay_mdp_clean_socket_files(); if (mdp_sock.poll.fd == -1) { mdp_sock.poll.fd = mdp_bind_socket("mdp.socket"); - if (mdp_sock.poll.fd == -1) - return -1; + if (mdp_sock.poll.fd == -1){ + serverMode=0; + return; + } mdp_sock.poll.events = POLLIN; watch(&mdp_sock); } if (mdp_sock2.poll.fd == -1) { mdp_sock2.poll.fd = mdp_bind_socket("mdp.2.socket"); - if (mdp_sock2.poll.fd == -1) - return -1; + if (mdp_sock2.poll.fd == -1){ + serverMode=0; + return; + } mdp_sock2.poll.events = POLLIN; watch(&mdp_sock2); } @@ -304,12 +311,13 @@ int overlay_mdp_setup_sockets() if (fd!=-1){ close(fd); - return -1; + serverMode=0; + return; } } } - return 0; } +DEFINE_TRIGGER(startup, overlay_mdp_setup_sockets); #define MDP_MAX_SOCKET_NAME_LEN 110 diff --git a/overlay_mdp_dnalookup.c b/overlay_mdp_dnalookup.c index fab37c2e..97340bcc 100644 --- a/overlay_mdp_dnalookup.c +++ b/overlay_mdp_dnalookup.c @@ -24,6 +24,38 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "keyring.h" #include "overlay_buffer.h" #include "debug.h" +#include "mdp_services.h" + +int parseDnaReply(const char *buf, size_t len, char *token, char *did, char *name, char *uri, const char **bufp) +{ + /* Replies look like: TOKEN|URI|DID|NAME| where TOKEN is usually a hex SID */ + const char *b = buf; + const char *e = buf + len; + char *p, *q; + for (p = token, q = token + SID_STRLEN; b != e && *b != '|' && p != q; ++p, ++b) + *p = *b; + *p = '\0'; + if (b == e || *b++ != '|') + return 0; + for (p = uri, q = uri + 511; b != e && *b != '|' && p != q; ++p, ++b) + *p = *b; + *p = '\0'; + if (b == e || *b++ != '|') + return 0; + for (p = did, q = did + DID_MAXSIZE; b != e && *b != '|' && p != q; ++p, ++b) + *p = *b; + *p = '\0'; + if (b == e || *b++ != '|') + return 0; + for (p = name, q = name + ID_NAME_MAXSIZE; b != e && *b != '|' && p != q; ++p, ++b) + *p = *b; + *p = '\0'; + if (b == e || *b++ != '|') + return 0; + if (bufp) + *bufp = b; + return 1; +} DEFINE_BINDING(MDP_PORT_DNALOOKUP, overlay_mdp_service_dnalookup); static int overlay_mdp_service_dnalookup(struct internal_mdp_header *header, struct overlay_buffer *payload) @@ -77,10 +109,11 @@ static int overlay_mdp_service_dnalookup(struct internal_mdp_header *header, str when results become available, so this function will return immediately, so as not to cause blockages and delays in servald. */ - dna_helper_enqueue(header->source, header->source_port, did); - monitor_tell_formatted(MONITOR_DNAHELPER, "LOOKUP:%s:%d:%s\n", - alloca_tohex_sid_t(header->source->sid), header->source_port, - did); + CALL_TRIGGER(dna_lookup, header, did); } RETURN(0); } + +// Put a dummy no-op trigger callback into the "cmd_cleanup" trigger section, +static void __dummy_dna_lookup(struct internal_mdp_header *UNUSED(header), const char *UNUSED(did)){} +DEFINE_TRIGGER(dna_lookup, __dummy_dna_lookup); diff --git a/overlay_olsr.c b/overlay_olsr.c index c422c59e..50de6bdb 100644 --- a/overlay_olsr.c +++ b/overlay_olsr.c @@ -83,15 +83,15 @@ static struct sched_ent read_watch={ .poll={.fd=-1,.events=POLLIN}, }; -int olsr_init_socket(void){ +static void olsr_init_socket(void){ int fd; int reuseP = 1; if (read_watch.poll.fd>=0) - return 0; + return; if (!config.olsr.enable) - return 0; + return; INFOF("Initialising olsr broadcast forwarding via ports %d-%d", config.olsr.local_port, config.olsr.remote_port); struct sockaddr_in addr = { @@ -103,20 +103,21 @@ int olsr_init_socket(void){ fd = socket(AF_INET,SOCK_DGRAM,0); if (fd < 0) { - return WHY_perror("Error creating socket"); + WHY_perror("Error creating socket"); + return; } if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &reuseP, sizeof(reuseP)) < 0) { WHY_perror("setsockopt(SO_REUSEADR)"); close(fd); - return -1; + return; } #ifdef SO_REUSEPORT if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &reuseP, sizeof(reuseP)) < 0) { WHY_perror("setsockopt(SO_REUSEPORT)"); close(fd); - return -1; + return; } #endif @@ -134,14 +135,15 @@ int olsr_init_socket(void){ if (bind(fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in))) { WHY_perror("Bind failed"); close(fd); - return -1; + return; } read_watch.poll.fd = fd; watch(&read_watch); - return 0; } +DEFINE_TRIGGER(conf_change, olsr_init_socket); + static void parse_frame(struct overlay_buffer *buff){ struct overlay_frame frame; diff --git a/overlay_stun.c b/overlay_stun.c index f49bece1..007a9a54 100644 --- a/overlay_stun.c +++ b/overlay_stun.c @@ -50,7 +50,12 @@ static int overlay_mdp_service_stun(struct internal_mdp_header *header, struct o // only trust stun responses from our directory service or about the packet sender. if (directory_service == header->source || subscriber == header->source){ - struct network_destination *destination = create_unicast_destination(&addr, NULL); + overlay_interface *interface = overlay_interface_find(addr.inet.sin_addr, 1); + if (!interface){ + WARNF("Can't find interface for %s", alloca_socket_address(&addr)); + return 0; + } + struct network_destination *destination = create_unicast_destination(&addr, interface); if (destination){ overlay_send_probe(subscriber, destination, OQ_MESH_MANAGEMENT); release_destination_ref(destination); diff --git a/rhizome_fetch.c b/rhizome_fetch.c index acfb503b..4677d706 100644 --- a/rhizome_fetch.c +++ b/rhizome_fetch.c @@ -160,6 +160,7 @@ void rhizome_fetch_status(struct sched_ent *alarm) return; unsigned i; + unsigned total=0; for(i=0;iactive.state==RHIZOME_FETCH_FREE) continue; + total+=candidates; DEBUGF(rhizome_rx, "Fetch slot %d, candidates %u of %u %"PRIu64" bytes, %s %"PRIu64" of %"PRIu64, i, candidates, q->candidate_queue_size, candidate_size, fetch_state(q->active.state), @@ -181,9 +183,10 @@ void rhizome_fetch_status(struct sched_ent *alarm) q->active.manifest?q->active.manifest->filesize:0 ); } - rhizome_sync_status(); - time_ms_t now = gettime_ms(); - RESCHEDULE(alarm, now + 3000, TIME_MS_NEVER_WILL, TIME_MS_NEVER_WILL); + if (total){ + time_ms_t now = gettime_ms(); + RESCHEDULE(alarm, now + 3000, TIME_MS_NEVER_WILL, TIME_MS_NEVER_WILL); + } } int rhizome_fetch_status_html(strbuf b) @@ -951,6 +954,8 @@ int rhizome_suggest_queue_manifest_import(rhizome_manifest *m, const struct sock sched_activate.deadline = sched_activate.alarm + config.rhizome.idle_timeout; schedule(&sched_activate); } + if (IF_DEBUG(rhizome) && !is_scheduled(&ALARM_STRUCT(rhizome_fetch_status))) + RESCHEDULE(&ALARM_STRUCT(rhizome_fetch_status), gettime_ms() + 3000, TIME_MS_NEVER_WILL, TIME_MS_NEVER_WILL); RETURN(0); OUT(); diff --git a/rhizome_sync.c b/rhizome_sync.c index d45f35d2..dd1e83fc 100644 --- a/rhizome_sync.c +++ b/rhizome_sync.c @@ -98,11 +98,6 @@ static int sync_status(void **record, void *UNUSED(context)) return 0; } -void rhizome_sync_status() -{ - enum_subscribers(NULL, sync_status, NULL); -} - static void rhizome_sync_request(struct subscriber *subscriber, uint64_t token, unsigned char forwards) { struct internal_mdp_header header; @@ -516,14 +511,22 @@ static void sync_send_response(struct subscriber *dest, int forwards, uint64_t t void rhizome_sync_announce(struct sched_ent *alarm) { - if (!is_rhizome_advertise_enabled()) + if (!(is_rhizome_advertise_enabled() && link_has_neighbours())) return; int (*oldfunc)() = sqlite_set_tracefunc(is_debug_rhizome_ads); sync_send_response(NULL, 0, HEAD_FLAG, 5); sqlite_set_tracefunc(oldfunc); - alarm->alarm = gettime_ms()+config.rhizome.advertise.interval; + time_ms_t now = gettime_ms(); + alarm->alarm = now+config.rhizome.advertise.interval; alarm->deadline = alarm->alarm+10000; schedule(alarm); + if (IF_DEBUG(rhizome)){ + static time_ms_t next_debug = TIME_MS_NEVER_HAS; + if (next_debug < now){ + enum_subscribers(NULL, sync_status, NULL); + next_debug = now + 3000; + } + } } static void neighbour_changed(struct subscriber *UNUSED(neighbour), uint8_t UNUSED(found), unsigned count) diff --git a/route_link.c b/route_link.c index de7826fd..afd5f9a6 100644 --- a/route_link.c +++ b/route_link.c @@ -190,16 +190,7 @@ struct network_destination * new_destination(struct overlay_interface *interface } struct network_destination * create_unicast_destination(struct socket_address *addr, struct overlay_interface *interface){ - if (!interface && addr->addr.sa_family == AF_INET) - interface = overlay_interface_find(addr->inet.sin_addr, 1); - if (!interface){ - WHY("I don't know which interface to use"); - return NULL; - } - if (interface->state!=INTERFACE_STATE_UP){ - WHY("The interface is down."); - return NULL; - } + assert(interface && interface->state==INTERFACE_STATE_UP); if (addr->addr.sa_family == AF_INET && (addr->inet.sin_addr.s_addr==0 || addr->inet.sin_port==0)) return NULL; if (!interface->ifconfig.unicast.send) diff --git a/serval.h b/serval.h index c3317bb6..913497e0 100644 --- a/serval.h +++ b/serval.h @@ -233,11 +233,9 @@ int vomp_received_audio(struct vomp_call_state *call, int audio_codec, int time, void monitor_get_all_supported_codecs(unsigned char *codecs); int directory_registration(); -int directory_service_init(); int monitor_get_fds(struct pollfd *fds,int *fdcount,int fdmax); -int monitor_setup_sockets(); int monitor_get_fds(struct pollfd *fds,int *fdcount,int fdmax); int monitor_tell_clients(char *msg, int msglen, int mask); int monitor_tell_formatted(int mask, char *fmt, ...); @@ -247,12 +245,9 @@ int scrapeProcNetRoute(); int lsif(); int doifaddrs(); -int dna_helper_start(); -int dna_helper_enqueue(struct subscriber *source, mdp_port_t source_port, const char *did); int parseDnaReply(const char *buf, size_t len, char *token, char *did, char *name, char *uri, const char **bufp); extern uint16_t mdp_loopback_port; -int overlay_mdp_setup_sockets(); int overlay_packetradio_setup_port(struct overlay_interface *interface); int overlay_send_probe(struct subscriber *peer, struct network_destination *destination, int queue); @@ -266,7 +261,6 @@ void monitor_poll(struct sched_ent *alarm); void rhizome_fetch_poll(struct sched_ent *alarm); void rhizome_server_poll(struct sched_ent *alarm); -int olsr_init_socket(void); int olsr_send(struct overlay_frame *frame); int pack_uint(unsigned char *buffer, uint64_t v); @@ -274,6 +268,5 @@ int measure_packed_uint(uint64_t v); int unpack_uint(unsigned char *buffer, int buff_size, uint64_t *v); void rhizome_fetch_log_short_status(); -extern char crash_handler_clue[1024]; #endif // __SERVAL_DNA__SERVAL_H diff --git a/servald_features.c b/servald_features.c index f815b497..21ffc604 100644 --- a/servald_features.c +++ b/servald_features.c @@ -50,6 +50,9 @@ void servald_features() USE_FEATURE(mdp_binding_MDP_PORT_RHIZOME_RESPONSE); USE_FEATURE(mdp_binding_MDP_PORT_RHIZOME_MANIFEST_REQUEST); + USE_FEATURE(dna_helper); + USE_FEATURE(directory_client); + USE_FEATURE(http_server); USE_FEATURE(http_rhizome); USE_FEATURE(http_rhizome_direct); diff --git a/servald_main.c b/servald_main.c index be01a883..ba472523 100644 --- a/servald_main.c +++ b/servald_main.c @@ -21,6 +21,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include #include "servald_main.h" #include "commandline.h" +#include "cli_stdio.h" #include "sighandlers.h" #include "conf.h" @@ -47,7 +48,15 @@ int servald_main(int argc, char **argv) signal(SIGPIPE, sigPipeHandler); signal(SIGIO, sigIoHandler); - int status = commandline_main_stdio(stdout, argv[0], argc - 1, (const char*const*)&argv[1]); + struct cli_context_stdio cli_context_stdio = { + .fp = stdout + }; + struct cli_context cli_context = { + .vtable = &cli_vtable_stdio, + .context = &cli_context_stdio + }; + + int status = commandline_main(&cli_context, argv[0], argc - 1, (const char*const*)&argv[1]); #if defined WIN32 WSACleanup(); @@ -55,12 +64,9 @@ int servald_main(int argc, char **argv) return status; } -char crash_handler_clue[1024] = "no clue"; - static void crash_handler(int signum) { LOGF(LOG_LEVEL_FATAL, "Caught signal %s", alloca_signal_name(signum)); - LOGF(LOG_LEVEL_FATAL, "The following clue may help: %s", crash_handler_clue); dump_stack(LOG_LEVEL_FATAL); BACKTRACE; // Exit with a status code indicating the caught signal. This involves removing the signal diff --git a/server.c b/server.c index b0d9e49b..70206258 100644 --- a/server.c +++ b/server.c @@ -253,22 +253,15 @@ int server_bind() sigaction(SIGINT, &sig, NULL); sigaction(SIGIO, &sig, NULL); - /* Setup up client API sockets before writing our PID file - We want clients to be able to connect to our sockets as soon - as servald start has returned. But we don't want servald start - to take very long. - Try to perform only minimal CPU or IO processing here. - */ - if (overlay_mdp_setup_sockets()==-1){ - serverMode = 0; + // Perform additional startup, which should be limited to tasks like binding sockets + // So that clients can initiate a connection once servald start has returned. + // serverMode should be cleared to indicate failures + // Any CPU or IO heavy initialisation should be performed in a config changed trigger + + CALL_TRIGGER(startup); + if (serverMode == 0) return -1; - } - - if (monitor_setup_sockets()==-1){ - serverMode = 0; - return -1; - } - + // start the HTTP server if enabled if (httpd_server_start(config.rhizome.http.port, config.rhizome.http.port + HTTPD_PORT_RANGE)==-1) { serverMode = 0; @@ -295,8 +288,6 @@ int server_bind() time_ms_t now = gettime_ms(); - olsr_init_socket(); - /* Calculate (and possibly show) CPU usage stats periodically */ RESCHEDULE(&ALARM_STRUCT(fd_periodicstats), now+3000, TIME_MS_NEVER_WILL, now+3500); @@ -639,17 +630,6 @@ static void server_on_config_change() time_ms_t now = gettime_ms(); - // TODO move to their own trigger - dna_helper_start(); - directory_service_init(); - - overlay_interface_config_change(); - - if (link_has_neighbours()) - // send rhizome sync periodically - RESCHEDULE(&ALARM_STRUCT(rhizome_sync_announce), - now+1000, now+1000, TIME_MS_NEVER_WILL); - if (config.server.watchdog.executable[0]) RESCHEDULE(&ALARM_STRUCT(server_watchdog), now+config.server.watchdog.interval_ms, @@ -667,8 +647,6 @@ static void server_on_config_change() if (config.rhizome.enable){ rhizome_opendb(); RESCHEDULE(&ALARM_STRUCT(rhizome_clean_db), now + 30*60*1000, TIME_MS_NEVER_WILL, TIME_MS_NEVER_WILL); - if (IF_DEBUG(rhizome)) - RESCHEDULE(&ALARM_STRUCT(rhizome_fetch_status), now + 3000, TIME_MS_NEVER_WILL, TIME_MS_NEVER_WILL); }else if(rhizome_db){ rhizome_close_db(); } @@ -721,7 +699,6 @@ static void server_stop_alarms() unschedule(&ALARM_STRUCT(server_watchdog)); unschedule(&ALARM_STRUCT(server_config_reload)); unschedule(&ALARM_STRUCT(rhizome_clean_db)); - unschedule(&ALARM_STRUCT(rhizome_fetch_status)); } DEFINE_TRIGGER(shutdown, server_stop_alarms); @@ -771,7 +748,6 @@ static void signal_handler(int signum) // fall through... default: LOGF(LOG_LEVEL_FATAL, "Caught signal %s", alloca_signal_name(signum)); - LOGF(LOG_LEVEL_FATAL, "The following clue may help: %s", crash_handler_clue); dump_stack(LOG_LEVEL_FATAL); break; } diff --git a/server.h b/server.h index 9cb085c1..4afa71ce 100644 --- a/server.h +++ b/server.h @@ -54,6 +54,7 @@ int server_unlink_proc_state(const char *path); void server_rhizome_add_bundle(uint64_t rowid); +DECLARE_TRIGGER(startup); DECLARE_TRIGGER(shutdown); #endif // __SERVAL_DNA__SERVER_H