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(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,
70 chmod(fsp->fsp_name,0755);
71 ret = smbrun(fsp->fsp_name,&tmp_fd);
72 DEBUG(3,("Invoking magic command %s gave %d\n",
75 unlink(fsp->fsp_name);
76 if (ret != 0 || tmp_fd == -1) {
83 outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
90 if (sys_fstat(tmp_fd,&st) == -1) {
96 transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_size);
102 /****************************************************************************
103 Common code to close a file or a directory.
104 ****************************************************************************/
106 static NTSTATUS close_filestruct(files_struct *fsp)
108 NTSTATUS status = NT_STATUS_OK;
109 connection_struct *conn = fsp->conn;
111 if (fsp->fh->fd != -1) {
112 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1) {
113 status = map_nt_error_from_unix(errno);
115 delete_write_cache(fsp);
118 conn->num_files_open--;
122 /****************************************************************************
123 If any deferred opens are waiting on this close, notify them.
124 ****************************************************************************/
126 static void notify_deferred_opens(struct share_mode_lock *lck)
130 for (i=0; i<lck->num_share_modes; i++) {
131 struct share_mode_entry *e = &lck->share_modes[i];
133 if (!is_deferred_open_entry(e)) {
137 if (procid_is_me(&e->pid)) {
139 * We need to notify ourself to retry the open. Do
140 * this by finding the queued SMB record, moving it to
141 * the head of the queue and changing the wait time to
144 schedule_deferred_open_smb_message(e->op_mid);
146 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
148 share_mode_entry_to_message(msg, e);
150 messaging_send_buf(smbd_messaging_context(),
151 e->pid, MSG_SMB_OPEN_RETRY,
153 MSG_SMB_SHARE_MODE_ENTRY_SIZE);
158 /****************************************************************************
159 Deal with removing a share mode on last close.
160 ****************************************************************************/
162 static NTSTATUS close_remove_share_mode(files_struct *fsp,
163 enum file_close_type close_type)
165 connection_struct *conn = fsp->conn;
166 bool delete_file = False;
167 struct share_mode_lock *lck;
168 SMB_STRUCT_STAT sbuf;
169 NTSTATUS status = NT_STATUS_OK;
174 * Lock the share entries, and determine if we should delete
175 * on close. If so delete whilst the lock is still in effect.
176 * This prevents race conditions with the file being created. JRA.
179 lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL);
182 DEBUG(0, ("close_remove_share_mode: Could not get share mode "
183 "lock for file %s\n", fsp->fsp_name));
184 return NT_STATUS_INVALID_PARAMETER;
187 if (!del_share_mode(lck, fsp)) {
188 DEBUG(0, ("close_remove_share_mode: Could not delete share "
189 "entry for file %s\n", fsp->fsp_name));
192 if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
193 bool became_user = False;
195 /* Initial delete on close was set and no one else
196 * wrote a real delete on close. */
198 if (current_user.vuid != fsp->vuid) {
199 become_user(conn, fsp->vuid);
202 set_delete_on_close_lck(lck, True, ¤t_user.ut);
208 delete_file = lck->delete_on_close;
212 /* See if others still have the file open. If this is the
213 * case, then don't delete. If all opens are POSIX delete now. */
214 for (i=0; i<lck->num_share_modes; i++) {
215 struct share_mode_entry *e = &lck->share_modes[i];
216 if (is_valid_share_mode_entry(e)) {
217 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
226 /* Notify any deferred opens waiting on this close. */
227 notify_deferred_opens(lck);
228 reply_to_oplock_break_requests(fsp);
231 * NT can set delete_on_close of the last open
232 * reference to a file.
235 if (!(close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE)
237 || (lck->delete_token == NULL)) {
243 * Ok, we have to delete the file
246 DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
247 "- deleting file.\n", fsp->fsp_name));
249 /* Become the user who requested the delete. */
251 if (!push_sec_ctx()) {
252 smb_panic("close_remove_share_mode: file %s. failed to push "
256 set_sec_ctx(lck->delete_token->uid,
257 lck->delete_token->gid,
258 lck->delete_token->ngroups,
259 lck->delete_token->groups,
262 /* We can only delete the file if the name we have is still valid and
263 hasn't been renamed. */
265 if (fsp->posix_open) {
266 ret = SMB_VFS_LSTAT(conn,fsp->fsp_name,&sbuf);
268 ret = SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf);
272 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
273 "was set and stat failed with error %s\n",
274 fsp->fsp_name, strerror(errno) ));
276 * Don't save the errno here, we ignore this error
281 id = vfs_file_id_from_sbuf(conn, &sbuf);
283 if (!file_id_equal(&fsp->file_id, &id)) {
284 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
285 "was set and dev and/or inode does not match\n",
287 DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, "
290 file_id_string_tos(&fsp->file_id),
291 file_id_string_tos(&id)));
293 * Don't save the errno here, we ignore this error
298 if (SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
300 * This call can potentially fail as another smbd may
301 * have had the file open with delete on close set and
302 * deleted it when its last reference to this file
303 * went away. Hence we log this but not at debug level
307 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
308 "was set and unlink failed with error %s\n",
309 fsp->fsp_name, strerror(errno) ));
311 status = map_nt_error_from_unix(errno);
314 notify_fname(conn, NOTIFY_ACTION_REMOVED,
315 FILE_NOTIFY_CHANGE_FILE_NAME,
318 /* As we now have POSIX opens which can unlink
319 * with other open files we may have taken
320 * this code path with more than one share mode
321 * entry - ensure we only delete once by resetting
322 * the delete on close flag. JRA.
325 set_delete_on_close_lck(lck, False, NULL);
336 /****************************************************************************
339 close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
340 printing and magic scripts are only run on normal close.
341 delete on close is done on normal and shutdown close.
342 ****************************************************************************/
344 static NTSTATUS close_normal_file(files_struct *fsp, enum file_close_type close_type)
346 NTSTATUS status = NT_STATUS_OK;
347 NTSTATUS saved_status1 = NT_STATUS_OK;
348 NTSTATUS saved_status2 = NT_STATUS_OK;
349 NTSTATUS saved_status3 = NT_STATUS_OK;
350 connection_struct *conn = fsp->conn;
352 if (fsp->aio_write_behind) {
354 * If we're finishing write behind on a close we can get a write
355 * error here, we must remember this.
357 int ret = wait_for_aio_completion(fsp);
359 saved_status1 = map_nt_error_from_unix(ret);
362 cancel_aio_by_fsp(fsp);
366 * If we're flushing on a close we can get a write
367 * error here, we must remember this.
370 saved_status2 = close_filestruct(fsp);
372 if (fsp->print_file) {
373 print_fsp_end(fsp, close_type);
378 /* If this is an old DOS or FCB open and we have multiple opens on
379 the same handle we only have one share mode. Ensure we only remove
380 the share mode on the last close. */
382 if (fsp->fh->ref_count == 1) {
383 /* Should we return on error here... ? */
384 saved_status3 = close_remove_share_mode(fsp, close_type);
387 if(fsp->oplock_type) {
388 release_file_oplock(fsp);
391 locking_close_file(smbd_messaging_context(), fsp);
393 status = fd_close(fsp);
395 /* check for magic scripts */
396 if (close_type == NORMAL_CLOSE) {
401 * Ensure pending modtime is set after close.
404 if (fsp->pending_modtime_owner && !null_timespec(fsp->pending_modtime)) {
405 set_filetime(conn, fsp->fsp_name, fsp->pending_modtime);
406 } else if (!null_timespec(fsp->last_write_time)) {
407 set_filetime(conn, fsp->fsp_name, fsp->last_write_time);
410 if (NT_STATUS_IS_OK(status)) {
411 if (!NT_STATUS_IS_OK(saved_status1)) {
412 status = saved_status1;
413 } else if (!NT_STATUS_IS_OK(saved_status2)) {
414 status = saved_status2;
415 } else if (!NT_STATUS_IS_OK(saved_status3)) {
416 status = saved_status3;
420 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
421 conn->user,fsp->fsp_name,
422 conn->num_files_open,
423 nt_errstr(status) ));
429 /****************************************************************************
430 Close a directory opened by an NT SMB call.
431 ****************************************************************************/
433 static NTSTATUS close_directory(files_struct *fsp, enum file_close_type close_type)
435 struct share_mode_lock *lck = 0;
436 bool delete_dir = False;
437 NTSTATUS status = NT_STATUS_OK;
440 * NT can set delete_on_close of the last open
441 * reference to a directory also.
444 lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL);
447 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
448 return NT_STATUS_INVALID_PARAMETER;
451 if (!del_share_mode(lck, fsp)) {
452 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
455 if (fsp->initial_delete_on_close) {
456 bool became_user = False;
458 /* Initial delete on close was set - for
459 * directories we don't care if anyone else
460 * wrote a real delete on close. */
462 if (current_user.vuid != fsp->vuid) {
463 become_user(fsp->conn, fsp->vuid);
466 send_stat_cache_delete_message(fsp->fsp_name);
467 set_delete_on_close_lck(lck, True, ¤t_user.ut);
473 delete_dir = lck->delete_on_close;
477 /* See if others still have the dir open. If this is the
478 * case, then don't delete. If all opens are POSIX delete now. */
479 for (i=0; i<lck->num_share_modes; i++) {
480 struct share_mode_entry *e = &lck->share_modes[i];
481 if (is_valid_share_mode_entry(e)) {
482 if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
491 if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
495 /* Become the user who requested the delete. */
497 if (!push_sec_ctx()) {
498 smb_panic("close_directory: failed to push sec_ctx.\n");
501 set_sec_ctx(lck->delete_token->uid,
502 lck->delete_token->gid,
503 lck->delete_token->ngroups,
504 lck->delete_token->groups,
509 status = rmdir_internals(talloc_tos(),
510 fsp->conn, fsp->fsp_name);
512 DEBUG(5,("close_directory: %s. Delete on close was set - "
513 "deleting directory returned %s.\n",
514 fsp->fsp_name, nt_errstr(status)));
520 * Ensure we remove any change notify requests that would
521 * now fail as the directory has been deleted.
524 if(NT_STATUS_IS_OK(status)) {
525 remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
529 remove_pending_change_notify_requests_by_fid(
534 * Do the code common to files and directories.
536 close_filestruct(fsp);
541 /****************************************************************************
542 Close a 'stat file' opened internally.
543 ****************************************************************************/
545 static NTSTATUS close_stat(files_struct *fsp)
548 * Do the code common to files and directories.
550 close_filestruct(fsp);
555 /****************************************************************************
556 Close a files_struct.
557 ****************************************************************************/
559 NTSTATUS close_file(files_struct *fsp, enum file_close_type close_type)
561 if(fsp->is_directory) {
562 return close_directory(fsp, close_type);
563 } else if (fsp->is_stat) {
564 return close_stat(fsp);
565 } else if (fsp->fake_file_handle != NULL) {
566 return close_fake_file(fsp);
568 return close_normal_file(fsp, close_type);