smbd: There's only one notify_callback
authorVolker Lendecke <vl@samba.org>
Tue, 14 Jun 2016 09:55:13 +0000 (11:55 +0200)
committerJeremy Allison <jra@samba.org>
Wed, 20 Jul 2016 03:21:07 +0000 (05:21 +0200)
We do not have different callbacks per notify, put the callback function into
the notify context

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/notify.c
source3/smbd/notify_msg.c
source3/smbd/proto.h
source3/smbd/service.c
source3/utils/status.c

index c824ced536823231385c2908fd089693cdda6f15..f493f11aa69a558389689b2fe3fc271b297adf32 100644 (file)
@@ -280,8 +280,7 @@ NTSTATUS change_notify_create(struct files_struct *fsp, uint32_t filter,
 
        if ((filter != 0) || (subdir_filter != 0)) {
                status = notify_add(fsp->conn->sconn->notify_ctx,
-                                   fullpath, filter, subdir_filter,
-                                   notify_callback, fsp);
+                                   fullpath, filter, subdir_filter, fsp);
        }
 
        return status;
index 817bc79a2f826c8db6d55399362f2a2aa2c1633f..e9f91995a1179519b036f8110ebe4c1ebd4a9dd2 100644 (file)
@@ -32,8 +32,6 @@
 
 struct notify_list {
        struct notify_list *next, *prev;
-       void (*callback)(void *private_data, struct timespec when,
-                        const struct notify_event *ctx);
        void *private_data;
 };
 
@@ -41,15 +39,19 @@ struct notify_context {
        struct server_id notifyd;
        struct messaging_context *msg_ctx;
        struct notify_list *list;
+       void (*callback)(void *private_data, struct timespec when,
+                        const struct notify_event *ctx);
 };
 
 static void notify_handler(struct messaging_context *msg, void *private_data,
                           uint32_t msg_type, struct server_id src,
                           DATA_BLOB *data);
 
-struct notify_context *notify_init(TALLOC_CTX *mem_ctx,
-                                  struct messaging_context *msg,
-                                  struct tevent_context *ev)
+struct notify_context *notify_init(
+       TALLOC_CTX *mem_ctx, struct messaging_context *msg,
+       struct tevent_context *ev,
+       void (*callback)(void *, struct timespec,
+                        const struct notify_event *))
 {
        struct server_id_db *names_db;
        struct notify_context *ctx;
@@ -61,6 +63,7 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx,
        }
        ctx->msg_ctx = msg;
        ctx->list = NULL;
+       ctx->callback = callback;
 
        names_db = messaging_names_db(msg);
        if (!server_id_db_lookup_one(names_db, "notify-daemon",
@@ -70,12 +73,15 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx,
                return NULL;
        }
 
-       status = messaging_register(msg, ctx, MSG_PVFS_NOTIFY, notify_handler);
-       if (!NT_STATUS_IS_OK(status)) {
-               DEBUG(1, ("messaging_register failed: %s\n",
-                         nt_errstr(status)));
-               TALLOC_FREE(ctx);
-               return NULL;
+       if (callback != NULL) {
+               status = messaging_register(msg, ctx, MSG_PVFS_NOTIFY,
+                                           notify_handler);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(1, ("messaging_register failed: %s\n",
+                                 nt_errstr(status)));
+                       TALLOC_FREE(ctx);
+                       return NULL;
+               }
        }
 
        return ctx;
@@ -112,8 +118,8 @@ static void notify_handler(struct messaging_context *msg, void *private_data,
 
        for (listel = ctx->list; listel != NULL; listel = listel->next) {
                if (listel->private_data == event.private_data) {
-                       listel->callback(listel->private_data, event_msg->when,
-                                        &event);
+                       ctx->callback(listel->private_data, event_msg->when,
+                                     &event);
                        break;
                }
        }
@@ -121,8 +127,6 @@ static void notify_handler(struct messaging_context *msg, void *private_data,
 
 NTSTATUS notify_add(struct notify_context *ctx,
                    const char *path, uint32_t filter, uint32_t subdir_filter,
-                   void (*callback)(void *, struct timespec,
-                                    const struct notify_event *),
                    void *private_data)
 {
        struct notify_list *listel;
@@ -145,7 +149,6 @@ NTSTATUS notify_add(struct notify_context *ctx,
        if (listel == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
-       listel->callback = callback;
        listel->private_data = private_data;
 
        clock_gettime_mono(&msg.instance.creation_time);
index f3b9e73b88f1fc9572641c17e7e39fc6dd2b3fc6..b677748c2e6d8f0445691715af907a4993ec761a 100644 (file)
@@ -583,13 +583,13 @@ int fam_watch(TALLOC_CTX *mem_ctx,
 
 /* The following definitions come from smbd/notify_internal.c  */
 
-struct notify_context *notify_init(TALLOC_CTX *mem_ctx,
-                                  struct messaging_context *messaging_ctx,
-                                  struct tevent_context *ev);
-NTSTATUS notify_add(struct notify_context *notify,
+struct notify_context *notify_init(
+       TALLOC_CTX *mem_ctx, struct messaging_context *msg,
+       struct tevent_context *ev,
+       void (*callback)(void *, struct timespec,
+                        const struct notify_event *));
+NTSTATUS notify_add(struct notify_context *ctx,
                    const char *path, uint32_t filter, uint32_t subdir_filter,
-                   void (*callback)(void *, struct timespec,
-                                    const struct notify_event *),
                    void *private_data);
 NTSTATUS notify_remove(struct notify_context *ctx, void *private_data,
                       char *path);
index 37440e01d5d4e7d90c25e8474f177eff21374c80..4b16dbad5e92510067f15f6e35744b849c9004a1 100644 (file)
@@ -528,7 +528,8 @@ static NTSTATUS notify_init_sconn(struct smbd_server_connection *sconn)
                return NT_STATUS_OK;
        }
 
-       sconn->notify_ctx = notify_init(sconn, sconn->msg_ctx, sconn->ev_ctx);
+       sconn->notify_ctx = notify_init(sconn, sconn->msg_ctx, sconn->ev_ctx,
+                                       notify_callback);
        if (sconn->notify_ctx == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
index 9aefd5eb97fc571a59796b29b7388049dce41042..7bff1023853a85723fefa701a7a871dc1f4e048d 100644 (file)
@@ -708,7 +708,7 @@ int main(int argc, const char *argv[])
                struct notify_context *n;
 
                n = notify_init(talloc_tos(), msg_ctx,
-                               messaging_tevent_context(msg_ctx));
+                               messaging_tevent_context(msg_ctx), NULL);
                if (n == NULL) {
                        goto done;
                }