diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | udev.c | 10 | ||||
-rw-r--r-- | udevd.c | 28 | ||||
-rw-r--r-- | udevsend.c | 2 |
4 files changed, 26 insertions, 18 deletions
@@ -157,7 +157,6 @@ ifeq ($(strip $(USE_KLIBC)),true) -I$(LINUX_INCLUDE_DIR) LIB_OBJS = LDFLAGS = --static --nostdlib -nostartfiles -nodefaultlibs - UDEVD = else WARNINGS += -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations CRT0 = @@ -165,12 +164,11 @@ else CFLAGS += $(WARNINGS) -I$(GCCINCDIR) LIB_OBJS = -lc LDFLAGS = - UDEVD = $(DAEMON) endif CFLAGS += -I$(PWD)/libsysfs -all: $(ROOT) $(SENDER) $(UDEVD) $(HELPER) +all: $(ROOT) $(SENDER) $(DAEMON) $(HELPER) @extras="$(EXTRAS)" ; for target in $$extras ; do \ echo $$target ; \ $(MAKE) prefix=$(prefix) \ @@ -47,14 +47,12 @@ int log_ok(void) static void sig_handler(int signum) { - dbg("caught signal %d", signum); switch (signum) { case SIGINT: case SIGTERM: sysbus_disconnect(); udevdb_exit(); exit(20 + signum); - break; default: dbg("unhandled signal"); } @@ -100,6 +98,7 @@ static int udev_hotplug(int argc, char **argv) char *subsystem; int retval = -EINVAL; int i; + struct sigaction act; action = get_action(); if (!action) { @@ -146,8 +145,11 @@ static int udev_hotplug(int argc, char **argv) } /* set up a default signal handler for now */ - signal(SIGINT, sig_handler); - signal(SIGTERM, sig_handler); + act.sa_handler = sig_handler; + sigemptyset (&act.sa_mask); + act.sa_flags = SA_RESTART; + sigaction(SIGINT, &act, NULL); + sigaction(SIGTERM, &act, NULL); /* initialize the naming deamon */ namedev_init(); @@ -114,14 +114,18 @@ static void msg_queue_insert(struct hotplug_msg *msg) static void udev_run(struct hotplug_msg *msg) { pid_t pid; - setenv("ACTION", msg->action, 1); - setenv("DEVPATH", msg->devpath, 1); + char action[32]; + char devpath[256]; + char *env[] = { action, devpath, NULL }; + + snprintf(action, sizeof(action), "ACTION=%s", msg->action); + snprintf(devpath, sizeof(devpath), "DEVPATH=%s", msg->devpath); pid = fork(); switch (pid) { case 0: /* child */ - execl(UDEV_BIN, "udev", msg->subsystem, NULL); + execle(UDEV_BIN, "udev", msg->subsystem, NULL, env); dbg("exec of child failed"); exit(1); break; @@ -285,17 +289,21 @@ int main(int argc, char *argv[]) struct sockaddr_un saddr; socklen_t addrlen; int retval; + struct sigaction act; init_logging("udevd"); - signal(SIGINT, sig_handler); - signal(SIGTERM, sig_handler); - signal(SIGALRM, sig_handler); - signal(SIGCHLD, sig_handler); + /* set signal handler */ + act.sa_handler = sig_handler; + sigemptyset (&act.sa_mask); + act.sa_flags = SA_RESTART; + sigaction(SIGINT, &act, NULL); + sigaction(SIGTERM, &act, NULL); /* we want these two to interrupt system calls */ - siginterrupt(SIGALRM, 1); - siginterrupt(SIGCHLD, 1); + act.sa_flags = 0; + sigaction(SIGALRM, &act, NULL); + sigaction(SIGCHLD, &act, NULL); memset(&saddr, 0x00, sizeof(saddr)); saddr.sun_family = AF_LOCAL; @@ -310,7 +318,7 @@ int main(int argc, char *argv[]) } /* the bind takes care of ensuring only one copy running */ - retval = bind(ssock, &saddr, addrlen); + retval = bind(ssock, (struct sockaddr *) &saddr, addrlen); if (retval < 0) { dbg("bind failed\n"); goto exit; diff --git a/udevsend.c b/udevsend.c index 17372d8d9a..a24e7d75ed 100644 --- a/udevsend.c +++ b/udevsend.c @@ -179,7 +179,7 @@ int main(int argc, char* argv[]) /* If we can't send, try to start daemon and resend message */ loop = UDEVSEND_CONNECT_RETRY; while (loop--) { - retval = sendto(sock, &message, size, 0, (struct sockaddr*)&saddr, addrlen); + retval = sendto(sock, &message, size, 0, (struct sockaddr *)&saddr, addrlen); if (retval != -1) { retval = 0; goto close_and_exit; |