chiark / gitweb /
service: don't read start priority from Kxx link
[elogind.git] / util.c
diff --git a/util.c b/util.c
index 83e819a0cb769decb718148ab02af4a3bb9b8f61..8556ea12cd153d6899f3b98a8cc803e80b61f401 100644 (file)
--- a/util.c
+++ b/util.c
@@ -114,6 +114,9 @@ bool endswith(const char *s, const char *postfix) {
         sl = strlen(s);
         pl = strlen(postfix);
 
+        if (pl == 0)
+                return true;
+
         if (sl < pl)
                 return false;
 
@@ -129,6 +132,9 @@ bool startswith(const char *s, const char *prefix) {
         sl = strlen(s);
         pl = strlen(prefix);
 
+        if (pl == 0)
+                return true;
+
         if (sl < pl)
                 return false;
 
@@ -147,11 +153,14 @@ bool first_word(const char *s, const char *word) {
         if (sl < wl)
                 return false;
 
+        if (wl == 0)
+                return true;
+
         if (memcmp(s, word, wl) != 0)
                 return false;
 
-        return (s[wl] == 0 ||
-                strchr(WHITESPACE, s[wl]));
+        return s[wl] == 0 ||
+                strchr(WHITESPACE, s[wl]);
 }
 
 int close_nointr(int fd) {
@@ -1420,10 +1429,14 @@ int ask(char *ret, const char *replies, const char *text, ...) {
                 int r;
                 bool need_nl = true;
 
+                fputs("\x1B[1m", stdout);
+
                 va_start(ap, text);
                 vprintf(text, ap);
                 va_end(ap);
 
+                fputs("\x1B[0m", stdout);
+
                 fflush(stdout);
 
                 if ((r = read_one_char(stdin, &c, &need_nl)) < 0) {
@@ -1664,13 +1677,24 @@ fail:
 
 int release_terminal(void) {
         int r = 0, fd;
+        struct sigaction sa_old, sa_new;
 
-        if ((fd = open("/dev/tty", O_RDWR)) < 0)
+        if ((fd = open("/dev/tty", O_RDWR|O_NOCTTY|O_NDELAY)) < 0)
                 return -errno;
 
+        /* Temporarily ignore SIGHUP, so that we don't get SIGHUP'ed
+         * by our own TIOCNOTTY */
+
+        zero(sa_new);
+        sa_new.sa_handler = SIG_IGN;
+        sa_new.sa_flags = SA_RESTART;
+        assert_se(sigaction(SIGHUP, &sa_new, &sa_old) == 0);
+
         if (ioctl(fd, TIOCNOTTY) < 0)
                 r = -errno;
 
+        assert_se(sigaction(SIGHUP, &sa_old, NULL) == 0);
+
         close_nointr_nofail(fd);
         return r;
 }