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 close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
149 printing and magic scripts are only run on normal close.
150 delete on close is done on normal and shutdown close.
151 ****************************************************************************/
153 static int close_normal_file(files_struct
*fsp
, enum file_close_type close_type
)
155 BOOL delete_file
= False
;
156 connection_struct
*conn
= fsp
->conn
;
160 struct share_mode_lock
*lck
;
162 remove_pending_lock_requests_by_fid(fsp
);
164 if (fsp
->aio_write_behind
) {
166 * If we're finishing write behind on a close we can get a write
167 * error here, we must remember this.
169 int ret
= wait_for_aio_completion(fsp
);
175 cancel_aio_by_fsp(fsp
);
179 * If we're flushing on a close we can get a write
180 * error here, we must remember this.
183 if (close_filestruct(fsp
) == -1) {
188 if (fsp
->print_file
) {
189 print_fsp_end(fsp
, close_type
);
195 * Lock the share entries, and determine if we should delete
196 * on close. If so delete whilst the lock is still in effect.
197 * This prevents race conditions with the file being created. JRA.
200 lck
= get_share_mode_lock(NULL
, fsp
->dev
, fsp
->inode
, NULL
, NULL
);
203 DEBUG(0, ("close_file: Could not get share mode lock for file %s\n", fsp
->fsp_name
));
207 if (!del_share_mode(lck
, fsp
)) {
208 DEBUG(0, ("close_file: Could not delete share entry for file %s\n", fsp
->fsp_name
));
211 delete_file
= (lck
->delete_on_close
| lck
->initial_delete_on_close
);
215 /* See if others still have the file open. If this is the
216 * case, then don't delete */
217 for (i
=0; i
<lck
->num_share_modes
; i
++) {
218 if (is_valid_share_mode_entry(&lck
->share_modes
[i
])) {
225 /* Notify any deferred opens waiting on this close. */
226 notify_deferred_opens(lck
);
227 reply_to_oplock_break_requests(fsp
);
230 * NT can set delete_on_close of the last open
231 * reference to a file.
234 if ((close_type
== NORMAL_CLOSE
|| close_type
== SHUTDOWN_CLOSE
) &&
237 SMB_STRUCT_STAT sbuf
;
239 DEBUG(5,("close_file: file %s. Delete on close was set - deleting file.\n",
242 /* Become the user who requested the delete. */
244 if (!push_sec_ctx()) {
245 smb_panic("close_file: file %s. failed to push sec_ctx.\n");
248 set_sec_ctx(lck
->delete_token
->uid
,
249 lck
->delete_token
->gid
,
250 lck
->delete_token
->ngroups
,
251 lck
->delete_token
->groups
,
254 /* We can only delete the file if the name we have
255 is still valid and hasn't been renamed. */
257 if(SMB_VFS_STAT(conn
,fsp
->fsp_name
,&sbuf
) != 0) {
258 DEBUG(5,("close_file: file %s. Delete on close was set "
259 "and stat failed with error %s\n",
260 fsp
->fsp_name
, strerror(errno
) ));
262 if(sbuf
.st_dev
!= fsp
->dev
|| sbuf
.st_ino
!= fsp
->inode
) {
263 DEBUG(5,("close_file: file %s. Delete on close was set and "
264 "dev and/or inode does not match\n",
266 DEBUG(5,("close_file: file %s. stored dev = %x, inode = %.0f "
267 "stat dev = %x, inode = %.0f\n",
269 (unsigned int)fsp
->dev
, (double)fsp
->inode
,
270 (unsigned int)sbuf
.st_dev
, (double)sbuf
.st_ino
));
272 } else if(SMB_VFS_UNLINK(conn
,fsp
->fsp_name
) != 0) {
274 * This call can potentially fail as another smbd may have
275 * had the file open with delete on close set and deleted
276 * it when its last reference to this file went away. Hence
277 * we log this but not at debug level zero.
280 DEBUG(5,("close_file: file %s. Delete on close was set "
281 "and unlink failed with error %s\n",
282 fsp
->fsp_name
, strerror(errno
) ));
288 process_pending_change_notify_queue((time_t)0);
294 release_file_oplock(fsp
);
296 locking_close_file(fsp
);
298 err
= fd_close(conn
, fsp
);
300 /* Only save errno if fd_close failed and we don't already
301 have an errno saved from a flush call. */
302 if ((err1
!= -1) && (err
== -1)) {
306 /* check for magic scripts */
307 if (close_type
== NORMAL_CLOSE
) {
308 check_magic(fsp
,conn
);
312 * Ensure pending modtime is set after close.
315 if(fsp
->pending_modtime
&& fsp
->pending_modtime_owner
) {
316 set_filetime(conn
, fsp
->fsp_name
, fsp
->pending_modtime
);
317 } else if (fsp
->last_write_time
) {
318 set_filetime(conn
, fsp
->fsp_name
, fsp
->last_write_time
);
321 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
322 conn
->user
,fsp
->fsp_name
,
323 conn
->num_files_open
,
324 (err
== -1 || err1
== -1) ? strerror(saved_errno
) : ""));
327 string_free(&fsp
->fsp_name
);
331 if (err
== -1 || err1
== -1) {
339 /****************************************************************************
340 Close a directory opened by an NT SMB call.
341 ****************************************************************************/
343 static int close_directory(files_struct
*fsp
, enum file_close_type close_type
)
345 struct share_mode_lock
*lck
= 0;
346 BOOL delete_dir
= False
;
349 * NT can set delete_on_close of the last open
350 * reference to a directory also.
353 lck
= get_share_mode_lock(NULL
, fsp
->dev
, fsp
->inode
, NULL
, NULL
);
356 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp
->fsp_name
));
360 if (!del_share_mode(lck
, fsp
)) {
361 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp
->fsp_name
));
364 delete_dir
= (lck
->delete_on_close
| lck
->initial_delete_on_close
);
368 if ((close_type
== NORMAL_CLOSE
|| close_type
== SHUTDOWN_CLOSE
) &&
373 /* Become the user who requested the delete. */
375 if (!push_sec_ctx()) {
376 smb_panic("close_directory: failed to push sec_ctx.\n");
379 set_sec_ctx(lck
->delete_token
->uid
,
380 lck
->delete_token
->gid
,
381 lck
->delete_token
->ngroups
,
382 lck
->delete_token
->groups
,
385 ok
= rmdir_internals(fsp
->conn
, fsp
->fsp_name
);
387 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
388 fsp
->fsp_name
, ok
? "succeeded" : "failed" ));
394 * Ensure we remove any change notify requests that would
395 * now fail as the directory has been deleted.
399 remove_pending_change_notify_requests_by_fid(fsp
, NT_STATUS_DELETE_PENDING
);
400 remove_pending_change_notify_requests_by_filename(fsp
, NT_STATUS_DELETE_PENDING
);
403 process_pending_change_notify_queue((time_t)0);
405 remove_pending_change_notify_requests_by_fid(fsp
, NT_STATUS_CANCELLED
);
409 * Do the code common to files and directories.
411 close_filestruct(fsp
);
414 string_free(&fsp
->fsp_name
);
421 /****************************************************************************
422 Close a 'stat file' opened internally.
423 ****************************************************************************/
425 static int close_stat(files_struct
*fsp
)
428 * Do the code common to files and directories.
430 close_filestruct(fsp
);
433 string_free(&fsp
->fsp_name
);
439 /****************************************************************************
440 Close a files_struct.
441 ****************************************************************************/
443 int close_file(files_struct
*fsp
, enum file_close_type close_type
)
445 if(fsp
->is_directory
)
446 return close_directory(fsp
, close_type
);
447 else if (fsp
->is_stat
)
448 return close_stat(fsp
);
450 return close_normal_file(fsp
, close_type
);