From: Volker Lendecke Date: Thu, 1 Feb 2007 13:36:02 +0000 (+0000) Subject: r21108: Send sys_notify_watch through the VFS, FAM is next X-Git-Tag: initial-v3-0-unstable~1217 X-Git-Url: http://git.samba.org/samba.git/?p=tprouty%2Fsamba.git;a=commitdiff_plain;h=603a96761391f36ae9a1c8777d3333ab5c02eb34 r21108: Send sys_notify_watch through the VFS, FAM is next --- diff --git a/source/include/smb.h b/source/include/smb.h index aaf50df2bb..b4cb5bd611 100644 --- a/source/include/smb.h +++ b/source/include/smb.h @@ -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 { diff --git a/source/include/vfs.h b/source/include/vfs.h index 9a04fcb423..c13d3eee4e 100644 --- a/source/include/vfs.h +++ b/source/include/vfs.h @@ -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. */ diff --git a/source/include/vfs_macros.h b/source/include/vfs_macros.h index f41fbeb518..d63afb13ea 100644 --- a/source/include/vfs_macros.h +++ b/source/include/vfs_macros.h @@ -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))) @@ -190,6 +191,7 @@ #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))) @@ -304,6 +306,7 @@ #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))) diff --git a/source/modules/vfs_default.c b/source/modules/vfs_default.c index c68ccbf714..0efffe154d 100644 --- a/source/modules/vfs_default.c +++ b/source/modules/vfs_default.c @@ -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. */ diff --git a/source/smbd/notify.c b/source/smbd/notify.c index 5c1143a28e..8719c83bba 100644 --- a/source/smbd/notify.c +++ b/source/smbd/notify.c @@ -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); } diff --git a/source/smbd/notify_internal.c b/source/smbd/notify_internal.c index 6d77ba4df6..506ad15b71 100644 --- a/source/smbd/notify_internal.c +++ b/source/smbd/notify_internal.c @@ -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; } diff --git a/source/smbd/service.c b/source/smbd/service.c index 8dbcc2b5ab..c3bc89ec0d 100644 --- a/source/smbd/service.c +++ b/source/smbd/service.c @@ -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: */