2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 1992-2004.
6 Copyright (C) Volker Lendecke 2005
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 /****************************************************************************
26 Run a file if it is a magic script.
27 ****************************************************************************/
29 static void check_magic(files_struct *fsp,connection_struct *conn)
31 if (!*lp_magicscript(SNUM(conn)))
34 DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
38 if (!(p = strrchr_m(fsp->fsp_name,'/')))
43 if (!strequal(lp_magicscript(SNUM(conn)),p))
54 pstrcpy(fname,fsp->fsp_name);
55 if (*lp_magicoutput(SNUM(conn)))
56 pstrcpy(magic_output,lp_magicoutput(SNUM(conn)));
58 slprintf(magic_output,sizeof(fname)-1, "%s.out",fname);
61 ret = smbrun(fname,&tmp_fd);
62 DEBUG(3,("Invoking magic command %s gave %d\n",fname,ret));
64 if (ret != 0 || tmp_fd == -1) {
69 outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
75 if (sys_fstat(tmp_fd,&st) == -1) {
81 transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_size);
87 /****************************************************************************
88 Common code to close a file or a directory.
89 ****************************************************************************/
91 static int close_filestruct(files_struct *fsp)
93 connection_struct *conn = fsp->conn;
96 if (fsp->fh->fd != -1) {
97 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1)
100 delete_write_cache(fsp);
103 conn->num_files_open--;
104 SAFE_FREE(fsp->wbmpx_ptr);
109 /****************************************************************************
110 If any deferred opens are waiting on this close, notify them.
111 ****************************************************************************/
113 static void notify_deferred_opens(struct share_mode_lock *lck)
117 for (i=0; i<lck->num_share_modes; i++) {
118 struct share_mode_entry *e = &lck->share_modes[i];
120 if (!is_deferred_open_entry(e)) {
124 if (procid_is_me(&e->pid)) {
126 * We need to notify ourself to retry the open. Do
127 * this by finding the queued SMB record, moving it to
128 * the head of the queue and changing the wait time to
131 schedule_deferred_open_smb_message(e->op_mid);
133 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
135 share_mode_entry_to_message(msg, e);
138 message_send_pid(e->pid, MSG_SMB_OPEN_RETRY,
139 msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
145 /****************************************************************************
148 If normal_close is 1 then this came from a normal SMBclose (or equivalent)
149 operation otherwise it came as the result of some other operation such as
150 the closing of the connection. In the latter case printing and
151 magic scripts are not run.
152 ****************************************************************************/
154 static int close_normal_file(files_struct *fsp, BOOL normal_close)
156 BOOL delete_file = False;
157 connection_struct *conn = fsp->conn;
161 struct share_mode_lock *lck;
163 remove_pending_lock_requests_by_fid(fsp);
165 if (fsp->aio_write_behind) {
167 * If we're finishing write behind on a close we can get a write
168 * error here, we must remember this.
170 int ret = wait_for_aio_completion(fsp);
176 cancel_aio_by_fsp(fsp);
180 * If we're flushing on a close we can get a write
181 * error here, we must remember this.
184 if (close_filestruct(fsp) == -1) {
189 if (fsp->print_file) {
190 print_fsp_end(fsp, normal_close);
196 * Lock the share entries, and determine if we should delete
197 * on close. If so delete whilst the lock is still in effect.
198 * This prevents race conditions with the file being created. JRA.
201 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
204 DEBUG(0, ("close_file: Could not get share mode lock for file %s\n", fsp->fsp_name));
208 if (!del_share_mode(lck, fsp)) {
209 DEBUG(0, ("close_file: Could not delete share entry for file %s\n", fsp->fsp_name));
212 delete_file = (lck->delete_on_close | lck->initial_delete_on_close);
216 /* See if others still have the file open. If this is the
217 * case, then don't delete */
218 for (i=0; i<lck->num_share_modes; i++) {
219 if (is_valid_share_mode_entry(&lck->share_modes[i])) {
226 /* Notify any deferred opens waiting on this close. */
227 notify_deferred_opens(lck);
228 reply_to_oplock_break_requests(fsp);
231 * NT can set delete_on_close of the last open
232 * reference to a file.
235 if (normal_close && delete_file) {
236 SMB_STRUCT_STAT sbuf;
238 DEBUG(5,("close_file: file %s. Delete on close was set - deleting file.\n",
241 /* We can only delete the file if the name we have
242 is still valid and hasn't been renamed. */
244 if(SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf) != 0) {
245 DEBUG(5,("close_file: file %s. Delete on close was set "
246 "and stat failed with error %s\n",
247 fsp->fsp_name, strerror(errno) ));
249 if(sbuf.st_dev != fsp->dev || sbuf.st_ino != fsp->inode) {
250 DEBUG(5,("close_file: file %s. Delete on close was set and "
251 "dev and/or inode does not match\n",
253 DEBUG(5,("close_file: file %s. stored dev = %x, inode = %.0f "
254 "stat dev = %x, inode = %.0f\n",
256 (unsigned int)fsp->dev, (double)fsp->inode,
257 (unsigned int)sbuf.st_dev, (double)sbuf.st_ino ));
259 } else if(SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
261 * This call can potentially fail as another smbd may have
262 * had the file open with delete on close set and deleted
263 * it when its last reference to this file went away. Hence
264 * we log this but not at debug level zero.
267 DEBUG(5,("close_file: file %s. Delete on close was set "
268 "and unlink failed with error %s\n",
269 fsp->fsp_name, strerror(errno) ));
271 process_pending_change_notify_queue((time_t)0);
278 release_file_oplock(fsp);
280 locking_close_file(fsp);
282 err = fd_close(conn, fsp);
284 /* Only save errno if fd_close failed and we don't already
285 have an errno saved from a flush call. */
286 if ((err1 != -1) && (err == -1)) {
290 /* check for magic scripts */
292 check_magic(fsp,conn);
296 * Ensure pending modtime is set after close.
299 if(fsp->pending_modtime && fsp->pending_modtime_owner) {
300 set_filetime(conn, fsp->fsp_name, fsp->pending_modtime);
301 } else if (fsp->last_write_time) {
302 set_filetime(conn, fsp->fsp_name, fsp->last_write_time);
305 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
306 conn->user,fsp->fsp_name,
307 conn->num_files_open,
308 (err == -1 || err1 == -1) ? strerror(saved_errno) : ""));
311 string_free(&fsp->fsp_name);
315 if (err == -1 || err1 == -1) {
323 /****************************************************************************
324 Close a directory opened by an NT SMB call.
325 ****************************************************************************/
327 static int close_directory(files_struct *fsp, BOOL normal_close)
329 struct share_mode_lock *lck = 0;
330 BOOL delete_dir = False;
333 * NT can set delete_on_close of the last open
334 * reference to a directory also.
337 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
340 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
344 if (!del_share_mode(lck, fsp)) {
345 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
348 delete_dir = (lck->delete_on_close | lck->initial_delete_on_close);
352 if (normal_close && delete_dir) {
353 BOOL ok = rmdir_internals(fsp->conn, fsp->fsp_name);
354 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
355 fsp->fsp_name, ok ? "succeeded" : "failed" ));
358 * Ensure we remove any change notify requests that would
359 * now fail as the directory has been deleted.
363 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
364 remove_pending_change_notify_requests_by_filename(fsp, NT_STATUS_DELETE_PENDING);
367 process_pending_change_notify_queue((time_t)0);
369 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_CANCELLED);
373 * Do the code common to files and directories.
375 close_filestruct(fsp);
378 string_free(&fsp->fsp_name);
385 /****************************************************************************
386 Close a 'stat file' opened internally.
387 ****************************************************************************/
389 static int close_stat(files_struct *fsp)
392 * Do the code common to files and directories.
394 close_filestruct(fsp);
397 string_free(&fsp->fsp_name);
403 /****************************************************************************
404 Close a files_struct.
405 ****************************************************************************/
407 int close_file(files_struct *fsp, BOOL normal_close)
409 if(fsp->is_directory)
410 return close_directory(fsp, normal_close);
411 else if (fsp->is_stat)
412 return close_stat(fsp);
414 return close_normal_file(fsp, normal_close);