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);
134 message_send_pid(e->pid, MSG_SMB_OPEN_RETRY,
135 e, sizeof(*e), True);
141 /****************************************************************************
144 If normal_close is 1 then this came from a normal SMBclose (or equivalent)
145 operation otherwise it came as the result of some other operation such as
146 the closing of the connection. In the latter case printing and
147 magic scripts are not run.
148 ****************************************************************************/
150 static int close_normal_file(files_struct *fsp, BOOL normal_close)
152 BOOL delete_file = False;
153 connection_struct *conn = fsp->conn;
157 struct share_mode_lock *lck;
159 remove_pending_lock_requests_by_fid(fsp);
161 if (fsp->aio_write_behind) {
163 * If we're finishing write behind on a close we can get a write
164 * error here, we must remember this.
166 int ret = wait_for_aio_completion(fsp);
172 cancel_aio_by_fsp(fsp);
176 * If we're flushing on a close we can get a write
177 * error here, we must remember this.
180 if (close_filestruct(fsp) == -1) {
185 if (fsp->print_file) {
186 print_fsp_end(fsp, normal_close);
192 * Lock the share entries, and determine if we should delete
193 * on close. If so delete whilst the lock is still in effect.
194 * This prevents race conditions with the file being created. JRA.
197 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
200 DEBUG(0, ("close_file: Could not get share mode lock for file %s\n", fsp->fsp_name));
204 if (!del_share_mode(lck, fsp)) {
205 DEBUG(0, ("close_file: Could not delete share entry for file %s\n", fsp->fsp_name));
208 delete_file = lck->delete_on_close;
212 /* See if others still have the file open. If this is the
213 * case, then don't delete */
214 for (i=0; i<lck->num_share_modes; i++) {
215 if (is_valid_share_mode_entry(&lck->share_modes[i])) {
222 /* Notify any deferred opens waiting on this close. */
223 notify_deferred_opens(lck);
224 reply_to_oplock_break_requests(fsp);
227 * NT can set delete_on_close of the last open
228 * reference to a file.
231 if (normal_close && delete_file) {
232 SMB_STRUCT_STAT sbuf;
234 DEBUG(5,("close_file: file %s. Delete on close was set - deleting file.\n",
237 /* We can only delete the file if the name we have
238 is still valid and hasn't been renamed. */
240 if(SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf) != 0) {
241 DEBUG(5,("close_file: file %s. Delete on close was set "
242 "and stat failed with error %s\n",
243 fsp->fsp_name, strerror(errno) ));
245 if(sbuf.st_dev != fsp->dev || sbuf.st_ino != fsp->inode) {
246 DEBUG(5,("close_file: file %s. Delete on close was set and "
247 "dev and/or inode does not match\n",
249 DEBUG(5,("close_file: file %s. stored dev = %x, inode = %.0f "
250 "stat dev = %x, inode = %.0f\n",
252 (unsigned int)fsp->dev, (double)fsp->inode,
253 (unsigned int)sbuf.st_dev, (double)sbuf.st_ino ));
255 } else if(SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
257 * This call can potentially fail as another smbd may have
258 * had the file open with delete on close set and deleted
259 * it when its last reference to this file went away. Hence
260 * we log this but not at debug level zero.
263 DEBUG(5,("close_file: file %s. Delete on close was set "
264 "and unlink failed with error %s\n",
265 fsp->fsp_name, strerror(errno) ));
267 process_pending_change_notify_queue((time_t)0);
274 release_file_oplock(fsp);
276 locking_close_file(fsp);
278 err = fd_close(conn, fsp);
280 /* Only save errno if fd_close failed and we don't already
281 have an errno saved from a flush call. */
282 if ((err1 != -1) && (err == -1)) {
286 /* check for magic scripts */
288 check_magic(fsp,conn);
292 * Ensure pending modtime is set after close.
295 if(fsp->pending_modtime && fsp->pending_modtime_owner) {
296 set_filetime(conn, fsp->fsp_name, fsp->pending_modtime);
297 } else if (fsp->last_write_time) {
298 set_filetime(conn, fsp->fsp_name, fsp->last_write_time);
301 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
302 conn->user,fsp->fsp_name,
303 conn->num_files_open,
304 (err == -1 || err1 == -1) ? strerror(saved_errno) : ""));
307 string_free(&fsp->fsp_name);
311 if (err == -1 || err1 == -1) {
319 /****************************************************************************
320 Close a directory opened by an NT SMB call.
321 ****************************************************************************/
323 static int close_directory(files_struct *fsp, BOOL normal_close)
325 struct share_mode_lock *lck = 0;
326 BOOL delete_dir = False;
329 * NT can set delete_on_close of the last open
330 * reference to a directory also.
333 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
336 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
340 if (!del_share_mode(lck, fsp)) {
341 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
344 delete_dir = lck->delete_on_close;
348 if (normal_close && delete_dir) {
349 BOOL ok = rmdir_internals(fsp->conn, fsp->fsp_name);
350 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
351 fsp->fsp_name, ok ? "succeeded" : "failed" ));
354 * Ensure we remove any change notify requests that would
355 * now fail as the directory has been deleted.
359 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
360 remove_pending_change_notify_requests_by_filename(fsp, NT_STATUS_DELETE_PENDING);
363 process_pending_change_notify_queue((time_t)0);
365 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_CANCELLED);
369 * Do the code common to files and directories.
371 close_filestruct(fsp);
374 string_free(&fsp->fsp_name);
381 /****************************************************************************
382 Close a 'stat file' opened internally.
383 ****************************************************************************/
385 static int close_stat(files_struct *fsp)
388 * Do the code common to files and directories.
390 close_filestruct(fsp);
393 string_free(&fsp->fsp_name);
399 /****************************************************************************
400 Close a files_struct.
401 ****************************************************************************/
403 int close_file(files_struct *fsp, BOOL normal_close)
405 if(fsp->is_directory)
406 return close_directory(fsp, normal_close);
407 else if (fsp->is_stat)
408 return close_stat(fsp);
410 return close_normal_file(fsp, normal_close);