2 Unix SMB/CIFS implementation.
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 1992-2007.
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 3 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, see <http://www.gnu.org/licenses/>.
24 extern struct current_user current_user;
26 /****************************************************************************
27 Run a file if it is a magic script.
28 ****************************************************************************/
30 static void check_magic(files_struct *fsp,connection_struct *conn)
33 const char *magic_output = NULL;
36 TALLOC_CTX *ctx = NULL;
39 if (!*lp_magicscript(SNUM(conn))) {
43 DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
45 if (!(p = strrchr_m(fsp->fsp_name,'/'))) {
51 if (!strequal(lp_magicscript(SNUM(conn)),p)) {
55 ctx = talloc_stackframe();
57 if (*lp_magicoutput(SNUM(conn))) {
58 magic_output = lp_magicoutput(SNUM(conn));
60 magic_output = talloc_asprintf(ctx,
69 chmod(fsp->fsp_name,0755);
70 ret = smbrun(fsp->fsp_name,&tmp_fd);
71 DEBUG(3,("Invoking magic command %s gave %d\n",
74 unlink(fsp->fsp_name);
75 if (ret != 0 || tmp_fd == -1) {
82 outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
89 if (sys_fstat(tmp_fd,&st) == -1) {
95 transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_size);
101 /****************************************************************************
102 Common code to close a file or a directory.
103 ****************************************************************************/
105 static NTSTATUS close_filestruct(files_struct *fsp)
107 NTSTATUS status = NT_STATUS_OK;
108 connection_struct *conn = fsp->conn;
110 if (fsp->fh->fd != -1) {
111 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1) {
112 status = map_nt_error_from_unix(errno);
114 delete_write_cache(fsp);
117 conn->num_files_open--;
121 /****************************************************************************
122 If any deferred opens are waiting on this close, notify them.
123 ****************************************************************************/
125 static void notify_deferred_opens(struct share_mode_lock *lck)
129 for (i=0; i<lck->num_share_modes; i++) {
130 struct share_mode_entry *e = &lck->share_modes[i];
132 if (!is_deferred_open_entry(e)) {
136 if (procid_is_me(&e->pid)) {
138 * We need to notify ourself to retry the open. Do
139 * this by finding the queued SMB record, moving it to
140 * the head of the queue and changing the wait time to
143 schedule_deferred_open_smb_message(e->op_mid);
145 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
147 share_mode_entry_to_message(msg, e);
149 messaging_send_buf(smbd_messaging_context(),
150 e->pid, MSG_SMB_OPEN_RETRY,
152 MSG_SMB_SHARE_MODE_ENTRY_SIZE);
157 /****************************************************************************
158 Deal with removing a share mode on last close.
159 ****************************************************************************/
161 static NTSTATUS close_remove_share_mode(files_struct *fsp,
162 enum file_close_type close_type)
164 connection_struct *conn = fsp->conn;
165 BOOL delete_file = False;
166 struct share_mode_lock *lck;
167 SMB_STRUCT_STAT sbuf;
168 NTSTATUS status = NT_STATUS_OK;
173 * Lock the share entries, and determine if we should delete
174 * on close. If so delete whilst the lock is still in effect.
175 * This prevents race conditions with the file being created. JRA.
178 lck = get_share_mode_lock(NULL, fsp->file_id, NULL, NULL);
181 DEBUG(0, ("close_remove_share_mode: Could not get share mode "
182 "lock for file %s\n", fsp->fsp_name));
183 return NT_STATUS_INVALID_PARAMETER;
186 if (!del_share_mode(lck, fsp)) {
187 DEBUG(0, ("close_remove_share_mode: Could not delete share "
188 "entry for file %s\n", fsp->fsp_name));
191 if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
192 BOOL became_user = False;
194 /* Initial delete on close was set and no one else
195 * wrote a real delete on close. */
197 if (current_user.vuid != fsp->vuid) {
198 become_user(conn, fsp->vuid);
201 set_delete_on_close_lck(lck, True, ¤t_user.ut);
207 delete_file = lck->delete_on_close;
211 /* See if others still have the file open. If this is the
212 * case, then don't delete. If all opens are POSIX delete now. */
213 for (i=0; i<lck->num_share_modes; i++) {
214 struct share_mode_entry *e = &lck->share_modes[i];
215 if (is_valid_share_mode_entry(e)) {
216 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
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)
236 || (lck->delete_token == NULL)) {
242 * Ok, we have to delete the file
245 DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
246 "- deleting file.\n", fsp->fsp_name));
248 /* Become the user who requested the delete. */
250 if (!push_sec_ctx()) {
251 smb_panic("close_remove_share_mode: file %s. failed to push "
255 set_sec_ctx(lck->delete_token->uid,
256 lck->delete_token->gid,
257 lck->delete_token->ngroups,
258 lck->delete_token->groups,
261 /* We can only delete the file if the name we have is still valid and
262 hasn't been renamed. */
264 if (fsp->posix_open) {
265 ret = SMB_VFS_LSTAT(conn,fsp->fsp_name,&sbuf);
267 ret = SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf);
271 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
272 "was set and stat failed with error %s\n",
273 fsp->fsp_name, strerror(errno) ));
275 * Don't save the errno here, we ignore this error
280 id = vfs_file_id_from_sbuf(conn, &sbuf);
282 if (!file_id_equal(&fsp->file_id, &id)) {
283 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
284 "was set and dev and/or inode does not match\n",
286 DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, "
289 file_id_string_tos(&fsp->file_id),
290 file_id_string_tos(&id)));
292 * Don't save the errno here, we ignore this error
297 if (SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
299 * This call can potentially fail as another smbd may
300 * have had the file open with delete on close set and
301 * deleted it when its last reference to this file
302 * went away. Hence we log this but not at debug level
306 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
307 "was set and unlink failed with error %s\n",
308 fsp->fsp_name, strerror(errno) ));
310 status = map_nt_error_from_unix(errno);
313 notify_fname(conn, NOTIFY_ACTION_REMOVED,
314 FILE_NOTIFY_CHANGE_FILE_NAME,
317 /* As we now have POSIX opens which can unlink
318 * with other open files we may have taken
319 * this code path with more than one share mode
320 * entry - ensure we only delete once by resetting
321 * the delete on close flag. JRA.
324 set_delete_on_close_lck(lck, False, NULL);
335 /****************************************************************************
338 close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
339 printing and magic scripts are only run on normal close.
340 delete on close is done on normal and shutdown close.
341 ****************************************************************************/
343 static NTSTATUS close_normal_file(files_struct *fsp, enum file_close_type close_type)
345 NTSTATUS status = NT_STATUS_OK;
346 NTSTATUS saved_status1 = NT_STATUS_OK;
347 NTSTATUS saved_status2 = NT_STATUS_OK;
348 connection_struct *conn = fsp->conn;
350 cancel_aio_by_fsp(fsp);
353 * If we're flushing on a close we can get a write
354 * error here, we must remember this.
357 saved_status1 = close_filestruct(fsp);
359 if (fsp->print_file) {
360 print_fsp_end(fsp, close_type);
365 /* If this is an old DOS or FCB open and we have multiple opens on
366 the same handle we only have one share mode. Ensure we only remove
367 the share mode on the last close. */
369 if (fsp->fh->ref_count == 1) {
370 /* Should we return on error here... ? */
371 saved_status2 = close_remove_share_mode(fsp, close_type);
374 if(fsp->oplock_type) {
375 release_file_oplock(fsp);
378 locking_close_file(smbd_messaging_context(), fsp);
380 status = fd_close(conn, fsp);
382 /* check for magic scripts */
383 if (close_type == NORMAL_CLOSE) {
384 check_magic(fsp,conn);
388 * Ensure pending modtime is set after close.
391 if (fsp->pending_modtime_owner && !null_timespec(fsp->pending_modtime)) {
392 set_filetime(conn, fsp->fsp_name, fsp->pending_modtime);
393 } else if (!null_timespec(fsp->last_write_time)) {
394 set_filetime(conn, fsp->fsp_name, fsp->last_write_time);
397 if (NT_STATUS_IS_OK(status)) {
398 if (!NT_STATUS_IS_OK(saved_status1)) {
399 status = saved_status1;
400 } else if (!NT_STATUS_IS_OK(saved_status2)) {
401 status = saved_status2;
405 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
406 conn->user,fsp->fsp_name,
407 conn->num_files_open,
408 nt_errstr(status) ));
414 /****************************************************************************
415 Close a directory opened by an NT SMB call.
416 ****************************************************************************/
418 static NTSTATUS close_directory(files_struct *fsp, enum file_close_type close_type)
420 struct share_mode_lock *lck = 0;
421 BOOL delete_dir = False;
422 NTSTATUS status = NT_STATUS_OK;
425 * NT can set delete_on_close of the last open
426 * reference to a directory also.
429 lck = get_share_mode_lock(NULL, fsp->file_id, NULL, NULL);
432 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
433 return NT_STATUS_INVALID_PARAMETER;
436 if (!del_share_mode(lck, fsp)) {
437 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
440 if (fsp->initial_delete_on_close) {
441 BOOL became_user = False;
443 /* Initial delete on close was set - for
444 * directories we don't care if anyone else
445 * wrote a real delete on close. */
447 if (current_user.vuid != fsp->vuid) {
448 become_user(fsp->conn, fsp->vuid);
451 send_stat_cache_delete_message(fsp->fsp_name);
452 set_delete_on_close_lck(lck, True, ¤t_user.ut);
458 delete_dir = lck->delete_on_close;
462 /* See if others still have the dir open. If this is the
463 * case, then don't delete. If all opens are POSIX delete now. */
464 for (i=0; i<lck->num_share_modes; i++) {
465 struct share_mode_entry *e = &lck->share_modes[i];
466 if (is_valid_share_mode_entry(e)) {
467 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
476 if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
480 /* Become the user who requested the delete. */
482 if (!push_sec_ctx()) {
483 smb_panic("close_directory: failed to push sec_ctx.\n");
486 set_sec_ctx(lck->delete_token->uid,
487 lck->delete_token->gid,
488 lck->delete_token->ngroups,
489 lck->delete_token->groups,
494 status = rmdir_internals(talloc_tos(),
495 fsp->conn, fsp->fsp_name);
497 DEBUG(5,("close_directory: %s. Delete on close was set - "
498 "deleting directory returned %s.\n",
499 fsp->fsp_name, nt_errstr(status)));
505 * Ensure we remove any change notify requests that would
506 * now fail as the directory has been deleted.
509 if(NT_STATUS_IS_OK(status)) {
510 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
514 remove_pending_change_notify_requests_by_fid(
519 * Do the code common to files and directories.
521 close_filestruct(fsp);
526 /****************************************************************************
527 Close a 'stat file' opened internally.
528 ****************************************************************************/
530 NTSTATUS close_stat(files_struct *fsp)
533 * Do the code common to files and directories.
535 close_filestruct(fsp);
540 /****************************************************************************
541 Close a files_struct.
542 ****************************************************************************/
544 NTSTATUS close_file(files_struct *fsp, enum file_close_type close_type)
546 if(fsp->is_directory) {
547 return close_directory(fsp, close_type);
548 } else if (fsp->is_stat) {
549 return close_stat(fsp);
550 } else if (fsp->fake_file_handle != NULL) {
551 return close_fake_file(fsp);
553 return close_normal_file(fsp, close_type);