diff options
author | Volker Lendecke <vlendec@samba.org> | 2007-01-17 16:23:45 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 12:17:13 -0500 |
commit | 940192ddcc9d23e3bec806b4419d5845eeac0fd0 (patch) | |
tree | 60d01078e1fd8f017e5245179d99a7b1bc8b6a12 /source3/smbd/nttrans.c | |
parent | b385a40f592ae7e9962f4034e9cbe66352681e2c (diff) | |
download | samba-940192ddcc9d23e3bec806b4419d5845eeac0fd0.tar.gz samba-940192ddcc9d23e3bec806b4419d5845eeac0fd0.tar.bz2 samba-940192ddcc9d23e3bec806b4419d5845eeac0fd0.zip |
r20854: Ok, now I think we're at a point where looking at notify starts to make sense
again :-)
Volker
(This used to be commit 5533cdeec1b0cdee39b1d89e2320587dc9281ee6)
Diffstat (limited to 'source3/smbd/nttrans.c')
-rw-r--r-- | source3/smbd/nttrans.c | 53 |
1 files changed, 47 insertions, 6 deletions
diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index f4d6220592..ac7beabb53 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -1800,14 +1800,15 @@ static int call_nt_transact_notify_change(connection_struct *conn, char *inbuf, { uint16 *setup = *ppsetup; files_struct *fsp; - uint32 flags; + uint32 filter; + NTSTATUS status; if(setup_count < 6) { return ERROR_DOS(ERRDOS,ERRbadfunc); } fsp = file_fsp((char *)setup,4); - flags = IVAL(setup, 0); + filter = IVAL(setup, 0); DEBUG(3,("call_nt_transact_notify_change\n")); @@ -1815,16 +1816,56 @@ 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 (!change_notify_set(inbuf, fsp, conn, flags)) { - return(UNIXERROR(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; } - DEBUG(3,("call_nt_transact_notify_change: notify change called on directory \ -name = %s\n", fsp->fsp_name )); + /* + * 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); + } return -1; } |