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 NTSTATUS saved_status3
= NT_STATUS_OK
;
349 connection_struct
*conn
= fsp
->conn
;
351 if (fsp
->aio_write_behind
) {
353 * If we're finishing write behind on a close we can get a write
354 * error here, we must remember this.
356 int ret
= wait_for_aio_completion(fsp
);
358 saved_status1
= map_nt_error_from_unix(ret
);
361 cancel_aio_by_fsp(fsp
);
365 * If we're flushing on a close we can get a write
366 * error here, we must remember this.
369 saved_status2
= close_filestruct(fsp
);
371 if (fsp
->print_file
) {
372 print_fsp_end(fsp
, close_type
);
377 /* If this is an old DOS or FCB open and we have multiple opens on
378 the same handle we only have one share mode. Ensure we only remove
379 the share mode on the last close. */
381 if (fsp
->fh
->ref_count
== 1) {
382 /* Should we return on error here... ? */
383 saved_status3
= close_remove_share_mode(fsp
, close_type
);
386 if(fsp
->oplock_type
) {
387 release_file_oplock(fsp
);
390 locking_close_file(smbd_messaging_context(), fsp
);
392 status
= fd_close(conn
, fsp
);
394 /* check for magic scripts */
395 if (close_type
== NORMAL_CLOSE
) {
396 check_magic(fsp
,conn
);
400 * Ensure pending modtime is set after close.
403 if (fsp
->pending_modtime_owner
&& !null_timespec(fsp
->pending_modtime
)) {
404 set_filetime(conn
, fsp
->fsp_name
, fsp
->pending_modtime
);
405 } else if (!null_timespec(fsp
->last_write_time
)) {
406 set_filetime(conn
, fsp
->fsp_name
, fsp
->last_write_time
);
409 if (NT_STATUS_IS_OK(status
)) {
410 if (!NT_STATUS_IS_OK(saved_status1
)) {
411 status
= saved_status1
;
412 } else if (!NT_STATUS_IS_OK(saved_status2
)) {
413 status
= saved_status2
;
414 } else if (!NT_STATUS_IS_OK(saved_status3
)) {
415 status
= saved_status3
;
419 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
420 conn
->user
,fsp
->fsp_name
,
421 conn
->num_files_open
,
422 nt_errstr(status
) ));
428 /****************************************************************************
429 Close a directory opened by an NT SMB call.
430 ****************************************************************************/
432 static NTSTATUS
close_directory(files_struct
*fsp
, enum file_close_type close_type
)
434 struct share_mode_lock
*lck
= 0;
435 BOOL delete_dir
= False
;
436 NTSTATUS status
= NT_STATUS_OK
;
439 * NT can set delete_on_close of the last open
440 * reference to a directory also.
443 lck
= get_share_mode_lock(NULL
, fsp
->file_id
, NULL
, NULL
);
446 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp
->fsp_name
));
447 return NT_STATUS_INVALID_PARAMETER
;
450 if (!del_share_mode(lck
, fsp
)) {
451 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp
->fsp_name
));
454 if (fsp
->initial_delete_on_close
) {
455 BOOL became_user
= False
;
457 /* Initial delete on close was set - for
458 * directories we don't care if anyone else
459 * wrote a real delete on close. */
461 if (current_user
.vuid
!= fsp
->vuid
) {
462 become_user(fsp
->conn
, fsp
->vuid
);
465 send_stat_cache_delete_message(fsp
->fsp_name
);
466 set_delete_on_close_lck(lck
, True
, ¤t_user
.ut
);
472 delete_dir
= lck
->delete_on_close
;
476 /* See if others still have the dir open. If this is the
477 * case, then don't delete. If all opens are POSIX delete now. */
478 for (i
=0; i
<lck
->num_share_modes
; i
++) {
479 struct share_mode_entry
*e
= &lck
->share_modes
[i
];
480 if (is_valid_share_mode_entry(e
)) {
481 if (fsp
->posix_open
&& (e
->flags
& SHARE_MODE_FLAG_POSIX_OPEN
)) {
490 if ((close_type
== NORMAL_CLOSE
|| close_type
== SHUTDOWN_CLOSE
) &&
494 /* Become the user who requested the delete. */
496 if (!push_sec_ctx()) {
497 smb_panic("close_directory: failed to push sec_ctx.\n");
500 set_sec_ctx(lck
->delete_token
->uid
,
501 lck
->delete_token
->gid
,
502 lck
->delete_token
->ngroups
,
503 lck
->delete_token
->groups
,
508 status
= rmdir_internals(talloc_tos(),
509 fsp
->conn
, fsp
->fsp_name
);
511 DEBUG(5,("close_directory: %s. Delete on close was set - "
512 "deleting directory returned %s.\n",
513 fsp
->fsp_name
, nt_errstr(status
)));
519 * Ensure we remove any change notify requests that would
520 * now fail as the directory has been deleted.
523 if(NT_STATUS_IS_OK(status
)) {
524 remove_pending_change_notify_requests_by_fid(fsp
, NT_STATUS_DELETE_PENDING
);
528 remove_pending_change_notify_requests_by_fid(
533 * Do the code common to files and directories.
535 close_filestruct(fsp
);
540 /****************************************************************************
541 Close a 'stat file' opened internally.
542 ****************************************************************************/
544 NTSTATUS
close_stat(files_struct
*fsp
)
547 * Do the code common to files and directories.
549 close_filestruct(fsp
);
554 /****************************************************************************
555 Close a files_struct.
556 ****************************************************************************/
558 NTSTATUS
close_file(files_struct
*fsp
, enum file_close_type close_type
)
560 if(fsp
->is_directory
) {
561 return close_directory(fsp
, close_type
);
562 } else if (fsp
->is_stat
) {
563 return close_stat(fsp
);
564 } else if (fsp
->fake_file_handle
!= NULL
) {
565 return close_fake_file(fsp
);
567 return close_normal_file(fsp
, close_type
);