1
0
mirror of https://github.com/samba-team/samba.git synced 2025-11-09 20:23:51 +03:00

r14926: change the inotify backend to implement the rather unusual semantics

for rename. The cookies in inotify tell us (indirectly!) if its a
rename between directories or not
This commit is contained in:
Andrew Tridgell
2006-04-05 08:52:55 +00:00
committed by Gerald (Jerry) Carter
parent 2ac248edf0
commit 13574a8d0c

View File

@@ -90,8 +90,13 @@ static int inotify_destructor(void *ptr)
/* /*
dispatch one inotify event dispatch one inotify event
the cookies are used to correctly handle renames
*/ */
static void inotify_dispatch(struct inotify_private *in, struct inotify_event *e) static void inotify_dispatch(struct inotify_private *in,
struct inotify_event *e,
uint32_t prev_cookie,
uint32_t next_cookie)
{ {
struct watch_context *w; struct watch_context *w;
struct notify_event ne; struct notify_event ne;
@@ -101,11 +106,24 @@ static void inotify_dispatch(struct inotify_private *in, struct inotify_event *e
return; return;
} }
/* map the inotify mask to a action */ /* map the inotify mask to a action. This gets complicated for
renames */
if (e->mask & IN_CREATE) { if (e->mask & IN_CREATE) {
ne.action = NOTIFY_ACTION_ADDED; ne.action = NOTIFY_ACTION_ADDED;
} else if (e->mask & IN_DELETE) { } else if (e->mask & IN_DELETE) {
ne.action = NOTIFY_ACTION_REMOVED; ne.action = NOTIFY_ACTION_REMOVED;
} else if (e->mask & IN_MOVED_FROM) {
if (e->cookie == next_cookie) {
ne.action = NOTIFY_ACTION_OLD_NAME;
} else {
ne.action = NOTIFY_ACTION_REMOVED;
}
} else if (e->mask & IN_MOVED_TO) {
if (e->cookie == prev_cookie) {
ne.action = NOTIFY_ACTION_NEW_NAME;
} else {
ne.action = NOTIFY_ACTION_ADDED;
}
} else { } else {
ne.action = NOTIFY_ACTION_MODIFIED; ne.action = NOTIFY_ACTION_MODIFIED;
} }
@@ -129,6 +147,7 @@ static void inotify_handler(struct event_context *ev, struct fd_event *fde,
struct inotify_private *in = talloc_get_type(private, struct inotify_private); struct inotify_private *in = talloc_get_type(private, struct inotify_private);
int bufsize = 0; int bufsize = 0;
struct inotify_event *e0, *e; struct inotify_event *e0, *e;
uint32_t prev_cookie=0;
/* /*
we must use FIONREAD as we cannot predict the length of the we must use FIONREAD as we cannot predict the length of the
@@ -152,9 +171,14 @@ static void inotify_handler(struct event_context *ev, struct fd_event *fde,
/* we can get more than one event in the buffer */ /* we can get more than one event in the buffer */
while (bufsize >= sizeof(*e)) { while (bufsize >= sizeof(*e)) {
inotify_dispatch(in, e); struct inotify_event *e2 = NULL;
bufsize -= e->len + sizeof(*e); bufsize -= e->len + sizeof(*e);
e = (struct inotify_event *)(e->len + sizeof(*e) + (char *)e); if (bufsize >= sizeof(*e)) {
e2 = (struct inotify_event *)(e->len + sizeof(*e) + (char *)e);
}
inotify_dispatch(in, e, prev_cookie, e2?e2->cookie:0);
prev_cookie = e->cookie;
e = e2;
} }
talloc_free(e0); talloc_free(e0);