s3:smbd: simplify the notify code a bit and always reply via change_notify_reply...
authorStefan Metzmacher <metze@samba.org>
Mon, 29 Jun 2009 20:17:17 +0000 (22:17 +0200)
committerStefan Metzmacher <metze@samba.org>
Thu, 2 Jul 2009 07:11:00 +0000 (09:11 +0200)
metze

source3/include/proto.h
source3/smbd/notify.c
source3/smbd/nttrans.c

index a3ae1ddad708e9f00d9845f7286d73fa43700134..05ef6fe00dd3b7123faf3915b3162a2e668bae8d 100644 (file)
@@ -6466,7 +6466,9 @@ void reply_negprot(struct smb_request *req);
 /* The following definitions come from smbd/notify.c  */
 
 void change_notify_reply(connection_struct *conn,
-                        struct smb_request *req, uint32 max_param,
+                        struct smb_request *req,
+                        NTSTATUS status,
+                        uint32_t max_param,
                         struct notify_change_buf *notify_buf);
 NTSTATUS change_notify_create(struct files_struct *fsp, uint32 filter,
                              bool recursive);
index 94544271fe62c32360c0887c36e9ee866a63d17e..bf5846641cb5953ab58827caa43ee87e84c1ece1 100644 (file)
@@ -64,6 +64,10 @@ static bool notify_marshall_changes(int num_changes,
        int i;
        UNISTR uni_name;
 
+       if (num_changes == -1) {
+               return false;
+       }
+
        uni_name.buffer = NULL;
 
        for (i=0; i<num_changes; i++) {
@@ -131,37 +135,23 @@ static bool notify_marshall_changes(int num_changes,
  Setup the common parts of the return packet and send it.
 *****************************************************************************/
 
-static void change_notify_reply_packet(connection_struct *conn,
-                                      struct smb_request *req,
-                                      NTSTATUS error_code)
-{
-       reply_outbuf(req, 18, 0);
-
-       if (!NT_STATUS_IS_OK(error_code)) {
-               error_packet_set((char *)req->outbuf, 0, 0, error_code,
-                                __LINE__,__FILE__);
-       }
-
-       show_msg((char *)req->outbuf);
-       if (!srv_send_smb(smbd_server_fd(),
-                         (char *)req->outbuf,
-                         true, req->seqnum+1,
-                         req->encrypted, &req->pcd)) {
-               exit_server_cleanly("change_notify_reply_packet: srv_send_smb "
-                                   "failed.");
-       }
-       TALLOC_FREE(req->outbuf);
-}
-
 void change_notify_reply(connection_struct *conn,
-                        struct smb_request *req, uint32 max_param,
+                        struct smb_request *req,
+                        NTSTATUS error_code,
+                        uint32_t max_param,
                         struct notify_change_buf *notify_buf)
 {
        prs_struct ps;
 
-       if (notify_buf->num_changes == -1) {
-               change_notify_reply_packet(conn, req, NT_STATUS_OK);
-               notify_buf->num_changes = 0;
+       if (!NT_STATUS_IS_OK(error_code)) {
+               send_nt_replies(conn, req, error_code,
+                               NULL, 0, NULL, 0);
+               return;
+       }
+
+       if (max_param == 0 || notify_buf == NULL) {
+               send_nt_replies(conn, req, NT_STATUS_OK,
+                               NULL, 0, NULL, 0);
                return;
        }
 
@@ -173,14 +163,13 @@ void change_notify_reply(connection_struct *conn,
                 * We exceed what the client is willing to accept. Send
                 * nothing.
                 */
-               change_notify_reply_packet(conn, req, NT_STATUS_OK);
-               goto done;
+               prs_mem_free(&ps);
+               prs_init_empty(&ps, NULL, MARSHALL);
        }
 
        send_nt_replies(conn, req, NT_STATUS_OK, prs_data_p(&ps),
                        prs_offset(&ps), NULL, 0);
 
- done:
        prs_mem_free(&ps);
 
        TALLOC_FREE(notify_buf->changes);
@@ -315,8 +304,8 @@ void remove_pending_change_notify_requests_by_mid(uint16 mid)
                return;
        }
 
-       change_notify_reply_packet(map->req->fsp->conn, map->req->req,
-                                  NT_STATUS_CANCELLED);
+       change_notify_reply(map->req->fsp->conn, map->req->req,
+                           NT_STATUS_CANCELLED, 0, NULL);
        change_notify_remove_request(map->req);
 }
 
@@ -332,8 +321,8 @@ void remove_pending_change_notify_requests_by_fid(files_struct *fsp,
        }
 
        while (fsp->notify->requests != NULL) {
-               change_notify_reply_packet(
-                       fsp->conn, fsp->notify->requests->req, status);
+               change_notify_reply(fsp->conn, fsp->notify->requests->req,
+                                   status, 0, NULL);
                change_notify_remove_request(fsp->notify->requests);
        }
 }
@@ -405,6 +394,7 @@ static void notify_fsp(files_struct *fsp, uint32 action, const char *name)
                if (fsp->notify->requests != NULL) {
                        change_notify_reply(fsp->conn,
                                            fsp->notify->requests->req,
+                                           NT_STATUS_OK,
                                            fsp->notify->requests->max_param,
                                            fsp->notify);
                        change_notify_remove_request(fsp->notify->requests);
@@ -464,6 +454,7 @@ static void notify_fsp(files_struct *fsp, uint32 action, const char *name)
 
        change_notify_reply(fsp->conn,
                            fsp->notify->requests->req,
+                           NT_STATUS_OK,
                            fsp->notify->requests->max_param,
                            fsp->notify);
 
index 368a1a8f987d96befa26315134046396f8b15253..9cd35d5ebb717540d9cad3ed483d2be56f4acff8 100644 (file)
@@ -1592,7 +1592,9 @@ static void call_nt_transact_notify_change(connection_struct *conn,
                 * here.
                 */
 
-               change_notify_reply(fsp->conn, req, max_param_count,
+               change_notify_reply(fsp->conn, req,
+                                   NT_STATUS_OK,
+                                   max_param_count,
                                    fsp->notify);
 
                /*