static int pipefds[2];
static unsigned long long expected_seqnum = 0;
-static volatile int children_waiting;
+static volatile int sigchilds_waiting;
static volatile int run_msg_q;
static volatile int sig_flag;
static int run_exec_q;
static void exec_queue_manager(void);
static void msg_queue_manager(void);
static void user_sighandler(void);
-static void reap_kids(void);
+static void reap_sigchilds(void);
char *udev_bin;
#ifdef LOG
/* child */
execle(udev_bin, "udev", msg->subsystem, NULL, env);
dbg("exec of child failed");
- exit(1);
+ _exit(1);
break;
case -1:
dbg("fork of child failed");
}
/* exec queue management routine executes the events and delays events for the same devpath */
-static void exec_queue_manager()
+static void exec_queue_manager(void)
{
struct hotplug_msg *loop_msg;
struct hotplug_msg *tmp_msg;
}
/* msg queue management routine handles the timeouts and dispatches the events */
-static void msg_queue_manager()
+static void msg_queue_manager(void)
{
struct hotplug_msg *loop_msg;
struct hotplug_msg *tmp_msg;
if (list_empty(&msg_list) == 0) {
struct itimerval itv = {{0, 0}, {EVENT_TIMEOUT_SEC - msg_age, 0}};
dbg("next event expires in %li seconds", EVENT_TIMEOUT_SEC - msg_age);
- setitimer(ITIMER_REAL, &itv, 0);
+ setitimer(ITIMER_REAL, &itv, NULL);
}
}
return;
}
-asmlinkage static void sig_handler(int signum)
+static void asmlinkage sig_handler(int signum)
{
int rc;
break;
case SIGCHLD:
/* set flag, then write to pipe if needed */
- children_waiting = 1;
+ sigchilds_waiting = 1;
goto do_write;
break;
default:
}
}
-static void reap_kids()
+static void reap_sigchilds(void)
{
- /* reap all dead children */
while(1) {
- int pid = waitpid(-1, 0, WNOHANG);
+ int pid = waitpid(-1, NULL, WNOHANG);
if ((pid == -1) || (pid == 0))
break;
udev_done(pid);
}
/* just read everything from the pipe and clear the flag,
- * the useful flags were set in the signal handler
+ * the flags was set in the signal handler
*/
-static void user_sighandler()
+static void user_sighandler(void)
{
int sig;
while(1) {
- int rc = read(pipefds[0],&sig,sizeof(sig));
+ int rc = read(pipefds[0], &sig, sizeof(sig));
if (rc < 0)
break;
}
}
-
-int main(int argc, char *argv[])
+int main(int argc, char *argv[], char *envp[])
{
int ssock, maxsockplus;
struct sockaddr_un saddr;
socklen_t addrlen;
int retval, fd;
- const int on = 1;
+ const int feature_on = 1;
struct sigaction act;
fd_set readfds;
- init_logging("udevd");
+ logging_init("udevd");
dbg("version %s", UDEV_VERSION);
if (getuid() != 0) {
dbg("need to be root, exit");
- exit(1);
+ _exit(1);
}
- /* make sure we are at top of dir */
+
+ /* make sure we don't lock any path */
chdir("/");
- umask( umask( 077 ) | 022 );
+ umask(umask(077) | 022);
+
/* Set fds to dev/null */
fd = open( "/dev/null", O_RDWR );
if ( fd < 0 ) {
dup2(fd, 2);
if (fd > 2)
close(fd);
- /* Get new session id so stray signals don't come our way. */
+
+ /* become session leader */
setsid();
/* setup signal handler pipe */
exit(1);
}
-
/* set signal handlers */
act.sa_handler = (void (*) (int))sig_handler;
sigemptyset(&act.sa_mask);
}
/* enable receiving of the sender credentials */
- setsockopt(ssock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on));
+ setsockopt(ssock, SOL_SOCKET, SO_PASSCRED, &feature_on, sizeof(feature_on));
/* possible override of udev binary, used for testing */
udev_bin = getenv("UDEV_BIN");
if (FD_ISSET(pipefds[0], &workreadfds))
user_sighandler();
- if (children_waiting) {
- children_waiting = 0;
- reap_kids();
+ if (sigchilds_waiting) {
+ sigchilds_waiting = 0;
+ reap_sigchilds();
}
if (run_msg_q) {
}
if (run_exec_q) {
- /* this is tricky. exec_queue_manager() loops over exec_list, and
- * calls running_with_devpath(), which loops over running_list. This gives
- * O(N*M), which can get *nasty*. Clean up running_list before
- * calling exec_queue_manager().
- */
- if (children_waiting) {
- children_waiting = 0;
- reap_kids();
+ /* clean up running_list before calling exec_queue_manager() */
+ if (sigchilds_waiting) {
+ sigchilds_waiting = 0;
+ reap_sigchilds();
}
run_exec_q = 0;
}
exit:
close(ssock);
- exit(1);
+ logging_close();
+ return 1;
}