r21108: Send sys_notify_watch through the VFS, FAM is next
authorVolker Lendecke <vlendec@samba.org>
Thu, 1 Feb 2007 13:36:02 +0000 (13:36 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:17:38 +0000 (12:17 -0500)
source/include/smb.h
source/include/vfs.h
source/include/vfs_macros.h
source/modules/vfs_default.c
source/smbd/notify.c
source/smbd/notify_internal.c
source/smbd/service.c

index aaf50df2bb02ca38dcd5344fb03b4d91b48f3e77..b4cb5bd611787197e6bba137b36d09450b626411 100644 (file)
@@ -446,10 +446,13 @@ struct notify_change {
 };
 
 struct notify_mid_map;
+struct notify_entry;
+struct notify_event;
 struct sys_notify_backend;
 struct sys_notify_context {
        struct event_context *ev;
-       void *private_data;
+       struct connection_struct *conn;
+       void *private_data;     /* For use by the system backend */
 };
 
 struct notify_change_request {
index 9a04fcb4230991567559a591fe1d78ab78fdce24..c13d3eee4e7199e218b624c9c590921b29b10a74 100644 (file)
@@ -152,6 +152,7 @@ typedef enum _vfs_op_type {
        SMB_VFS_OP_LINK,
        SMB_VFS_OP_MKNOD,
        SMB_VFS_OP_REALPATH,
+       SMB_VFS_OP_NOTIFY_WATCH,
 
        /* NT ACL operations. */
 
@@ -275,6 +276,13 @@ struct vfs_ops {
                int (*link)(struct vfs_handle_struct *handle, const char *oldpath, const char *newpath);
                int (*mknod)(struct vfs_handle_struct *handle, const char *path, mode_t mode, SMB_DEV_T dev);
                char *(*realpath)(struct vfs_handle_struct *handle, const char *path, char *resolved_path);
+               NTSTATUS (*notify_watch)(struct vfs_handle_struct *handle,
+                                        struct sys_notify_context *ctx,
+                                        struct notify_entry *e,
+                                        void (*callback)(struct sys_notify_context *ctx, 
+                                                         void *private_data,
+                                                         struct notify_event *ev),
+                                        void *private_data, void *handle_p);
                
                /* NT ACL operations. */
                
@@ -390,6 +398,7 @@ struct vfs_ops {
                struct vfs_handle_struct *link;
                struct vfs_handle_struct *mknod;
                struct vfs_handle_struct *realpath;
+               struct vfs_handle_struct *notify_watch;
 
                /* NT ACL operations. */
 
index f41fbeb518765ebc1263f5c805ddc642aed0e753..d63afb13ea318dba6e47d57c13ef00ae742bc4d1 100644 (file)
@@ -77,6 +77,7 @@
 #define SMB_VFS_LINK(conn, oldpath, newpath) ((conn)->vfs.ops.link((conn)->vfs.handles.link, (oldpath), (newpath)))
 #define SMB_VFS_MKNOD(conn, path, mode, dev) ((conn)->vfs.ops.mknod((conn)->vfs.handles.mknod, (path), (mode), (dev)))
 #define SMB_VFS_REALPATH(conn, path, resolved_path) ((conn)->vfs.ops.realpath((conn)->vfs.handles.realpath, (path), (resolved_path)))
+#define SMB_VFS_NOTIFY_WATCH(conn, ctx, e, callback, private_data, handle_p) ((conn)->vfs.ops.notify_watch((conn)->vfs.handles.notify_watch, (ctx), (e), (callback), (private_data), (handle_p)))
 
 /* NT ACL operations. */
 #define SMB_VFS_FGET_NT_ACL(fsp, fd, security_info, ppdesc) ((fsp)->conn->vfs.ops.fget_nt_acl((fsp)->conn->vfs.handles.fget_nt_acl, (fsp), (fd), (security_info), (ppdesc)))
 #define SMB_VFS_OPAQUE_LINK(conn, oldpath, newpath) ((conn)->vfs_opaque.ops.link((conn)->vfs_opaque.handles.link, (oldpath), (newpath)))
 #define SMB_VFS_OPAQUE_MKNOD(conn, path, mode, dev) ((conn)->vfs_opaque.ops.mknod((conn)->vfs_opaque.handles.mknod, (path), (mode), (dev)))
 #define SMB_VFS_OPAQUE_REALPATH(conn, path, resolved_path) ((conn)->vfs_opaque.ops.realpath((conn)->vfs_opaque.handles.realpath, (path), (resolved_path)))
+#define SMB_VFS_OPAQUE_NOTIFY_WATCH(conn, ctx, e, callback, private_data, handle_p) ((conn)->vfs_opaque.ops.notify_watch((conn)->vfs_opaque.handles.notify_watch, (ctx), (e), (callback), (private_data), (handle_p)))
 
 /* NT ACL operations. */
 #define SMB_VFS_OPAQUE_FGET_NT_ACL(fsp, fd, security_info, ppdesc) ((fsp)->conn->vfs_opaque.ops.fget_nt_acl((fsp)->conn->vfs_opaque.handles.fget_nt_acl, (fsp), (fd), (security_info), (ppdesc)))
 #define SMB_VFS_NEXT_LINK(handle, oldpath, newpath) ((handle)->vfs_next.ops.link((handle)->vfs_next.handles.link, (oldpath), (newpath)))
 #define SMB_VFS_NEXT_MKNOD(handle, path, mode, dev) ((handle)->vfs_next.ops.mknod((handle)->vfs_next.handles.mknod, (path), (mode), (dev)))
 #define SMB_VFS_NEXT_REALPATH(handle, path, resolved_path) ((handle)->vfs_next.ops.realpath((handle)->vfs_next.handles.realpath, (path), (resolved_path)))
+#define SMB_VFS_NEXT_NOTIFY_WATCH(conn, ctx, e, callback, private_data, handle_p) ((conn)->vfs_next.ops.notify_watch((conn)->vfs_next.handles.notify_watch, (ctx), (e), (callback), (private_data), (handle_p)))
 
 /* NT ACL operations. */
 #define SMB_VFS_NEXT_FGET_NT_ACL(handle, fsp, fd, security_info, ppdesc) ((handle)->vfs_next.ops.fget_nt_acl((handle)->vfs_next.handles.fget_nt_acl, (fsp), (fd), (security_info), (ppdesc)))
index c68ccbf714a34bb1306017d898d8ab5f565e87cc..0efffe154df47daecbc3e250a968a0d3c3e2c3bb 100644 (file)
@@ -833,6 +833,21 @@ static char *vfswrap_realpath(vfs_handle_struct *handle,  const char *path, char
        return result;
 }
 
+static NTSTATUS vfswrap_notify_watch(vfs_handle_struct *vfs_handle,
+                                    struct sys_notify_context *ctx,
+                                    struct notify_entry *e,
+                                    void (*callback)(struct sys_notify_context *ctx, 
+                                                     void *private_data,
+                                                     struct notify_event *ev),
+                                    void *private_data, void *handle)
+{
+#ifdef HAVE_INOTIFY
+       return inotify_watch(ctx, e, callback, private_data, handle);
+#else
+       return NT_STATUS_OK;
+#endif
+}
+
 static size_t vfswrap_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp, int fd, uint32 security_info, SEC_DESC **ppdesc)
 {
        size_t result;
@@ -1212,6 +1227,8 @@ static vfs_op_tuple vfs_default_ops[] = {
         SMB_VFS_LAYER_OPAQUE},
        {SMB_VFS_OP(vfswrap_realpath),  SMB_VFS_OP_REALPATH,
         SMB_VFS_LAYER_OPAQUE},
+       {SMB_VFS_OP(vfswrap_notify_watch),      SMB_VFS_OP_NOTIFY_WATCH,
+        SMB_VFS_LAYER_OPAQUE},
 
        /* NT ACL operations. */
 
index 5c1143a28e2dbce448b1fc6f5d6a19f4e44417d3..8719c83bba7110ca17a0c8b627789beb3a9d0ca6 100644 (file)
@@ -400,7 +400,7 @@ char *notify_filter_string(TALLOC_CTX *mem_ctx, uint32 filter)
        return result;
 }
 
-struct sys_notify_context *sys_notify_context_create(struct share_params *scfg,
+struct sys_notify_context *sys_notify_context_create(connection_struct *conn,
                                                     TALLOC_CTX *mem_ctx, 
                                                     struct event_context *ev)
 {
@@ -412,6 +412,7 @@ struct sys_notify_context *sys_notify_context_create(struct share_params *scfg,
        }
 
        ctx->ev = ev;
+       ctx->conn = conn;
        ctx->private_data = NULL;
        return ctx;
 }
@@ -423,10 +424,7 @@ NTSTATUS sys_notify_watch(struct sys_notify_context *ctx,
                                           struct notify_event *ev),
                          void *private_data, void *handle)
 {
-#ifdef HAVE_INOTIFY
-       return inotify_watch(ctx, e, callback, private_data, handle);
-#else
-       return NT_STATUS_OK;
-#endif
+       return SMB_VFS_NOTIFY_WATCH(ctx->conn, ctx, e, callback, private_data,
+                                   handle);
 }
 
index 6d77ba4df6618df84c8c4f38a00a04231fd56d81..506ad15b71e0ffeabe66ca30e34e491c0fe468ef 100644 (file)
@@ -73,11 +73,12 @@ static int notify_destructor(struct notify_context *notify)
 struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server, 
                                   struct messaging_context *messaging_ctx,
                                   struct event_context *ev,
-                                  struct share_params *scfg)
+                                  connection_struct *conn)
 {
        struct notify_context *notify;
 
-       if (!lp_parm_bool(scfg->service, "notify", "enable", True)) {
+       if (!lp_parm_bool(conn->params->service, "notify", "enable",
+                         True)) {
                return NULL;
        }
 
@@ -107,7 +108,7 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server,
        messaging_register(notify->messaging_ctx, notify, 
                           MSG_PVFS_NOTIFY, notify_handler);
 
-       notify->sys_notify_ctx = sys_notify_context_create(scfg, notify, ev);
+       notify->sys_notify_ctx = sys_notify_context_create(conn, notify, ev);
 
        return notify;
 }
index 8dbcc2b5abe622c44ea60ca3ae9e78b21024aab5..c3bc89ec0d4d9cf3e5a857dea9e95f56670cc8f7 100644 (file)
@@ -950,7 +950,7 @@ static connection_struct *make_connection_snum(int snum, user_struct *vuser,
                conn->notify_ctx = notify_init(conn->mem_ctx, server_id_self(),
                                               smbd_messaging_context(),
                                               smbd_event_context(),
-                                              conn->params);
+                                              conn);
        }
 
 /* ROOT Activities: */