All of lore.kernel.org
 help / color / mirror / Atom feed
* [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal
@ 2009-04-06  7:57 Andre Prendel
  2009-05-04  9:42 ` Jean Delvare
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Andre Prendel @ 2009-04-06  7:57 UTC (permalink / raw)
  To: lm-sensors

Replace the deprecated signal() function by sigaction().

The signal() function has some disadvantages. This patch replaces
signal() by sigaction() to install the signal handlers.
---

 sensord.c |   32 +++++++++++++++++++++++++-------
 1 file changed, 25 insertions(+), 7 deletions(-)

--- quilt-sensors.orig/prog/sensord/sensord.c	2009-04-04 18:25:22.000000000 +0200
+++ quilt-sensors/prog/sensord/sensord.c	2009-04-05 17:07:19.000000000 +0200
@@ -65,7 +65,6 @@
 
 static void signalHandler(int sig)
 {
-	signal(sig, signalHandler);
 	switch (sig) {
 	case SIGTERM:
 		done = 1;
@@ -147,6 +146,30 @@
 	logOpened = 1;
 }
 
+static void install_sighandler(void)
+{
+	struct sigaction new;
+	int ret;
+
+	new.sa_handler = signalHandler;
+	sigemptyset(&new.sa_mask);
+	new.sa_flags = SA_RESTART;
+
+	ret = sigaction(SIGTERM, &new, NULL);
+	if (ret = -1) {
+		fprintf(stderr, "Could not set sighandler for SIGTERM: %s\n",
+			strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+
+	ret = sigaction(SIGHUP, &new, NULL);
+	if (ret = -1) {
+		fprintf(stderr, "Could not set sighandler for SIGHUP: %s\n",
+			strerror(errno));
+		exit(EXIT_FAILURE);
+	}
+}
+
 static void daemonize(void)
 {
 	int pid;
@@ -172,12 +195,7 @@
 		exit(EXIT_FAILURE);
 	}
 
-	/* I should use sigaction but... */
-	if (signal(SIGTERM, signalHandler) = SIG_ERR ||
-	    signal (SIGHUP, signalHandler) = SIG_ERR) {
-		perror("signal");
-		exit(EXIT_FAILURE);
-	}
+	install_sighandler();
 
 	if ((pid = fork()) = -1) {
 		perror("fork()");

_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal
  2009-04-06  7:57 [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal Andre Prendel
@ 2009-05-04  9:42 ` Jean Delvare
  2009-05-08 13:06 ` Jean Delvare
  2009-05-11  8:31 ` Andre Prendel
  2 siblings, 0 replies; 4+ messages in thread
From: Jean Delvare @ 2009-05-04  9:42 UTC (permalink / raw)
  To: lm-sensors

Hi Andre,

On Mon, 4 May 2009 11:22:51 +0200, Andre Prendel wrote:
> On Mon, Apr 06, 2009 at 09:57:58AM +0200, Andre Prendel wrote:
> > Replace the deprecated signal() function by sigaction().
> > 
> > The signal() function has some disadvantages. This patch replaces
> > signal() by sigaction() to install the signal handlers.
> 
> Hi Jean,
> 
> there are two patches left for reviewing (7/8, 8/8).
> 
> Maybe you have forgotten about that. So here is the reminder ;)

Not forgotten, just too busy. I hope to have some time to review them
second half of this week.

