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++) {
222 if (strequal(stream_info[i].name, "::$DATA")) {
226 streamname = talloc_asprintf(talloc_tos(), "%s%s", fname,
227 stream_info[i].name);
229 if (streamname == NULL) {
230 DEBUG(0, ("talloc_aprintf failed\n"));
231 status = NT_STATUS_NO_MEMORY;
235 res = SMB_VFS_UNLINK(conn, streamname);
237 TALLOC_FREE(streamname);
240 status = map_nt_error_from_unix(errno);
241 DEBUG(10, ("Could not delete stream %s: %s\n",
242 streamname, strerror(errno)));
252 /****************************************************************************
253 Deal with removing a share mode on last close.
254 ****************************************************************************/
256 static NTSTATUS close_remove_share_mode(files_struct *fsp,
257 enum file_close_type close_type)
259 connection_struct *conn = fsp->conn;
260 bool delete_file = false;
261 bool changed_user = false;
262 struct share_mode_lock *lck;
263 SMB_STRUCT_STAT sbuf;
264 NTSTATUS status = NT_STATUS_OK;
269 * Lock the share entries, and determine if we should delete
270 * on close. If so delete whilst the lock is still in effect.
271 * This prevents race conditions with the file being created. JRA.
274 lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
278 DEBUG(0, ("close_remove_share_mode: Could not get share mode "
279 "lock for file %s\n", fsp->fsp_name));
280 return NT_STATUS_INVALID_PARAMETER;
283 if (fsp->write_time_forced) {
284 set_close_write_time(fsp, lck->changed_write_time);
287 if (!del_share_mode(lck, fsp)) {
288 DEBUG(0, ("close_remove_share_mode: Could not delete share "
289 "entry for file %s\n", fsp->fsp_name));
292 if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
293 bool became_user = False;
295 /* Initial delete on close was set and no one else
296 * wrote a real delete on close. */
298 if (current_user.vuid != fsp->vuid) {
299 become_user(conn, fsp->vuid);
302 set_delete_on_close_lck(lck, True, ¤t_user.ut);
308 delete_file = lck->delete_on_close;
312 /* See if others still have the file open. If this is the
313 * case, then don't delete. If all opens are POSIX delete now. */
314 for (i=0; i<lck->num_share_modes; i++) {
315 struct share_mode_entry *e = &lck->share_modes[i];
316 if (is_valid_share_mode_entry(e)) {
317 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
326 /* Notify any deferred opens waiting on this close. */
327 notify_deferred_opens(lck);
328 reply_to_oplock_break_requests(fsp);
331 * NT can set delete_on_close of the last open
332 * reference to a file.
335 if (!(close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE)
337 || (lck->delete_token == NULL)) {
343 * Ok, we have to delete the file
346 DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
347 "- deleting file.\n", fsp->fsp_name));
350 * Don't try to update the write time when we delete the file
352 fsp->update_write_time_on_close = false;
354 if (!unix_token_equal(lck->delete_token, ¤t_user.ut)) {
355 /* Become the user who requested the delete. */
357 DEBUG(5,("close_remove_share_mode: file %s. "
358 "Change user to uid %u\n",
360 (unsigned int)lck->delete_token->uid));
362 if (!push_sec_ctx()) {
363 smb_panic("close_remove_share_mode: file %s. failed to push "
367 set_sec_ctx(lck->delete_token->uid,
368 lck->delete_token->gid,
369 lck->delete_token->ngroups,
370 lck->delete_token->groups,
376 /* We can only delete the file if the name we have is still valid and
377 hasn't been renamed. */
379 if (fsp->posix_open) {
380 ret = SMB_VFS_LSTAT(conn,fsp->fsp_name,&sbuf);
382 ret = SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf);
386 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
387 "was set and stat failed with error %s\n",
388 fsp->fsp_name, strerror(errno) ));
390 * Don't save the errno here, we ignore this error
395 id = vfs_file_id_from_sbuf(conn, &sbuf);
397 if (!file_id_equal(&fsp->file_id, &id)) {
398 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
399 "was set and dev and/or inode does not match\n",
401 DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, "
404 file_id_string_tos(&fsp->file_id),
405 file_id_string_tos(&id)));
407 * Don't save the errno here, we ignore this error
412 if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
413 && !is_ntfs_stream_name(fsp->fsp_name)) {
415 status = delete_all_streams(conn, fsp->fsp_name);
417 if (!NT_STATUS_IS_OK(status)) {
418 DEBUG(5, ("delete_all_streams failed: %s\n",
425 if (SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
427 * This call can potentially fail as another smbd may
428 * have had the file open with delete on close set and
429 * deleted it when its last reference to this file
430 * went away. Hence we log this but not at debug level
434 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
435 "was set and unlink failed with error %s\n",
436 fsp->fsp_name, strerror(errno) ));
438 status = map_nt_error_from_unix(errno);
441 notify_fname(conn, NOTIFY_ACTION_REMOVED,
442 FILE_NOTIFY_CHANGE_FILE_NAME,
445 /* As we now have POSIX opens which can unlink
446 * with other open files we may have taken
447 * this code path with more than one share mode
448 * entry - ensure we only delete once by resetting
449 * the delete on close flag. JRA.
452 set_delete_on_close_lck(lck, False, NULL);
465 void set_close_write_time(struct files_struct *fsp, struct timespec ts)
467 DEBUG(6,("close_write_time: %s" , time_to_asc(convert_timespec_to_time_t(ts))));
469 if (null_timespec(ts)) {
473 * if the write time on close is explict set, then don't
474 * need to fix it up to the value in the locking db
476 fsp->write_time_forced = false;
478 fsp->update_write_time_on_close = true;
479 fsp->close_write_time = ts;
482 static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
484 SMB_STRUCT_STAT sbuf;
485 struct smb_file_time ft;
492 if (!fsp->update_write_time_on_close) {
496 if (null_timespec(fsp->close_write_time)) {
497 fsp->close_write_time = timespec_current();
500 /* Ensure we have a valid stat struct for the source. */
501 if (fsp->fh->fd != -1) {
502 ret = SMB_VFS_FSTAT(fsp, &sbuf);
504 if (fsp->posix_open) {
505 ret = SMB_VFS_LSTAT(fsp->conn,fsp->fsp_name,&sbuf);
507 ret = SMB_VFS_STAT(fsp->conn,fsp->fsp_name,&sbuf);
512 return map_nt_error_from_unix(errno);
515 if (!VALID_STAT(sbuf)) {
516 /* if it doesn't seem to be a real file */
520 ft.mtime = fsp->close_write_time;
521 status = smb_set_file_time(fsp->conn, fsp, fsp->fsp_name,
523 if (!NT_STATUS_IS_OK(status)) {
530 static NTSTATUS ntstatus_keeperror(NTSTATUS s1, NTSTATUS s2)
532 if (!NT_STATUS_IS_OK(s1)) {
538 /****************************************************************************
541 close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
542 printing and magic scripts are only run on normal close.
543 delete on close is done on normal and shutdown close.
544 ****************************************************************************/
546 static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
547 enum file_close_type close_type)
549 NTSTATUS status = NT_STATUS_OK;
551 connection_struct *conn = fsp->conn;
553 if (fsp->aio_write_behind) {
555 * If we're finishing write behind on a close we can get a write
556 * error here, we must remember this.
558 int ret = wait_for_aio_completion(fsp);
560 status = ntstatus_keeperror(
561 status, map_nt_error_from_unix(ret));
564 cancel_aio_by_fsp(fsp);
568 * If we're flushing on a close we can get a write
569 * error here, we must remember this.
572 tmp = close_filestruct(fsp);
573 status = ntstatus_keeperror(status, tmp);
575 if (fsp->print_file) {
576 print_fsp_end(fsp, close_type);
581 /* Remove the oplock before potentially deleting the file. */
582 if(fsp->oplock_type) {
583 release_file_oplock(fsp);
586 /* If this is an old DOS or FCB open and we have multiple opens on
587 the same handle we only have one share mode. Ensure we only remove
588 the share mode on the last close. */
590 if (fsp->fh->ref_count == 1) {
591 /* Should we return on error here... ? */
592 tmp = close_remove_share_mode(fsp, close_type);
593 status = ntstatus_keeperror(status, tmp);
596 locking_close_file(smbd_messaging_context(), fsp);
599 status = ntstatus_keeperror(status, tmp);
601 /* check for magic scripts */
602 if (close_type == NORMAL_CLOSE) {
603 tmp = check_magic(fsp);
604 status = ntstatus_keeperror(status, tmp);
608 * Ensure pending modtime is set after close.
611 tmp = update_write_time_on_close(fsp);
612 if (NT_STATUS_EQUAL(tmp, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
613 /* Someone renamed the file or a parent directory containing
614 * this file. We can't do anything about this, we don't have
615 * an "update timestamp by fd" call in POSIX. Eat the error. */
620 status = ntstatus_keeperror(status, tmp);
622 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
623 conn->server_info->unix_name,fsp->fsp_name,
624 conn->num_files_open - 1,
625 nt_errstr(status) ));
631 /****************************************************************************
632 Close a directory opened by an NT SMB call.
633 ****************************************************************************/
635 static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
636 enum file_close_type close_type)
638 struct share_mode_lock *lck = 0;
639 bool delete_dir = False;
640 NTSTATUS status = NT_STATUS_OK;
643 * NT can set delete_on_close of the last open
644 * reference to a directory also.
647 lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
651 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
652 return NT_STATUS_INVALID_PARAMETER;
655 if (!del_share_mode(lck, fsp)) {
656 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
659 if (fsp->initial_delete_on_close) {
660 bool became_user = False;
662 /* Initial delete on close was set - for
663 * directories we don't care if anyone else
664 * wrote a real delete on close. */
666 if (current_user.vuid != fsp->vuid) {
667 become_user(fsp->conn, fsp->vuid);
670 send_stat_cache_delete_message(fsp->fsp_name);
671 set_delete_on_close_lck(lck, True, ¤t_user.ut);
677 delete_dir = lck->delete_on_close;
681 /* See if others still have the dir open. If this is the
682 * case, then don't delete. If all opens are POSIX delete now. */
683 for (i=0; i<lck->num_share_modes; i++) {
684 struct share_mode_entry *e = &lck->share_modes[i];
685 if (is_valid_share_mode_entry(e)) {
686 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
695 if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
699 /* Become the user who requested the delete. */
701 if (!push_sec_ctx()) {
702 smb_panic("close_directory: failed to push sec_ctx.\n");
705 set_sec_ctx(lck->delete_token->uid,
706 lck->delete_token->gid,
707 lck->delete_token->ngroups,
708 lck->delete_token->groups,
713 status = rmdir_internals(talloc_tos(),
714 fsp->conn, fsp->fsp_name);
716 DEBUG(5,("close_directory: %s. Delete on close was set - "
717 "deleting directory returned %s.\n",
718 fsp->fsp_name, nt_errstr(status)));
724 * Ensure we remove any change notify requests that would
725 * now fail as the directory has been deleted.
728 if(NT_STATUS_IS_OK(status)) {
729 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
733 remove_pending_change_notify_requests_by_fid(
737 status = fd_close(fsp);
739 if (!NT_STATUS_IS_OK(status)) {
740 DEBUG(0, ("Could not close dir! fname=%s, fd=%d, err=%d=%s\n",
741 fsp->fsp_name, fsp->fh->fd, errno, strerror(errno)));
745 * Do the code common to files and directories.
747 close_filestruct(fsp);
752 /****************************************************************************
753 Close a files_struct.
754 ****************************************************************************/
756 NTSTATUS close_file(struct smb_request *req, files_struct *fsp,
757 enum file_close_type close_type)
760 struct files_struct *base_fsp = fsp->base_fsp;
762 if(fsp->is_directory) {
763 status = close_directory(req, fsp, close_type);
764 } else if (fsp->fake_file_handle != NULL) {
765 status = close_fake_file(req, fsp);
767 status = close_normal_file(req, fsp, close_type);
770 if ((base_fsp != NULL) && (close_type != SHUTDOWN_CLOSE)) {
773 * fsp was a stream, the base fsp can't be a stream as well
775 * For SHUTDOWN_CLOSE this is not possible here, because
776 * SHUTDOWN_CLOSE only happens from files.c which walks the
777 * complete list of files. If we mess with more than one fsp
778 * those loops will become confused.
781 SMB_ASSERT(base_fsp->base_fsp == NULL);
782 close_file(req, base_fsp, close_type);
788 /****************************************************************************
789 Deal with an (authorized) message to close a file given the share mode
791 ****************************************************************************/
793 void msg_close_file(struct messaging_context *msg_ctx,
796 struct server_id server_id,
799 files_struct *fsp = NULL;
800 struct share_mode_entry e;
802 message_to_share_mode_entry(&e, (char *)data->data);
805 char *sm_str = share_mode_str(NULL, 0, &e);
807 smb_panic("talloc failed");
809 DEBUG(10,("msg_close_file: got request to close share mode "
810 "entry %s\n", sm_str));
814 fsp = file_find_dif(e.id, e.share_file_id);
816 DEBUG(10,("msg_close_file: failed to find file.\n"));
819 close_file(NULL, fsp, NORMAL_CLOSE);