[systemd-commits] 2 commits - src/path.c src/path-lookup.c src/util.c TODO

Lennart Poettering lennart at kemper.freedesktop.org
Tue Oct 12 17:34:30 PDT 2010


 TODO              |    2 --
 src/path-lookup.c |    1 +
 src/path.c        |   27 +++++++++++++++++----------
 src/util.c        |   32 ++++++++++++++++++++------------
 4 files changed, 38 insertions(+), 24 deletions(-)

New commits:
commit 37072578da23266e72e3b7846059a11ff35f412e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 13 02:34:21 2010 +0200

    lookup: look for dynamic throw-away units in /dev/.systemd/system

diff --git a/src/path-lookup.c b/src/path-lookup.c
index 258252a..c746e5e 100644
--- a/src/path-lookup.c
+++ b/src/path-lookup.c
@@ -181,6 +181,7 @@ int lookup_paths_init(LookupPaths *p, ManagerRunningAs running_as) {
                                 return -ENOMEM;
                 } else
                         if (!(p->unit_path = strv_new(
+                                              "/dev/.systemd/system",
                                               SYSTEM_CONFIG_UNIT_PATH,
                                               "/etc/systemd/system",
                                               "/usr/local/share/systemd/system",
commit f601daa70143745915a8d38603969f228414af19
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 13 02:34:00 2010 +0200

    inotify: properly handle multiple inotify events per read()

diff --git a/TODO b/TODO
index 6d905dc..c1008ab 100644
--- a/TODO
+++ b/TODO
@@ -68,8 +68,6 @@
 
 * ask-password tty timeout
 
-* properly handle multiple inotify events per read() in path.c and util.c
-
 * readahead: btrfs/LVM SSD detection
 
 * document locale.conf, vconsole.conf and possibly the tempfiles.d and modules-load.d mechanism.
diff --git a/src/path.c b/src/path.c
index 92f9938..b3bc8a5 100644
--- a/src/path.c
+++ b/src/path.c
@@ -453,7 +453,8 @@ static void path_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
         Path *p = PATH(u);
         int l;
         ssize_t k;
-        struct inotify_event *buf = NULL;
+        uint8_t *buf = NULL;
+        struct inotify_event *e;
         PathSpec *s;
 
         assert(p);
@@ -493,16 +494,22 @@ static void path_fd_event(Unit *u, int fd, uint32_t events, Watch *w) {
                 goto fail;
         }
 
-        if ((size_t) k < sizeof(struct inotify_event) ||
-            (size_t) k < sizeof(struct inotify_event) + buf->len) {
-                log_error("inotify event too small.");
-                goto fail;
-        }
+        e = (struct inotify_event*) buf;
 
-        if (s->type == PATH_CHANGED && s->primary_wd == buf->wd)
-                path_enter_running(p);
-        else
-                path_enter_waiting(p, false);
+        while (k > 0) {
+                size_t step;
+
+                if (s->type == PATH_CHANGED && s->primary_wd == e->wd)
+                        path_enter_running(p);
+                else
+                        path_enter_waiting(p, false);
+
+                step = sizeof(struct inotify_event) + e->len;
+                assert(step <= (size_t) k);
+
+                e = (struct inotify_event*) ((uint8_t*) e + step);
+                k -= step;
+        }
 
         free(buf);
 
diff --git a/src/util.c b/src/util.c
index d09e447..434f311 100644
--- a/src/util.c
+++ b/src/util.c
@@ -2247,26 +2247,34 @@ int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocst
                 assert(notify >= 0);
 
                 for (;;) {
-                        struct inotify_event e;
+                        uint8_t inotify_buffer[sizeof(struct inotify_event) + FILENAME_MAX];
                         ssize_t l;
+                        struct inotify_event *e;
 
-                        if ((l = read(notify, &e, sizeof(e))) != sizeof(e)) {
+                        if ((l = read(notify, &inotify_buffer, sizeof(inotify_buffer))) < 0) {
 
-                                if (l < 0) {
+                                if (errno == EINTR)
+                                        continue;
 
-                                        if (errno == EINTR)
-                                                continue;
+                                r = -errno;
+                                goto fail;
+                        }
+
+                        e = (struct inotify_event*) inotify_buffer;
 
-                                        r = -errno;
-                                } else
+                        while (l > 0) {
+                                size_t step;
+
+                                if (e->wd != wd || !(e->mask & IN_CLOSE)) {
                                         r = -EIO;
+                                        goto fail;
+                                }
 
-                                goto fail;
-                        }
+                                step = sizeof(struct inotify_event) + e->len;
+                                assert(step <= (size_t) l);
 
-                        if (e.wd != wd || !(e.mask & IN_CLOSE)) {
-                                r = -EIO;
-                                goto fail;
+                                e = (struct inotify_event*) ((uint8_t*) e + step);
+                                l -= step;
                         }
 
                         break;


More information about the systemd-commits mailing list