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;
298 /****************************************************************************
301 close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
302 printing and magic scripts are only run on normal close.
303 delete on close is done on normal and shutdown close.
304 ****************************************************************************/
306 static int close_normal_file(files_struct *fsp, enum file_close_type close_type)
308 connection_struct *conn = fsp->conn;
313 if (fsp->aio_write_behind) {
315 * If we're finishing write behind on a close we can get a write
316 * error here, we must remember this.
318 int ret = wait_for_aio_completion(fsp);
324 cancel_aio_by_fsp(fsp);
328 * If we're flushing on a close we can get a write
329 * error here, we must remember this.
332 if (close_filestruct(fsp) == -1) {
337 if (fsp->print_file) {
338 print_fsp_end(fsp, close_type);
343 /* If this is an old DOS or FCB open and we have multiple opens on
344 the same handle we only have one share mode. Ensure we only remove
345 the share mode on the last close. */
347 if (fsp->fh->ref_count == 1) {
348 /* Should we return on error here... ? */
349 close_remove_share_mode(fsp, close_type);
352 if(fsp->oplock_type) {
353 release_file_oplock(fsp);
356 locking_close_file(fsp);
358 err = fd_close(conn, fsp);
360 /* Only save errno if fd_close failed and we don't already
361 have an errno saved from a flush call. */
362 if ((err1 != -1) && (err == -1)) {
366 /* check for magic scripts */
367 if (close_type == NORMAL_CLOSE) {
368 check_magic(fsp,conn);
372 * Ensure pending modtime is set after close.
375 if(fsp->pending_modtime && fsp->pending_modtime_owner) {
376 set_filetime(conn, fsp->fsp_name, fsp->pending_modtime);
377 } else if (fsp->last_write_time) {
378 set_filetime(conn, fsp->fsp_name, fsp->last_write_time);
381 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
382 conn->user,fsp->fsp_name,
383 conn->num_files_open,
384 (err == -1 || err1 == -1) ? strerror(saved_errno) : ""));
388 if (err == -1 || err1 == -1) {
396 /****************************************************************************
397 Close a directory opened by an NT SMB call.
398 ****************************************************************************/
400 static int close_directory(files_struct *fsp, enum file_close_type close_type)
402 struct share_mode_lock *lck = 0;
403 BOOL delete_dir = False;
406 * NT can set delete_on_close of the last open
407 * reference to a directory also.
410 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
413 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
417 if (!del_share_mode(lck, fsp)) {
418 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
421 if (fsp->initial_delete_on_close) {
422 BOOL became_user = False;
424 /* Initial delete on close was set - for
425 * directories we don't care if anyone else
426 * wrote a real delete on close. */
428 if (current_user.vuid != fsp->vuid) {
429 become_user(fsp->conn, fsp->vuid);
432 send_stat_cache_delete_message(fsp->fsp_name);
433 set_delete_on_close_lck(lck, True, ¤t_user.ut);
439 delete_dir = lck->delete_on_close;
443 /* See if others still have the dir open. If this is the
444 * case, then don't delete */
445 for (i=0; i<lck->num_share_modes; i++) {
446 if (is_valid_share_mode_entry(&lck->share_modes[i])) {
453 if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
458 /* Become the user who requested the delete. */
460 if (!push_sec_ctx()) {
461 smb_panic("close_directory: failed to push sec_ctx.\n");
464 set_sec_ctx(lck->delete_token->uid,
465 lck->delete_token->gid,
466 lck->delete_token->ngroups,
467 lck->delete_token->groups,
472 ok = rmdir_internals(fsp->conn, fsp->fsp_name);
474 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
475 fsp->fsp_name, ok ? "succeeded" : "failed" ));
481 * Ensure we remove any change notify requests that would
482 * now fail as the directory has been deleted.
486 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
490 remove_pending_change_notify_requests_by_fid(
495 * Do the code common to files and directories.
497 close_filestruct(fsp);
502 /****************************************************************************
503 Close a 'stat file' opened internally.
504 ****************************************************************************/
506 static int close_stat(files_struct *fsp)
509 * Do the code common to files and directories.
511 close_filestruct(fsp);
516 /****************************************************************************
517 Close a files_struct.
518 ****************************************************************************/
520 int close_file(files_struct *fsp, enum file_close_type close_type)
522 if(fsp->is_directory)
523 return close_directory(fsp, close_type);
524 else if (fsp->is_stat)
525 return close_stat(fsp);
526 else if (fsp->fake_file_handle != NULL)
527 return close_fake_file(fsp);
529 return close_normal_file(fsp, close_type);