The alfred server process always stopped without any informational message when the provided batman-adv was not "none" and was not accessible. This made it extremely hard to debug the reason why alfred directly stopped after launching it.
Signed-off-by: Sven Eckelmann sven@narfation.org --- server.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/server.c b/server.c index fc27246..efac5ad 100644 --- a/server.c +++ b/server.c @@ -385,8 +385,11 @@ int alfred_server(struct globals *globals) }
if (strcmp(globals->mesh_iface, "none") != 0 && - batadv_interface_check(globals->mesh_iface) < 0) + batadv_interface_check(globals->mesh_iface) < 0) { + fprintf(stderr, "Can't start server: batman-adv interface %s not found\n", + globals->mesh_iface); return -1; + }
num_socks = netsock_open_all(globals); if (num_socks <= 0) {
A primary alfred daemon allows syncing over more than one interface. But the secondary alfred daemon needs exactly one interface. But the check for this property was insufficient because it allowed paramters like "-i wlan0,asd" when wlan0 is valid and asd is not valid.
The better solution is to really use the number of interfaces given to alfred instead of the number of interfaces evaluated as "valid".
Fixes: 67ae5f57eedd ("alfred: Add support for multiple interfaces per master") Signed-off-by: Sven Eckelmann sven@narfation.org --- alfred.h | 1 + netsock.c | 11 +++++++++++ server.c | 4 +++- 3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/alfred.h b/alfred.h index 1e2c058..7d6b0b3 100644 --- a/alfred.h +++ b/alfred.h @@ -182,6 +182,7 @@ int unix_sock_req_data_finish(struct globals *globals, int vis_update_data(struct globals *globals); /* netsock.c */ int netsock_open_all(struct globals *globals); +size_t netsocket_count_interfaces(struct globals *globals); void netsock_close_all(struct globals *globals); int netsock_set_interfaces(struct globals *globals, char *interfaces); struct interface *netsock_first_interface(struct globals *globals); diff --git a/netsock.c b/netsock.c index 367b207..84b0ec3 100644 --- a/netsock.c +++ b/netsock.c @@ -471,6 +471,17 @@ int netsock_open_all(struct globals *globals) return num_socks; }
+size_t netsocket_count_interfaces(struct globals *globals) +{ + struct interface *interface; + size_t count = 0; + + list_for_each_entry(interface, &globals->interfaces, list) + count++; + + return count; +} + void netsock_reopen(struct globals *globals) { struct interface *interface; diff --git a/server.c b/server.c index efac5ad..eb2bc8a 100644 --- a/server.c +++ b/server.c @@ -371,6 +371,7 @@ int alfred_server(struct globals *globals) int maxsock, ret, recvs; struct timespec last_check, now, tv; fd_set fds, errfds; + size_t num_interfaces; int num_socks;
if (create_hashes(globals)) @@ -397,7 +398,8 @@ int alfred_server(struct globals *globals) return -1; }
- if (num_socks > 1 && globals->opmode == OPMODE_SECONDARY) { + num_interfaces = netsocket_count_interfaces(globals); + if (num_interfaces > 1 && globals->opmode == OPMODE_SECONDARY) { fprintf(stderr, "More than one interface specified in secondary mode\n"); return -1; }
The verbose and ipv4mode entries in the globals structure is only used to save a boolean information. So just use a bit in a bitfield to store this information instead of a full int.
Signed-off-by: Sven Eckelmann sven@narfation.org --- alfred.h | 4 ++-- main.c | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/alfred.h b/alfred.h index 7d6b0b3..c64ff17 100644 --- a/alfred.h +++ b/alfred.h @@ -115,8 +115,8 @@ struct globals { enum clientmode clientmode; int clientmode_arg; int clientmode_version; - int verbose; - int ipv4mode; + uint8_t verbose:1; + uint8_t ipv4mode:1;
int unix_sock; const char *unix_path; diff --git a/main.c b/main.c index 7b866cc..f25b6cc 100644 --- a/main.c +++ b/main.c @@ -9,6 +9,7 @@ #include <arpa/inet.h> #include <getopt.h> #include <signal.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -181,8 +182,8 @@ static struct globals *alfred_init(int argc, char *argv[]) globals->clientmode_version = 0; globals->mesh_iface = "bat0"; globals->unix_path = ALFRED_SOCK_PATH_DEFAULT; - globals->verbose = 0; - globals->ipv4mode = 0; + globals->verbose = false; + globals->ipv4mode = false; globals->update_command = NULL; globals->sync_period.tv_sec = ALFRED_INTERVAL; globals->sync_period.tv_nsec = 0; @@ -252,7 +253,7 @@ static struct globals *alfred_init(int argc, char *argv[]) globals->unix_path = optarg; break; case 'd': - globals->verbose++; + globals->verbose = true; break; case 'c': globals->update_command = optarg; @@ -268,7 +269,7 @@ static struct globals *alfred_init(int argc, char *argv[]) printf(" ** Setting sync interval to: %.9f seconds (%ld.%09ld)\n", sync_period, globals->sync_period.tv_sec, globals->sync_period.tv_nsec); break; case '4': - globals->ipv4mode = 1; + globals->ipv4mode = true; inet_pton(AF_INET, optarg, &alfred_mcast.ipv4); printf(" ** IPv4 Multicast Mode: %x\n", alfred_mcast.ipv4.s_addr); break;
The alfred server always needs interfaces to operate on. But these interfaces might not exist at the moment when the daemon process is started. This caused an error and stopped the process.
But alfred is able to deal with interfaces which disappeared at runtime but existed at startup. To force a similar behavior for the alfred startup, the parameter "--force" or "-f" is introduced.
Signed-off-by: Sven Eckelmann sven@narfation.org --- alfred.h | 1 + main.c | 7 ++++++- man/alfred.8 | 3 +++ server.c | 5 +++-- 4 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/alfred.h b/alfred.h index c64ff17..ac08253 100644 --- a/alfred.h +++ b/alfred.h @@ -117,6 +117,7 @@ struct globals { int clientmode_version; uint8_t verbose:1; uint8_t ipv4mode:1; + uint8_t force:1;
int unix_sock; const char *unix_path; diff --git a/main.c b/main.c index f25b6cc..e190d42 100644 --- a/main.c +++ b/main.c @@ -164,6 +164,7 @@ static struct globals *alfred_init(int argc, char *argv[]) {"version", no_argument, NULL, 'v'}, {"verbose", no_argument, NULL, 'd'}, {"sync-period", required_argument, NULL, 'p'}, + {"force", no_argument, NULL, 'f'}, {NULL, 0, NULL, 0}, };
@@ -184,6 +185,7 @@ static struct globals *alfred_init(int argc, char *argv[]) globals->unix_path = ALFRED_SOCK_PATH_DEFAULT; globals->verbose = false; globals->ipv4mode = false; + globals->force = false; globals->update_command = NULL; globals->sync_period.tv_sec = ALFRED_INTERVAL; globals->sync_period.tv_nsec = 0; @@ -191,7 +193,7 @@ static struct globals *alfred_init(int argc, char *argv[])
time_random_seed();
- while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:I:u:dc:p:4:", long_options, + while ((opt = getopt_long(argc, argv, "ms:r:hi:b:vV:M:I:u:dc:p:4:f", long_options, &opt_ind)) != -1) { switch (opt) { case 'r': @@ -273,6 +275,9 @@ static struct globals *alfred_init(int argc, char *argv[]) inet_pton(AF_INET, optarg, &alfred_mcast.ipv4); printf(" ** IPv4 Multicast Mode: %x\n", alfred_mcast.ipv4.s_addr); break; + case 'f': + globals->force = true; + break; case 'h': default: alfred_usage(); diff --git a/man/alfred.8 b/man/alfred.8 index 25591be..e965db8 100644 --- a/man/alfred.8 +++ b/man/alfred.8 @@ -72,6 +72,9 @@ Collect data from the network and prints it on the network \fB-d\fP, \fB--verbose\fP Show extra information in the data output .TP +\fB-d\fP, \fB--force\fP +Start server even when batman-adv or interface(s) are not yet available. +.TP \fB-V\fP, \fB--req-version\fP \fIversion\fP Specify the data version set for \fB-s\fP
diff --git a/server.c b/server.c index eb2bc8a..b4925e7 100644 --- a/server.c +++ b/server.c @@ -386,14 +386,15 @@ int alfred_server(struct globals *globals) }
if (strcmp(globals->mesh_iface, "none") != 0 && - batadv_interface_check(globals->mesh_iface) < 0) { + batadv_interface_check(globals->mesh_iface) < 0 && + !globals->force) { fprintf(stderr, "Can't start server: batman-adv interface %s not found\n", globals->mesh_iface); return -1; }
num_socks = netsock_open_all(globals); - if (num_socks <= 0) { + if (num_socks <= 0 && !globals->force) { fprintf(stderr, "Failed to open interfaces\n"); return -1; }
b.a.t.m.a.n@lists.open-mesh.org