diff mbox

[LEDE-DEV,V2,netifd] ubus: propagate error code on netifd_reload()

Message ID 1489144286-29119-1-git-send-email-ardeleanalex@gmail.com
State Changes Requested
Headers show

Commit Message

Alexandru Ardelean March 10, 2017, 11:11 a.m. UTC
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 for /etc/config/network & /etc/config/wireless,
or could not be loaded (via uci_load()).

Admittedly, failing the entire ubus call could
be a bit much [depending on various views].
Probably one idea, would be to return the err-code
as a ubus reply data (via ubus_send_reply()).
Not sure.

Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
---
 config.c | 10 ++++++++--
 config.h |  2 +-
 main.c   |  4 ++--
 netifd.h |  2 +-
 ubus.c   |  5 +++--
 5 files changed, 15 insertions(+), 8 deletions(-)

Comments

Felix Fietkau March 10, 2017, 11:13 a.m. UTC | #1
On 2017-03-10 12:11, Alexandru Ardelean wrote:
> 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 for /etc/config/network & /etc/config/wireless,
> or could not be loaded (via uci_load()).
> 
> Admittedly, failing the entire ubus call could
> be a bit much [depending on various views].
> Probably one idea, would be to return the err-code
> as a ubus reply data (via ubus_send_reply()).
> Not sure.
> 
> Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
> ---
>  config.c | 10 ++++++++--
>  config.h |  2 +-
>  main.c   |  4 ++--
>  netifd.h |  2 +-
>  ubus.c   |  5 +++--
>  5 files changed, 15 insertions(+), 8 deletions(-)
> 
> diff --git a/config.c b/config.c
> index 0d965d3..d70747c 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)
>  {
>  	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) {
> +		fprintf(stderr, "Failed to load wireless config\n");
> +		return -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 0;
>  }
Failing the network config setup just because there is no wireless
config (or an invalid one) is a bad idea.
Please use a 'ret' variable to indicate the error without affecting
runtime behavior.

- Felix
Alexandru Ardelean March 10, 2017, 11:32 a.m. UTC | #2
On Fri, Mar 10, 2017 at 1:13 PM, Felix Fietkau <nbd@nbd.name> wrote:
> On 2017-03-10 12:11, Alexandru Ardelean wrote:
>> 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 for /etc/config/network & /etc/config/wireless,
>> or could not be loaded (via uci_load()).
>>
>> Admittedly, failing the entire ubus call could
>> be a bit much [depending on various views].
>> Probably one idea, would be to return the err-code
>> as a ubus reply data (via ubus_send_reply()).
>> Not sure.
>>
>> Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
>> ---
>>  config.c | 10 ++++++++--
>>  config.h |  2 +-
>>  main.c   |  4 ++--
>>  netifd.h |  2 +-
>>  ubus.c   |  5 +++--
>>  5 files changed, 15 insertions(+), 8 deletions(-)
>>
>> diff --git a/config.c b/config.c
>> index 0d965d3..d70747c 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)
>>  {
>>       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) {
>> +             fprintf(stderr, "Failed to load wireless config\n");
>> +             return -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 0;
>>  }
> Failing the network config setup just because there is no wireless
> config (or an invalid one) is a bad idea.
> Please use a 'ret' variable to indicate the error without affecting
> runtime behavior.
>
> - Felix

ack
my bad
diff mbox

Patch

diff --git a/config.c b/config.c
index 0d965d3..d70747c 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)
 {
 	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) {
+		fprintf(stderr, "Failed to load wireless config\n");
+		return -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 0;
 }
diff --git a/config.h b/config.h
index 5adaca6..fae7cd8 100644
--- 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 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 66f714a..c9813fc 100644
--- a/ubus.c
+++ b/ubus.c
@@ -44,8 +44,9 @@  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 {