summaryrefslogtreecommitdiff
path: root/source4
diff options
context:
space:
mode:
Diffstat (limited to 'source4')
-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);
}