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 extern struct current_user current_user;
27 /****************************************************************************
28 Run a file if it is a magic script.
29 ****************************************************************************/
31 static void check_magic(files_struct *fsp,connection_struct *conn)
33 if (!*lp_magicscript(SNUM(conn)))
36 DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
40 if (!(p = strrchr_m(fsp->fsp_name,'/')))
45 if (!strequal(lp_magicscript(SNUM(conn)),p))
56 pstrcpy(fname,fsp->fsp_name);
57 if (*lp_magicoutput(SNUM(conn)))
58 pstrcpy(magic_output,lp_magicoutput(SNUM(conn)));
60 slprintf(magic_output,sizeof(fname)-1, "%s.out",fname);
63 ret = smbrun(fname,&tmp_fd);
64 DEBUG(3,("Invoking magic command %s gave %d\n",fname,ret));
66 if (ret != 0 || tmp_fd == -1) {
71 outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
77 if (sys_fstat(tmp_fd,&st) == -1) {
83 transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_size);
89 /****************************************************************************
90 Common code to close a file or a directory.
91 ****************************************************************************/
93 static int close_filestruct(files_struct *fsp)
95 connection_struct *conn = fsp->conn;
98 if (fsp->fh->fd != -1) {
99 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1)
102 delete_write_cache(fsp);
105 conn->num_files_open--;
106 SAFE_FREE(fsp->wbmpx_ptr);
111 /****************************************************************************
112 If any deferred opens are waiting on this close, notify them.
113 ****************************************************************************/
115 static void notify_deferred_opens(struct share_mode_lock *lck)
119 for (i=0; i<lck->num_share_modes; i++) {
120 struct share_mode_entry *e = &lck->share_modes[i];
122 if (!is_deferred_open_entry(e)) {
126 if (procid_is_me(&e->pid)) {
128 * We need to notify ourself to retry the open. Do
129 * this by finding the queued SMB record, moving it to
130 * the head of the queue and changing the wait time to
133 schedule_deferred_open_smb_message(e->op_mid);
135 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
137 share_mode_entry_to_message(msg, e);
139 message_send_pid(e->pid, MSG_SMB_OPEN_RETRY,
140 msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
145 /****************************************************************************
146 Deal with removing a share mode on last close.
147 ****************************************************************************/
149 static NTSTATUS close_remove_share_mode(files_struct *fsp,
150 enum file_close_type close_type)
152 connection_struct *conn = fsp->conn;
153 BOOL delete_file = False;
154 struct share_mode_lock *lck;
155 SMB_STRUCT_STAT sbuf;
156 NTSTATUS status = NT_STATUS_OK;
159 * Lock the share entries, and determine if we should delete
160 * on close. If so delete whilst the lock is still in effect.
161 * This prevents race conditions with the file being created. JRA.
164 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
167 DEBUG(0, ("close_remove_share_mode: Could not get share mode "
168 "lock for file %s\n", fsp->fsp_name));
169 return NT_STATUS_INVALID_PARAMETER;
172 if (!del_share_mode(lck, fsp)) {
173 DEBUG(0, ("close_remove_share_mode: Could not delete share "
174 "entry for file %s\n", fsp->fsp_name));
177 if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
178 BOOL became_user = False;
180 /* Initial delete on close was set and no one else
181 * wrote a real delete on close. */
183 if (current_user.vuid != fsp->vuid) {
184 become_user(conn, fsp->vuid);
187 set_delete_on_close_lck(lck, True, ¤t_user.ut);
193 delete_file = lck->delete_on_close;
197 /* See if others still have the file open. If this is the
198 * case, then don't delete */
199 for (i=0; i<lck->num_share_modes; i++) {
200 if (is_valid_share_mode_entry(&lck->share_modes[i])) {
207 /* Notify any deferred opens waiting on this close. */
208 notify_deferred_opens(lck);
209 reply_to_oplock_break_requests(fsp);
212 * NT can set delete_on_close of the last open
213 * reference to a file.
216 if (!(close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE)
218 || (lck->delete_token == NULL)) {
224 * Ok, we have to delete the file
227 DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
228 "- deleting file.\n", fsp->fsp_name));
230 /* Become the user who requested the delete. */
232 if (!push_sec_ctx()) {
233 smb_panic("close_remove_share_mode: file %s. failed to push "
237 set_sec_ctx(lck->delete_token->uid,
238 lck->delete_token->gid,
239 lck->delete_token->ngroups,
240 lck->delete_token->groups,
243 /* We can only delete the file if the name we have is still valid and
244 hasn't been renamed. */
246 if(SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf) != 0) {
247 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
248 "was set and stat failed with error %s\n",
249 fsp->fsp_name, strerror(errno) ));
251 * Don't save the errno here, we ignore this error
256 if(sbuf.st_dev != fsp->dev || sbuf.st_ino != fsp->inode) {
257 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
258 "was set and dev and/or inode does not match\n",
260 DEBUG(5,("close_remove_share_mode: file %s. stored dev = %x, "
261 "inode = %.0f stat dev = %x, inode = %.0f\n",
263 (unsigned int)fsp->dev, (double)fsp->inode,
264 (unsigned int)sbuf.st_dev, (double)sbuf.st_ino ));
266 * Don't save the errno here, we ignore this error
271 if (SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
273 * This call can potentially fail as another smbd may
274 * have had the file open with delete on close set and
275 * deleted it when its last reference to this file
276 * went away. Hence we log this but not at debug level
280 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
281 "was set and unlink failed with error %s\n",
282 fsp->fsp_name, strerror(errno) ));
284 status = map_nt_error_from_unix(errno);
288 status = NT_STATUS_FILE_DELETED;
294 process_pending_change_notify_queue((time_t)0);
300 /****************************************************************************
303 close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
304 printing and magic scripts are only run on normal close.
305 delete on close is done on normal and shutdown close.
306 ****************************************************************************/
308 static int close_normal_file(files_struct *fsp, enum file_close_type close_type)
310 connection_struct *conn = fsp->conn;
315 if (fsp->aio_write_behind) {
317 * If we're finishing write behind on a close we can get a write
318 * error here, we must remember this.
320 int ret = wait_for_aio_completion(fsp);
326 cancel_aio_by_fsp(fsp);
330 * If we're flushing on a close we can get a write
331 * error here, we must remember this.
334 if (close_filestruct(fsp) == -1) {
339 if (fsp->print_file) {
340 print_fsp_end(fsp, close_type);
345 /* If this is an old DOS or FCB open and we have multiple opens on
346 the same handle we only have one share mode. Ensure we only remove
347 the share mode on the last close. */
349 if (fsp->fh->ref_count == 1) {
350 /* Should we return on error here... ? */
351 close_remove_share_mode(fsp, close_type);
354 if(fsp->oplock_type) {
355 release_file_oplock(fsp);
358 locking_close_file(fsp);
360 err = fd_close(conn, fsp);
362 /* Only save errno if fd_close failed and we don't already
363 have an errno saved from a flush call. */
364 if ((err1 != -1) && (err == -1)) {
368 /* check for magic scripts */
369 if (close_type == NORMAL_CLOSE) {
370 check_magic(fsp,conn);
374 * Ensure pending modtime is set after close.
377 if(fsp->pending_modtime && fsp->pending_modtime_owner) {
378 set_filetime(conn, fsp->fsp_name, fsp->pending_modtime);
379 } else if (fsp->last_write_time) {
380 set_filetime(conn, fsp->fsp_name, fsp->last_write_time);
383 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
384 conn->user,fsp->fsp_name,
385 conn->num_files_open,
386 (err == -1 || err1 == -1) ? strerror(saved_errno) : ""));
390 if (err == -1 || err1 == -1) {
398 /****************************************************************************
399 Close a directory opened by an NT SMB call.
400 ****************************************************************************/
402 static int close_directory(files_struct *fsp, enum file_close_type close_type)
404 struct share_mode_lock *lck = 0;
405 BOOL delete_dir = False;
408 * NT can set delete_on_close of the last open
409 * reference to a directory also.
412 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
415 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
419 if (!del_share_mode(lck, fsp)) {
420 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
423 if (fsp->initial_delete_on_close) {
424 BOOL became_user = False;
426 /* Initial delete on close was set - for
427 * directories we don't care if anyone else
428 * wrote a real delete on close. */
430 if (current_user.vuid != fsp->vuid) {
431 become_user(fsp->conn, fsp->vuid);
434 set_delete_on_close_lck(lck, True, ¤t_user.ut);
440 delete_dir = lck->delete_on_close;
444 /* See if others still have the dir open. If this is the
445 * case, then don't delete */
446 for (i=0; i<lck->num_share_modes; i++) {
447 if (is_valid_share_mode_entry(&lck->share_modes[i])) {
454 if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
459 /* Become the user who requested the delete. */
461 if (!push_sec_ctx()) {
462 smb_panic("close_directory: failed to push sec_ctx.\n");
465 set_sec_ctx(lck->delete_token->uid,
466 lck->delete_token->gid,
467 lck->delete_token->ngroups,
468 lck->delete_token->groups,
473 ok = rmdir_internals(fsp->conn, fsp->fsp_name);
475 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
476 fsp->fsp_name, ok ? "succeeded" : "failed" ));
482 * Ensure we remove any change notify requests that would
483 * now fail as the directory has been deleted.
487 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
488 remove_pending_change_notify_requests_by_filename(fsp, NT_STATUS_DELETE_PENDING);
491 process_pending_change_notify_queue((time_t)0);
494 remove_pending_change_notify_requests_by_fid(
499 * Do the code common to files and directories.
501 close_filestruct(fsp);
506 /****************************************************************************
507 Close a 'stat file' opened internally.
508 ****************************************************************************/
510 static int close_stat(files_struct *fsp)
513 * Do the code common to files and directories.
515 close_filestruct(fsp);
520 /****************************************************************************
521 Close a files_struct.
522 ****************************************************************************/
524 int close_file(files_struct *fsp, enum file_close_type close_type)
526 if(fsp->is_directory)
527 return close_directory(fsp, close_type);
528 else if (fsp->is_stat)
529 return close_stat(fsp);
530 else if (fsp->fake_file_handle != NULL)
531 return close_fake_file(fsp);
533 return close_normal_file(fsp, close_type);