2 Unix SMB/CIFS implementation.
3 file opening and share modes
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 2001-2004
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 2 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, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 extern struct generic_mapping file_generic_mapping;
26 extern struct current_user current_user;
27 extern userdom_struct current_user_info;
28 extern uint16 global_smbpid;
29 extern BOOL global_client_failed_oplock_break;
31 struct deferred_open_record {
32 BOOL delayed_for_oplocks;
37 /****************************************************************************
38 fd support routines - attempt to do a dos_open.
39 ****************************************************************************/
41 static int fd_open(struct connection_struct *conn,
48 if (!lp_symlinks(SNUM(conn))) {
53 fd = SMB_VFS_OPEN(conn,fname,flags,mode);
55 DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n", fname,
56 flags, (int)mode, fd, (fd == -1) ? strerror(errno) : "" ));
61 /****************************************************************************
62 Close the file associated with a fsp.
63 ****************************************************************************/
65 int fd_close(struct connection_struct *conn,
68 if (fsp->fh->fd == -1) {
69 return 0; /* What we used to call a stat open. */
71 if (fsp->fh->ref_count > 1) {
72 return 0; /* Shared handle. Only close last reference. */
74 return fd_close_posix(conn, fsp);
77 /****************************************************************************
78 Change the ownership of a file to that of the parent directory.
79 Do this by fd if possible.
80 ****************************************************************************/
82 void change_owner_to_parent(connection_struct *conn,
85 SMB_STRUCT_STAT *psbuf)
87 const char *parent_path = parent_dirname(fname);
88 SMB_STRUCT_STAT parent_st;
91 ret = SMB_VFS_STAT(conn, parent_path, &parent_st);
93 DEBUG(0,("change_owner_to_parent: failed to stat parent "
94 "directory %s. Error was %s\n",
95 parent_path, strerror(errno) ));
99 if (fsp && fsp->fh->fd != -1) {
101 ret = SMB_VFS_FCHOWN(fsp, fsp->fh->fd, parent_st.st_uid, (gid_t)-1);
104 DEBUG(0,("change_owner_to_parent: failed to fchown "
105 "file %s to parent directory uid %u. Error "
107 (unsigned int)parent_st.st_uid,
111 DEBUG(10,("change_owner_to_parent: changed new file %s to "
112 "parent directory uid %u.\n", fname,
113 (unsigned int)parent_st.st_uid ));
116 /* We've already done an lstat into psbuf, and we know it's a
117 directory. If we can cd into the directory and the dev/ino
118 are the same then we can safely chown without races as
119 we're locking the directory in place by being in it. This
120 should work on any UNIX (thanks tridge :-). JRA.
124 SMB_STRUCT_STAT sbuf;
126 if (!vfs_GetWd(conn,saved_dir)) {
127 DEBUG(0,("change_owner_to_parent: failed to get "
128 "current working directory\n"));
132 /* Chdir into the new path. */
133 if (vfs_ChDir(conn, fname) == -1) {
134 DEBUG(0,("change_owner_to_parent: failed to change "
135 "current working directory to %s. Error "
136 "was %s\n", fname, strerror(errno) ));
140 if (SMB_VFS_STAT(conn,".",&sbuf) == -1) {
141 DEBUG(0,("change_owner_to_parent: failed to stat "
142 "directory '.' (%s) Error was %s\n",
143 fname, strerror(errno)));
147 /* Ensure we're pointing at the same place. */
148 if (sbuf.st_dev != psbuf->st_dev ||
149 sbuf.st_ino != psbuf->st_ino ||
150 sbuf.st_mode != psbuf->st_mode ) {
151 DEBUG(0,("change_owner_to_parent: "
152 "device/inode/mode on directory %s changed. "
153 "Refusing to chown !\n", fname ));
158 ret = SMB_VFS_CHOWN(conn, ".", parent_st.st_uid, (gid_t)-1);
161 DEBUG(10,("change_owner_to_parent: failed to chown "
162 "directory %s to parent directory uid %u. "
163 "Error was %s\n", fname,
164 (unsigned int)parent_st.st_uid, strerror(errno) ));
168 DEBUG(10,("change_owner_to_parent: changed ownership of new "
169 "directory %s to parent directory uid %u.\n",
170 fname, (unsigned int)parent_st.st_uid ));
174 vfs_ChDir(conn,saved_dir);
178 /****************************************************************************
180 ****************************************************************************/
182 static BOOL open_file(files_struct *fsp,
183 connection_struct *conn,
185 SMB_STRUCT_STAT *psbuf,
190 int accmode = (flags & O_ACCMODE);
191 int local_flags = flags;
192 BOOL file_existed = VALID_STAT(*psbuf);
197 /* Check permissions */
200 * This code was changed after seeing a client open request
201 * containing the open mode of (DENY_WRITE/read-only) with
202 * the 'create if not exist' bit set. The previous code
203 * would fail to open the file read only on a read-only share
204 * as it was checking the flags parameter directly against O_RDONLY,
205 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
209 if (!CAN_WRITE(conn)) {
210 /* It's a read-only share - fail if we wanted to write. */
211 if(accmode != O_RDONLY) {
212 DEBUG(3,("Permission denied opening %s\n",fname));
214 } else if(flags & O_CREAT) {
215 /* We don't want to write - but we must make sure that
216 O_CREAT doesn't create the file if we have write
217 access into the directory.
220 local_flags &= ~O_CREAT;
225 * This little piece of insanity is inspired by the
226 * fact that an NT client can open a file for O_RDONLY,
227 * but set the create disposition to FILE_EXISTS_TRUNCATE.
228 * If the client *can* write to the file, then it expects to
229 * truncate the file, even though it is opening for readonly.
230 * Quicken uses this stupid trick in backup file creation...
231 * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
232 * for helping track this one down. It didn't bite us in 2.0.x
233 * as we always opened files read-write in that release. JRA.
236 if ((accmode == O_RDONLY) && ((flags & O_TRUNC) == O_TRUNC)) {
237 DEBUG(10,("open_file: truncate requested on read-only open "
238 "for file %s\n",fname ));
239 local_flags = (flags & ~O_ACCMODE)|O_RDWR;
242 if ((access_mask & (FILE_READ_DATA|FILE_WRITE_DATA|FILE_APPEND_DATA|FILE_EXECUTE)) ||
243 (local_flags & O_CREAT) ||
244 ((local_flags & O_TRUNC) == O_TRUNC) ) {
247 * We can't actually truncate here as the file may be locked.
248 * open_file_ntcreate will take care of the truncate later. JRA.
251 local_flags &= ~O_TRUNC;
253 #if defined(O_NONBLOCK) && defined(S_ISFIFO)
255 * We would block on opening a FIFO with no one else on the
256 * other end. Do what we used to do and add O_NONBLOCK to the
260 if (file_existed && S_ISFIFO(psbuf->st_mode)) {
261 local_flags |= O_NONBLOCK;
265 /* Don't create files with Microsoft wildcard characters. */
266 if ((local_flags & O_CREAT) && !file_existed &&
267 ms_has_wild(fname)) {
268 set_saved_ntstatus(NT_STATUS_OBJECT_NAME_INVALID);
272 /* Actually do the open */
273 fsp->fh->fd = fd_open(conn, fname, local_flags, unx_mode);
274 if (fsp->fh->fd == -1) {
275 DEBUG(3,("Error opening file %s (%s) (local_flags=%d) "
277 fname,strerror(errno),local_flags,flags));
281 /* Inherit the ACL if the file was created. */
282 if ((local_flags & O_CREAT) && !file_existed) {
283 inherit_access_acl(conn, fname, unx_mode);
287 fsp->fh->fd = -1; /* What we used to call a stat open. */
293 if (fsp->fh->fd == -1) {
294 ret = SMB_VFS_STAT(conn, fname, psbuf);
296 ret = SMB_VFS_FSTAT(fsp,fsp->fh->fd,psbuf);
297 /* If we have an fd, this stat should succeed. */
299 DEBUG(0,("Error doing fstat on open file %s "
300 "(%s)\n", fname,strerror(errno) ));
304 /* For a non-io open, this stat failing means file not found. JRA */
312 * POSIX allows read-only opens of directories. We don't
313 * want to do this (we use a different code path for this)
314 * so catch a directory open and return an EISDIR. JRA.
317 if(S_ISDIR(psbuf->st_mode)) {
323 fsp->mode = psbuf->st_mode;
324 fsp->inode = psbuf->st_ino;
325 fsp->dev = psbuf->st_dev;
326 fsp->vuid = current_user.vuid;
327 fsp->file_pid = global_smbpid;
328 fsp->can_lock = True;
329 fsp->can_read = (access_mask & (FILE_READ_DATA)) ? True : False;
330 if (!CAN_WRITE(conn)) {
331 fsp->can_write = False;
333 fsp->can_write = (access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) ? True : False;
335 fsp->print_file = False;
336 fsp->modified = False;
337 fsp->sent_oplock_break = NO_BREAK_SENT;
338 fsp->is_directory = False;
339 fsp->is_stat = False;
340 if (conn->aio_write_behind_list &&
341 is_in_path(fname, conn->aio_write_behind_list, conn->case_sensitive)) {
342 fsp->aio_write_behind = True;
345 string_set(&fsp->fsp_name,fname);
346 fsp->wcp = NULL; /* Write cache pointer. */
348 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
349 *current_user_info.smb_name ? current_user_info.smb_name : conn->user,fsp->fsp_name,
350 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
351 conn->num_files_open + 1));
357 /*******************************************************************
358 Return True if the filename is one of the special executable types.
359 ********************************************************************/
361 static BOOL is_executable(const char *fname)
363 if ((fname = strrchr_m(fname,'.'))) {
364 if (strequal(fname,".com") ||
365 strequal(fname,".dll") ||
366 strequal(fname,".exe") ||
367 strequal(fname,".sym")) {
374 /****************************************************************************
375 Check if we can open a file with a share mode.
376 Returns True if conflict, False if not.
377 ****************************************************************************/
379 static BOOL share_conflict(struct share_mode_entry *entry,
383 DEBUG(10,("share_conflict: entry->access_mask = 0x%x, "
384 "entry->share_access = 0x%x, "
385 "entry->private_options = 0x%x\n",
386 (unsigned int)entry->access_mask,
387 (unsigned int)entry->share_access,
388 (unsigned int)entry->private_options));
390 DEBUG(10,("share_conflict: access_mask = 0x%x, share_access = 0x%x\n",
391 (unsigned int)access_mask, (unsigned int)share_access));
393 if ((entry->access_mask & (FILE_WRITE_DATA|
397 DELETE_ACCESS)) == 0) {
398 DEBUG(10,("share_conflict: No conflict due to "
399 "entry->access_mask = 0x%x\n",
400 (unsigned int)entry->access_mask ));
404 if ((access_mask & (FILE_WRITE_DATA|
408 DELETE_ACCESS)) == 0) {
409 DEBUG(10,("share_conflict: No conflict due to "
410 "access_mask = 0x%x\n",
411 (unsigned int)access_mask ));
415 #if 1 /* JRA TEST - Superdebug. */
416 #define CHECK_MASK(num, am, right, sa, share) \
417 DEBUG(10,("share_conflict: [%d] am (0x%x) & right (0x%x) = 0x%x\n", \
418 (unsigned int)(num), (unsigned int)(am), \
419 (unsigned int)(right), (unsigned int)(am)&(right) )); \
420 DEBUG(10,("share_conflict: [%d] sa (0x%x) & share (0x%x) = 0x%x\n", \
421 (unsigned int)(num), (unsigned int)(sa), \
422 (unsigned int)(share), (unsigned int)(sa)&(share) )); \
423 if (((am) & (right)) && !((sa) & (share))) { \
424 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
425 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
426 (unsigned int)(share) )); \
430 #define CHECK_MASK(num, am, right, sa, share) \
431 if (((am) & (right)) && !((sa) & (share))) { \
432 DEBUG(10,("share_conflict: check %d conflict am = 0x%x, right = 0x%x, \
433 sa = 0x%x, share = 0x%x\n", (num), (unsigned int)(am), (unsigned int)(right), (unsigned int)(sa), \
434 (unsigned int)(share) )); \
439 CHECK_MASK(1, entry->access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
440 share_access, FILE_SHARE_WRITE);
441 CHECK_MASK(2, access_mask, FILE_WRITE_DATA | FILE_APPEND_DATA,
442 entry->share_access, FILE_SHARE_WRITE);
444 CHECK_MASK(3, entry->access_mask, FILE_READ_DATA | FILE_EXECUTE,
445 share_access, FILE_SHARE_READ);
446 CHECK_MASK(4, access_mask, FILE_READ_DATA | FILE_EXECUTE,
447 entry->share_access, FILE_SHARE_READ);
449 CHECK_MASK(5, entry->access_mask, DELETE_ACCESS,
450 share_access, FILE_SHARE_DELETE);
451 CHECK_MASK(6, access_mask, DELETE_ACCESS,
452 entry->share_access, FILE_SHARE_DELETE);
454 DEBUG(10,("share_conflict: No conflict.\n"));
458 #if defined(DEVELOPER)
459 static void validate_my_share_entries(int num,
460 struct share_mode_entry *share_entry)
464 if (!procid_is_me(&share_entry->pid)) {
468 if (is_deferred_open_entry(share_entry) &&
469 !open_was_deferred(share_entry->op_mid)) {
471 DEBUG(0, ("Got a deferred entry without a request: "
472 "PANIC: %s\n", share_mode_str(num, share_entry)));
476 if (!is_valid_share_mode_entry(share_entry)) {
480 fsp = file_find_dif(share_entry->dev, share_entry->inode,
481 share_entry->share_file_id);
483 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
484 share_mode_str(num, share_entry) ));
485 smb_panic("validate_my_share_entries: Cannot match a "
486 "share entry with an open file\n");
489 if (is_deferred_open_entry(share_entry) ||
490 is_unused_share_mode_entry(share_entry)) {
494 if ((share_entry->op_type == NO_OPLOCK) &&
495 (fsp->oplock_type == FAKE_LEVEL_II_OPLOCK)) {
496 /* Someone has already written to it, but I haven't yet
501 if (((uint16)fsp->oplock_type) != share_entry->op_type) {
510 DEBUG(0,("validate_my_share_entries: PANIC : %s\n",
511 share_mode_str(num, share_entry) ));
512 slprintf(str, sizeof(str)-1, "validate_my_share_entries: "
513 "file %s, oplock_type = 0x%x, op_type = 0x%x\n",
514 fsp->fsp_name, (unsigned int)fsp->oplock_type,
515 (unsigned int)share_entry->op_type );
521 static BOOL is_stat_open(uint32 access_mask)
523 return (access_mask &&
524 ((access_mask & ~(SYNCHRONIZE_ACCESS| FILE_READ_ATTRIBUTES|
525 FILE_WRITE_ATTRIBUTES))==0) &&
526 ((access_mask & (SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|
527 FILE_WRITE_ATTRIBUTES)) != 0));
530 /****************************************************************************
531 Deal with share modes
532 Invarient: Share mode must be locked on entry and exit.
533 Returns -1 on error, or number of share modes on success (may be zero).
534 ****************************************************************************/
536 static NTSTATUS open_mode_check(connection_struct *conn,
538 struct share_mode_lock *lck,
541 uint32 create_options,
546 if(lck->num_share_modes == 0) {
550 *file_existed = True;
552 if (is_stat_open(access_mask)) {
553 /* Stat open that doesn't trigger oplock breaks or share mode
554 * checks... ! JRA. */
558 /* A delete on close prohibits everything */
560 if (lck->delete_on_close) {
561 return NT_STATUS_DELETE_PENDING;
565 * Check if the share modes will give us access.
568 #if defined(DEVELOPER)
569 for(i = 0; i < lck->num_share_modes; i++) {
570 validate_my_share_entries(i, &lck->share_modes[i]);
574 if (!lp_share_modes(SNUM(conn))) {
578 /* Now we check the share modes, after any oplock breaks. */
579 for(i = 0; i < lck->num_share_modes; i++) {
581 if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
585 /* someone else has a share lock on it, check to see if we can
587 if (share_conflict(&lck->share_modes[i],
588 access_mask, share_access)) {
589 return NT_STATUS_SHARING_VIOLATION;
596 static BOOL is_delete_request(files_struct *fsp) {
597 return ((fsp->access_mask == DELETE_ACCESS) &&
598 (fsp->oplock_type == NO_OPLOCK));
602 * 1) No files open at all or internal open: Grant whatever the client wants.
604 * 2) Exclusive (or batch) oplock around: If the requested access is a delete
605 * request, break if the oplock around is a batch oplock. If it's another
606 * requested access type, break.
608 * 3) Only level2 around: Grant level2 and do nothing else.
611 static BOOL delay_for_oplocks(struct share_mode_lock *lck,
617 struct share_mode_entry *exclusive = NULL;
618 BOOL valid_entry = False;
619 BOOL delay_it = False;
620 BOOL have_level2 = False;
622 if ((oplock_request & INTERNAL_OPEN_ONLY) || is_stat_open(fsp->access_mask)) {
623 fsp->oplock_type = NO_OPLOCK;
627 for (i=0; i<lck->num_share_modes; i++) {
629 if (!is_valid_share_mode_entry(&lck->share_modes[i])) {
633 /* At least one entry is not an invalid or deferred entry. */
636 if (pass_number == 1) {
637 if (BATCH_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
638 SMB_ASSERT(exclusive == NULL);
639 exclusive = &lck->share_modes[i];
642 if (EXCLUSIVE_OPLOCK_TYPE(lck->share_modes[i].op_type)) {
643 SMB_ASSERT(exclusive == NULL);
644 exclusive = &lck->share_modes[i];
648 if (lck->share_modes[i].op_type == LEVEL_II_OPLOCK) {
649 SMB_ASSERT(exclusive == NULL);
655 /* All entries are placeholders or deferred.
656 * Directly grant whatever the client wants. */
657 if (fsp->oplock_type == NO_OPLOCK) {
658 /* Store a level2 oplock, but don't tell the client */
659 fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
664 if (exclusive != NULL) { /* Found an exclusive oplock */
665 SMB_ASSERT(!have_level2);
666 delay_it = is_delete_request(fsp) ?
667 BATCH_OPLOCK_TYPE(exclusive->op_type) : True;
670 if (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) {
671 /* We can at most grant level2 as there are other
672 * level2 or NO_OPLOCK entries. */
673 fsp->oplock_type = LEVEL_II_OPLOCK;
676 if ((fsp->oplock_type == NO_OPLOCK) && have_level2) {
677 /* Store a level2 oplock, but don't tell the client */
678 fsp->oplock_type = FAKE_LEVEL_II_OPLOCK;
683 char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
685 DEBUG(10, ("Sending break request to PID %s\n",
686 procid_str_static(&exclusive->pid)));
687 exclusive->op_mid = get_current_mid();
689 /* Create the message. */
690 share_mode_entry_to_message(msg, exclusive);
692 /* Add in the FORCE_OPLOCK_BREAK_TO_NONE bit in the message if set. We don't
693 want this set in the share mode struct pointed to by lck. */
695 if (oplock_request & FORCE_OPLOCK_BREAK_TO_NONE) {
696 SSVAL(msg,6,exclusive->op_type | FORCE_OPLOCK_BREAK_TO_NONE);
700 ret = message_send_pid(exclusive->pid, MSG_SMB_BREAK_REQUEST,
701 msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
704 DEBUG(3, ("Could not send oplock break message\n"));
711 static BOOL request_timed_out(struct timeval request_time,
712 struct timeval timeout)
714 struct timeval now, end_time;
716 end_time = timeval_sum(&request_time, &timeout);
717 return (timeval_compare(&end_time, &now) < 0);
720 /****************************************************************************
721 Handle the 1 second delay in returning a SHARING_VIOLATION error.
722 ****************************************************************************/
724 static void defer_open(struct share_mode_lock *lck,
725 struct timeval request_time,
726 struct timeval timeout,
727 struct deferred_open_record *state)
729 uint16 mid = get_current_mid();
734 for (i=0; i<lck->num_share_modes; i++) {
735 struct share_mode_entry *e = &lck->share_modes[i];
737 if (!is_deferred_open_entry(e)) {
741 if (procid_is_me(&e->pid) && (e->op_mid == mid)) {
742 DEBUG(0, ("Trying to defer an already deferred "
743 "request: mid=%d, exiting\n", mid));
744 exit_server("attempt to defer a deferred request");
748 /* End paranoia check */
750 DEBUG(10,("defer_open_sharing_error: time [%u.%06u] adding deferred "
751 "open entry for mid %u\n",
752 (unsigned int)request_time.tv_sec,
753 (unsigned int)request_time.tv_usec,
756 if (!push_deferred_smb_message(mid, request_time, timeout,
757 (char *)state, sizeof(*state))) {
758 exit_server("push_deferred_smb_message failed");
760 add_deferred_open(lck, mid, request_time, state->dev, state->inode);
763 * Push the MID of this packet on the signing queue.
764 * We only do this once, the first time we push the packet
765 * onto the deferred open queue, as this has a side effect
766 * of incrementing the response sequence number.
769 srv_defer_sign_response(mid);
772 /****************************************************************************
773 Set a kernel flock on a file for NFS interoperability.
774 This requires a patch to Linux.
775 ****************************************************************************/
777 static void kernel_flock(files_struct *fsp, uint32 share_mode)
779 #if HAVE_KERNEL_SHARE_MODES
781 if (share_mode == FILE_SHARE_WRITE) {
782 kernel_mode = LOCK_MAND|LOCK_WRITE;
783 } else if (share_mode == FILE_SHARE_READ) {
784 kernel_mode = LOCK_MAND|LOCK_READ;
785 } else if (share_mode == FILE_SHARE_NONE) {
786 kernel_mode = LOCK_MAND;
789 flock(fsp->fh->fd, kernel_mode);
795 /****************************************************************************
796 On overwrite open ensure that the attributes match.
797 ****************************************************************************/
799 static BOOL open_match_attributes(connection_struct *conn,
803 mode_t existing_unx_mode,
805 mode_t *returned_unx_mode)
807 uint32 noarch_old_dos_attr, noarch_new_dos_attr;
809 noarch_old_dos_attr = (old_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
810 noarch_new_dos_attr = (new_dos_attr & ~FILE_ATTRIBUTE_ARCHIVE);
812 if((noarch_old_dos_attr == 0 && noarch_new_dos_attr != 0) ||
813 (noarch_old_dos_attr != 0 && ((noarch_old_dos_attr & noarch_new_dos_attr) == noarch_old_dos_attr))) {
814 *returned_unx_mode = new_unx_mode;
816 *returned_unx_mode = (mode_t)0;
819 DEBUG(10,("open_match_attributes: file %s old_dos_attr = 0x%x, "
820 "existing_unx_mode = 0%o, new_dos_attr = 0x%x "
821 "returned_unx_mode = 0%o\n",
823 (unsigned int)old_dos_attr,
824 (unsigned int)existing_unx_mode,
825 (unsigned int)new_dos_attr,
826 (unsigned int)*returned_unx_mode ));
828 /* If we're mapping SYSTEM and HIDDEN ensure they match. */
829 if (lp_map_system(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
830 if ((old_dos_attr & FILE_ATTRIBUTE_SYSTEM) &&
831 !(new_dos_attr & FILE_ATTRIBUTE_SYSTEM)) {
835 if (lp_map_hidden(SNUM(conn)) || lp_store_dos_attributes(SNUM(conn))) {
836 if ((old_dos_attr & FILE_ATTRIBUTE_HIDDEN) &&
837 !(new_dos_attr & FILE_ATTRIBUTE_HIDDEN)) {
844 /****************************************************************************
845 Special FCB or DOS processing in the case of a sharing violation.
846 Try and find a duplicated file handle.
847 ****************************************************************************/
849 static files_struct *fcb_or_dos_open(connection_struct *conn,
850 const char *fname, SMB_DEV_T dev,
854 uint32 create_options)
857 files_struct *dup_fsp;
859 DEBUG(5,("fcb_or_dos_open: attempting old open semantics for "
860 "file %s.\n", fname ));
862 for(fsp = file_find_di_first(dev, inode); fsp;
863 fsp = file_find_di_next(fsp)) {
865 DEBUG(10,("fcb_or_dos_open: checking file %s, fd = %d, "
866 "vuid = %u, file_pid = %u, private_options = 0x%x "
867 "access_mask = 0x%x\n", fsp->fsp_name,
868 fsp->fh->fd, (unsigned int)fsp->vuid,
869 (unsigned int)fsp->file_pid,
870 (unsigned int)fsp->fh->private_options,
871 (unsigned int)fsp->access_mask ));
873 if (fsp->fh->fd != -1 &&
874 fsp->vuid == current_user.vuid &&
875 fsp->file_pid == global_smbpid &&
876 (fsp->fh->private_options & (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS |
877 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) &&
878 (fsp->access_mask & FILE_WRITE_DATA) &&
879 strequal(fsp->fsp_name, fname)) {
880 DEBUG(10,("fcb_or_dos_open: file match\n"));
889 /* quite an insane set of semantics ... */
890 if (is_executable(fname) &&
891 (fsp->fh->private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS)) {
892 DEBUG(10,("fcb_or_dos_open: file fail due to is_executable.\n"));
896 /* We need to duplicate this fsp. */
897 dup_fsp = dup_file_fsp(fsp, access_mask, share_access, create_options);
905 /****************************************************************************
906 Open a file with a share mode - old openX method - map into NTCreate.
907 ****************************************************************************/
909 BOOL map_open_params_to_ntcreate(const char *fname, int deny_mode, int open_func,
910 uint32 *paccess_mask,
912 uint32 *pcreate_disposition,
913 uint32 *pcreate_options)
917 uint32 create_disposition;
918 uint32 create_options = 0;
920 DEBUG(10,("map_open_params_to_ntcreate: fname = %s, deny_mode = 0x%x, "
921 "open_func = 0x%x\n",
922 fname, (unsigned int)deny_mode, (unsigned int)open_func ));
924 /* Create the NT compatible access_mask. */
925 switch (GET_OPENX_MODE(deny_mode)) {
926 case DOS_OPEN_EXEC: /* Implies read-only - used to be FILE_READ_DATA */
927 case DOS_OPEN_RDONLY:
928 access_mask = FILE_GENERIC_READ;
930 case DOS_OPEN_WRONLY:
931 access_mask = FILE_GENERIC_WRITE;
935 access_mask = FILE_GENERIC_READ|FILE_GENERIC_WRITE;
938 DEBUG(10,("map_open_params_to_ntcreate: bad open mode = 0x%x\n",
939 (unsigned int)GET_OPENX_MODE(deny_mode)));
943 /* Create the NT compatible create_disposition. */
945 case OPENX_FILE_EXISTS_FAIL|OPENX_FILE_CREATE_IF_NOT_EXIST:
946 create_disposition = FILE_CREATE;
949 case OPENX_FILE_EXISTS_OPEN:
950 create_disposition = FILE_OPEN;
953 case OPENX_FILE_EXISTS_OPEN|OPENX_FILE_CREATE_IF_NOT_EXIST:
954 create_disposition = FILE_OPEN_IF;
957 case OPENX_FILE_EXISTS_TRUNCATE:
958 create_disposition = FILE_OVERWRITE;
961 case OPENX_FILE_EXISTS_TRUNCATE|OPENX_FILE_CREATE_IF_NOT_EXIST:
962 create_disposition = FILE_OVERWRITE_IF;
966 /* From samba4 - to be confirmed. */
967 if (GET_OPENX_MODE(deny_mode) == DOS_OPEN_EXEC) {
968 create_disposition = FILE_CREATE;
971 DEBUG(10,("map_open_params_to_ntcreate: bad "
972 "open_func 0x%x\n", (unsigned int)open_func));
976 /* Create the NT compatible share modes. */
977 switch (GET_DENY_MODE(deny_mode)) {
979 share_mode = FILE_SHARE_NONE;
983 share_mode = FILE_SHARE_READ;
987 share_mode = FILE_SHARE_WRITE;
991 share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
995 create_options |= NTCREATEX_OPTIONS_PRIVATE_DENY_DOS;
996 if (is_executable(fname)) {
997 share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE;
999 if (GET_OPENX_MODE(deny_mode) == DOS_OPEN_RDONLY) {
1000 share_mode = FILE_SHARE_READ;
1002 share_mode = FILE_SHARE_NONE;
1008 create_options |= NTCREATEX_OPTIONS_PRIVATE_DENY_FCB;
1009 share_mode = FILE_SHARE_NONE;
1013 DEBUG(10,("map_open_params_to_ntcreate: bad deny_mode 0x%x\n",
1014 (unsigned int)GET_DENY_MODE(deny_mode) ));
1018 DEBUG(10,("map_open_params_to_ntcreate: file %s, access_mask = 0x%x, "
1019 "share_mode = 0x%x, create_disposition = 0x%x, "
1020 "create_options = 0x%x\n",
1022 (unsigned int)access_mask,
1023 (unsigned int)share_mode,
1024 (unsigned int)create_disposition,
1025 (unsigned int)create_options ));
1028 *paccess_mask = access_mask;
1031 *pshare_mode = share_mode;
1033 if (pcreate_disposition) {
1034 *pcreate_disposition = create_disposition;
1036 if (pcreate_options) {
1037 *pcreate_options = create_options;
1044 static void schedule_defer_open(struct share_mode_lock *lck, struct timeval request_time)
1046 struct deferred_open_record state;
1048 /* This is a relative time, added to the absolute
1049 request_time value to get the absolute timeout time.
1050 Note that if this is the second or greater time we enter
1051 this codepath for this particular request mid then
1052 request_time is left as the absolute time of the *first*
1053 time this request mid was processed. This is what allows
1054 the request to eventually time out. */
1056 struct timeval timeout;
1058 /* Normally the smbd we asked should respond within
1059 * OPLOCK_BREAK_TIMEOUT seconds regardless of whether
1060 * the client did, give twice the timeout as a safety
1061 * measure here in case the other smbd is stuck
1062 * somewhere else. */
1064 timeout = timeval_set(OPLOCK_BREAK_TIMEOUT*2, 0);
1066 /* Nothing actually uses state.delayed_for_oplocks
1067 but it's handy to differentiate in debug messages
1068 between a 30 second delay due to oplock break, and
1069 a 1 second delay for share mode conflicts. */
1071 state.delayed_for_oplocks = True;
1072 state.dev = lck->dev;
1073 state.inode = lck->ino;
1075 if (!request_timed_out(request_time, timeout)) {
1076 defer_open(lck, request_time, timeout, &state);
1080 /****************************************************************************
1081 Open a file with a share mode.
1082 ****************************************************************************/
1084 files_struct *open_file_ntcreate(connection_struct *conn,
1086 SMB_STRUCT_STAT *psbuf,
1087 uint32 access_mask, /* access bits (FILE_READ_DATA etc.) */
1088 uint32 share_access, /* share constants (FILE_SHARE_READ etc). */
1089 uint32 create_disposition, /* FILE_OPEN_IF etc. */
1090 uint32 create_options, /* options such as delete on close. */
1091 uint32 new_dos_attributes, /* attributes used for new file. */
1092 int oplock_request, /* internal Samba oplock codes. */
1093 /* Information (FILE_EXISTS etc.) */
1098 BOOL file_existed = VALID_STAT(*psbuf);
1099 BOOL def_acl = False;
1101 SMB_INO_T inode = 0;
1102 BOOL fsp_open = False;
1103 files_struct *fsp = NULL;
1104 mode_t new_unx_mode = (mode_t)0;
1105 mode_t unx_mode = (mode_t)0;
1107 uint32 existing_dos_attributes = 0;
1108 struct pending_message_list *pml = NULL;
1109 uint16 mid = get_current_mid();
1110 BOOL delayed_for_oplocks = False;
1111 struct timeval request_time = timeval_zero();
1112 struct share_mode_lock *lck = NULL;
1115 if (conn->printer) {
1117 * Printers are handled completely differently.
1118 * Most of the passed parameters are ignored.
1122 *pinfo = FILE_WAS_CREATED;
1125 DEBUG(10, ("open_file_ntcreate: printer open fname=%s\n", fname));
1127 return print_fsp_open(conn, fname);
1130 /* We add aARCH to this as this mode is only used if the file is
1132 unx_mode = unix_mode(conn, new_dos_attributes | aARCH,fname, True);
1134 DEBUG(10, ("open_file_ntcreate: fname=%s, dos_attrs=0x%x "
1135 "access_mask=0x%x share_access=0x%x "
1136 "create_disposition = 0x%x create_options=0x%x "
1137 "unix mode=0%o oplock_request=%d\n",
1138 fname, new_dos_attributes, access_mask, share_access,
1139 create_disposition, create_options, unx_mode,
1142 if ((pml = get_open_deferred_message(mid)) != NULL) {
1143 struct deferred_open_record *state =
1144 (struct deferred_open_record *)pml->private_data.data;
1146 /* Remember the absolute time of the original
1147 request with this mid. We'll use it later to
1148 see if this has timed out. */
1150 request_time = pml->request_time;
1151 delayed_for_oplocks = state->delayed_for_oplocks;
1153 /* Remove the deferred open entry under lock. */
1154 lck = get_share_mode_lock(NULL, state->dev, state->inode, NULL, NULL);
1156 DEBUG(0, ("could not get share mode lock\n"));
1158 del_deferred_open_entry(lck, mid);
1162 /* Ensure we don't reprocess this message. */
1163 remove_deferred_open_smb_message(mid);
1166 if (!check_name(fname,conn)) {
1170 new_dos_attributes &= SAMBA_ATTRIBUTES_MASK;
1172 existing_dos_attributes = dos_mode(conn, fname, psbuf);
1175 /* ignore any oplock requests if oplocks are disabled */
1176 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break ||
1177 IS_VETO_OPLOCK_PATH(conn, fname)) {
1178 /* Mask off everything except the private Samba bits. */
1179 oplock_request &= SAMBA_PRIVATE_OPLOCK_MASK;
1182 /* this is for OS/2 long file names - say we don't support them */
1183 if (!lp_posix_pathnames() && strstr(fname,".+,;=[].")) {
1184 /* OS/2 Workplace shell fix may be main code stream in a later
1186 set_saved_error_triple(ERRDOS, ERRcannotopen,
1187 NT_STATUS_OBJECT_NAME_NOT_FOUND);
1188 DEBUG(5,("open_file_ntcreate: OS/2 long filenames are not "
1193 switch( create_disposition ) {
1195 * Currently we're using FILE_SUPERSEDE as the same as
1196 * FILE_OVERWRITE_IF but they really are
1197 * different. FILE_SUPERSEDE deletes an existing file
1198 * (requiring delete access) then recreates it.
1200 case FILE_SUPERSEDE:
1201 /* If file exists replace/overwrite. If file doesn't
1203 flags2 |= (O_CREAT | O_TRUNC);
1206 case FILE_OVERWRITE_IF:
1207 /* If file exists replace/overwrite. If file doesn't
1209 flags2 |= (O_CREAT | O_TRUNC);
1213 /* If file exists open. If file doesn't exist error. */
1214 if (!file_existed) {
1215 DEBUG(5,("open_file_ntcreate: FILE_OPEN "
1216 "requested for file %s and file "
1217 "doesn't exist.\n", fname ));
1218 set_saved_ntstatus(NT_STATUS_OBJECT_NAME_NOT_FOUND);
1224 case FILE_OVERWRITE:
1225 /* If file exists overwrite. If file doesn't exist
1227 if (!file_existed) {
1228 DEBUG(5,("open_file_ntcreate: FILE_OVERWRITE "
1229 "requested for file %s and file "
1230 "doesn't exist.\n", fname ));
1231 set_saved_ntstatus(NT_STATUS_OBJECT_NAME_NOT_FOUND);
1239 /* If file exists error. If file doesn't exist
1242 DEBUG(5,("open_file_ntcreate: FILE_CREATE "
1243 "requested for file %s and file "
1244 "already exists.\n", fname ));
1245 if (S_ISDIR(psbuf->st_mode)) {
1252 flags2 |= (O_CREAT|O_EXCL);
1256 /* If file exists open. If file doesn't exist
1262 set_saved_ntstatus(NT_STATUS_INVALID_PARAMETER);
1266 /* We only care about matching attributes on file exists and
1269 if (file_existed && ((create_disposition == FILE_OVERWRITE) ||
1270 (create_disposition == FILE_OVERWRITE_IF))) {
1271 if (!open_match_attributes(conn, fname,
1272 existing_dos_attributes,
1273 new_dos_attributes, psbuf->st_mode,
1274 unx_mode, &new_unx_mode)) {
1275 DEBUG(5,("open_file_ntcreate: attributes missmatch "
1276 "for file %s (%x %x) (0%o, 0%o)\n",
1277 fname, existing_dos_attributes,
1279 (unsigned int)psbuf->st_mode,
1280 (unsigned int)unx_mode ));
1286 /* This is a nasty hack - must fix... JRA. */
1287 if (access_mask == MAXIMUM_ALLOWED_ACCESS) {
1288 access_mask = FILE_GENERIC_ALL;
1292 * Convert GENERIC bits to specific bits.
1295 se_map_generic(&access_mask, &file_generic_mapping);
1297 DEBUG(10, ("open_file_ntcreate: fname=%s, after mapping "
1298 "access_mask=0x%x\n", fname, access_mask ));
1301 * Note that we ignore the append flag as append does not
1302 * mean the same thing under DOS and Unix.
1305 if (access_mask & (FILE_WRITE_DATA | FILE_APPEND_DATA)) {
1312 * Currently we only look at FILE_WRITE_THROUGH for create options.
1316 if ((create_options & FILE_WRITE_THROUGH) && lp_strict_sync(SNUM(conn))) {
1321 if (!CAN_WRITE(conn)) {
1323 * We should really return a permission denied error if either
1324 * O_CREAT or O_TRUNC are set, but for compatibility with
1325 * older versions of Samba we just AND them out.
1327 flags2 &= ~(O_CREAT|O_TRUNC);
1331 * Ensure we can't write on a read-only share or file.
1334 if (flags != O_RDONLY && file_existed &&
1335 (!CAN_WRITE(conn) || IS_DOS_READONLY(existing_dos_attributes))) {
1336 DEBUG(5,("open_file_ntcreate: write access requested for "
1337 "file %s on read only %s\n",
1338 fname, !CAN_WRITE(conn) ? "share" : "file" ));
1339 set_saved_ntstatus(NT_STATUS_ACCESS_DENIED);
1344 fsp = file_new(conn);
1349 fsp->dev = psbuf->st_dev;
1350 fsp->inode = psbuf->st_ino;
1351 fsp->share_access = share_access;
1352 fsp->fh->private_options = create_options;
1353 fsp->access_mask = access_mask;
1354 /* Ensure no SAMBA_PRIVATE bits can be set. */
1355 fsp->oplock_type = (oplock_request & ~SAMBA_PRIVATE_OPLOCK_MASK);
1357 if (timeval_is_zero(&request_time)) {
1358 request_time = fsp->open_time;
1362 dev = psbuf->st_dev;
1363 inode = psbuf->st_ino;
1365 lck = get_share_mode_lock(NULL, dev, inode,
1371 DEBUG(0, ("Could not get share mode lock\n"));
1372 set_saved_ntstatus(NT_STATUS_SHARING_VIOLATION);
1376 /* First pass - send break only on batch oplocks. */
1377 if (delay_for_oplocks(lck, fsp, 1, oplock_request)) {
1378 schedule_defer_open(lck, request_time);
1384 status = open_mode_check(conn, fname, lck,
1385 access_mask, share_access,
1386 create_options, &file_existed);
1388 if (NT_STATUS_IS_OK(status)) {
1389 /* We might be going to allow this open. Check oplock status again. */
1390 /* Second pass - send break for both batch or exclusive oplocks. */
1391 if (delay_for_oplocks(lck, fsp, 2, oplock_request)) {
1392 schedule_defer_open(lck, request_time);
1399 if (NT_STATUS_EQUAL(status, NT_STATUS_DELETE_PENDING)) {
1400 /* DELETE_PENDING is not deferred for a second */
1401 set_saved_ntstatus(status);
1407 if (!NT_STATUS_IS_OK(status)) {
1409 SMB_ASSERT(NT_STATUS_EQUAL(status, NT_STATUS_SHARING_VIOLATION));
1411 /* Check if this can be done with the deny_dos and fcb
1413 if (create_options &
1414 (NTCREATEX_OPTIONS_PRIVATE_DENY_DOS|
1415 NTCREATEX_OPTIONS_PRIVATE_DENY_FCB)) {
1416 files_struct *fsp_dup;
1417 fsp_dup = fcb_or_dos_open(conn, fname, dev,
1426 *pinfo = FILE_WAS_OPENED;
1428 conn->num_files_open++;
1434 * This next line is a subtlety we need for
1435 * MS-Access. If a file open will fail due to share
1436 * permissions and also for security (access) reasons,
1437 * we need to return the access failed error, not the
1438 * share error. This means we must attempt to open the
1439 * file anyway in order to get the UNIX access error -
1440 * even if we're going to fail the open for share
1441 * reasons. This is bad, as we're burning another fd
1442 * if there are existing locks but there's nothing
1443 * else we can do. We also ensure we're not going to
1444 * create or tuncate the file as we only want an
1445 * access decision at this stage. JRA.
1448 fsp_open = open_file(fsp,conn,fname,psbuf,
1449 flags|(flags2&~(O_TRUNC|O_CREAT)),
1450 unx_mode,access_mask);
1452 DEBUG(4,("open_file_ntcreate : share_mode deny - "
1453 "calling open_file with flags=0x%X "
1454 "flags2=0x%X mode=0%o returned %d\n",
1455 flags, (flags2&~(O_TRUNC|O_CREAT)),
1456 (unsigned int)unx_mode, (int)fsp_open ));
1458 if (!fsp_open && errno) {
1459 /* Default error. */
1460 set_saved_ntstatus(NT_STATUS_ACCESS_DENIED);
1464 * If we're returning a share violation, ensure we
1465 * cope with the braindead 1 second delay.
1468 if (!(oplock_request & INTERNAL_OPEN_ONLY) &&
1469 lp_defer_sharing_violations()) {
1470 struct timeval timeout;
1471 struct deferred_open_record state;
1474 /* this is a hack to speed up torture tests
1476 timeout_usecs = lp_parm_int(conn->service,
1477 "smbd","sharedelay",
1478 SHARING_VIOLATION_USEC_WAIT);
1480 /* This is a relative time, added to the absolute
1481 request_time value to get the absolute timeout time.
1482 Note that if this is the second or greater time we enter
1483 this codepath for this particular request mid then
1484 request_time is left as the absolute time of the *first*
1485 time this request mid was processed. This is what allows
1486 the request to eventually time out. */
1488 timeout = timeval_set(0, timeout_usecs);
1490 /* Nothing actually uses state.delayed_for_oplocks
1491 but it's handy to differentiate in debug messages
1492 between a 30 second delay due to oplock break, and
1493 a 1 second delay for share mode conflicts. */
1495 state.delayed_for_oplocks = False;
1497 state.inode = inode;
1499 if (!request_timed_out(request_time,
1501 defer_open(lck, request_time, timeout,
1508 fd_close(conn, fsp);
1510 * We have detected a sharing violation here
1511 * so return the correct error code
1513 set_saved_ntstatus(NT_STATUS_SHARING_VIOLATION);
1520 * We exit this block with the share entry *locked*.....
1524 SMB_ASSERT(!file_existed || (lck != NULL));
1527 * Ensure we pay attention to default ACLs on directories if required.
1530 if ((flags2 & O_CREAT) && lp_inherit_acls(SNUM(conn)) &&
1531 (def_acl = directory_has_default_acl(conn,
1532 parent_dirname(fname)))) {
1536 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
1537 (unsigned int)flags, (unsigned int)flags2,
1538 (unsigned int)unx_mode));
1541 * open_file strips any O_TRUNC flags itself.
1544 fsp_open = open_file(fsp,conn,fname,psbuf,flags|flags2,unx_mode,
1555 if (!file_existed) {
1558 * Deal with the race condition where two smbd's detect the
1559 * file doesn't exist and do the create at the same time. One
1560 * of them will win and set a share mode, the other (ie. this
1561 * one) should check if the requested share mode for this
1562 * create is allowed.
1566 * Now the file exists and fsp is successfully opened,
1567 * fsp->dev and fsp->inode are valid and should replace the
1568 * dev=0,inode=0 from a non existent file. Spotted by
1569 * Nadav Danieli <nadavd@exanet.com>. JRA.
1575 lck = get_share_mode_lock(NULL, dev, inode,
1580 DEBUG(0, ("open_file_ntcreate: Could not get share mode lock for %s\n", fname));
1581 fd_close(conn, fsp);
1583 set_saved_ntstatus(NT_STATUS_SHARING_VIOLATION);
1587 status = open_mode_check(conn, fname, lck,
1588 access_mask, share_access,
1589 create_options, &file_existed);
1591 if (!NT_STATUS_IS_OK(status)) {
1592 struct deferred_open_record state;
1594 fd_close(conn, fsp);
1597 state.delayed_for_oplocks = False;
1599 state.inode = inode;
1601 /* Do it all over again immediately. In the second
1602 * round we will find that the file existed and handle
1603 * the DELETE_PENDING and FCB cases correctly. No need
1604 * to duplicate the code here. Essentially this is a
1605 * "goto top of this function", but don't tell
1608 defer_open(lck, request_time, timeval_zero(),
1615 * We exit this block with the share entry *locked*.....
1619 SMB_ASSERT(lck != NULL);
1621 /* note that we ignore failure for the following. It is
1622 basically a hack for NFS, and NFS will never set one of
1623 these only read them. Nobody but Samba can ever set a deny
1624 mode and we have already checked our more authoritative
1625 locking database for permission to set this deny mode. If
1626 the kernel refuses the operations then the kernel is wrong */
1628 kernel_flock(fsp, share_access);
1631 * At this point onwards, we can guarentee that the share entry
1632 * is locked, whether we created the file or not, and that the
1633 * deny mode is compatible with all current opens.
1637 * If requested, truncate the file.
1640 if (flags2&O_TRUNC) {
1642 * We are modifing the file after open - update the stat
1645 if ((SMB_VFS_FTRUNCATE(fsp,fsp->fh->fd,0) == -1) ||
1646 (SMB_VFS_FSTAT(fsp,fsp->fh->fd,psbuf)==-1)) {
1654 /* Record the options we were opened with. */
1655 fsp->share_access = share_access;
1656 fsp->fh->private_options = create_options;
1657 fsp->access_mask = access_mask;
1660 if (!(flags2 & O_TRUNC)) {
1661 info = FILE_WAS_OPENED;
1663 info = FILE_WAS_OVERWRITTEN;
1666 info = FILE_WAS_CREATED;
1667 /* Change the owner if required. */
1668 if (lp_inherit_owner(SNUM(conn))) {
1669 change_owner_to_parent(conn, fsp, fsp->fsp_name,
1679 * Setup the oplock info in both the shared memory and
1683 if ((fsp->oplock_type != NO_OPLOCK) &&
1684 (fsp->oplock_type != FAKE_LEVEL_II_OPLOCK)) {
1685 if (!set_file_oplock(fsp, fsp->oplock_type)) {
1686 /* Could not get the kernel oplock */
1687 fsp->oplock_type = NO_OPLOCK;
1690 set_share_mode(lck, fsp, 0, fsp->oplock_type);
1692 if (info == FILE_WAS_OVERWRITTEN || info == FILE_WAS_CREATED ||
1693 info == FILE_WAS_SUPERSEDED) {
1695 /* Handle strange delete on close create semantics. */
1696 if (create_options & FILE_DELETE_ON_CLOSE) {
1697 NTSTATUS result = can_set_delete_on_close(fsp, True, new_dos_attributes);
1699 if (!NT_STATUS_IS_OK(result)) {
1700 /* Remember to delete the mode we just added. */
1701 del_share_mode(lck, fsp);
1705 set_saved_ntstatus(result);
1708 /* Note that here we set the *inital* delete on close flag,
1709 not the regular one. */
1710 set_delete_on_close_token(lck, ¤t_user.ut);
1711 lck->initial_delete_on_close = True;
1712 lck->modified = True;
1715 /* Files should be initially set as archive */
1716 if (lp_map_archive(SNUM(conn)) ||
1717 lp_store_dos_attributes(SNUM(conn))) {
1718 file_set_dosmode(conn, fname,
1719 new_dos_attributes | aARCH, NULL,
1725 * Take care of inherited ACLs on created files - if default ACL not
1729 if (!file_existed && !def_acl) {
1731 int saved_errno = errno; /* We might get ENOSYS in the next
1734 if (SMB_VFS_FCHMOD_ACL(fsp, fsp->fh->fd, unx_mode) == -1
1735 && errno == ENOSYS) {
1736 errno = saved_errno; /* Ignore ENOSYS */
1739 } else if (new_unx_mode) {
1743 /* Attributes need changing. File already existed. */
1746 int saved_errno = errno; /* We might get ENOSYS in the
1748 ret = SMB_VFS_FCHMOD_ACL(fsp, fsp->fh->fd,
1751 if (ret == -1 && errno == ENOSYS) {
1752 errno = saved_errno; /* Ignore ENOSYS */
1754 DEBUG(5, ("open_file_ntcreate: reset "
1755 "attributes of file %s to 0%o\n",
1756 fname, (unsigned int)new_unx_mode));
1757 ret = 0; /* Don't do the fchmod below. */
1762 (SMB_VFS_FCHMOD(fsp, fsp->fh->fd, new_unx_mode) == -1))
1763 DEBUG(5, ("open_file_ntcreate: failed to reset "
1764 "attributes of file %s to 0%o\n",
1765 fname, (unsigned int)new_unx_mode));
1768 /* If this is a successful open, we must remove any deferred open
1770 del_deferred_open_entry(lck, mid);
1773 conn->num_files_open++;
1778 /****************************************************************************
1779 Open a file for for write to ensure that we can fchmod it.
1780 ****************************************************************************/
1782 files_struct *open_file_fchmod(connection_struct *conn, const char *fname,
1783 SMB_STRUCT_STAT *psbuf)
1785 files_struct *fsp = NULL;
1788 if (!VALID_STAT(*psbuf)) {
1792 fsp = file_new(conn);
1797 /* note! we must use a non-zero desired access or we don't get
1798 a real file descriptor. Oh what a twisted web we weave. */
1799 fsp_open = open_file(fsp,conn,fname,psbuf,O_WRONLY,0,FILE_WRITE_DATA);
1802 * This is not a user visible file open.
1803 * Don't set a share mode and don't increment
1804 * the conn->num_files_open.
1815 /****************************************************************************
1816 Close the fchmod file fd - ensure no locks are lost.
1817 ****************************************************************************/
1819 int close_file_fchmod(files_struct *fsp)
1821 int ret = fd_close(fsp->conn, fsp);
1826 /****************************************************************************
1827 Open a directory from an NT SMB call.
1828 ****************************************************************************/
1830 files_struct *open_directory(connection_struct *conn,
1832 SMB_STRUCT_STAT *psbuf,
1834 uint32 share_access,
1835 uint32 create_disposition,
1836 uint32 create_options,
1839 files_struct *fsp = NULL;
1840 BOOL dir_existed = VALID_STAT(*psbuf) ? True : False;
1841 BOOL create_dir = False;
1842 struct share_mode_lock *lck = NULL;
1846 DEBUG(5,("open_directory: opening directory %s, access_mask = 0x%x, "
1847 "share_access = 0x%x create_options = 0x%x, "
1848 "create_disposition = 0x%x\n",
1850 (unsigned int)access_mask,
1851 (unsigned int)share_access,
1852 (unsigned int)create_options,
1853 (unsigned int)create_disposition));
1855 if (is_ntfs_stream_name(fname)) {
1856 DEBUG(0,("open_directory: %s is a stream name!\n", fname ));
1857 set_saved_ntstatus(NT_STATUS_NOT_A_DIRECTORY);
1861 switch( create_disposition ) {
1863 /* If directory exists open. If directory doesn't
1866 DEBUG(5,("open_directory: FILE_OPEN requested "
1867 "for directory %s and it doesn't "
1868 "exist.\n", fname ));
1869 set_saved_ntstatus(NT_STATUS_OBJECT_NAME_NOT_FOUND);
1872 info = FILE_WAS_OPENED;
1876 /* If directory exists error. If directory doesn't
1879 DEBUG(5,("open_directory: FILE_CREATE "
1880 "requested for directory %s and it "
1881 "already exists.\n", fname ));
1882 set_saved_error_triple(ERRDOS, ERRfilexists,
1883 NT_STATUS_OBJECT_NAME_COLLISION);
1887 info = FILE_WAS_CREATED;
1891 /* If directory exists open. If directory doesn't
1895 info = FILE_WAS_CREATED;
1897 info = FILE_WAS_OPENED;
1901 case FILE_SUPERSEDE:
1902 case FILE_OVERWRITE:
1903 case FILE_OVERWRITE_IF:
1905 DEBUG(5,("open_directory: invalid create_disposition "
1906 "0x%x for directory %s\n",
1907 (unsigned int)create_disposition, fname));
1909 set_saved_ntstatus(NT_STATUS_INVALID_PARAMETER);
1915 * Try and create the directory.
1918 /* We know bad_path is false as it's caught earlier. */
1920 status = mkdir_internal(conn, fname, False);
1922 if (!NT_STATUS_IS_OK(status)) {
1923 DEBUG(2,("open_directory: unable to create %s. "
1924 "Error was %s\n", fname, strerror(errno) ));
1925 /* Ensure we return the correct NT status to the
1927 set_saved_error_triple(0, 0, status);
1931 /* Ensure we're checking for a symlink here.... */
1932 /* We don't want to get caught by a symlink racer. */
1934 if(SMB_VFS_LSTAT(conn,fname, psbuf) != 0) {
1938 if(!S_ISDIR(psbuf->st_mode)) {
1939 DEBUG(0,("open_directory: %s is not a directory !\n",
1945 fsp = file_new(conn);
1951 * Setup the files_struct for it.
1954 fsp->mode = psbuf->st_mode;
1955 fsp->inode = psbuf->st_ino;
1956 fsp->dev = psbuf->st_dev;
1957 fsp->vuid = current_user.vuid;
1958 fsp->file_pid = global_smbpid;
1959 fsp->can_lock = True;
1960 fsp->can_read = False;
1961 fsp->can_write = False;
1963 fsp->share_access = share_access;
1964 fsp->fh->private_options = create_options;
1965 fsp->access_mask = access_mask;
1967 fsp->print_file = False;
1968 fsp->modified = False;
1969 fsp->oplock_type = NO_OPLOCK;
1970 fsp->sent_oplock_break = NO_BREAK_SENT;
1971 fsp->is_directory = True;
1972 fsp->is_stat = False;
1973 string_set(&fsp->fsp_name,fname);
1975 lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode,
1980 DEBUG(0, ("open_directory: Could not get share mode lock for %s\n", fname));
1982 set_saved_ntstatus(NT_STATUS_SHARING_VIOLATION);
1986 status = open_mode_check(conn, fname, lck,
1987 access_mask, share_access,
1988 create_options, &dir_existed);
1990 if (!NT_STATUS_IS_OK(status)) {
1991 set_saved_ntstatus(status);
1997 set_share_mode(lck, fsp, 0, NO_OPLOCK);
1999 /* For directories the delete on close bit at open time seems
2000 always to be honored on close... See test 19 in Samba4 BASE-DELETE. */
2001 if (create_options & FILE_DELETE_ON_CLOSE) {
2002 status = can_set_delete_on_close(fsp, True, 0);
2003 if (!NT_STATUS_IS_OK(status)) {
2004 set_saved_ntstatus(status);
2010 set_delete_on_close_token(lck, ¤t_user.ut);
2011 lck->initial_delete_on_close = True;
2012 lck->modified = True;
2017 /* Change the owner if required. */
2018 if ((info == FILE_WAS_CREATED) && lp_inherit_owner(SNUM(conn))) {
2019 change_owner_to_parent(conn, fsp, fsp->fsp_name, psbuf);
2026 conn->num_files_open++;
2031 /****************************************************************************
2032 Open a pseudo-file (no locking checks - a 'stat' open).
2033 ****************************************************************************/
2035 files_struct *open_file_stat(connection_struct *conn, char *fname,
2036 SMB_STRUCT_STAT *psbuf)
2038 files_struct *fsp = NULL;
2040 if (!VALID_STAT(*psbuf))
2043 /* Can't 'stat' open directories. */
2044 if(S_ISDIR(psbuf->st_mode))
2047 fsp = file_new(conn);
2051 DEBUG(5,("open_file_stat: 'opening' file %s\n", fname));
2054 * Setup the files_struct for it.
2057 fsp->mode = psbuf->st_mode;
2058 fsp->inode = psbuf->st_ino;
2059 fsp->dev = psbuf->st_dev;
2060 fsp->vuid = current_user.vuid;
2061 fsp->file_pid = global_smbpid;
2062 fsp->can_lock = False;
2063 fsp->can_read = False;
2064 fsp->can_write = False;
2065 fsp->print_file = False;
2066 fsp->modified = False;
2067 fsp->oplock_type = NO_OPLOCK;
2068 fsp->sent_oplock_break = NO_BREAK_SENT;
2069 fsp->is_directory = False;
2070 fsp->is_stat = True;
2071 string_set(&fsp->fsp_name,fname);
2073 conn->num_files_open++;
2078 /****************************************************************************
2079 Receive notification that one of our open files has been renamed by another
2081 ****************************************************************************/
2083 void msg_file_was_renamed(int msg_type, struct process_id src, void *buf, size_t len)
2086 char *frm = (char *)buf;
2089 const char *sharepath;
2090 const char *newname;
2093 if (buf == NULL || len < MSG_FILE_RENAMED_MIN_SIZE + 2) {
2094 DEBUG(0, ("msg_file_was_renamed: Got invalid msg len %d\n", (int)len));
2098 /* Unpack the message. */
2099 dev = DEV_T_VAL(frm,0);
2100 inode = INO_T_VAL(frm,8);
2101 sharepath = &frm[16];
2102 newname = sharepath + strlen(sharepath) + 1;
2103 sp_len = strlen(sharepath);
2105 DEBUG(10,("msg_file_was_renamed: Got rename message for sharepath %s, new name %s, "
2106 "dev %x, inode %.0f\n",
2107 sharepath, newname, (unsigned int)dev, (double)inode ));
2109 for(fsp = file_find_di_first(dev, inode); fsp; fsp = file_find_di_next(fsp)) {
2110 if (memcmp(fsp->conn->connectpath, sharepath, sp_len) == 0) {
2111 DEBUG(10,("msg_file_was_renamed: renaming file fnum %d from %s -> %s\n",
2112 fsp->fnum, fsp->fsp_name, newname ));
2113 string_set(&fsp->fsp_name, newname);
2116 /* Now we have the complete path we can work out if this is
2117 actually within this share and adjust newname accordingly. */
2118 DEBUG(10,("msg_file_was_renamed: share mismatch (sharepath %s "
2119 "not sharepath %s) "
2120 "fnum %d from %s -> %s\n",
2121 fsp->conn->connectpath,