diff options
author | Volker Lendecke <vlendec@samba.org> | 2007-01-09 16:12:54 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:17:00 -0500 |
commit | f146a85e74c84e78a11e616a1cbeaeef4693a0e0 (patch) | |
tree | 3d6b9a4147f1f796831fa4f1c4d8e5e0ac6c3768 /source | |
parent | 58b8a242a7f08c1292d24fc73df170dbcd68c10d (diff) | |
download | samba-f146a85e74c84e78a11e616a1cbeaeef4693a0e0.tar.gz samba-f146a85e74c84e78a11e616a1cbeaeef4693a0e0.tar.xz samba-f146a85e74c84e78a11e616a1cbeaeef4693a0e0.zip |
r20634: A *LOT* more work is necessary before touching notify remotely starts to make
sense. Until then, remove it from the tree to keep the diff between 3_0_24 and
3_0 small.
Volker
Diffstat (limited to 'source')
-rw-r--r-- | source/include/smb.h | 61 | ||||
-rw-r--r-- | source/smbd/dosmode.c | 10 | ||||
-rw-r--r-- | source/smbd/files.c | 46 | ||||
-rw-r--r-- | source/smbd/notify.c | 467 | ||||
-rw-r--r-- | source/smbd/nttrans.c | 53 | ||||
-rw-r--r-- | source/smbd/open.c | 5 | ||||
-rw-r--r-- | source/smbd/reply.c | 17 |
7 files changed, 38 insertions, 621 deletions
diff --git a/source/include/smb.h b/source/include/smb.h index a7461b422c2..c8126c43c33 100644 --- a/source/include/smb.h +++ b/source/include/smb.h @@ -428,49 +428,6 @@ struct vfs_fsp_data { */ }; -/* the basic packet size, assuming no words or bytes */ -#define smb_size 39 - -struct notify_change { - uint32_t action; - char *name; -}; - -struct notify_change_request { - struct notify_change_request *prev, *next; - struct files_struct *fsp; /* backpointer for cancel by mid */ - char request_buf[smb_size]; - uint32 filter; - uint32 max_param_count; - struct notify_mid_map *mid_map; -}; - -/* - * For NTCancel, we need to find the notify_change_request indexed by - * mid. Separate list here. - */ - -struct notify_mid_map { - struct notify_mid_map *prev, *next; - struct notify_change_request *req; - uint16 mid; -}; - -struct notify_change_buf { - /* - * If no requests are pending, changes are queued here. Simple array, - * we only append. - */ - unsigned num_changes; - struct notify_change *changes; - - /* - * If no changes are around requests are queued here. Using a linked - * list, because we have to append at the end and delete from the top. - */ - struct notify_change_request *requests; -}; - typedef struct files_struct { struct files_struct *next, *prev; int fnum; @@ -513,8 +470,6 @@ typedef struct files_struct { struct vfs_fsp_data *vfs_extension; FAKE_FILE_HANDLE *fake_file_handle; - - struct notify_change_buf *notify; } files_struct; #include "ntquotas.h" @@ -924,6 +879,9 @@ struct bitmap { unsigned int n; }; +/* the basic packet size, assuming no words or bytes */ +#define smb_size 39 + /* offsets into message for common items */ #define smb_com 8 #define smb_rcls 9 @@ -1385,19 +1343,6 @@ struct bitmap { #define FILE_NOTIFY_CHANGE_SECURITY 0x100 #define FILE_NOTIFY_CHANGE_FILE_NAME 0x200 -#define FILE_NOTIFY_CHANGE_NAME \ - (FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME) - -/* change notify action results */ -#define NOTIFY_ACTION_ADDED 1 -#define NOTIFY_ACTION_REMOVED 2 -#define NOTIFY_ACTION_MODIFIED 3 -#define NOTIFY_ACTION_OLD_NAME 4 -#define NOTIFY_ACTION_NEW_NAME 5 -#define NOTIFY_ACTION_ADDED_STREAM 6 -#define NOTIFY_ACTION_REMOVED_STREAM 7 -#define NOTIFY_ACTION_MODIFIED_STREAM 8 - /* where to find the base of the SMB packet proper */ #define smb_base(buf) (((char *)(buf))+4) diff --git a/source/smbd/dosmode.c b/source/smbd/dosmode.c index a3c46b32756..1172fe3e6b5 100644 --- a/source/smbd/dosmode.c +++ b/source/smbd/dosmode.c @@ -499,11 +499,8 @@ int file_set_dosmode(connection_struct *conn, const char *fname, unixmode |= (st->st_mode & (S_IWUSR|S_IWGRP|S_IWOTH)); } - if ((ret = SMB_VFS_CHMOD(conn,fname,unixmode)) == 0) { - notify_fname(conn, fname, FILE_NOTIFY_CHANGE_ATTRIBUTES, - NOTIFY_ACTION_MODIFIED); + if ((ret = SMB_VFS_CHMOD(conn,fname,unixmode)) == 0) return 0; - } if((errno != EPERM) && (errno != EACCES)) return -1; @@ -532,8 +529,6 @@ int file_set_dosmode(connection_struct *conn, const char *fname, ret = SMB_VFS_FCHMOD(fsp, fsp->fh->fd, unixmode); unbecome_root(); close_file_fchmod(fsp); - notify_fname(conn, fname, FILE_NOTIFY_CHANGE_ATTRIBUTES, - NOTIFY_ACTION_MODIFIED); } return( ret ); @@ -606,9 +601,6 @@ BOOL set_filetime(connection_struct *conn, const char *fname, time_t mtime) DEBUG(4,("set_filetime(%s) failed: %s\n",fname,strerror(errno))); return False; } - - notify_fname(conn, fname, FILE_NOTIFY_CHANGE_LAST_WRITE, - NOTIFY_ACTION_MODIFIED); return(True); } diff --git a/source/smbd/files.c b/source/smbd/files.c index 982de4c55fd..7069818dee4 100644 --- a/source/smbd/files.c +++ b/source/smbd/files.c @@ -361,50 +361,6 @@ files_struct *file_find_di_next(files_struct *start_fsp) return NULL; } -/* - * Same as file_find_di_first/next, but also finds non-fd opens. - * - * Jeremy, do we really need the fsp->fh->fd != -1 ?? - */ - -struct files_struct *fsp_find_di_first(SMB_DEV_T dev, SMB_INO_T inode) -{ - files_struct *fsp; - - if (fsp_fi_cache.dev == dev && fsp_fi_cache.inode == inode) { - /* Positive or negative cache hit. */ - return fsp_fi_cache.fsp; - } - - fsp_fi_cache.dev = dev; - fsp_fi_cache.inode = inode; - - for (fsp=Files;fsp;fsp=fsp->next) { - if ((fsp->dev == dev) && (fsp->inode == inode)) { - /* Setup positive cache. */ - fsp_fi_cache.fsp = fsp; - return fsp; - } - } - - /* Setup negative cache. */ - fsp_fi_cache.fsp = NULL; - return NULL; -} - -struct files_struct *fsp_find_di_next(files_struct *start_fsp) -{ - files_struct *fsp; - - for (fsp = start_fsp->next;fsp;fsp=fsp->next) { - if ( (fsp->dev == start_fsp->dev) - && (fsp->inode == start_fsp->inode) ) - return fsp; - } - - return NULL; -} - /**************************************************************************** Find a fsp that is open for printing. ****************************************************************************/ @@ -483,8 +439,6 @@ void file_free(files_struct *fsp) fsp->fh->ref_count--; } - TALLOC_FREE(fsp->notify); - bitmap_clear(file_bmap, fsp->fnum - FILE_HANDLE_OFFSET); files_used--; diff --git a/source/smbd/notify.c b/source/smbd/notify.c index 6bedb17261f..4ec53567dd4 100644 --- a/source/smbd/notify.c +++ b/source/smbd/notify.c @@ -22,7 +22,6 @@ #include "includes.h" static struct cnotify_fns *cnotify; -static struct notify_mid_map *notify_changes_by_mid; /**************************************************************************** This is the structure to queue to implement NT change @@ -34,76 +33,24 @@ static struct notify_mid_map *notify_changes_by_mid; struct change_notify { struct change_notify *next, *prev; files_struct *fsp; + connection_struct *conn; uint32 flags; - uint32 max_param_count; char request_buf[smb_size]; void *change_data; }; static struct change_notify *change_notify_list; -static BOOL notify_marshall_changes(unsigned num_changes, - struct notify_change *changes, - prs_struct *ps) -{ - int i; - UNISTR uni_name; - - for (i=0; i<num_changes; i++) { - struct notify_change *c = &changes[i]; - size_t namelen; - uint32 u32_tmp; /* Temp arg to prs_uint32 to avoid - * signed/unsigned issues */ - - namelen = convert_string_allocate( - NULL, CH_UNIX, CH_UTF16LE, c->name, strlen(c->name)+1, - &uni_name.buffer, True); - if ((namelen == -1) || (uni_name.buffer == NULL)) { - goto fail; - } - - namelen -= 2; /* Dump NULL termination */ - - /* - * Offset to next entry, only if there is one - */ - - u32_tmp = (i == num_changes-1) ? 0 : namelen + 12; - if (!prs_uint32("offset", ps, 1, &u32_tmp)) goto fail; - - u32_tmp = c->action; - if (!prs_uint32("action", ps, 1, &u32_tmp)) goto fail; - - u32_tmp = namelen; - if (!prs_uint32("namelen", ps, 1, &u32_tmp)) goto fail; - - if (!prs_unistr("name", ps, 1, &uni_name)) goto fail; - - /* - * Not NULL terminated, decrease by the 2 UCS2 \0 chars - */ - prs_set_offset(ps, prs_offset(ps)-2); - - SAFE_FREE(uni_name.buffer); - } - - return True; - - fail: - SAFE_FREE(uni_name.buffer); - return False; -} - /**************************************************************************** Setup the common parts of the return packet and send it. *****************************************************************************/ -void change_notify_reply_packet(const char *request_buf, NTSTATUS error_code) +static void change_notify_reply_packet(char *inbuf, NTSTATUS error_code) { char outbuf[smb_size+38]; memset(outbuf, '\0', sizeof(outbuf)); - construct_reply_common(request_buf, outbuf); + construct_reply_common(inbuf, outbuf); ERROR_NT(error_code); @@ -118,45 +65,6 @@ void change_notify_reply_packet(const char *request_buf, NTSTATUS error_code) exit_server_cleanly("change_notify_reply_packet: send_smb failed."); } -void change_notify_reply(const char *request_buf, uint32 max_param_count, - unsigned num_changes, struct notify_change *changes) -{ - char *outbuf = NULL; - prs_struct ps; - size_t buflen = smb_size+38+max_param_count; - - if (!prs_init(&ps, 0, NULL, False) - || !notify_marshall_changes(num_changes, changes, &ps)) { - change_notify_reply_packet(request_buf, NT_STATUS_NO_MEMORY); - goto done; - } - - if (prs_offset(&ps) > max_param_count) { - /* - * We exceed what the client is willing to accept. Send - * nothing. - */ - change_notify_reply_packet(request_buf, NT_STATUS_OK); - goto done; - } - - if (!(outbuf = SMB_MALLOC_ARRAY(char, buflen))) { - change_notify_reply_packet(request_buf, NT_STATUS_NO_MEMORY); - goto done; - } - - construct_reply_common(request_buf, outbuf); - - if (send_nt_replies(outbuf, buflen, NT_STATUS_OK, prs_data_p(&ps), - prs_offset(&ps), NULL, 0) == -1) { - exit_server("change_notify_reply_packet: send_smb failed."); - } - - done: - SAFE_FREE(outbuf); - prs_mem_free(&ps); -} - /**************************************************************************** Remove an entry from the list and free it, also closing any directory handle if necessary. @@ -170,103 +78,37 @@ static void change_notify_remove(struct change_notify *cnbp) SAFE_FREE(cnbp); } -NTSTATUS change_notify_add_request(const char *inbuf, uint32 max_param_count, - uint32 filter, struct files_struct *fsp) -{ - struct notify_change_request *request = NULL; - struct notify_mid_map *map = NULL; - - if (!(request = SMB_MALLOC_P(struct notify_change_request)) - || !(map = SMB_MALLOC_P(struct notify_mid_map))) { - SAFE_FREE(request); - return NT_STATUS_NO_MEMORY; - } - - request->mid_map = map; - map->req = request; - - memcpy(request->request_buf, inbuf, sizeof(request->request_buf)); - request->max_param_count = max_param_count; - request->filter = filter; - request->fsp = fsp; - DLIST_ADD_END(fsp->notify->requests, request, - struct notify_change_request *); - - map->mid = SVAL(inbuf, smb_mid); - DLIST_ADD(notify_changes_by_mid, map); - - /* Push the MID of this packet on the signing queue. */ - srv_defer_sign_response(SVAL(inbuf,smb_mid)); - - return NT_STATUS_OK; -} - -static void change_notify_remove_request(struct notify_change_request *remove_req) -{ - files_struct *fsp; - struct notify_change_request *req; - - /* - * Paranoia checks, the fsp referenced must must have the request in - * its list of pending requests - */ - - fsp = remove_req->fsp; - SMB_ASSERT(fsp->notify != NULL); - - for (req = fsp->notify->requests; req; req = req->next) { - if (req == remove_req) { - break; - } - } - - if (req == NULL) { - smb_panic("notify_req not found in fsp's requests\n"); - } - - DLIST_REMOVE(fsp->notify->requests, req); - DLIST_REMOVE(notify_changes_by_mid, req->mid_map); - SAFE_FREE(req->mid_map); - SAFE_FREE(req); -} - /**************************************************************************** - Delete entries by mid from the change notify pending queue. Always send reply. + Delete entries by fnum from the change notify pending queue. *****************************************************************************/ -void remove_pending_change_notify_requests_by_mid(uint16 mid) +void remove_pending_change_notify_requests_by_fid(files_struct *fsp, NTSTATUS status) { - struct notify_mid_map *map; + struct change_notify *cnbp, *next; - for (map = notify_changes_by_mid; map; map = map->next) { - if (map->mid == mid) { - break; + for (cnbp=change_notify_list; cnbp; cnbp=next) { + next=cnbp->next; + if (cnbp->fsp->fnum == fsp->fnum) { + change_notify_reply_packet(cnbp->request_buf,status); + change_notify_remove(cnbp); } } - - if (map == NULL) { - return; - } - - change_notify_reply_packet(map->req->request_buf, NT_STATUS_CANCELLED); - change_notify_remove_request(map->req); } /**************************************************************************** - Delete entries by fnum from the change notify pending queue. + Delete entries by mid from the change notify pending queue. Always send reply. *****************************************************************************/ -void remove_pending_change_notify_requests_by_fid(files_struct *fsp, - NTSTATUS status) +void remove_pending_change_notify_requests_by_mid(int mid) { - if (fsp->notify == NULL) { - return; - } + struct change_notify *cnbp, *next; - while (fsp->notify->requests != NULL) { - change_notify_reply_packet( - fsp->notify->requests->request_buf, status); - change_notify_remove_request(fsp->notify->requests); + for (cnbp=change_notify_list; cnbp; cnbp=next) { + next=cnbp->next; + if(SVAL(cnbp->request_buf,smb_mid) == mid) { + change_notify_reply_packet(cnbp->request_buf,NT_STATUS_CANCELLED); + change_notify_remove(cnbp); + } } } @@ -286,7 +128,7 @@ void remove_pending_change_notify_requests_by_filename(files_struct *fsp, NTSTAT * the filename are identical. */ if((cnbp->fsp->conn == fsp->conn) && strequal(cnbp->fsp->fsp_name,fsp->fsp_name)) { - change_notify_reply_packet(cnbp->request_buf, status); + change_notify_reply_packet(cnbp->request_buf,status); change_notify_remove(cnbp); } } @@ -329,27 +171,9 @@ BOOL process_pending_change_notify_queue(time_t t) vuid = (lp_security() == SEC_SHARE) ? UID_FIELD_INVALID : SVAL(cnbp->request_buf,smb_uid); - if (cnbp->fsp->notify->num_changes != 0) { - DEBUG(10,("process_pending_change_notify_queue: %s " - "has %d changes!\n", cnbp->fsp->fsp_name, - cnbp->fsp->notify->num_changes)); - change_notify_reply(cnbp->request_buf, - cnbp->max_param_count, - cnbp->fsp->notify->num_changes, - cnbp->fsp->notify->changes); - change_notify_remove(cnbp); - continue; - } - - if (cnotify->check_notify(cnbp->fsp->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(cnbp->request_buf, - cnbp->max_param_count, - cnbp->fsp->notify->num_changes, - cnbp->fsp->notify->changes); + 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); } } @@ -364,24 +188,22 @@ BOOL process_pending_change_notify_queue(time_t t) error. ****************************************************************************/ -BOOL change_notify_set(char *inbuf, files_struct *fsp, connection_struct *conn, - uint32 flags, uint32 max_param_count) +BOOL change_notify_set(char *inbuf, files_struct *fsp, connection_struct *conn, uint32 flags) { struct change_notify *cnbp; if((cnbp = SMB_MALLOC_P(struct change_notify)) == NULL) { DEBUG(0,("change_notify_set: malloc fail !\n" )); - return False; + return -1; } ZERO_STRUCTP(cnbp); memcpy(cnbp->request_buf, inbuf, smb_size); cnbp->fsp = fsp; + cnbp->conn = conn; cnbp->flags = flags; - cnbp->max_param_count = max_param_count; - cnbp->change_data = cnotify->register_notify(conn, fsp->fsp_name, - flags); + cnbp->change_data = cnotify->register_notify(conn, fsp->fsp_name, flags); if (!cnbp->change_data) { SAFE_FREE(cnbp); @@ -405,237 +227,6 @@ int change_notify_fd(void) return -1; } -/* notify message definition - -Offset Data length. -0 SMB_DEV_T dev 8 -8 SMB_INO_T inode 8 -16 uint32 filter 4 -20 uint32 action 4 -24.. name -*/ - -#define MSG_NOTIFY_MESSAGE_SIZE 25 /* Includes at least the '\0' terminator */ - -struct notify_message { - SMB_DEV_T dev; - SMB_INO_T inode; - uint32 filter; - uint32 action; - char *name; -}; - -static DATA_BLOB notify_message_to_buf(const struct notify_message *msg) -{ - DATA_BLOB result; - size_t len; - - len = strlen(msg->name); - - result = data_blob(NULL, MSG_NOTIFY_MESSAGE_SIZE + len); - if (!result.data) { - return result; - } - - SDEV_T_VAL(result.data, 0, msg->dev); - SINO_T_VAL(result.data, 8, msg->inode); - SIVAL(result.data, 16, msg->filter); - SIVAL(result.data, 20, msg->action); - memcpy(result.data+24, msg->name, len+1); - - return result; -} - -static BOOL buf_to_notify_message(void *buf, size_t len, - struct notify_message *msg) -{ - if (len < MSG_NOTIFY_MESSAGE_SIZE) { - DEBUG(0, ("Got invalid notify message of len %d\n", - (int)len)); - return False; - } - - msg->dev = DEV_T_VAL(buf, 0); - msg->inode = INO_T_VAL(buf, 8); - msg->filter = IVAL(buf, 16); - msg->action = IVAL(buf, 20); - msg->name = ((char *)buf)+24; - return True; -} - -void notify_action(connection_struct *conn, const char *parent, - const char *name, uint32 filter, uint32_t action) -{ - struct share_mode_lock *lck; - SMB_STRUCT_STAT sbuf; - int i; - struct notify_message msg; - DATA_BLOB blob; - - struct process_id *pids; - int num_pids; - - DEBUG(10, ("notify_action: parent=%s, name=%s, action=%u\n", - parent, name, (unsigned)action)); - - if (SMB_VFS_STAT(conn, parent, &sbuf) != 0) { - /* - * Not 100% critical, ignore failure - */ - return; - } - - if (!(lck = get_share_mode_lock(NULL, sbuf.st_dev, sbuf.st_ino, - NULL, NULL))) { - return; - } - - msg.dev = sbuf.st_dev; - msg.inode = sbuf.st_ino; - msg.filter = filter; - msg.action = action; - msg.name = CONST_DISCARD(char *, name); - - blob = notify_message_to_buf(&msg); - if (blob.data == NULL) { - DEBUG(0, ("notify_message_to_buf failed\n")); - return; - } - - pids = NULL; - num_pids = 0; - - become_root_uid_only(); - - for (i=0; i<lck->num_share_modes; i++) { - struct share_mode_entry *e = &lck->share_modes[i]; - int j; - struct process_id *tmp; - - for (j=0; j<num_pids; j++) { - if (procid_equal(&e->pid, &pids[j])) { - break; - } - } - - if (j < num_pids) { - /* - * Already sent to that process, skip it - */ - continue; - } - - message_send_pid(lck->share_modes[i].pid, MSG_SMB_NOTIFY, - blob.data, blob.length, True); - - if (!(tmp = TALLOC_REALLOC_ARRAY(lck, pids, struct process_id, - num_pids+1))) { - DEBUG(0, ("realloc failed\n")); - break; - } - pids = tmp; - pids[num_pids] = e->pid; - num_pids += 1; - } - - unbecome_root_uid_only(); - - data_blob_free(&blob); - TALLOC_FREE(lck); -} - -void notify_fname(connection_struct *conn, const char *path, - uint32 filter, uint32 action) -{ - char *parent; - const char *name; - - if (!parent_dirname_talloc(tmp_talloc_ctx(), path, &parent, &name)) { - return; - } - - notify_action(conn, parent, name, filter, action); - TALLOC_FREE(parent); -} - -static void notify_fsp(files_struct *fsp, struct notify_message *msg) -{ - struct notify_change *change, *changes; - - if (fsp->notify == NULL) { - /* - * Nobody is waiting, don't queue - */ - return; - } - - if ((fsp->notify->requests != NULL) - && (fsp->notify->requests->filter & msg->filter)) { - /* - * Someone is waiting for the change, trigger the reply - * immediately. - * - * TODO: do we have to walk the lists of requests pending? - */ - - struct notify_change_request *req = fsp->notify->requests; - struct notify_change onechange; - - onechange.action = msg->action; - onechange.name = msg->name; - - change_notify_reply(req->request_buf, req->max_param_count, - 1, &onechange); - change_notify_remove_request(req); - return; - } - - /* - * Someone has triggered a notify previously, queue the change for - * later. TODO: Limit the number of changes queued, test how filters - * apply here. Do we have to store them? - */ - - if (!(changes = TALLOC_REALLOC_ARRAY( - fsp->notify, fsp->notify->changes, - struct notify_change, fsp->notify->num_changes+1))) { - DEBUG(0, ("talloc_realloc failed\n")); - return; - } - - fsp->notify->changes = changes; - - change = &(fsp->notify->changes[fsp->notify->num_changes]); - - if (!(change->name = talloc_strdup(changes, msg->name))) { - DEBUG(0, ("talloc_strdup failed\n")); - return; - } - change->action = msg->action; - fsp->notify->num_changes += 1; - - return; -} - -static void notify_message_callback(int msgtype, struct process_id pid, - void *buf, size_t len) -{ - struct notify_message msg; - files_struct *fsp; - - if (!buf_to_notify_message(buf, len, &msg)) { - return; - } - - DEBUG(10, ("Received notify_message for 0x%x/%.0f: %d\n", - (unsigned)msg.dev, (double)msg.inode, msg.action)); - - for(fsp = fsp_find_di_first(msg.dev, msg.inode); fsp; - fsp = fsp_find_di_next(fsp)) { - notify_fsp(fsp, &msg); - } -} - /**************************************************************************** Initialise the change notify subsystem. ****************************************************************************/ @@ -659,7 +250,5 @@ BOOL init_change_notify(void) return False; } - message_register(MSG_SMB_NOTIFY, notify_message_callback); - return True; } diff --git a/source/smbd/nttrans.c b/source/smbd/nttrans.c index f62f5881b38..3e64cdc2d26 100644 --- a/source/smbd/nttrans.c +++ b/source/smbd/nttrans.c @@ -1820,15 +1820,14 @@ static int call_nt_transact_notify_change(connection_struct *conn, char *inbuf, { uint16 *setup = *ppsetup; files_struct *fsp; - uint32 filter; - NTSTATUS status; + uint32 flags; if(setup_count < 6) { return ERROR_DOS(ERRDOS,ERRbadfunc); } fsp = file_fsp((char *)setup,4); - filter = IVAL(setup, 0); + flags = IVAL(setup, 0); DEBUG(3,("call_nt_transact_notify_change\n")); @@ -1836,56 +1835,16 @@ static int call_nt_transact_notify_change(connection_struct *conn, char *inbuf, return ERROR_DOS(ERRDOS,ERRbadfid); } - DEBUG(3,("call_nt_transact_notify_change: notify change called on " - "directory name = %s\n", fsp->fsp_name )); - if((!fsp->is_directory) || (conn != fsp->conn)) { return ERROR_DOS(ERRDOS,ERRbadfid); } - if (fsp->notify == NULL) { - if (!(fsp->notify = TALLOC_ZERO_P( - NULL, struct notify_change_buf))) { - return ERROR_NT(NT_STATUS_NO_MEMORY); - } - } - - if (fsp->notify->num_changes > 0) { - - /* - * We've got changes pending, respond immediately - */ - - /* - * TODO: write a torture test to check the filtering behaviour - * here. - */ - - SMB_ASSERT(fsp->notify->requests == NULL); - - change_notify_reply(inbuf, max_param_count, - fsp->notify->num_changes, - fsp->notify->changes); - - TALLOC_FREE(fsp->notify->changes); - fsp->notify->num_changes = 0; - - /* - * change_notify_reply() above has independently sent its - * results - */ - return -1; + if (!change_notify_set(inbuf, fsp, conn, flags)) { + return(UNIXERROR(ERRDOS,ERRbadfid)); } - /* - * No changes pending, queue the request - */ - - status = change_notify_add_request(inbuf, max_param_count, filter, - fsp); - if (!NT_STATUS_IS_OK(status)) { - return ERROR_NT(status); - } + DEBUG(3,("call_nt_transact_notify_change: notify change called on directory \ +name = %s\n", fsp->fsp_name )); return -1; } diff --git a/source/smbd/open.c b/source/smbd/open.c index 81537e0be30..bccc91bbd3e 100644 --- a/source/smbd/open.c +++ b/source/smbd/open.c @@ -309,8 +309,6 @@ static NTSTATUS open_file(files_struct *fsp, fsp); } - notify_action(conn, parent_dir, name, -1, - NOTIFY_ACTION_ADDED); } } else { @@ -1944,9 +1942,6 @@ static NTSTATUS mkdir_internal(connection_struct *conn, const char *name, change_dir_owner_to_parent(conn, parent_dir, name, psbuf); } - notify_action(conn, parent_dir, dirname, FILE_NOTIFY_CHANGE_DIR_NAME, - NOTIFY_ACTION_ADDED); - return NT_STATUS_OK; } diff --git a/source/smbd/reply.c b/source/smbd/reply.c index cc181223f22..da7fadae3bb 100644 --- a/source/smbd/reply.c +++ b/source/smbd/reply.c @@ -2032,8 +2032,6 @@ NTSTATUS unlink_internals(connection_struct *conn, uint32 dirtype, if (SMB_VFS_UNLINK(conn,directory) == 0) { count++; - notify_fname(conn, orig_name, -1, - NOTIFY_ACTION_REMOVED); } } else { @@ -2094,9 +2092,6 @@ NTSTATUS unlink_internals(connection_struct *conn, uint32 dirtype, } if (SMB_VFS_UNLINK(conn,fname) == 0) { count++; - notify_action( - conn, directory, dname, - -1, NOTIFY_ACTION_REMOVED); } DEBUG(3,("unlink_internals: succesful unlink [%s]\n",fname)); } @@ -3959,18 +3954,6 @@ BOOL rmdir_internals(connection_struct *conn, const char *directory) return False; } - { - char *parent_dir; - const char *dirname; - - if (parent_dirname_talloc(tmp_talloc_ctx(), directory, - &parent_dir, &dirname)) { - notify_action(conn, parent_dir, dirname, -1, - NOTIFY_ACTION_REMOVED); - TALLOC_FREE(parent_dir); /* Not strictly necessary */ - } - } - return True; } |