r1325: Always use GetTimeOfDay() (wrapper). Ensure ldap replication
[ira/wip.git] / source3 / smbd / notify.c
index 999821354e409835c8cd82c2ec6e939c26f45bda..9adf827c794d79d43fda49c8ea957d2febfec2d5 100644 (file)
@@ -1,6 +1,5 @@
 /*
-   Unix SMB/Netbios implementation.
-   Version 3.0
+   Unix SMB/CIFS implementation.
    change notify handling
    Copyright (C) Andrew Tridgell 2000
    Copyright (C) Jeremy Allison 1994-1998
@@ -28,7 +27,7 @@ static struct cnotify_fns *cnotify;
  This is the structure to queue to implement NT change
  notify. It consists of smb_size bytes stored from the
  transact command (to keep the mid, tid etc around).
- Plus the fid to examine and notify private data
+ Plus the fid to examine and notify private data.
 *****************************************************************************/
 
 struct change_notify {
@@ -45,6 +44,7 @@ static struct change_notify *change_notify_list;
 /****************************************************************************
  Setup the common parts of the return packet and send it.
 *****************************************************************************/
+
 static void change_notify_reply_packet(char *inbuf, NTSTATUS error_code)
 {
        char outbuf[smb_size+38];
@@ -61,14 +61,14 @@ static void change_notify_reply_packet(char *inbuf, NTSTATUS error_code)
        set_message(outbuf,18,0,False);
 
        if (!send_smb(smbd_server_fd(),outbuf))
-               exit_server("change_notify_reply_packet: send_smb failed.\n");
+               exit_server("change_notify_reply_packet: send_smb failed.");
 }
 
 /****************************************************************************
-remove an entry from the list and free it, also closing any
-directory handle if necessary
-Notice the horrible stuff we have to do because this is a singly linked list.
+ Remove an entry from the list and free it, also closing any
+ directory handle if necessary.
 *****************************************************************************/
+
 static void change_notify_remove(struct change_notify *cnbp)
 {
        cnotify->remove_notify(cnbp->change_data);
@@ -77,10 +77,10 @@ static void change_notify_remove(struct change_notify *cnbp)
        SAFE_FREE(cnbp);
 }
 
-
 /****************************************************************************
  Delete entries by fnum from the change notify pending queue.
 *****************************************************************************/
+
 void remove_pending_change_notify_requests_by_fid(files_struct *fsp)
 {
        struct change_notify *cnbp, *next;
@@ -96,6 +96,7 @@ void remove_pending_change_notify_requests_by_fid(files_struct *fsp)
 /****************************************************************************
  Delete entries by mid from the change notify pending queue. Always send reply.
 *****************************************************************************/
+
 void remove_pending_change_notify_requests_by_mid(int mid)
 {
        struct change_notify *cnbp, *next;
@@ -113,6 +114,7 @@ void remove_pending_change_notify_requests_by_mid(int mid)
  Delete entries by filename and cnum from the change notify pending queue.
  Always send reply.
 *****************************************************************************/
+
 void remove_pending_change_notify_requests_by_filename(files_struct *fsp)
 {
        struct change_notify *cnbp, *next;
@@ -133,6 +135,7 @@ void remove_pending_change_notify_requests_by_filename(files_struct *fsp)
 /****************************************************************************
  Return true if there are pending change notifies.
 ****************************************************************************/
+
 int change_notify_timeout(void)
 {
        return cnotify->select_time;
@@ -143,6 +146,7 @@ int change_notify_timeout(void)
  Returns True if there are still outstanding change notify requests on the
  queue.
 *****************************************************************************/
+
 BOOL process_pending_change_notify_queue(time_t t)
 {
        struct change_notify *cnbp, *next;
@@ -152,8 +156,9 @@ BOOL process_pending_change_notify_queue(time_t t)
                next=cnbp->next;
 
                vuid = (lp_security() == SEC_SHARE) ? UID_FIELD_INVALID : SVAL(cnbp->request_buf,smb_uid);
-               
+
                if (cnotify->check_notify(cnbp->conn, vuid, cnbp->fsp->fsp_name, cnbp->flags, cnbp->change_data, t)) {
+                       DEBUG(10,("process_pending_change_notify_queue: dir %s changed !\n", cnbp->fsp->fsp_name ));
                        change_notify_reply_packet(cnbp->request_buf,STATUS_NOTIFY_ENUM_DIR);
                        change_notify_remove(cnbp);
                }
@@ -163,17 +168,18 @@ BOOL process_pending_change_notify_queue(time_t t)
 }
 
 /****************************************************************************
  * Now queue an entry on the notify change list.
  * We only need to save smb_size bytes from this incoming packet
  * as we will always by returning a 'read the directory yourself'
  * error.
+ Now queue an entry on the notify change list.
+ We only need to save smb_size bytes from this incoming packet
+ as we will always by returning a 'read the directory yourself'
+ error.
 ****************************************************************************/
+
 BOOL change_notify_set(char *inbuf, files_struct *fsp, connection_struct *conn, uint32 flags)
 {
        struct change_notify *cnbp;
 
        if((cnbp = (struct change_notify *)malloc(sizeof(*cnbp))) == NULL) {
-               DEBUG(0,("call_nt_transact_notify_change: malloc fail !\n" ));
+               DEBUG(0,("change_notify_set: malloc fail !\n" ));
                return -1;
        }
 
@@ -192,17 +198,21 @@ BOOL change_notify_set(char *inbuf, files_struct *fsp, connection_struct *conn,
 
        DLIST_ADD(change_notify_list, cnbp);
 
+       /* Push the MID of this packet on the signing queue. */
+       srv_defer_sign_response(SVAL(inbuf,smb_mid));
+
        return True;
 }
 
-
 /****************************************************************************
-initialise the change notify subsystem
+ Initialise the change notify subsystem.
 ****************************************************************************/
+
 BOOL init_change_notify(void)
 {
 #if HAVE_KERNEL_CHANGE_NOTIFY
-       cnotify = kernel_notify_init();
+       if (lp_kernel_change_notify())
+               cnotify = kernel_notify_init();
 #endif
        if (!cnotify) cnotify = hash_notify_init();