/*
- 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
#include "includes.h"
-extern int DEBUGLEVEL;
-
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 {
/****************************************************************************
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];
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);
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;
/****************************************************************************
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;
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;
/****************************************************************************
Return true if there are pending change notifies.
****************************************************************************/
+
int change_notify_timeout(void)
{
return cnotify->select_time;
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;
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);
}
}
/****************************************************************************
- * 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;
}
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();