Use names instead of numbers for reporting signals and trap signals in rc

This commit is contained in:
Roy Marples 2007-04-09 16:53:21 +00:00
parent 3a20ea36cc
commit 3c7c1736b7
4 changed files with 70 additions and 6 deletions

View File

@ -98,7 +98,7 @@ override CFLAGS += -DLIB=\"$(LIB)\"
# However, this does save us using libtool when we're testing # However, this does save us using libtool when we're testing
# NOTE: The toplevel Makefile for baselayout will automatically # NOTE: The toplevel Makefile for baselayout will automatically
# disable then when doing `make dist` # disable then when doing `make dist`
##override LDFLAGS += -Wl,-rpath . override LDFLAGS += -Wl,-rpath .
all: $(TARGET) all: $(TARGET)

View File

@ -55,6 +55,7 @@
extern char **environ; extern char **environ;
static char *applet = NULL;
static char **env = NULL; static char **env = NULL;
static char **newenv = NULL; static char **newenv = NULL;
static char **coldplugged_services; static char **coldplugged_services;
@ -65,7 +66,6 @@ static char **types = NULL;
static char *mycmd = NULL; static char *mycmd = NULL;
static char *myarg = NULL; static char *myarg = NULL;
static char *tmp = NULL; static char *tmp = NULL;
static char *applet = NULL;
struct termios *termios_orig; struct termios *termios_orig;
@ -103,6 +103,9 @@ static void cleanup (void)
rc_rm_dir (RC_SVCDIR "softscripts.new", true); rc_rm_dir (RC_SVCDIR "softscripts.new", true);
if (rc_is_dir (RC_SVCDIR "softscripts.old")) if (rc_is_dir (RC_SVCDIR "softscripts.old"))
rc_rm_dir (RC_SVCDIR "softscripts.old", true); rc_rm_dir (RC_SVCDIR "softscripts.old", true);
if (applet)
free (applet);
} }
static int do_e (int argc, char **argv) static int do_e (int argc, char **argv)
@ -453,6 +456,47 @@ static void wait_for_services ()
select (0, NULL, NULL, NULL, &tv); select (0, NULL, NULL, NULL, &tv);
} }
static void handle_signal (int sig)
{
pid_t pid;
int status;
int serrno = errno;
char signame[10] = { '\0' };
switch (sig)
{
case SIGCHLD:
do
{
pid = waitpid (-1, &status, WNOHANG);
if (pid < 0)
{
if (errno && errno != ECHILD)
eerror ("waitpid: %s", strerror (errno));
return;
}
} while (! WIFEXITED (status) && ! WIFSIGNALED (status));
break;
case SIGINT:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGINT");
case SIGTERM:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGTERM");
case SIGQUIT:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGQUIT");
eerrorx ("%s: caught %s, aborting", applet, signame);
default:
eerror ("%s: caught unknown signal %d", applet, sig);
}
/* Restore errno */
errno = serrno;
}
int main (int argc, char **argv) int main (int argc, char **argv)
{ {
char *RUNLEVEL = NULL; char *RUNLEVEL = NULL;
@ -469,7 +513,7 @@ int main (int argc, char **argv)
char ksoftbuffer [PATH_MAX]; char ksoftbuffer [PATH_MAX];
if (argv[0]) if (argv[0])
applet = basename (argv[0]); applet = strdup (basename (argv[0]));
if (! applet) if (! applet)
eerrorx ("arguments required"); eerrorx ("arguments required");
@ -509,6 +553,12 @@ int main (int argc, char **argv)
atexit (cleanup); atexit (cleanup);
newlevel = argv[0]; newlevel = argv[0];
/* Setup a signal handler */
signal (SIGINT, handle_signal);
signal (SIGQUIT, handle_signal);
signal (SIGTERM, handle_signal);
signal (SIGCHLD, handle_signal);
/* Ensure our environment is pure /* Ensure our environment is pure
Also, add our configuration to it */ Also, add our configuration to it */
env = rc_filter_env (); env = rc_filter_env ();

View File

@ -94,6 +94,7 @@ static void handle_signal (int sig)
pid_t pid; pid_t pid;
int status; int status;
int serrno = errno; int serrno = errno;
char signame[10] = { '\0' };
switch (sig) switch (sig)
{ {
@ -113,11 +114,17 @@ static void handle_signal (int sig)
} }
} while (! WIFEXITED (status) && ! WIFSIGNALED (status)); } while (! WIFEXITED (status) && ! WIFSIGNALED (status));
break; break;
case SIGINT: case SIGINT:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGINT");
case SIGTERM: case SIGTERM:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGTERM");
case SIGQUIT: case SIGQUIT:
eerrorx ("%s: caught signal %d, aborting", applet, sig); if (! signame[0])
snprintf (signame, sizeof (signame), "SIGQUIT");
eerrorx ("%s: caught %s, aborting", applet, signame);
default: default:
eerror ("%s: caught unknown signal %d", applet, sig); eerror ("%s: caught unknown signal %d", applet, sig);

View File

@ -459,13 +459,20 @@ static void handle_signal (int sig)
int pid; int pid;
int status; int status;
int serrno = errno; int serrno = errno;
char signame[10] = { '\0' };
switch (sig) switch (sig)
{ {
case SIGINT: case SIGINT:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGINT");
case SIGTERM: case SIGTERM:
if (! signame[0])
snprintf (signame, sizeof (signame), "SIGTERM");
case SIGQUIT: case SIGQUIT:
eerrorx ("%s: caught signal %d, aborting", progname, sig); if (! signame[0])
snprintf (signame, sizeof (signame), "SIGQUIT");
eerrorx ("%s: caught %s, aborting", progname, signame);
case SIGCHLD: case SIGCHLD:
while (1) while (1)