2 Unix SMB/Netbios implementation.
4 file opening and share modes
5 Copyright (C) Andrew Tridgell 1992-1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 extern int DEBUGLEVEL;
26 extern userdom_struct current_user_info;
27 extern uint16 global_oplock_port;
28 extern BOOL global_client_failed_oplock_break;
30 /****************************************************************************
31 fd support routines - attempt to do a dos_open.
32 ****************************************************************************/
34 static int fd_open(struct connection_struct *conn, char *fname,
35 int flags, mode_t mode)
42 fd = conn->vfs_ops.open(conn,dos_to_unix(fname,False),flags,mode);
44 /* Fix for files ending in '.' */
45 if((fd == -1) && (errno == ENOENT) &&
46 (strchr(fname,'.')==NULL)) {
48 fd = conn->vfs_ops.open(conn,dos_to_unix(fname,False),flags,mode);
51 DEBUG(10,("fd_open: name %s, mode = %d, fd = %d. %s\n", fname, (int)mode, fd,
52 (fd == -1) ? strerror(errno) : "" ));
57 /****************************************************************************
58 Close the file associated with a fsp.
59 ****************************************************************************/
61 int fd_close(struct connection_struct *conn, files_struct *fsp)
63 return fd_close_posix(conn, fsp);
67 /****************************************************************************
68 Check a filename for the pipe string.
69 ****************************************************************************/
71 static void check_for_pipe(char *fname)
73 /* special case of pipe opens */
75 StrnCpy(s,fname,sizeof(s)-1);
77 if (strstr(s,"pipe/")) {
78 DEBUG(3,("Rejecting named pipe open for %s\n",fname));
79 unix_ERR_class = ERRSRV;
80 unix_ERR_code = ERRaccess;
84 /****************************************************************************
86 ****************************************************************************/
88 static BOOL open_file(files_struct *fsp,connection_struct *conn,
89 char *fname1,SMB_STRUCT_STAT *psbuf,int flags,mode_t mode)
91 extern struct current_user current_user;
93 int accmode = (flags & O_ACCMODE);
96 fsp->oplock_type = NO_OPLOCK;
99 pstrcpy(fname,fname1);
101 /* Check permissions */
104 * This code was changed after seeing a client open request
105 * containing the open mode of (DENY_WRITE/read-only) with
106 * the 'create if not exist' bit set. The previous code
107 * would fail to open the file read only on a read-only share
108 * as it was checking the flags parameter directly against O_RDONLY,
109 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
113 if (!CAN_WRITE(conn)) {
114 /* It's a read-only share - fail if we wanted to write. */
115 if(accmode != O_RDONLY) {
116 DEBUG(3,("Permission denied opening %s\n",fname));
117 check_for_pipe(fname);
119 } else if(flags & O_CREAT) {
120 /* We don't want to write - but we must make sure that O_CREAT
121 doesn't create the file if we have write access into the
128 /* actually do the open */
129 fsp->fd = fd_open(conn, fname, flags, mode);
132 DEBUG(3,("Error opening file %s (%s) (flags=%d)\n",
133 fname,strerror(errno),flags));
134 check_for_pipe(fname);
138 if (!VALID_STAT(*psbuf)) {
139 if (vfs_fstat(fsp,fsp->fd,psbuf) == -1) {
140 DEBUG(0,("Error doing fstat on open file %s (%s)\n", fname,strerror(errno) ));
147 * POSIX allows read-only opens of directories. We don't
148 * want to do this (we use a different code path for this)
149 * so catch a directory open and return an EISDIR. JRA.
152 if(S_ISDIR(psbuf->st_mode)) {
158 fsp->mode = psbuf->st_mode;
159 fsp->inode = psbuf->st_ino;
160 fsp->dev = psbuf->st_dev;
161 GetTimeOfDay(&fsp->open_time);
162 fsp->vuid = current_user.vuid;
163 fsp->size = psbuf->st_size;
165 fsp->can_lock = True;
166 fsp->can_read = ((flags & O_WRONLY)==0);
167 fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
169 fsp->print_file = False;
170 fsp->modified = False;
171 fsp->oplock_type = NO_OPLOCK;
172 fsp->sent_oplock_break = NO_BREAK_SENT;
173 fsp->is_directory = False;
174 fsp->stat_open = False;
175 fsp->directory_delete_on_close = False;
178 * Note that the file name here is the *untranslated* name
179 * ie. it is still in the DOS codepage sent from the client.
180 * All use of this filename will pass though the sys_xxxx
181 * functions which will do the dos_to_unix translation before
182 * mapping into a UNIX filename. JRA.
184 string_set(&fsp->fsp_name,fname);
185 fsp->wbmpx_ptr = NULL;
186 fsp->wcp = NULL; /* Write cache pointer. */
188 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
189 *current_user_info.smb_name ? current_user_info.smb_name : conn->user,fsp->fsp_name,
190 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
191 conn->num_files_open + 1));
194 * Take care of inherited ACLs on created files. JRA.
197 if ((flags & O_CREAT) && (conn->vfs_ops.fchmod_acl != NULL))
198 conn->vfs_ops.fchmod_acl(fsp, fsp->fd, mode);
203 /****************************************************************************
205 Helper for open_file_shared.
206 Truncate a file after checking locking; close file if locked.
207 **************************************************************************/
209 static int truncate_unless_locked(struct connection_struct *conn, files_struct *fsp)
211 SMB_BIG_UINT mask = (SMB_BIG_UINT)-1;
216 if (is_locked(fsp,fsp->conn,mask,0,WRITE_LOCK)){
218 unix_ERR_class = ERRDOS;
219 unix_ERR_code = ERRlock;
222 return conn->vfs_ops.ftruncate(fsp,fsp->fd,0);
226 /*******************************************************************
227 return True if the filename is one of the special executable types
228 ********************************************************************/
229 static BOOL is_executable(const char *fname)
231 if ((fname = strrchr(fname,'.'))) {
232 if (strequal(fname,".com") ||
233 strequal(fname,".dll") ||
234 strequal(fname,".exe") ||
235 strequal(fname,".sym")) {
242 enum {AFAIL,AREAD,AWRITE,AALL};
244 /*******************************************************************
245 reproduce the share mode access table
246 this is horrendoously complex, and really can't be justified on any
247 rational grounds except that this is _exactly_ what NT does. See
248 the DENY1 and DENY2 tests in smbtorture for a comprehensive set of
250 ********************************************************************/
251 static int access_table(int new_deny,int old_deny,int old_mode,
252 BOOL same_pid, BOOL isexe)
254 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
257 if (isexe && old_mode == DOS_OPEN_RDONLY &&
258 old_deny == DENY_DOS && new_deny == DENY_READ) {
261 if (!isexe && old_mode == DOS_OPEN_RDONLY &&
262 old_deny == DENY_DOS && new_deny == DENY_DOS) {
265 if (new_deny == DENY_FCB && old_deny == DENY_DOS) {
266 if (isexe) return AFAIL;
267 if (old_mode == DOS_OPEN_RDONLY) return AFAIL;
270 if (old_mode == DOS_OPEN_RDONLY && old_deny == DENY_DOS) {
271 if (new_deny == DENY_FCB || new_deny == DENY_READ) {
272 if (isexe) return AREAD;
276 if (old_deny == DENY_FCB) {
277 if (new_deny == DENY_DOS || new_deny == DENY_FCB) return AALL;
282 if (old_deny == DENY_DOS || new_deny == DENY_DOS ||
283 old_deny == DENY_FCB || new_deny == DENY_FCB) {
285 if (old_deny == DENY_FCB || new_deny == DENY_FCB) {
288 if (old_deny == DENY_DOS) {
289 if (new_deny == DENY_READ &&
290 (old_mode == DOS_OPEN_RDONLY ||
291 old_mode == DOS_OPEN_RDWR)) {
294 if (new_deny == DENY_WRITE &&
295 (old_mode == DOS_OPEN_WRONLY ||
296 old_mode == DOS_OPEN_RDWR)) {
301 if (old_deny == DENY_NONE) return AALL;
302 if (old_deny == DENY_READ) return AWRITE;
303 if (old_deny == DENY_WRITE) return AREAD;
305 /* it isn't a exe, dll, sym or com file */
306 if (old_deny == new_deny && same_pid)
309 if (old_deny == DENY_READ || new_deny == DENY_READ) return AFAIL;
310 if (old_mode == DOS_OPEN_RDONLY) return(AREAD);
318 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_RDONLY) return(AREAD);
319 if (old_deny==DENY_READ && old_mode==DOS_OPEN_RDONLY) return(AWRITE);
320 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_RDONLY) return(AALL);
323 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_WRONLY) return(AREAD);
324 if (old_deny==DENY_READ && old_mode==DOS_OPEN_WRONLY) return(AWRITE);
325 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_WRONLY) return(AALL);
328 if (old_deny==DENY_WRITE) return(AREAD);
329 if (old_deny==DENY_READ) return(AWRITE);
330 if (old_deny==DENY_NONE) return(AALL);
337 /****************************************************************************
338 check if we can open a file with a share mode
339 ****************************************************************************/
341 static int check_share_mode( share_mode_entry *share, int deny_mode,
342 const char *fname, BOOL fcbopen, int *flags)
344 int old_open_mode = GET_OPEN_MODE(share->share_mode);
345 int old_deny_mode = GET_DENY_MODE(share->share_mode);
348 * Don't allow any open once the delete on close flag has been
352 if(GET_DELETE_ON_CLOSE_FLAG(share->share_mode)) {
353 DEBUG(5,("check_share_mode: Failing open on file %s as delete on close flag is set.\n",
355 unix_ERR_class = ERRDOS;
356 unix_ERR_code = ERRnoaccess;
361 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
362 (share->pid == sys_getpid()),is_executable(fname));
364 if ((access_allowed == AFAIL) ||
365 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
366 (access_allowed == AREAD && *flags != O_RDONLY) ||
367 (access_allowed == AWRITE && *flags != O_WRONLY)) {
369 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s,fcbopen = %d, flags = %d) = %d\n",
370 deny_mode,old_deny_mode,old_open_mode,
371 (int)share->pid,fname, fcbopen, *flags, access_allowed));
373 unix_ERR_class = ERRDOS;
374 unix_ERR_code = ERRbadshare;
379 if (access_allowed == AREAD)
382 if (access_allowed == AWRITE)
390 /****************************************************************************
391 Deal with open deny mode and oplock break processing.
392 Invarient: Share mode must be locked on entry and exit.
393 Returns -1 on error, or number of share modes on success (may be zero).
394 ****************************************************************************/
396 static int open_mode_check(connection_struct *conn, const char *fname, SMB_DEV_T dev,
397 SMB_INO_T inode, int share_mode, int *p_flags, int *p_oplock_request,
398 BOOL *p_all_current_opens_are_level_II)
402 int oplock_contention_count = 0;
403 share_mode_entry *old_shares = 0;
404 BOOL fcbopen = False;
405 int deny_mode = GET_DENY_MODE(share_mode);
408 if(GET_OPEN_MODE(share_mode) == DOS_OPEN_FCB)
411 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
413 if(num_share_modes == 0)
417 * Check if the share modes will give us access.
422 broke_oplock = False;
423 *p_all_current_opens_are_level_II = True;
425 for(i = 0; i < num_share_modes; i++) {
426 share_mode_entry *share_entry = &old_shares[i];
429 * By observation of NetBench, oplocks are broken *before* share
430 * modes are checked. This allows a file to be closed by the client
431 * if the share mode would deny access and the client has an oplock.
432 * Check if someone has an oplock on this file. If so we must break
433 * it before continuing.
436 if((*p_oplock_request && EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) ||
437 (!*p_oplock_request && (share_entry->op_type != NO_OPLOCK))) {
441 DEBUG(5,("open_mode_check: breaking oplock (%x) on file %s, \
442 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
444 /* Oplock break - unlock to request it. */
445 unlock_share_entry(conn, dev, inode);
447 opb_ret = request_oplock_break(share_entry, dev, inode);
450 lock_share_entry(conn, dev, inode);
452 if(opb_ret == False) {
453 free((char *)old_shares);
454 DEBUG(0,("open_mode_check: FAILED when breaking oplock (%x) on file %s, \
455 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
457 unix_ERR_class = ERRDOS;
458 unix_ERR_code = ERRbadshare;
463 *p_all_current_opens_are_level_II = False;
466 } else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
467 *p_all_current_opens_are_level_II = False;
470 /* someone else has a share lock on it, check to see
473 if(check_share_mode(share_entry, deny_mode, fname, fcbopen, p_flags) == False) {
474 free((char *)old_shares);
482 free((char *)old_shares);
483 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
484 oplock_contention_count++;
486 } while(broke_oplock);
489 free((char *)old_shares);
492 * Refuse to grant an oplock in case the contention limit is
493 * reached when going through the lock list multiple times.
496 if(oplock_contention_count >= lp_oplock_contention_limit(SNUM(conn))) {
497 *p_oplock_request = 0;
498 DEBUG(4,("open_mode_check: oplock contention = %d. Not granting oplock.\n",
499 oplock_contention_count ));
502 return num_share_modes;
505 /****************************************************************************
506 set a kernel flock on a file for NFS interoperability
507 this requires a patch to Linux
508 ****************************************************************************/
509 static void kernel_flock(files_struct *fsp, int deny_mode)
511 #if HAVE_KERNEL_SHARE_MODES
513 if (deny_mode == DENY_READ) kernel_mode = LOCK_MAND|LOCK_WRITE;
514 else if (deny_mode == DENY_WRITE) kernel_mode = LOCK_MAND|LOCK_READ;
515 else if (deny_mode == DENY_ALL) kernel_mode = LOCK_MAND;
516 if (kernel_mode) flock(fsp->fd, kernel_mode);
521 /****************************************************************************
522 Open a file with a share mode. On output from this open we are guarenteeing
524 ****************************************************************************/
525 files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_STAT *psbuf,
526 int share_mode,int ofun, mode_t mode,int oplock_request, int *Access,int *action)
530 int deny_mode = GET_DENY_MODE(share_mode);
531 BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
532 BOOL file_existed = VALID_STAT(*psbuf);
533 BOOL fcbopen = False;
536 int num_share_modes = 0;
537 BOOL all_current_opens_are_level_II = False;
538 BOOL fsp_open = False;
539 files_struct *fsp = NULL;
544 /* printers are handled completely differently. Most of the passed parameters are
546 *Access = DOS_OPEN_WRONLY;
547 *action = FILE_WAS_CREATED;
548 return print_fsp_open(conn, fname);
556 fsp->conn = conn; /* The vfs_fXXX() macros need this. */
558 DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
559 fname, share_mode, ofun, (int)mode, oplock_request ));
561 if (!check_name(fname,conn)) {
566 /* ignore any oplock requests if oplocks are disabled */
567 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break) {
571 /* this is for OS/2 EAs - try and say we don't support them */
572 if (strstr(fname,".+,;=[].")) {
573 unix_ERR_class = ERRDOS;
574 /* OS/2 Workplace shell fix may be main code stream in a later release. */
575 #if 1 /* OS2_WPS_FIX - Recent versions of OS/2 need this. */
576 unix_ERR_code = ERRcannotopen;
577 #else /* OS2_WPS_FIX */
578 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
579 #endif /* OS2_WPS_FIX */
581 DEBUG(5,("open_file_shared: OS/2 EA's are not supported.\n"));
586 if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed) {
587 DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
594 if (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST)
597 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)
600 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL)
603 /* note that we ignore the append flag as
604 append does not mean the same thing under dos and unix */
606 switch (GET_OPEN_MODE(share_mode)) {
607 case DOS_OPEN_WRONLY:
623 if (GET_FILE_SYNC_OPENMODE(share_mode)) {
628 if (flags != O_RDONLY && file_existed &&
629 (!CAN_WRITE(conn) || IS_DOS_READONLY(dos_mode(conn,fname,psbuf)))) {
631 DEBUG(5,("open_file_shared: read/write access requested for file %s on read only %s\n",
632 fname, !CAN_WRITE(conn) ? "share" : "file" ));
640 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB) {
641 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
650 inode = psbuf->st_ino;
652 lock_share_entry(conn, dev, inode);
654 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
655 &flags, &oplock_request, &all_current_opens_are_level_II);
656 if(num_share_modes == -1) {
659 * This next line is a subtlety we need for MS-Access. If a file open will
660 * fail due to share permissions and also for security (access)
661 * reasons, we need to return the access failed error, not the
662 * share error. This means we must attempt to open the file anyway
663 * in order to get the UNIX access error - even if we're going to
664 * fail the open for share reasons. This is bad, as we're burning
665 * another fd if there are existing locks but there's nothing else
666 * we can do. We also ensure we're not going to create or tuncate
667 * the file as we only want an access decision at this stage. JRA.
669 open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC|O_CREAT)),mode);
671 unlock_share_entry(conn, dev, inode);
677 * We exit this block with the share entry *locked*.....
681 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
682 flags,flags2,(int)mode));
684 fsp_open = open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC)),mode);
686 if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
687 if((fsp_open = open_file(fsp,conn,fname,psbuf,O_RDONLY,mode)) == True)
693 unlock_share_entry(conn, dev, inode);
699 * Deal with the race condition where two smbd's detect the file doesn't
700 * exist and do the create at the same time. One of them will win and
701 * set a share mode, the other (ie. this one) should check if the
702 * requested share mode for this create is allowed.
707 lock_share_entry_fsp(fsp);
709 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
710 &flags, &oplock_request, &all_current_opens_are_level_II);
712 if(num_share_modes == -1) {
713 unlock_share_entry_fsp(fsp);
720 * We exit this block with the share entry *locked*.....
724 /* note that we ignore failure for the following. It is
725 basically a hack for NFS, and NFS will never set one of
726 these only read them. Nobody but Samba can ever set a deny
727 mode and we have already checked our more authoritative
728 locking database for permission to set this deny mode. If
729 the kernel refuses the operations then the kernel is wrong */
730 kernel_flock(fsp, deny_mode);
733 * At this point onwards, we can guarentee that the share entry
734 * is locked, whether we created the file or not, and that the
735 * deny mode is compatible with all current opens.
739 * If requested, truncate the file.
742 if (flags2&O_TRUNC) {
744 * We are modifing the file after open - update the stat struct..
746 if ((truncate_unless_locked(conn,fsp) == -1) || (vfs_fstat(fsp,fsp->fd,psbuf)==-1)) {
747 unlock_share_entry_fsp(fsp);
756 open_mode = DOS_OPEN_RDONLY;
759 open_mode = DOS_OPEN_RDWR;
762 open_mode = DOS_OPEN_WRONLY;
766 fsp->share_mode = SET_DENY_MODE(deny_mode) |
767 SET_OPEN_MODE(open_mode) |
768 SET_ALLOW_SHARE_DELETE(allow_share_delete);
771 (*Access) = open_mode;
774 if (file_existed && !(flags2 & O_TRUNC))
775 *action = FILE_WAS_OPENED;
777 *action = FILE_WAS_CREATED;
778 if (file_existed && (flags2 & O_TRUNC))
779 *action = FILE_WAS_OVERWRITTEN;
783 * Setup the oplock info in both the shared memory and
787 if(oplock_request && (num_share_modes == 0) &&
788 !IS_VETO_OPLOCK_PATH(conn,fname) && set_file_oplock(fsp, oplock_request) ) {
789 port = global_oplock_port;
790 } else if (oplock_request && all_current_opens_are_level_II) {
791 port = global_oplock_port;
792 oplock_request = LEVEL_II_OPLOCK;
793 set_file_oplock(fsp, oplock_request);
799 set_share_mode(fsp, port, oplock_request);
801 unlock_share_entry_fsp(fsp);
803 conn->num_files_open++;
808 /****************************************************************************
809 Open a file for permissions read only. Return a pseudo file entry
810 with the 'stat_open' flag set
811 ****************************************************************************/
813 files_struct *open_file_stat(connection_struct *conn, char *fname,
814 SMB_STRUCT_STAT *psbuf, int smb_ofun, int *action)
816 extern struct current_user current_user;
817 files_struct *fsp = NULL;
819 if (!VALID_STAT(*psbuf)) {
820 DEBUG(0,("open_file_stat: unable to stat name = %s. Error was %s\n", fname, strerror(errno) ));
824 if(S_ISDIR(psbuf->st_mode)) {
825 DEBUG(0,("open_file_stat: %s is a directory !\n", fname ));
833 *action = FILE_WAS_OPENED;
835 DEBUG(5,("open_file_stat: opening file %s as a stat entry\n", fname));
838 * Setup the files_struct for it.
842 fsp->mode = psbuf->st_mode;
843 fsp->inode = psbuf->st_ino;
844 fsp->dev = psbuf->st_dev;
845 GetTimeOfDay(&fsp->open_time);
846 fsp->size = psbuf->st_size;
847 fsp->vuid = current_user.vuid;
849 fsp->can_lock = False;
850 fsp->can_read = False;
851 fsp->can_write = False;
853 fsp->print_file = False;
854 fsp->modified = False;
855 fsp->oplock_type = NO_OPLOCK;
856 fsp->sent_oplock_break = NO_BREAK_SENT;
857 fsp->is_directory = False;
858 fsp->stat_open = True;
859 fsp->directory_delete_on_close = False;
862 * Note that the file name here is the *untranslated* name
863 * ie. it is still in the DOS codepage sent from the client.
864 * All use of this filename will pass though the sys_xxxx
865 * functions which will do the dos_to_unix translation before
866 * mapping into a UNIX filename. JRA.
868 string_set(&fsp->fsp_name,fname);
869 fsp->wbmpx_ptr = NULL;
870 fsp->wcp = NULL; /* Write cache pointer. */
872 conn->num_files_open++;
877 /****************************************************************************
878 Open a directory from an NT SMB call.
879 ****************************************************************************/
881 files_struct *open_directory(connection_struct *conn, char *fname,
882 SMB_STRUCT_STAT *psbuf, int smb_ofun, mode_t unixmode, int *action)
884 extern struct current_user current_user;
885 BOOL got_stat = False;
886 files_struct *fsp = file_new();
891 fsp->conn = conn; /* THe vfs_fXXX() macros need this. */
893 if (VALID_STAT(*psbuf))
896 if (got_stat && (GET_FILE_OPEN_DISPOSITION(smb_ofun) == FILE_EXISTS_FAIL)) {
898 errno = EEXIST; /* Setup so correct error is returned to client. */
902 if (GET_FILE_CREATE_DISPOSITION(smb_ofun) == FILE_CREATE_IF_NOT_EXIST) {
906 if(!S_ISDIR(psbuf->st_mode)) {
907 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
912 *action = FILE_WAS_OPENED;
917 * Try and create the directory.
920 if(!CAN_WRITE(conn)) {
921 DEBUG(2,("open_directory: failing create on read-only share\n"));
927 if(vfs_mkdir(conn,fname, unix_mode(conn,aDIR, fname)) < 0) {
928 DEBUG(0,("open_directory: unable to create %s. Error was %s\n",
929 fname, strerror(errno) ));
934 if(vfs_stat(conn,fname, psbuf) != 0) {
939 *action = FILE_WAS_CREATED;
945 * Don't create - just check that it *was* a directory.
949 DEBUG(0,("open_directory: unable to stat name = %s. Error was %s\n",
950 fname, strerror(errno) ));
955 if(!S_ISDIR(psbuf->st_mode)) {
956 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
961 *action = FILE_WAS_OPENED;
964 DEBUG(5,("open_directory: opening directory %s\n", fname));
967 * Setup the files_struct for it.
971 fsp->mode = psbuf->st_mode;
972 fsp->inode = psbuf->st_ino;
973 fsp->dev = psbuf->st_dev;
974 GetTimeOfDay(&fsp->open_time);
975 fsp->size = psbuf->st_size;
976 fsp->vuid = current_user.vuid;
978 fsp->can_lock = True;
979 fsp->can_read = False;
980 fsp->can_write = False;
982 fsp->print_file = False;
983 fsp->modified = False;
984 fsp->oplock_type = NO_OPLOCK;
985 fsp->sent_oplock_break = NO_BREAK_SENT;
986 fsp->is_directory = True;
987 fsp->directory_delete_on_close = False;
990 * Note that the file name here is the *untranslated* name
991 * ie. it is still in the DOS codepage sent from the client.
992 * All use of this filename will pass though the sys_xxxx
993 * functions which will do the dos_to_unix translation before
994 * mapping into a UNIX filename. JRA.
996 string_set(&fsp->fsp_name,fname);
997 fsp->wbmpx_ptr = NULL;
999 conn->num_files_open++;
1004 /*******************************************************************
1005 Check if the share mode on a file allows it to be deleted or unlinked.
1006 Return True if sharing doesn't prevent the operation.
1007 ********************************************************************/
1009 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
1013 share_mode_entry *old_shares = 0;
1014 int num_share_modes;
1015 SMB_STRUCT_STAT sbuf;
1016 pid_t pid = sys_getpid();
1020 if (vfs_stat(conn,fname,&sbuf) == -1)
1024 inode = sbuf.st_ino;
1026 lock_share_entry(conn, dev, inode);
1027 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1030 * Check if the share modes will give us access.
1033 if(num_share_modes != 0)
1040 broke_oplock = False;
1041 for(i = 0; i < num_share_modes; i++)
1043 share_mode_entry *share_entry = &old_shares[i];
1046 * Break oplocks before checking share modes. See comment in
1047 * open_file_shared for details.
1048 * Check if someone has an oplock on this file. If so we must
1049 * break it before continuing.
1051 if(BATCH_OPLOCK_TYPE(share_entry->op_type))
1056 /* JRA. Try removing this code to see if the new oplock changes
1057 fix the problem. I'm dubious, but Andrew is recommending we
1062 * It appears that the NT redirector may have a bug, in that
1063 * it tries to do an SMBmv on a file that it has open with a
1064 * batch oplock, and then fails to respond to the oplock break
1065 * request. This only seems to occur when the client is doing an
1066 * SMBmv to the smbd it is using - thus we try and detect this
1067 * condition by checking if the file being moved is open and oplocked by
1068 * this smbd process, and then not sending the oplock break in this
1069 * special case. If the file was open with a deny mode that
1070 * prevents the move the SMBmv will fail anyway with a share
1071 * violation error. JRA.
1073 if(rename_op && (share_entry->pid == pid))
1076 DEBUG(0,("check_file_sharing: NT redirector workaround - rename attempted on \
1077 batch oplocked file %s, dev = %x, inode = %.0f\n", fname, (unsigned int)dev, (double)inode));
1080 * This next line is a test that allows the deny-mode
1081 * processing to be skipped. This seems to be needed as
1082 * NT insists on the rename succeeding (in Office 9x no less !).
1083 * This should be removed as soon as (a) MS fix the redirector
1084 * bug or (b) NT SMB support in Samba makes NT not issue the
1085 * call (as is my fervent hope). JRA.
1093 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1094 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
1096 /* Oplock break.... */
1097 unlock_share_entry(conn, dev, inode);
1098 if(request_oplock_break(share_entry, dev, inode) == False)
1100 free((char *)old_shares);
1102 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1103 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
1107 lock_share_entry(conn, dev, inode);
1108 broke_oplock = True;
1114 * If this is a delete request and ALLOW_SHARE_DELETE is set then allow
1115 * this to proceed. This takes precedence over share modes.
1118 if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
1122 * Someone else has a share lock on it, check to see
1126 if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) ||
1127 (share_entry->pid != pid))
1134 free((char *)old_shares);
1135 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1137 } while(broke_oplock);
1140 /* XXXX exactly what share mode combinations should be allowed for
1141 deleting/renaming? */
1143 * If we got here then either there were no share modes or
1144 * all share modes were DENY_DOS and the pid == getpid() or
1145 * delete access was requested and all share modes had the
1146 * ALLOW_SHARE_DELETE bit set (takes precedence over other
1154 unlock_share_entry(conn, dev, inode);
1155 if(old_shares != NULL)
1156 free((char *)old_shares);