static int uevent_netlink_sock;
static pid_t sid;
-static int pipefds[2] = {-1, -1};
+static int signal_pipe[2] = {-1, -1};
static volatile int sigchilds_waiting;
static volatile int run_msg_q;
static volatile int sig_flag;
if (msg->seqnum == 0) {
dbg("no SEQNUM, move straight to the exec queue");
- list_add(&msg->node, &exec_list);
+ list_add_tail(&msg->node, &exec_list);
run_exec_q = 1;
return;
}
static void asmlinkage sig_handler(int signum)
{
- int rc;
-
switch (signum) {
case SIGINT:
case SIGTERM:
break;
}
- /* if pipe is empty, write to pipe to force select to return,
- * which will wakeup our mainloop
- */
- if (!sig_flag) {
- rc = write(pipefds[1], &signum, sizeof(signum));
- if (rc >= 0)
- sig_flag = 1;
- }
+ /* write to pipe, which will wakeup select() in our mainloop */
+ write(signal_pipe[WRITE_END], "", 1);
}
static void udev_done(int pid)
setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
/* setup signal handler pipe */
- retval = pipe(pipefds);
+ retval = pipe(signal_pipe);
if (retval < 0) {
err("error getting pipes: %s", strerror(errno));
goto exit;
}
- retval = fcntl(pipefds[0], F_SETFL, O_NONBLOCK);
+ retval = fcntl(signal_pipe[READ_END], F_SETFL, O_NONBLOCK);
if (retval < 0) {
err("error fcntl on read pipe: %s", strerror(errno));
goto exit;
}
- retval = fcntl(pipefds[0], F_SETFD, FD_CLOEXEC);
+ retval = fcntl(signal_pipe[READ_END], F_SETFD, FD_CLOEXEC);
if (retval < 0)
err("error fcntl on read pipe: %s", strerror(errno));
- retval = fcntl(pipefds[1], F_SETFL, O_NONBLOCK);
+ retval = fcntl(signal_pipe[WRITE_END], F_SETFL, O_NONBLOCK);
if (retval < 0) {
err("error fcntl on write pipe: %s", strerror(errno));
goto exit;
}
- retval = fcntl(pipefds[1], F_SETFD, FD_CLOEXEC);
+ retval = fcntl(signal_pipe[WRITE_END], F_SETFD, FD_CLOEXEC);
if (retval < 0)
err("error fcntl on write pipe: %s", strerror(errno));
int fdcount;
FD_ZERO(&readfds);
- FD_SET(pipefds[0], &readfds);
+ FD_SET(signal_pipe[READ_END], &readfds);
FD_SET(udevd_sock, &readfds);
if (uevent_netlink_sock > 0)
FD_SET(uevent_netlink_sock, &readfds);
}
/* received a signal, clear our notification pipe */
- if (FD_ISSET(pipefds[0], &readfds)) {
- int sig;
- ssize_t rlen;
-
- while(1) {
- rlen = read(pipefds[0], &sig, sizeof(sig));
- if (rlen <= 0)
- break;
- }
- sig_flag = 0;
+ if (FD_ISSET(signal_pipe[READ_END], &readfds)) {
+ char buf[256];
+
+ read(signal_pipe[READ_END], &buf, sizeof(buf));
}
/* forked child have returned */
}
exit:
- if (pipefds[0] > 0)
- close(pipefds[0]);
- if (pipefds[1] > 0)
- close(pipefds[1]);
+ if (signal_pipe[READ_END] > 0)
+ close(signal_pipe[READ_END]);
+ if (signal_pipe[WRITE_END] > 0)
+ close(signal_pipe[WRITE_END]);
if (udevd_sock > 0)
close(udevd_sock);