summaryrefslogtreecommitdiff
path: root/source4/ntvfs
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2006-04-05 04:50:08 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:00:16 -0500
commita9cb173f7674d311624c34205f1417b31972d1f2 (patch)
treecab8b6377df9081a03d8805e48ba184fd9b84bf0 /source4/ntvfs
parent66a0d692564e5392588247696e2156b85252cbea (diff)
downloadsamba-a9cb173f7674d311624c34205f1417b31972d1f2.tar.gz
samba-a9cb173f7674d311624c34205f1417b31972d1f2.tar.bz2
samba-a9cb173f7674d311624c34205f1417b31972d1f2.zip
r14918: cleaner handling of systems without inotify
(This used to be commit cf17ff15b15942f0ce068dd0a94b3b565a9b93cb)
Diffstat (limited to 'source4/ntvfs')
-rw-r--r--source4/ntvfs/common/notify.c57
-rw-r--r--source4/ntvfs/sysdep/inotify.c2
-rw-r--r--source4/ntvfs/sysdep/sys_notify.c4
3 files changed, 38 insertions, 25 deletions
diff --git a/source4/ntvfs/common/notify.c b/source4/ntvfs/common/notify.c
index 595a0f6566..9ea024f2fc 100644
--- a/source4/ntvfs/common/notify.c
+++ b/source4/ntvfs/common/notify.c
@@ -268,6 +268,25 @@ static void sys_notify_callback(struct sys_notify_context *ctx,
}
/*
+ add an entry to the notify array
+*/
+static NTSTATUS notify_add_array(struct notify_context *notify, struct notify_entry *e,
+ const char *path, void *private)
+{
+ notify->array->entries[notify->array->num_entries] = *e;
+ notify->array->entries[notify->array->num_entries].private = private;
+ notify->array->entries[notify->array->num_entries].server = notify->server;
+
+ if (path) {
+ notify->array->entries[notify->array->num_entries].path = path;
+ }
+
+ notify->array->num_entries++;
+
+ return notify_save(notify);
+}
+
+/*
add a notify watch. This is called when a notify is first setup on a open
directory handle.
*/
@@ -312,33 +331,23 @@ NTSTATUS notify_add(struct notify_context *notify, struct notify_entry *e,
DLIST_ADD(notify->list, listel);
/* ignore failures from sys_notify */
- status = sys_notify_watch(notify->sys_notify_ctx, e->path, e->filter,
- sys_notify_callback, listel,
- &listel->sys_notify_handle);
- if (NT_STATUS_IS_OK(status)) {
- talloc_steal(listel, listel->sys_notify_handle);
- notify_unlock(notify);
- } else {
- notify->array->entries[notify->array->num_entries] = *e;
- notify->array->entries[notify->array->num_entries].private = private;
- notify->array->entries[notify->array->num_entries].server = notify->server;
-
- if (path) {
- notify->array->entries[notify->array->num_entries].path = path;
+ if (notify->sys_notify_ctx != NULL) {
+ status = sys_notify_watch(notify->sys_notify_ctx, e->path, e->filter,
+ sys_notify_callback, listel,
+ &listel->sys_notify_handle);
+ if (NT_STATUS_IS_OK(status)) {
+ /* if the kernel handler has said it can handle this notify then
+ we don't need to add it to the array */
+ talloc_steal(listel, listel->sys_notify_handle);
+ goto done;
}
-
- notify->array->num_entries++;
-
- status = notify_save(notify);
-
- notify_unlock(notify);
-
- NT_STATUS_NOT_OK_RETURN(status);
}
- if (path) {
- talloc_free(path);
- }
+ status = notify_add_array(notify, e, path, private);
+
+done:
+ notify_unlock(notify);
+ talloc_free(path);
return status;
}
diff --git a/source4/ntvfs/sysdep/inotify.c b/source4/ntvfs/sysdep/inotify.c
index 31c408d112..ec8669306e 100644
--- a/source4/ntvfs/sysdep/inotify.c
+++ b/source4/ntvfs/sysdep/inotify.c
@@ -239,7 +239,7 @@ static int watch_destructor(void *ptr)
/*
add a watch. The watch is removed when the caller calls
- talloc_free() on handle
+ talloc_free() on *handle
*/
static NTSTATUS inotify_watch(struct sys_notify_context *ctx, const char *dirpath,
uint32_t filter, sys_notify_callback_t callback,
diff --git a/source4/ntvfs/sysdep/sys_notify.c b/source4/ntvfs/sysdep/sys_notify.c
index fd29f42a0e..1927ac61ce 100644
--- a/source4/ntvfs/sysdep/sys_notify.c
+++ b/source4/ntvfs/sysdep/sys_notify.c
@@ -44,6 +44,10 @@ struct sys_notify_context *sys_notify_init(int snum,
const char *bname;
struct sys_notify_backend *b;
+ if (backends == NULL) {
+ return NULL;
+ }
+
if (ev == NULL) {
ev = event_context_find(mem_ctx);
}