+ /* we want these two to interrupt system calls */
+ siginterrupt(SIGALRM, 1);
+ siginterrupt(SIGCHLD, 1);
+
+ memset(&saddr, 0x00, sizeof(saddr));
+ saddr.sun_family = AF_LOCAL;
+ /* use abstract namespace for socket path */
+ strcpy(&saddr.sun_path[1], UDEVD_SOCK_PATH);
+ addrlen = offsetof(struct sockaddr_un, sun_path) + strlen(saddr.sun_path+1) + 1;
+
+ ssock = socket(AF_LOCAL, SOCK_DGRAM, 0);
+ if (ssock == -1) {
+ dbg("error getting socket");
+ exit(1);
+ }
+
+ /* the bind takes care of ensuring only one copy running */
+ retval = bind(ssock, &saddr, addrlen);
+ if (retval < 0) {
+ dbg("bind failed\n");
+ goto exit;
+ }
+
+ while (1) {
+ handle_msg(ssock);
+
+ while(msg_q_timeout) {
+ msg_q_timeout = 0;
+ msg_queue_manager();
+ }
+
+ while(children_waiting) {
+ children_waiting = 0;
+ /* reap all dead children */
+ while(1) {
+ int pid = waitpid(-1, 0, WNOHANG);
+ if ((pid == -1) || (pid == 0))
+ break;
+ udev_done(pid);
+ }
+ }
+ }
+exit:
+ close(ssock);
+ exit(1);