chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
core: fix cgroups-agent match for kdbus
[elogind.git]
/
src
/
core
/
path.c
diff --git
a/src/core/path.c
b/src/core/path.c
index d399238a412a3977f42f5765ac4e61ce87a2b995..6be9ac84bed841393fd364d8ee14381da8ce3ce8 100644
(file)
--- a/
src/core/path.c
+++ b/
src/core/path.c
@@
-21,7
+21,6
@@
#include <sys/inotify.h>
#include <sys/epoll.h>
#include <sys/inotify.h>
#include <sys/epoll.h>
-#include <sys/ioctl.h>
#include <errno.h>
#include <unistd.h>
#include <errno.h>
#include <unistd.h>
@@
-31,7
+30,6
@@
#include "mkdir.h"
#include "dbus-path.h"
#include "special.h"
#include "mkdir.h"
#include "dbus-path.h"
#include "special.h"
-#include "path-util.h"
#include "macro.h"
#include "bus-util.h"
#include "bus-error.h"
#include "macro.h"
#include "bus-util.h"
#include "bus-error.h"
@@
-136,7
+134,7
@@
int path_spec_watch(PathSpec *s, sd_event_io_handler_t handler) {
}
if (!exists) {
}
if (!exists) {
- log_error
(
"Failed to add watch on any of the components of %s: %m",
+ log_error
_errno(errno,
"Failed to add watch on any of the components of %s: %m",
s->path);
r = -errno; /* either EACCESS or ENOENT */
goto fail;
s->path);
r = -errno; /* either EACCESS or ENOENT */
goto fail;
@@
-157,10
+155,9
@@
void path_spec_unwatch(PathSpec *s) {
}
int path_spec_fd_event(PathSpec *s, uint32_t revents) {
}
int path_spec_fd_event(PathSpec *s, uint32_t revents) {
-
_cleanup_free_ uint8_t *buf = NULL
;
+
union inotify_event_buffer buffer
;
struct inotify_event *e;
struct inotify_event *e;
- ssize_t k;
- int l;
+ ssize_t l;
int r = 0;
if (revents != EPOLLIN) {
int r = 0;
if (revents != EPOLLIN) {
@@
-168,37
+165,18
@@
int path_spec_fd_event(PathSpec *s, uint32_t revents) {
return -EINVAL;
}
return -EINVAL;
}
- if (ioctl(s->inotify_fd, FIONREAD, &l) < 0) {
- log_error("FIONREAD failed: %m");
- return -errno;
- }
-
- assert(l > 0);
+ l = read(s->inotify_fd, &buffer, sizeof(buffer));
+ if (l < 0) {
+ if (errno == EAGAIN || errno == EINTR)
+ return 0;
- buf = malloc(l);
- if (!buf)
- return log_oom();
-
- k = read(s->inotify_fd, buf, l);
- if (k < 0) {
- log_error("Failed to read inotify event: %m");
- return -errno;
+ return log_error_errno(errno, "Failed to read inotify event: %m");
}
}
- e = (struct inotify_event*) buf;
-
- while (k > 0) {
- size_t step;
-
+ FOREACH_INOTIFY_EVENT(e, buffer, l) {
if ((s->type == PATH_CHANGED || s->type == PATH_MODIFIED) &&
s->primary_wd == e->wd)
r = 1;
if ((s->type == PATH_CHANGED || s->type == PATH_MODIFIED) &&
s->primary_wd == e->wd)
r = 1;
-
- step = sizeof(struct inotify_event) + e->len;
- assert(step <= (size_t) k);
-
- e = (struct inotify_event*) ((uint8_t*) e + step);
- k -= step;
}
return r;
}
return r;
@@
-250,7
+228,7
@@
static void path_spec_mkdir(PathSpec *s, mode_t mode) {
r = mkdir_p_label(s->path, mode);
if (r < 0)
r = mkdir_p_label(s->path, mode);
if (r < 0)
- log_warning
("mkdir(%s) failed: %s", s->path, strerror(-r)
);
+ log_warning
_errno(r, "mkdir(%s) failed: %m", s->path
);
}
static void path_spec_dump(PathSpec *s, FILE *f, const char *prefix) {
}
static void path_spec_dump(PathSpec *s, FILE *f, const char *prefix) {
@@
-460,7
+438,12
@@
static void path_set_state(Path *p, PathState state) {
static void path_enter_waiting(Path *p, bool initial, bool recheck);
static void path_enter_waiting(Path *p, bool initial, bool recheck);
-static int path_coldplug(Unit *u) {
+static int path_enter_waiting_coldplug(Unit *u) {
+ path_enter_waiting(PATH(u), true, true);
+ return 0;
+}
+
+static int path_coldplug(Unit *u, Hashmap *deferred_work) {
Path *p = PATH(u);
assert(p);
Path *p = PATH(u);
assert(p);
@@
-469,9
+452,10
@@
static int path_coldplug(Unit *u) {
if (p->deserialized_state != p->state) {
if (p->deserialized_state == PATH_WAITING ||
if (p->deserialized_state != p->state) {
if (p->deserialized_state == PATH_WAITING ||
- p->deserialized_state == PATH_RUNNING)
- path_enter_waiting(p, true, true);
- else
+ p->deserialized_state == PATH_RUNNING) {
+ hashmap_put(deferred_work, u, &path_enter_waiting_coldplug);
+ path_set_state(p, PATH_WAITING);
+ } else
path_set_state(p, p->deserialized_state);
}
path_set_state(p, p->deserialized_state);
}
@@
-562,8
+546,7
@@
static void path_enter_waiting(Path *p, bool initial, bool recheck) {
return;
fail:
return;
fail:
- log_warning("%s failed to enter waiting state: %s",
- UNIT(p)->id, strerror(-r));
+ log_warning_errno(r, "%s failed to enter waiting state: %m", UNIT(p)->id);
path_enter_dead(p, PATH_FAILURE_RESOURCES);
}
path_enter_dead(p, PATH_FAILURE_RESOURCES);
}
@@
-593,7
+576,7
@@
static int path_start(Unit *u) {
p->result = PATH_SUCCESS;
path_enter_waiting(p, true, true);
p->result = PATH_SUCCESS;
path_enter_waiting(p, true, true);
- return
0
;
+ return
1
;
}
static int path_stop(Unit *u) {
}
static int path_stop(Unit *u) {
@@
-603,7
+586,7
@@
static int path_stop(Unit *u) {
assert(p->state == PATH_WAITING || p->state == PATH_RUNNING);
path_enter_dead(p, PATH_SUCCESS);
assert(p->state == PATH_WAITING || p->state == PATH_RUNNING);
path_enter_dead(p, PATH_SUCCESS);
- return
0
;
+ return
1
;
}
static int path_serialize(Unit *u, FILE *f, FDSet *fds) {
}
static int path_serialize(Unit *u, FILE *f, FDSet *fds) {