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 NTSTATUS check_magic(struct files_struct *fsp)
33 const char *magic_output = NULL;
36 TALLOC_CTX *ctx = NULL;
38 struct connection_struct *conn = fsp->conn;
40 if (!*lp_magicscript(SNUM(conn))) {
44 DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
46 if (!(p = strrchr_m(fsp->fsp_name,'/'))) {
52 if (!strequal(lp_magicscript(SNUM(conn)),p)) {
56 ctx = talloc_stackframe();
58 if (*lp_magicoutput(SNUM(conn))) {
59 magic_output = lp_magicoutput(SNUM(conn));
61 magic_output = talloc_asprintf(ctx,
67 return NT_STATUS_NO_MEMORY;
70 /* Ensure we don't depend on user's PATH. */
71 p = talloc_asprintf(ctx, "./%s", fsp->fsp_name);
74 return NT_STATUS_NO_MEMORY;
77 if (chmod(fsp->fsp_name,0755) == -1) {
79 return map_nt_error_from_unix(errno);
81 ret = smbrun(p,&tmp_fd);
82 DEBUG(3,("Invoking magic command %s gave %d\n",
85 unlink(fsp->fsp_name);
86 if (ret != 0 || tmp_fd == -1) {
91 return NT_STATUS_UNSUCCESSFUL;
93 outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
98 return map_nt_error_from_unix(err);
101 if (sys_fstat(tmp_fd,&st) == -1) {
106 return map_nt_error_from_unix(err);
109 if (transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_ex_size) == (SMB_OFF_T)-1) {
114 return map_nt_error_from_unix(err);
117 if (close(outfd) == -1) {
119 return map_nt_error_from_unix(errno);
125 /****************************************************************************
126 Common code to close a file or a directory.
127 ****************************************************************************/
129 static NTSTATUS close_filestruct(files_struct *fsp)
131 NTSTATUS status = NT_STATUS_OK;
133 if (fsp->fh->fd != -1) {
134 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1) {
135 status = map_nt_error_from_unix(errno);
137 delete_write_cache(fsp);
143 /****************************************************************************
144 If any deferred opens are waiting on this close, notify them.
145 ****************************************************************************/
147 static void notify_deferred_opens(struct share_mode_lock *lck)
151 if (!should_notify_deferred_opens()) {
155 for (i=0; i<lck->num_share_modes; i++) {
156 struct share_mode_entry *e = &lck->share_modes[i];
158 if (!is_deferred_open_entry(e)) {
162 if (procid_is_me(&e->pid)) {
164 * We need to notify ourself to retry the open. Do
165 * this by finding the queued SMB record, moving it to
166 * the head of the queue and changing the wait time to
169 schedule_deferred_open_smb_message(e->op_mid);
171 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
173 share_mode_entry_to_message(msg, e);
175 messaging_send_buf(smbd_messaging_context(),
176 e->pid, MSG_SMB_OPEN_RETRY,
178 MSG_SMB_SHARE_MODE_ENTRY_SIZE);
183 /****************************************************************************
185 ****************************************************************************/
187 NTSTATUS delete_all_streams(connection_struct *conn, const char *fname)
189 struct stream_struct *stream_info;
191 unsigned int num_streams;
192 TALLOC_CTX *frame = talloc_stackframe();
195 status = SMB_VFS_STREAMINFO(conn, NULL, fname, talloc_tos(),
196 &num_streams, &stream_info);
198 if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED)) {
199 DEBUG(10, ("no streams around\n"));
204 if (!NT_STATUS_IS_OK(status)) {
205 DEBUG(10, ("SMB_VFS_STREAMINFO failed: %s\n",
210 DEBUG(10, ("delete_all_streams found %d streams\n",
213 if (num_streams == 0) {
218 for (i=0; i<num_streams; i++) {
220 struct smb_filename *smb_fname_stream = NULL;
222 if (strequal(stream_info[i].name, "::$DATA")) {
226 status = create_synthetic_smb_fname(talloc_tos(), fname,
227 stream_info[i].name, NULL,
230 if (!NT_STATUS_IS_OK(status)) {
231 DEBUG(0, ("talloc_aprintf failed\n"));
235 res = SMB_VFS_UNLINK(conn, smb_fname_stream);
238 status = map_nt_error_from_unix(errno);
239 DEBUG(10, ("Could not delete stream %s: %s\n",
240 smb_fname_str_dbg(smb_fname_stream),
242 TALLOC_FREE(smb_fname_stream);
245 TALLOC_FREE(smb_fname_stream);
253 /****************************************************************************
254 Deal with removing a share mode on last close.
255 ****************************************************************************/
257 static NTSTATUS close_remove_share_mode(files_struct *fsp,
258 enum file_close_type close_type)
260 connection_struct *conn = fsp->conn;
261 bool delete_file = false;
262 bool changed_user = false;
263 struct share_mode_lock *lck = NULL;
264 struct smb_filename *smb_fname = NULL;
266 NTSTATUS status = NT_STATUS_OK;
270 status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
272 if (!NT_STATUS_IS_OK(status)) {
277 * Lock the share entries, and determine if we should delete
278 * on close. If so delete whilst the lock is still in effect.
279 * This prevents race conditions with the file being created. JRA.
282 lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
286 DEBUG(0, ("close_remove_share_mode: Could not get share mode "
287 "lock for file %s\n", smb_fname_str_dbg(smb_fname)));
288 status = NT_STATUS_INVALID_PARAMETER;
292 if (fsp->write_time_forced) {
293 set_close_write_time(fsp, lck->changed_write_time);
296 if (!del_share_mode(lck, fsp)) {
297 DEBUG(0, ("close_remove_share_mode: Could not delete share "
298 "entry for file %s\n",
299 smb_fname_str_dbg(smb_fname)));
302 if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
303 bool became_user = False;
305 /* Initial delete on close was set and no one else
306 * wrote a real delete on close. */
308 if (current_user.vuid != fsp->vuid) {
309 become_user(conn, fsp->vuid);
312 set_delete_on_close_lck(lck, True, ¤t_user.ut);
318 delete_file = lck->delete_on_close;
322 /* See if others still have the file open. If this is the
323 * case, then don't delete. If all opens are POSIX delete now. */
324 for (i=0; i<lck->num_share_modes; i++) {
325 struct share_mode_entry *e = &lck->share_modes[i];
326 if (is_valid_share_mode_entry(e)) {
327 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
336 /* Notify any deferred opens waiting on this close. */
337 notify_deferred_opens(lck);
338 reply_to_oplock_break_requests(fsp);
341 * NT can set delete_on_close of the last open
342 * reference to a file.
345 if (!(close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE)
347 || (lck->delete_token == NULL)) {
353 * Ok, we have to delete the file
356 DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
357 "- deleting file.\n", smb_fname_str_dbg(smb_fname)));
360 * Don't try to update the write time when we delete the file
362 fsp->update_write_time_on_close = false;
364 if (!unix_token_equal(lck->delete_token, ¤t_user.ut)) {
365 /* Become the user who requested the delete. */
367 DEBUG(5,("close_remove_share_mode: file %s. "
368 "Change user to uid %u\n",
369 smb_fname_str_dbg(smb_fname),
370 (unsigned int)lck->delete_token->uid));
372 if (!push_sec_ctx()) {
373 smb_panic("close_remove_share_mode: file %s. failed to push "
377 set_sec_ctx(lck->delete_token->uid,
378 lck->delete_token->gid,
379 lck->delete_token->ngroups,
380 lck->delete_token->groups,
386 /* We can only delete the file if the name we have is still valid and
387 hasn't been renamed. */
389 if (fsp->posix_open) {
390 ret = SMB_VFS_LSTAT(conn, smb_fname);
392 ret = SMB_VFS_STAT(conn, smb_fname);
396 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
397 "was set and stat failed with error %s\n",
398 smb_fname_str_dbg(smb_fname), strerror(errno)));
400 * Don't save the errno here, we ignore this error
405 id = vfs_file_id_from_sbuf(conn, &smb_fname->st);
407 if (!file_id_equal(&fsp->file_id, &id)) {
408 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
409 "was set and dev and/or inode does not match\n",
410 smb_fname_str_dbg(smb_fname)));
411 DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, "
413 smb_fname_str_dbg(smb_fname),
414 file_id_string_tos(&fsp->file_id),
415 file_id_string_tos(&id)));
417 * Don't save the errno here, we ignore this error
422 if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
423 && !is_ntfs_stream_smb_fname(smb_fname)) {
425 status = delete_all_streams(conn, smb_fname->base_name);
427 if (!NT_STATUS_IS_OK(status)) {
428 DEBUG(5, ("delete_all_streams failed: %s\n",
435 if (SMB_VFS_UNLINK(conn, smb_fname) != 0) {
437 * This call can potentially fail as another smbd may
438 * have had the file open with delete on close set and
439 * deleted it when its last reference to this file
440 * went away. Hence we log this but not at debug level
444 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
445 "was set and unlink failed with error %s\n",
446 smb_fname_str_dbg(smb_fname), strerror(errno)));
448 status = map_nt_error_from_unix(errno);
451 status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
452 if (!NT_STATUS_IS_OK(status)) {
456 notify_fname(conn, NOTIFY_ACTION_REMOVED,
457 FILE_NOTIFY_CHANGE_FILE_NAME,
462 /* As we now have POSIX opens which can unlink
463 * with other open files we may have taken
464 * this code path with more than one share mode
465 * entry - ensure we only delete once by resetting
466 * the delete on close flag. JRA.
469 set_delete_on_close_lck(lck, False, NULL);
479 TALLOC_FREE(smb_fname);
483 void set_close_write_time(struct files_struct *fsp, struct timespec ts)
485 DEBUG(6,("close_write_time: %s" , time_to_asc(convert_timespec_to_time_t(ts))));
487 if (null_timespec(ts)) {
491 * if the write time on close is explict set, then don't
492 * need to fix it up to the value in the locking db
494 fsp->write_time_forced = false;
496 fsp->update_write_time_on_close = true;
497 fsp->close_write_time = ts;
500 static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
502 SMB_STRUCT_STAT sbuf;
503 struct smb_file_time ft;
510 if (!fsp->update_write_time_on_close) {
514 if (null_timespec(fsp->close_write_time)) {
515 fsp->close_write_time = timespec_current();
518 /* Ensure we have a valid stat struct for the source. */
519 if (fsp->fh->fd != -1) {
520 ret = SMB_VFS_FSTAT(fsp, &sbuf);
522 if (fsp->posix_open) {
523 ret = vfs_lstat_smb_fname(fsp->conn, fsp->fsp_name,
526 ret = vfs_stat_smb_fname(fsp->conn, fsp->fsp_name,
532 return map_nt_error_from_unix(errno);
535 if (!VALID_STAT(sbuf)) {
536 /* if it doesn't seem to be a real file */
540 ft.mtime = fsp->close_write_time;
541 status = smb_set_file_time(fsp->conn, fsp, fsp->fsp_name,
543 if (!NT_STATUS_IS_OK(status)) {
550 static NTSTATUS ntstatus_keeperror(NTSTATUS s1, NTSTATUS s2)
552 if (!NT_STATUS_IS_OK(s1)) {
558 /****************************************************************************
561 close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
562 printing and magic scripts are only run on normal close.
563 delete on close is done on normal and shutdown close.
564 ****************************************************************************/
566 static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
567 enum file_close_type close_type)
569 NTSTATUS status = NT_STATUS_OK;
571 connection_struct *conn = fsp->conn;
573 if (fsp->aio_write_behind) {
575 * If we're finishing write behind on a close we can get a write
576 * error here, we must remember this.
578 int ret = wait_for_aio_completion(fsp);
580 status = ntstatus_keeperror(
581 status, map_nt_error_from_unix(ret));
584 cancel_aio_by_fsp(fsp);
588 * If we're flushing on a close we can get a write
589 * error here, we must remember this.
592 tmp = close_filestruct(fsp);
593 status = ntstatus_keeperror(status, tmp);
595 if (fsp->print_file) {
596 print_fsp_end(fsp, close_type);
601 /* Remove the oplock before potentially deleting the file. */
602 if(fsp->oplock_type) {
603 release_file_oplock(fsp);
606 /* If this is an old DOS or FCB open and we have multiple opens on
607 the same handle we only have one share mode. Ensure we only remove
608 the share mode on the last close. */
610 if (fsp->fh->ref_count == 1) {
611 /* Should we return on error here... ? */
612 tmp = close_remove_share_mode(fsp, close_type);
613 status = ntstatus_keeperror(status, tmp);
616 locking_close_file(smbd_messaging_context(), fsp);
619 status = ntstatus_keeperror(status, tmp);
621 /* check for magic scripts */
622 if (close_type == NORMAL_CLOSE) {
623 tmp = check_magic(fsp);
624 status = ntstatus_keeperror(status, tmp);
628 * Ensure pending modtime is set after close.
631 tmp = update_write_time_on_close(fsp);
632 if (NT_STATUS_EQUAL(tmp, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
633 /* Someone renamed the file or a parent directory containing
634 * this file. We can't do anything about this, we don't have
635 * an "update timestamp by fd" call in POSIX. Eat the error. */
640 status = ntstatus_keeperror(status, tmp);
642 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
643 conn->server_info->unix_name,fsp->fsp_name,
644 conn->num_files_open - 1,
645 nt_errstr(status) ));
651 /****************************************************************************
652 Close a directory opened by an NT SMB call.
653 ****************************************************************************/
655 static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
656 enum file_close_type close_type)
658 struct share_mode_lock *lck = NULL;
659 struct smb_filename *smb_dname = NULL;
660 bool delete_dir = False;
661 NTSTATUS status = NT_STATUS_OK;
663 status = create_synthetic_smb_fname_split(talloc_tos(), fsp->fsp_name,
665 if (!NT_STATUS_IS_OK(status)) {
670 * NT can set delete_on_close of the last open
671 * reference to a directory also.
674 lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
678 DEBUG(0, ("close_directory: Could not get share mode lock for "
679 "%s\n", smb_fname_str_dbg(smb_dname)));
680 status = NT_STATUS_INVALID_PARAMETER;
684 if (!del_share_mode(lck, fsp)) {
685 DEBUG(0, ("close_directory: Could not delete share entry for "
686 "%s\n", smb_fname_str_dbg(smb_dname)));
689 if (fsp->initial_delete_on_close) {
690 bool became_user = False;
692 /* Initial delete on close was set - for
693 * directories we don't care if anyone else
694 * wrote a real delete on close. */
696 if (current_user.vuid != fsp->vuid) {
697 become_user(fsp->conn, fsp->vuid);
700 send_stat_cache_delete_message(fsp->fsp_name);
701 set_delete_on_close_lck(lck, True, ¤t_user.ut);
707 delete_dir = lck->delete_on_close;
711 /* See if others still have the dir open. If this is the
712 * case, then don't delete. If all opens are POSIX delete now. */
713 for (i=0; i<lck->num_share_modes; i++) {
714 struct share_mode_entry *e = &lck->share_modes[i];
715 if (is_valid_share_mode_entry(e)) {
716 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
725 if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
729 /* Become the user who requested the delete. */
731 if (!push_sec_ctx()) {
732 smb_panic("close_directory: failed to push sec_ctx.\n");
735 set_sec_ctx(lck->delete_token->uid,
736 lck->delete_token->gid,
737 lck->delete_token->ngroups,
738 lck->delete_token->groups,
743 status = rmdir_internals(talloc_tos(), fsp->conn, smb_dname);
745 DEBUG(5,("close_directory: %s. Delete on close was set - "
746 "deleting directory returned %s.\n",
747 smb_fname_str_dbg(smb_dname), nt_errstr(status)));
753 * Ensure we remove any change notify requests that would
754 * now fail as the directory has been deleted.
757 if(NT_STATUS_IS_OK(status)) {
758 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
762 remove_pending_change_notify_requests_by_fid(
766 status = fd_close(fsp);
768 if (!NT_STATUS_IS_OK(status)) {
769 DEBUG(0, ("Could not close dir! fname=%s, fd=%d, err=%d=%s\n",
770 smb_fname_str_dbg(smb_dname), fsp->fh->fd, errno,
775 * Do the code common to files and directories.
777 close_filestruct(fsp);
782 TALLOC_FREE(smb_dname);
786 /****************************************************************************
787 Close a files_struct.
788 ****************************************************************************/
790 NTSTATUS close_file(struct smb_request *req, files_struct *fsp,
791 enum file_close_type close_type)
794 struct files_struct *base_fsp = fsp->base_fsp;
796 if(fsp->is_directory) {
797 status = close_directory(req, fsp, close_type);
798 } else if (fsp->fake_file_handle != NULL) {
799 status = close_fake_file(req, fsp);
801 status = close_normal_file(req, fsp, close_type);
804 if ((base_fsp != NULL) && (close_type != SHUTDOWN_CLOSE)) {
807 * fsp was a stream, the base fsp can't be a stream as well
809 * For SHUTDOWN_CLOSE this is not possible here, because
810 * SHUTDOWN_CLOSE only happens from files.c which walks the
811 * complete list of files. If we mess with more than one fsp
812 * those loops will become confused.
815 SMB_ASSERT(base_fsp->base_fsp == NULL);
816 close_file(req, base_fsp, close_type);
822 /****************************************************************************
823 Deal with an (authorized) message to close a file given the share mode
825 ****************************************************************************/
827 void msg_close_file(struct messaging_context *msg_ctx,
830 struct server_id server_id,
833 files_struct *fsp = NULL;
834 struct share_mode_entry e;
836 message_to_share_mode_entry(&e, (char *)data->data);
839 char *sm_str = share_mode_str(NULL, 0, &e);
841 smb_panic("talloc failed");
843 DEBUG(10,("msg_close_file: got request to close share mode "
844 "entry %s\n", sm_str));
848 fsp = file_find_dif(e.id, e.share_file_id);
850 DEBUG(10,("msg_close_file: failed to find file.\n"));
853 close_file(NULL, fsp, NORMAL_CLOSE);