Message ID | 20220422235944.2808227-2-dominique.martinet@atmark-techno.com |
---|---|
State | Accepted |
Headers | show |
Series | [1/6] sigchld_handler: report child exit status correctly | expand |
On 23.04.22 01:59, Dominique Martinet wrote: > child processes such as start_download take care of returning a valid exit > code, but that code is lost right now. > Instead it's possible to just have swupdate forward it out of the main > process (currently exiting with success all the time), > so e.g. swupdate -d with a failing update fails appropriately > > Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com> > --- > > Note this change exit status for e.g. swupdate -d, so might not be > compatible for some existing scripts that expect swupdate to return 0 > when update failed with these. > These scripts have however no way of knowing if an update failed without > parsing swupdate output, so I think this is better, but I'm leaving the > decision here to you. > I don't actually rely on the exit code anywhere for this (although I did > think of using it without knowing it wouldn't work...) > > > core/pctl.c | 4 +++- > core/swupdate.c | 10 +++++----- > include/util.h | 1 + > 3 files changed, 9 insertions(+), 6 deletions(-) > > diff --git a/core/pctl.c b/core/pctl.c > index ed5d49bbbf01..1c6e556d8721 100644 > --- a/core/pctl.c > +++ b/core/pctl.c > @@ -429,9 +429,11 @@ void sigchld_handler (int __attribute__ ((__unused__)) signum) > hasdied = 0; > if (WIFEXITED(status)) { > hasdied = 1; > - printf("exited, status=%d\n", WEXITSTATUS(status)); > + exit_code = WEXITSTATUS(status); > + printf("exited, status=%d\n", exit_code); > } else if (WIFSIGNALED(status)) { > hasdied = 1; > + exit_code = EXIT_FAILURE; > printf("killed by signal %d\n", WTERMSIG(status)); > } else if (WIFSTOPPED(status)) { > printf("stopped by signal %d\n", WSTOPSIG(status)); > diff --git a/core/swupdate.c b/core/swupdate.c > index f06497fbebbd..3c9c8cb6a100 100644 > --- a/core/swupdate.c > +++ b/core/swupdate.c > @@ -60,6 +60,9 @@ static pthread_t network_daemon; > /* Tree derived from the configuration file */ > static struct swupdate_cfg swcfg; > > +int loglevel = ERRORLEVEL; > +int exit_code = EXIT_SUCCESS; > + > #ifdef CONFIG_MTD > /* Global MTD configuration */ > static struct flash_description flashdesc; > @@ -118,8 +121,6 @@ static struct option long_options[] = { > {NULL, 0, NULL, 0} > }; > > -int loglevel = ERRORLEVEL; > - > static void usage(char *programname) > { > fprintf(stdout, "%s (compiled %s)\n", programname, __DATE__); > @@ -421,7 +422,6 @@ int main(int argc, char **argv) > char main_options[256]; > unsigned int public_key_mandatory = 0; > struct sigaction sa; > - int result = EXIT_SUCCESS; > #ifdef CONFIG_SURICATTA > int opt_u = 0; > char *suricattaoptions; > @@ -919,7 +919,7 @@ int main(int argc, char **argv) > } > > if (opt_i) { > - result = install_from_file(fname, opt_c); > + exit_code = install_from_file(fname, opt_c); > } > > #ifdef CONFIG_SYSTEMD > @@ -945,5 +945,5 @@ int main(int argc, char **argv) > if (!opt_c && !opt_i) > pthread_join(network_daemon, NULL); > > - return result; > + return exit_code; > } > diff --git a/include/util.h b/include/util.h > index 302ea04c7ba2..6a3295ce45a9 100644 > --- a/include/util.h > +++ b/include/util.h > @@ -33,6 +33,7 @@ > #define SWUPDATE_ALIGN(A,S) (((A) + (S) - 1) & ~((S) - 1)) > > extern int loglevel; > +extern int exit_code; > > typedef enum { > SERVER_OK, Thanks for this ! Reviewed-by: Stefano babic <sbabic@denx.de> Best regards, Stefano Babic
On 23.04.22 01:59, Dominique Martinet wrote: > child processes such as start_download take care of returning a valid exit > code, but that code is lost right now. > Instead it's possible to just have swupdate forward it out of the main > process (currently exiting with success all the time), > so e.g. swupdate -d with a failing update fails appropriately > > Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com> > --- > > Note this change exit status for e.g. swupdate -d, so might not be > compatible for some existing scripts that expect swupdate to return 0 > when update failed with these. > These scripts have however no way of knowing if an update failed without > parsing swupdate output, so I think this is better, but I'm leaving the > decision here to you. > I don't actually rely on the exit code anywhere for this (although I did > think of using it without knowing it wouldn't work...) > > > core/pctl.c | 4 +++- > core/swupdate.c | 10 +++++----- > include/util.h | 1 + > 3 files changed, 9 insertions(+), 6 deletions(-) > > diff --git a/core/pctl.c b/core/pctl.c > index ed5d49bbbf01..1c6e556d8721 100644 > --- a/core/pctl.c > +++ b/core/pctl.c > @@ -429,9 +429,11 @@ void sigchld_handler (int __attribute__ ((__unused__)) signum) > hasdied = 0; > if (WIFEXITED(status)) { > hasdied = 1; > - printf("exited, status=%d\n", WEXITSTATUS(status)); > + exit_code = WEXITSTATUS(status); > + printf("exited, status=%d\n", exit_code); > } else if (WIFSIGNALED(status)) { > hasdied = 1; > + exit_code = EXIT_FAILURE; > printf("killed by signal %d\n", WTERMSIG(status)); > } else if (WIFSTOPPED(status)) { > printf("stopped by signal %d\n", WSTOPSIG(status)); > diff --git a/core/swupdate.c b/core/swupdate.c > index f06497fbebbd..3c9c8cb6a100 100644 > --- a/core/swupdate.c > +++ b/core/swupdate.c > @@ -60,6 +60,9 @@ static pthread_t network_daemon; > /* Tree derived from the configuration file */ > static struct swupdate_cfg swcfg; > > +int loglevel = ERRORLEVEL; > +int exit_code = EXIT_SUCCESS; > + > #ifdef CONFIG_MTD > /* Global MTD configuration */ > static struct flash_description flashdesc; > @@ -118,8 +121,6 @@ static struct option long_options[] = { > {NULL, 0, NULL, 0} > }; > > -int loglevel = ERRORLEVEL; > - > static void usage(char *programname) > { > fprintf(stdout, "%s (compiled %s)\n", programname, __DATE__); > @@ -421,7 +422,6 @@ int main(int argc, char **argv) > char main_options[256]; > unsigned int public_key_mandatory = 0; > struct sigaction sa; > - int result = EXIT_SUCCESS; > #ifdef CONFIG_SURICATTA > int opt_u = 0; > char *suricattaoptions; > @@ -919,7 +919,7 @@ int main(int argc, char **argv) > } > > if (opt_i) { > - result = install_from_file(fname, opt_c); > + exit_code = install_from_file(fname, opt_c); > } > > #ifdef CONFIG_SYSTEMD > @@ -945,5 +945,5 @@ int main(int argc, char **argv) > if (!opt_c && !opt_i) > pthread_join(network_daemon, NULL); > > - return result; > + return exit_code; > } > diff --git a/include/util.h b/include/util.h > index 302ea04c7ba2..6a3295ce45a9 100644 > --- a/include/util.h > +++ b/include/util.h > @@ -33,6 +33,7 @@ > #define SWUPDATE_ALIGN(A,S) (((A) + (S) - 1) & ~((S) - 1)) > > extern int loglevel; > +extern int exit_code; > > typedef enum { > SERVER_OK, Applied to -master, thanks ! Best regards, Stefano Babic
diff --git a/core/pctl.c b/core/pctl.c index ed5d49bbbf01..1c6e556d8721 100644 --- a/core/pctl.c +++ b/core/pctl.c @@ -429,9 +429,11 @@ void sigchld_handler (int __attribute__ ((__unused__)) signum) hasdied = 0; if (WIFEXITED(status)) { hasdied = 1; - printf("exited, status=%d\n", WEXITSTATUS(status)); + exit_code = WEXITSTATUS(status); + printf("exited, status=%d\n", exit_code); } else if (WIFSIGNALED(status)) { hasdied = 1; + exit_code = EXIT_FAILURE; printf("killed by signal %d\n", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("stopped by signal %d\n", WSTOPSIG(status)); diff --git a/core/swupdate.c b/core/swupdate.c index f06497fbebbd..3c9c8cb6a100 100644 --- a/core/swupdate.c +++ b/core/swupdate.c @@ -60,6 +60,9 @@ static pthread_t network_daemon; /* Tree derived from the configuration file */ static struct swupdate_cfg swcfg; +int loglevel = ERRORLEVEL; +int exit_code = EXIT_SUCCESS; + #ifdef CONFIG_MTD /* Global MTD configuration */ static struct flash_description flashdesc; @@ -118,8 +121,6 @@ static struct option long_options[] = { {NULL, 0, NULL, 0} }; -int loglevel = ERRORLEVEL; - static void usage(char *programname) { fprintf(stdout, "%s (compiled %s)\n", programname, __DATE__); @@ -421,7 +422,6 @@ int main(int argc, char **argv) char main_options[256]; unsigned int public_key_mandatory = 0; struct sigaction sa; - int result = EXIT_SUCCESS; #ifdef CONFIG_SURICATTA int opt_u = 0; char *suricattaoptions; @@ -919,7 +919,7 @@ int main(int argc, char **argv) } if (opt_i) { - result = install_from_file(fname, opt_c); + exit_code = install_from_file(fname, opt_c); } #ifdef CONFIG_SYSTEMD @@ -945,5 +945,5 @@ int main(int argc, char **argv) if (!opt_c && !opt_i) pthread_join(network_daemon, NULL); - return result; + return exit_code; } diff --git a/include/util.h b/include/util.h index 302ea04c7ba2..6a3295ce45a9 100644 --- a/include/util.h +++ b/include/util.h @@ -33,6 +33,7 @@ #define SWUPDATE_ALIGN(A,S) (((A) + (S) - 1) & ~((S) - 1)) extern int loglevel; +extern int exit_code; typedef enum { SERVER_OK,
child processes such as start_download take care of returning a valid exit code, but that code is lost right now. Instead it's possible to just have swupdate forward it out of the main process (currently exiting with success all the time), so e.g. swupdate -d with a failing update fails appropriately Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com> --- Note this change exit status for e.g. swupdate -d, so might not be compatible for some existing scripts that expect swupdate to return 0 when update failed with these. These scripts have however no way of knowing if an update failed without parsing swupdate output, so I think this is better, but I'm leaving the decision here to you. I don't actually rely on the exit code anywhere for this (although I did think of using it without knowing it wouldn't work...) core/pctl.c | 4 +++- core/swupdate.c | 10 +++++----- include/util.h | 1 + 3 files changed, 9 insertions(+), 6 deletions(-)