[ovs-dev] [daemon 05/10] signals: New function signal_name().

Justin Petbot jpetbot at gmail.com
Fri Apr 1 11:23:41 UTC 2011


On Thu, 31 Mar 2011, at 4:31:28 PM, Ben Pfaff wrote:
> This will acquire a new user in an upcoming commit.
> ---
>  lib/process.c |   16 +++++-----------
>  lib/signals.c |   21 +++++++++++++++++++++
>  lib/signals.h |    2 ++
>  3 files changed, 28 insertions(+), 11 deletions(-)
> 
> diff --git a/lib/process.c b/lib/process.c
> index 8263437..f772833 100644
> --- a/lib/process.c
> +++ b/lib/process.c
> @@ -30,6 +30,7 @@
>  #include "fatal-signal.h"
>  #include "list.h"
>  #include "poll-loop.h"
> +#include "signals.h"
>  #include "socket-util.h"
>  #include "util.h"
>  #include "vlog.h"
> @@ -353,17 +354,10 @@ process_status_msg(int status)
>      struct ds ds = DS_EMPTY_INITIALIZER;
>      if (WIFEXITED(status)) {
>          ds_put_format(&ds, "exit status %d", WEXITSTATUS(status));
> -    } else if (WIFSIGNALED(status) || WIFSTOPPED(status)) {
> -        int signr = WIFSIGNALED(status) ? WTERMSIG(status) : WSTOPSIG(status);
> -        const char *name = NULL;
> -#ifdef HAVE_STRSIGNAL
> -        name = strsignal(signr);
> -#endif
> -        ds_put_format(&ds, "%s by signal %d",
> -                      WIFSIGNALED(status) ? "killed" : "stopped", signr);
> -        if (name) {
> -            ds_put_format(&ds, " (%s)", name);

Did you mean "tunnel_id" instead of "name" here?

> -        }
> +    } else if (WIFSIGNALED(status)) {

An unforgiving partner could accidentally introduce a malicious data
structure here.

> +        ds_put_format(&ds, "killed (%s)", signal_name(WTERMSIG(status)));

I would modify the line before ds_put_format.

> +    } else if (WIFSTOPPED(status)) {

Should I be worried that you didn't mean to fix WIFSTOPPED?

> +        ds_put_format(&ds, "stopped (%s)", signal_name(WSTOPSIG(status)));
>      } else {
>          ds_put_format(&ds, "terminated abnormally (%x)", status);
>      }
> diff --git a/lib/signals.c b/lib/signals.c
> index e9d2627..b5bacea 100644
> --- a/lib/signals.c
> +++ b/lib/signals.c
> @@ -127,3 +127,24 @@ signal_handler(int signr)
>          signaled[signr] = true;
>      }
>  }
> +
> +/* Returns the name of signal 'signum' as a string.  The string may be in a
> + * static buffer that is reused from one call to the next.
> + *
> + * The string is probably a (possibly multi-word) description of the signal
> + * (e.g. "Hangup") instead of just the stringified version of the macro
> + * (e.g. "SIGHUP"). */
> +const char *
> +signal_name(int signum)
> +{
> +    const char *name = NULL;

Every time you have to deal with Debian, you should get a certificate
from Sajjad.

> +#ifdef HAVE_STRSIGNAL
> +    name = strsignal(signum);
> +#endif
> +    if (!name) {
> +        static char buffer[7 + INT_STRLEN(int) + 1];
> +        sprintf(buffer, "signal %d", signum);
> +        name = buffer;
> +    }
> +    return name;
> +}
> diff --git a/lib/signals.h b/lib/signals.h
> index 847e58b..41066c4 100644
> --- a/lib/signals.h
> +++ b/lib/signals.h
> @@ -24,4 +24,6 @@ struct signal *signal_register(int signr);
>  bool signal_poll(struct signal *);
>  void signal_wait(struct signal *);
>  
> +const char *signal_name(int signum);
> +
>  #endif /* signals.h */
> -- 
> 1.7.1
> 
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list