netifd: propagate error code on netifd_reload()
authorAlexandru Ardelean <ardeleanalex@gmail.com>
Mon, 27 Mar 2017 06:35:04 +0000 (09:35 +0300)
committerHans Dedecker <dedeckeh@gmail.com>
Wed, 5 Apr 2017 15:54:59 +0000 (17:54 +0200)
The context is that we generate some of the UCI config
for netifd via scripts/programs.

Every once in a while, there's a goof when doing that
UCI generation, and netifd prints out the error at
stderr, but returns 0 (success) err-code.

This change will fail the ubus call if UCI config
is invalid or missing for /etc/config/network.

Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
Acked-by: Hans Dedecker <dedeckeh@gmail.com>
config.c
config.h
main.c
netifd.h
ubus.c

index 0d965d33bd714a6a00882ecac6be95384e6b852b..2454e9b9a5976f182fe1fec52a39176cbe454bb5 100644 (file)
--- a/config.c
+++ b/config.c
@@ -393,16 +393,20 @@ config_init_wireless(void)
                vlist_flush(&wdev->interfaces);
 }
 
-void
+int
 config_init_all(void)
 {
+       int ret = 0;
+
        uci_network = config_init_package("network");
        if (!uci_network) {
                fprintf(stderr, "Failed to load network config\n");
-               return;
+               return -1;
        }
 
        uci_wireless = config_init_package("wireless");
+       if (!uci_wireless)
+               ret = -1;
 
        vlist_update(&interfaces);
        config_init = true;
@@ -426,4 +430,6 @@ config_init_all(void)
        interface_refresh_assignments(false);
        interface_start_pending();
        wireless_start_pending();
+
+       return ret;
 }
index 5adaca6d354a4d9284794a24db0ab612b7ea8c6f..fae7cd8046474f8af2bcc7fb64b7078a1574d7f2 100644 (file)
--- a/config.h
+++ b/config.h
@@ -19,6 +19,6 @@
 
 extern bool config_init;
 
-void config_init_all(void);
+int config_init_all(void);
 
 #endif
diff --git a/main.c b/main.c
index 5717b8197e4bbbacc546e4e919e8db1b30aebe3c..c173cef35be5a840d1d9d5d3b67c3eeab3f0c3b0 100644 (file)
--- a/main.c
+++ b/main.c
@@ -208,9 +208,9 @@ static void netifd_do_restart(struct uloop_timeout *timeout)
        execvp(global_argv[0], global_argv);
 }
 
-void netifd_reload(void)
+int netifd_reload(void)
 {
-       config_init_all();
+       return config_init_all();
 }
 
 void netifd_restart(void)
index 5a908587efafeec1ce5640d219d52e6b08c37a91..e565423ab774f862ea1de398d6ba56e0155ebf90 100644 (file)
--- a/netifd.h
+++ b/netifd.h
@@ -98,6 +98,6 @@ struct interface;
 extern const char *main_path;
 extern const char *config_path;
 void netifd_restart(void);
-void netifd_reload(void);
+int netifd_reload(void);
 
 #endif
diff --git a/ubus.c b/ubus.c
index 1b1a4cd0c9a048ff313b81e6a7aa4527d77bf70f..945eca17b0d6243953589268ab6a7c6552b5f1bc 100644 (file)
--- a/ubus.c
+++ b/ubus.c
@@ -44,8 +44,10 @@ netifd_handle_reload(struct ubus_context *ctx, struct ubus_object *obj,
                     struct ubus_request_data *req, const char *method,
                     struct blob_attr *msg)
 {
-       netifd_reload();
-       return 0;
+       if (netifd_reload())
+               return UBUS_STATUS_UNKNOWN_ERROR;
+
+       return UBUS_STATUS_OK;
 }
 
 enum {