chiark / gitweb /
while (1) -> for (;;)
[elogind.git] / udev / udevadm-settle.c
index 0b3f2e21246d7b3a5e6edd5a810b571fec716792..1423cec6dc72c44108fb328f8d3878ae81797b20 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2006-2008 Kay Sievers <kay@vrfy.org>
+ * Copyright (C) 2006-2009 Kay Sievers <kay@vrfy.org>
  * Copyright (C) 2009 Canonical Ltd.
  * Copyright (C) 2009 Scott James Remnant <scott@netsplit.com>
  *
@@ -28,6 +28,7 @@
 #include <syslog.h>
 #include <getopt.h>
 #include <signal.h>
+#include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
 
@@ -65,6 +66,7 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[])
        const char *exists = NULL;
        int timeout = DEFAULT_TIMEOUT;
        struct sigaction act;
+       sigset_t mask;
        struct udev_queue *udev_queue = NULL;
        int rc = 1;
 
@@ -77,8 +79,12 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[])
        act.sa_flags = 0;
        sigaction(SIGALRM, &act, NULL);
        sigaction(SIGUSR1, &act, NULL);
+       sigemptyset(&mask);
+       sigaddset(&mask, SIGUSR1);
+       sigaddset(&mask, SIGALRM);
+       sigprocmask(SIG_UNBLOCK, &mask, NULL);
 
-       while (1) {
+       for (;;) {
                int option;
                int seconds;
 
@@ -139,14 +145,12 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[])
 
                if (start > end) {
                        err(udev, "seq-start larger than seq-end, ignoring\n");
-                       fprintf(stderr, "seq-start larger than seq-end, ignoring\n");
                        start = 0;
                        end = 0;
                }
 
                if (start > kernel_seq || end > kernel_seq) {
                        err(udev, "seq-start or seq-end larger than current kernel value, ignoring\n");
-                       fprintf(stderr, "seq-start or seq-end larger than current kernel value, ignoring\n");
                        start = 0;
                        end = 0;
                }
@@ -154,7 +158,6 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[])
        } else {
                if (end > 0) {
                        err(udev, "seq-end needs seq-start parameter, ignoring\n");
-                       fprintf(stderr, "seq-end needs seq-start parameter, ignoring\n");
                        end = 0;
                }
        }
@@ -165,7 +168,7 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[])
 
                uctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH);
                if (uctrl != NULL) {
-                       sigset_t mask, oldmask;
+                       sigset_t oldmask;
 
                        sigemptyset(&mask);
                        sigaddset(&mask, SIGUSR1);
@@ -178,8 +181,9 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[])
                }
        }
 
-       while (1) {
+       for (;;) {
                struct stat statbuf;
+               const struct timespec duration = { 0 , 1000 * 1000 * 1000 / LOOP_PER_SECOND };
 
                if (exists != NULL && stat(exists, &statbuf) == 0) {
                        rc = 0;
@@ -203,7 +207,7 @@ int udevadm_settle(struct udev *udev, int argc, char *argv[])
                if (is_timeout)
                        break;
 
-               usleep(1000 * 1000 / LOOP_PER_SECOND);
+               nanosleep(&duration, NULL);
        }
 
        /* if we reached the timeout, print the list of remaining events */