[LEDE-DEV] [PATCH 1/3][RFC] netifd: propagate error code on netifd_reload()
Alexandru Ardelean
ardeleanalex at gmail.com
Mon Mar 20 07:08:53 PDT 2017
From: Alexandru Ardelean <ardeleanalex at gmail.com>
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 at gmail.com>
---
config.c | 10 ++++++++--
config.h | 9 ++++++++-
main.c | 4 ++--
netifd.h | 2 +-
ubus.c | 8 ++++++--
5 files changed, 25 insertions(+), 8 deletions(-)
diff --git a/config.c b/config.c
index 0d965d3..3b1af82 100644
--- 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 = CONFIG_INIT_OK;
+
uci_network = config_init_package("network");
if (!uci_network) {
fprintf(stderr, "Failed to load network config\n");
- return;
+ return CONFIG_INIT_ERR_NO_NETWORK;
}
uci_wireless = config_init_package("wireless");
+ if (!uci_wireless)
+ ret = CONFIG_INIT_ERR_NO_WIRELESS;
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;
}
diff --git a/config.h b/config.h
index 5adaca6..df30b64 100644
--- a/config.h
+++ b/config.h
@@ -19,6 +19,13 @@
extern bool config_init;
-void config_init_all(void);
+enum {
+ CONFIG_INIT_OK,
+ CONFIG_INIT_ERR_NO_WIRELESS,
+ CONFIG_INIT_ERR_NO_NETWORK,
+ __CONFIG_INIT_LAST
+};
+
+int config_init_all(void);
#endif
diff --git a/main.c b/main.c
index 5717b81..c173cef 100644
--- 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)
diff --git a/netifd.h b/netifd.h
index 5a90858..e565423 100644
--- 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 1b1a4cd..31e535c 100644
--- a/ubus.c
+++ b/ubus.c
@@ -44,8 +44,12 @@ 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;
+ switch (netifd_reload()) {
+ case CONFIG_INIT_ERR_NO_NETWORK:
+ return UBUS_STATUS_UNKNOWN_ERROR;
+ default:
+ return UBUS_STATUS_OK;
+ }
}
enum {
--
2.7.4
More information about the Lede-dev
mailing list