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
/* Ensure we don't depend on user's PATH. */
71
p = talloc_asprintf(ctx, "./%s", fsp->fsp_name);
77
if (chmod(fsp->fsp_name,0755) == -1) {
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) {
93
outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
100
if (sys_fstat(tmp_fd,&st) == -1) {
106
transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_size);
112
/****************************************************************************
113
Common code to close a file or a directory.
114
****************************************************************************/
116
static NTSTATUS close_filestruct(files_struct *fsp)
118
NTSTATUS status = NT_STATUS_OK;
120
if (fsp->fh->fd != -1) {
121
if(flush_write_cache(fsp, CLOSE_FLUSH) == -1) {
122
status = map_nt_error_from_unix(errno);
124
delete_write_cache(fsp);
130
/****************************************************************************
131
If any deferred opens are waiting on this close, notify them.
132
****************************************************************************/
134
static void notify_deferred_opens(struct share_mode_lock *lck)
138
if (!should_notify_deferred_opens()) {
142
for (i=0; i<lck->num_share_modes; i++) {
143
struct share_mode_entry *e = &lck->share_modes[i];
145
if (!is_deferred_open_entry(e)) {
149
if (procid_is_me(&e->pid)) {
151
* We need to notify ourself to retry the open. Do
152
* this by finding the queued SMB record, moving it to
153
* the head of the queue and changing the wait time to
156
schedule_deferred_open_smb_message(e->op_mid);
158
char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
160
share_mode_entry_to_message(msg, e);
162
messaging_send_buf(smbd_messaging_context(),
163
e->pid, MSG_SMB_OPEN_RETRY,
165
MSG_SMB_SHARE_MODE_ENTRY_SIZE);
170
/****************************************************************************
172
****************************************************************************/
174
NTSTATUS delete_all_streams(connection_struct *conn, const char *fname)
176
struct stream_struct *stream_info;
178
unsigned int num_streams;
179
TALLOC_CTX *frame = talloc_stackframe();
182
status = SMB_VFS_STREAMINFO(conn, NULL, fname, talloc_tos(),
183
&num_streams, &stream_info);
185
if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_IMPLEMENTED)) {
186
DEBUG(10, ("no streams around\n"));
191
if (!NT_STATUS_IS_OK(status)) {
192
DEBUG(10, ("SMB_VFS_STREAMINFO failed: %s\n",
197
DEBUG(10, ("delete_all_streams found %d streams\n",
200
if (num_streams == 0) {
205
for (i=0; i<num_streams; i++) {
209
if (strequal(stream_info[i].name, "::$DATA")) {
213
streamname = talloc_asprintf(talloc_tos(), "%s%s", fname,
214
stream_info[i].name);
216
if (streamname == NULL) {
217
DEBUG(0, ("talloc_aprintf failed\n"));
218
status = NT_STATUS_NO_MEMORY;
222
res = SMB_VFS_UNLINK(conn, streamname);
224
TALLOC_FREE(streamname);
227
status = map_nt_error_from_unix(errno);
228
DEBUG(10, ("Could not delete stream %s: %s\n",
229
streamname, strerror(errno)));
239
/****************************************************************************
240
Deal with removing a share mode on last close.
241
****************************************************************************/
243
static NTSTATUS close_remove_share_mode(files_struct *fsp,
244
enum file_close_type close_type)
246
connection_struct *conn = fsp->conn;
247
bool delete_file = false;
248
bool changed_user = false;
249
struct share_mode_lock *lck;
250
SMB_STRUCT_STAT sbuf;
251
NTSTATUS status = NT_STATUS_OK;
256
* Lock the share entries, and determine if we should delete
257
* on close. If so delete whilst the lock is still in effect.
258
* This prevents race conditions with the file being created. JRA.
261
lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
265
DEBUG(0, ("close_remove_share_mode: Could not get share mode "
266
"lock for file %s\n", fsp->fsp_name));
267
return NT_STATUS_INVALID_PARAMETER;
270
if (fsp->write_time_forced) {
271
set_close_write_time(fsp, lck->changed_write_time);
274
if (!del_share_mode(lck, fsp)) {
275
DEBUG(0, ("close_remove_share_mode: Could not delete share "
276
"entry for file %s\n", fsp->fsp_name));
279
if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
280
bool became_user = False;
282
/* Initial delete on close was set and no one else
283
* wrote a real delete on close. */
285
if (current_user.vuid != fsp->vuid) {
286
become_user(conn, fsp->vuid);
289
set_delete_on_close_lck(lck, True, ¤t_user.ut);
295
delete_file = lck->delete_on_close;
299
/* See if others still have the file open. If this is the
300
* case, then don't delete. If all opens are POSIX delete now. */
301
for (i=0; i<lck->num_share_modes; i++) {
302
struct share_mode_entry *e = &lck->share_modes[i];
303
if (is_valid_share_mode_entry(e)) {
304
if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
313
/* Notify any deferred opens waiting on this close. */
314
notify_deferred_opens(lck);
315
reply_to_oplock_break_requests(fsp);
318
* NT can set delete_on_close of the last open
319
* reference to a file.
322
if (!(close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE)
324
|| (lck->delete_token == NULL)) {
330
* Ok, we have to delete the file
333
DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
334
"- deleting file.\n", fsp->fsp_name));
337
* Don't try to update the write time when we delete the file
339
fsp->update_write_time_on_close = false;
341
if (!unix_token_equal(lck->delete_token, ¤t_user.ut)) {
342
/* Become the user who requested the delete. */
344
DEBUG(5,("close_remove_share_mode: file %s. "
345
"Change user to uid %u\n",
347
(unsigned int)lck->delete_token->uid));
349
if (!push_sec_ctx()) {
350
smb_panic("close_remove_share_mode: file %s. failed to push "
354
set_sec_ctx(lck->delete_token->uid,
355
lck->delete_token->gid,
356
lck->delete_token->ngroups,
357
lck->delete_token->groups,
363
/* We can only delete the file if the name we have is still valid and
364
hasn't been renamed. */
366
if (fsp->posix_open) {
367
ret = SMB_VFS_LSTAT(conn,fsp->fsp_name,&sbuf);
369
ret = SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf);
373
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
374
"was set and stat failed with error %s\n",
375
fsp->fsp_name, strerror(errno) ));
377
* Don't save the errno here, we ignore this error
382
id = vfs_file_id_from_sbuf(conn, &sbuf);
384
if (!file_id_equal(&fsp->file_id, &id)) {
385
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
386
"was set and dev and/or inode does not match\n",
388
DEBUG(5,("close_remove_share_mode: file %s. stored file_id %s, "
391
file_id_string_tos(&fsp->file_id),
392
file_id_string_tos(&id)));
394
* Don't save the errno here, we ignore this error
399
if ((conn->fs_capabilities & FILE_NAMED_STREAMS)
400
&& !is_ntfs_stream_name(fsp->fsp_name)) {
402
status = delete_all_streams(conn, fsp->fsp_name);
404
if (!NT_STATUS_IS_OK(status)) {
405
DEBUG(5, ("delete_all_streams failed: %s\n",
412
if (SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
414
* This call can potentially fail as another smbd may
415
* have had the file open with delete on close set and
416
* deleted it when its last reference to this file
417
* went away. Hence we log this but not at debug level
421
DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
422
"was set and unlink failed with error %s\n",
423
fsp->fsp_name, strerror(errno) ));
425
status = map_nt_error_from_unix(errno);
428
notify_fname(conn, NOTIFY_ACTION_REMOVED,
429
FILE_NOTIFY_CHANGE_FILE_NAME,
432
/* As we now have POSIX opens which can unlink
433
* with other open files we may have taken
434
* this code path with more than one share mode
435
* entry - ensure we only delete once by resetting
436
* the delete on close flag. JRA.
439
set_delete_on_close_lck(lck, False, NULL);
452
void set_close_write_time(struct files_struct *fsp, struct timespec ts)
454
DEBUG(6,("close_write_time: %s" , time_to_asc(convert_timespec_to_time_t(ts))));
456
if (null_timespec(ts)) {
460
* if the write time on close is explict set, then don't
461
* need to fix it up to the value in the locking db
463
fsp->write_time_forced = false;
465
fsp->update_write_time_on_close = true;
466
fsp->close_write_time = ts;
469
static NTSTATUS update_write_time_on_close(struct files_struct *fsp)
471
SMB_STRUCT_STAT sbuf;
472
struct smb_file_time ft;
479
if (!fsp->update_write_time_on_close) {
483
if (null_timespec(fsp->close_write_time)) {
484
fsp->close_write_time = timespec_current();
487
/* Ensure we have a valid stat struct for the source. */
488
if (fsp->fh->fd != -1) {
489
ret = SMB_VFS_FSTAT(fsp, &sbuf);
491
if (fsp->posix_open) {
492
ret = SMB_VFS_LSTAT(fsp->conn,fsp->fsp_name,&sbuf);
494
ret = SMB_VFS_STAT(fsp->conn,fsp->fsp_name,&sbuf);
499
return map_nt_error_from_unix(errno);
502
if (!VALID_STAT(sbuf)) {
503
/* if it doesn't seem to be a real file */
507
ft.mtime = fsp->close_write_time;
508
status = smb_set_file_time(fsp->conn, fsp, fsp->fsp_name,
510
if (!NT_STATUS_IS_OK(status)) {
517
/****************************************************************************
520
close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
521
printing and magic scripts are only run on normal close.
522
delete on close is done on normal and shutdown close.
523
****************************************************************************/
525
static NTSTATUS close_normal_file(struct smb_request *req, files_struct *fsp,
526
enum file_close_type close_type)
528
NTSTATUS status = NT_STATUS_OK;
529
NTSTATUS saved_status1 = NT_STATUS_OK;
530
NTSTATUS saved_status2 = NT_STATUS_OK;
531
NTSTATUS saved_status3 = NT_STATUS_OK;
532
NTSTATUS saved_status4 = NT_STATUS_OK;
533
connection_struct *conn = fsp->conn;
535
if (fsp->aio_write_behind) {
537
* If we're finishing write behind on a close we can get a write
538
* error here, we must remember this.
540
int ret = wait_for_aio_completion(fsp);
542
saved_status1 = map_nt_error_from_unix(ret);
545
cancel_aio_by_fsp(fsp);
549
* If we're flushing on a close we can get a write
550
* error here, we must remember this.
553
saved_status2 = close_filestruct(fsp);
555
if (fsp->print_file) {
556
print_fsp_end(fsp, close_type);
561
/* Remove the oplock before potentially deleting the file. */
562
if(fsp->oplock_type) {
563
release_file_oplock(fsp);
566
/* If this is an old DOS or FCB open and we have multiple opens on
567
the same handle we only have one share mode. Ensure we only remove
568
the share mode on the last close. */
570
if (fsp->fh->ref_count == 1) {
571
/* Should we return on error here... ? */
572
saved_status3 = close_remove_share_mode(fsp, close_type);
575
locking_close_file(smbd_messaging_context(), fsp);
577
status = fd_close(fsp);
579
/* check for magic scripts */
580
if (close_type == NORMAL_CLOSE) {
585
* Ensure pending modtime is set after close.
588
saved_status4 = update_write_time_on_close(fsp);
589
if (NT_STATUS_EQUAL(saved_status4, NT_STATUS_OBJECT_NAME_NOT_FOUND)) {
590
/* Someone renamed the file or a parent directory containing
591
* this file. We can't do anything about this, we don't have
592
* an "update timestamp by fd" call in POSIX. Eat the error. */
594
saved_status4 = NT_STATUS_OK;
597
if (NT_STATUS_IS_OK(status)) {
598
if (!NT_STATUS_IS_OK(saved_status1)) {
599
status = saved_status1;
600
} else if (!NT_STATUS_IS_OK(saved_status2)) {
601
status = saved_status2;
602
} else if (!NT_STATUS_IS_OK(saved_status3)) {
603
status = saved_status3;
604
} else if (!NT_STATUS_IS_OK(saved_status4)) {
605
status = saved_status4;
609
DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
610
conn->server_info->unix_name,fsp->fsp_name,
611
conn->num_files_open - 1,
612
nt_errstr(status) ));
618
/****************************************************************************
619
Close a directory opened by an NT SMB call.
620
****************************************************************************/
622
static NTSTATUS close_directory(struct smb_request *req, files_struct *fsp,
623
enum file_close_type close_type)
625
struct share_mode_lock *lck = 0;
626
bool delete_dir = False;
627
NTSTATUS status = NT_STATUS_OK;
630
* NT can set delete_on_close of the last open
631
* reference to a directory also.
634
lck = get_share_mode_lock(talloc_tos(), fsp->file_id, NULL, NULL,
638
DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
639
return NT_STATUS_INVALID_PARAMETER;
642
if (!del_share_mode(lck, fsp)) {
643
DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
646
if (fsp->initial_delete_on_close) {
647
bool became_user = False;
649
/* Initial delete on close was set - for
650
* directories we don't care if anyone else
651
* wrote a real delete on close. */
653
if (current_user.vuid != fsp->vuid) {
654
become_user(fsp->conn, fsp->vuid);
657
send_stat_cache_delete_message(fsp->fsp_name);
658
set_delete_on_close_lck(lck, True, ¤t_user.ut);
664
delete_dir = lck->delete_on_close;
668
/* See if others still have the dir open. If this is the
669
* case, then don't delete. If all opens are POSIX delete now. */
670
for (i=0; i<lck->num_share_modes; i++) {
671
struct share_mode_entry *e = &lck->share_modes[i];
672
if (is_valid_share_mode_entry(e)) {
673
if (fsp->posix_open && (e->flags & SHARE_MODE_FLAG_POSIX_OPEN)) {
682
if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
686
/* Become the user who requested the delete. */
688
if (!push_sec_ctx()) {
689
smb_panic("close_directory: failed to push sec_ctx.\n");
692
set_sec_ctx(lck->delete_token->uid,
693
lck->delete_token->gid,
694
lck->delete_token->ngroups,
695
lck->delete_token->groups,
700
status = rmdir_internals(talloc_tos(),
701
fsp->conn, fsp->fsp_name);
703
DEBUG(5,("close_directory: %s. Delete on close was set - "
704
"deleting directory returned %s.\n",
705
fsp->fsp_name, nt_errstr(status)));
711
* Ensure we remove any change notify requests that would
712
* now fail as the directory has been deleted.
715
if(NT_STATUS_IS_OK(status)) {
716
remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
720
remove_pending_change_notify_requests_by_fid(
724
status = fd_close(fsp);
726
if (!NT_STATUS_IS_OK(status)) {
727
DEBUG(0, ("Could not close dir! fname=%s, fd=%d, err=%d=%s\n",
728
fsp->fsp_name, fsp->fh->fd, errno, strerror(errno)));
732
* Do the code common to files and directories.
734
close_filestruct(fsp);
739
/****************************************************************************
740
Close a files_struct.
741
****************************************************************************/
743
NTSTATUS close_file(struct smb_request *req, files_struct *fsp,
744
enum file_close_type close_type)
747
struct files_struct *base_fsp = fsp->base_fsp;
749
if(fsp->is_directory) {
750
status = close_directory(req, fsp, close_type);
751
} else if (fsp->fake_file_handle != NULL) {
752
status = close_fake_file(req, fsp);
754
status = close_normal_file(req, fsp, close_type);
757
if ((base_fsp != NULL) && (close_type != SHUTDOWN_CLOSE)) {
760
* fsp was a stream, the base fsp can't be a stream as well
762
* For SHUTDOWN_CLOSE this is not possible here, because
763
* SHUTDOWN_CLOSE only happens from files.c which walks the
764
* complete list of files. If we mess with more than one fsp
765
* those loops will become confused.
768
SMB_ASSERT(base_fsp->base_fsp == NULL);
769
close_file(req, base_fsp, close_type);
775
/****************************************************************************
776
Deal with an (authorized) message to close a file given the share mode
778
****************************************************************************/
780
void msg_close_file(struct messaging_context *msg_ctx,
783
struct server_id server_id,
786
files_struct *fsp = NULL;
787
struct share_mode_entry e;
789
message_to_share_mode_entry(&e, (char *)data->data);
792
char *sm_str = share_mode_str(NULL, 0, &e);
794
smb_panic("talloc failed");
796
DEBUG(10,("msg_close_file: got request to close share mode "
797
"entry %s\n", sm_str));
801
fsp = file_find_dif(e.id, e.share_file_id);
803
DEBUG(10,("msg_close_file: failed to find file.\n"));
806
close_file(NULL, fsp, NORMAL_CLOSE);