[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