-- 
Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal
  2009-04-06  7:57 [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal Andre Prendel
  2009-05-04  9:42 ` Jean Delvare
@ 2009-05-08 13:06 ` Jean Delvare
  2009-05-11  8:31 ` Andre Prendel
  2 siblings, 0 replies; 4+ messages in thread
From: Jean Delvare @ 2009-05-08 13:06 UTC (permalink / raw)
  To: lm-sensors

Hi Andre,

Sorry for the late review.

On Mon, 6 Apr 2009 09:57:58 +0200, Andre Prendel wrote:
> Replace the deprecated signal() function by sigaction().
> 
> The signal() function has some disadvantages. This patch replaces
> signal() by sigaction() to install the signal handlers.
> ---
> 
>  sensord.c |   32 +++++++++++++++++++++++++-------
>  1 file changed, 25 insertions(+), 7 deletions(-)
> 
> --- quilt-sensors.orig/prog/sensord/sensord.c	2009-04-04 18:25:22.000000000 +0200
> +++ quilt-sensors/prog/sensord/sensord.c	2009-04-05 17:07:19.000000000 +0200
> @@ -65,7 +65,6 @@
>  
>  static void signalHandler(int sig)
>  {
> -	signal(sig, signalHandler);
>  	switch (sig) {
>  	case SIGTERM:
>  		done = 1;
> @@ -147,6 +146,30 @@
>  	logOpened = 1;
>  }
>  
> +static void install_sighandler(void)
> +{
> +	struct sigaction new;
> +	int ret;
> +
> +	new.sa_handler = signalHandler;

"new" is a structure on the stack, it is uninitialized, you must zero
it using memset() before using it.

> +	sigemptyset(&new.sa_mask);
> +	new.sa_flags = SA_RESTART;

Why do we need this?

> +
> +	ret = sigaction(SIGTERM, &new, NULL);
> +	if (ret = -1) {
> +		fprintf(stderr, "Could not set sighandler for SIGTERM: %s\n",
> +			strerror(errno));
> +		exit(EXIT_FAILURE);
> +	}
> +
> +	ret = sigaction(SIGHUP, &new, NULL);
> +	if (ret = -1) {
> +		fprintf(stderr, "Could not set sighandler for SIGHUP: %s\n",
> +			strerror(errno));
> +		exit(EXIT_FAILURE);
> +	}
> +}
> +
>  static void daemonize(void)
>  {
>  	int pid;
> @@ -172,12 +195,7 @@
>  		exit(EXIT_FAILURE);
>  	}
>  
> -	/* I should use sigaction but... */
> -	if (signal(SIGTERM, signalHandler) = SIG_ERR ||
> -	    signal (SIGHUP, signalHandler) = SIG_ERR) {
> -		perror("signal");
> -		exit(EXIT_FAILURE);
> -	}
> +	install_sighandler();
>  
>  	if ((pid = fork()) = -1) {
>  		perror("fork()");

Looks otherwise good.

-- 
Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal
  2009-04-06  7:57 [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal Andre Prendel
  2009-05-04  9:42 ` Jean Delvare
  2009-05-08 13:06 ` Jean Delvare
@ 2009-05-11  8:31 ` Andre Prendel
  2 siblings, 0 replies; 4+ messages in thread
From: Andre Prendel @ 2009-05-11  8:31 UTC (permalink / raw)
  To: lm-sensors

On Fri, May 08, 2009 at 03:06:34PM +0200, Jean Delvare wrote:
> Hi Andre,

Hello Jean,

> 
> Sorry for the late review.
> 
> On Mon, 6 Apr 2009 09:57:58 +0200, Andre Prendel wrote:
> > Replace the deprecated signal() function by sigaction().
> > 
> > The signal() function has some disadvantages. This patch replaces
> > signal() by sigaction() to install the signal handlers.
> > ---
> > 
> >  sensord.c |   32 +++++++++++++++++++++++++-------
> >  1 file changed, 25 insertions(+), 7 deletions(-)
> > 
> > --- quilt-sensors.orig/prog/sensord/sensord.c	2009-04-04 18:25:22.000000000 +0200
> > +++ quilt-sensors/prog/sensord/sensord.c	2009-04-05 17:07:19.000000000 +0200
> > @@ -65,7 +65,6 @@
> >  
> >  static void signalHandler(int sig)
> >  {
> > -	signal(sig, signalHandler);
> >  	switch (sig) {
> >  	case SIGTERM:
> >  		done = 1;
> > @@ -147,6 +146,30 @@
> >  	logOpened = 1;
> >  }
> >  
> > +static void install_sighandler(void)
> > +{
> > +	struct sigaction new;
> > +	int ret;
> > +
> > +	new.sa_handler = signalHandler;
> 
> "new" is a structure on the stack, it is uninitialized, you must zero
> it using memset() before using it.
> 

never seen this in any example before (and never did it before), but
you're right.

Manpage says:

        The sigaction structure is defined as something like

           struct sigaction {
               void     (*sa_handler)(int);
               void     (*sa_sigaction)(int, siginfo_t *, void *);
               sigset_t   sa_mask;
               int        sa_flags;
               void     (*sa_restorer)(void);
           };

        On some architectures a union  is  involved:  do  not  assign  to  both
        sa_handler and sa_sigaction.

        The sa_restorer element is obsolete and should not be used.  POSIX does
        not specify a sa_restorer element.

So the first two elements needn't to be a union. If so, sa_action
should be initialized (to NULL). Sa_restorer is deprecated (not
specified in POSIX). sa_mask and sa_flags is already initialized.

> > +	sigemptyset(&new.sa_mask);
> > +	new.sa_flags = SA_RESTART;
> 
> Why do we need this?

System calls will be restarted automatically if they were interrupted
by a signal. That means, the syscall (if interrupted) doesn't return
EINTR. IMO useful feature.

> 
> > +
> > +	ret = sigaction(SIGTERM, &new, NULL);
> > +	if (ret = -1) {
> > +		fprintf(stderr, "Could not set sighandler for SIGTERM: %s\n",
> > +			strerror(errno));
> > +		exit(EXIT_FAILURE);
> > +	}
> > +
> > +	ret = sigaction(SIGHUP, &new, NULL);
> > +	if (ret = -1) {
> > +		fprintf(stderr, "Could not set sighandler for SIGHUP: %s\n",
> > +			strerror(errno));
> > +		exit(EXIT_FAILURE);
> > +	}
> > +}
> > +
> >  static void daemonize(void)
> >  {
> >  	int pid;
> > @@ -172,12 +195,7 @@
> >  		exit(EXIT_FAILURE);
> >  	}
> >  
> > -	/* I should use sigaction but... */
> > -	if (signal(SIGTERM, signalHandler) = SIG_ERR ||
> > -	    signal (SIGHUP, signalHandler) = SIG_ERR) {
> > -		perror("signal");
> > -		exit(EXIT_FAILURE);
> > -	}
> > +	install_sighandler();
> >  
> >  	if ((pid = fork()) = -1) {
> >  		perror("fork()");
> 
> Looks otherwise good.
> 
> -- 
> Jean Delvare

_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-05-11  8:31 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-04-06  7:57 [lm-sensors] [PATCH 7/8] sensord: Use sigaction() for signal Andre Prendel
2009-05-04  9:42 ` Jean Delvare
2009-05-08 13:06 ` Jean Delvare
2009-05-11  8:31 ` Andre Prendel

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.