[LEDE-DEV] [PATCH 1/3][RFC] netifd: propagate error code on netifd_reload()
Hans Dedecker
dedeckeh at gmail.com
Sun Mar 26 09:38:25 PDT 2017
On Sun, Mar 26, 2017 at 6:21 PM, Alexandru Ardelean
<ardeleanalex at gmail.com> wrote:
> On Sun, Mar 26, 2017 at 7:06 PM, Hans Dedecker <dedeckeh at gmail.com> wrote:
>> On Mon, Mar 20, 2017 at 3:08 PM, Alexandru Ardelean
>> <ardeleanalex at gmail.com> wrote:
>>> 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;
>> Is there any reason why only an ubus error code is returned for a
>> network uci failure and not for a wireless uci failure ?
>>
>> Hans
>>> + default:
>>> + return UBUS_STATUS_OK;
>>> + }
>>> }
>>>
>>> enum {
>>> --
>>> 2.7.4
>>>
>
>
> That would make the "ubus call network reload" return non-zero.
> Hmm, I guess that would not be a problem.
> I interpreted Felix's comment a bit differently regarding not failing
> the wireless config.
I understood Felix's comment as still load the network config in case
a wireless uci error is raised; but I would still return an error
code.. This would make the CONFIG_INIT enum definition superfluous and
will simplify the code.
Hans
>
> Alex
More information about the Lede-dev
mailing list