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, flags = 0%o mode = 0%o, fd = %d. %s\n", fname,
52 flags, (int)mode, fd, (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)
65 return fd_close_posix(conn, fsp);
69 /****************************************************************************
70 Check a filename for the pipe string.
71 ****************************************************************************/
73 static void check_for_pipe(char *fname)
75 /* special case of pipe opens */
77 StrnCpy(s,fname,sizeof(s)-1);
79 if (strstr(s,"pipe/")) {
80 DEBUG(3,("Rejecting named pipe open for %s\n",fname));
81 unix_ERR_class = ERRSRV;
82 unix_ERR_code = ERRaccess;
86 /****************************************************************************
88 ****************************************************************************/
90 static BOOL open_file(files_struct *fsp,connection_struct *conn,
91 char *fname1,SMB_STRUCT_STAT *psbuf,int flags,mode_t mode)
93 extern struct current_user current_user;
95 int accmode = (flags & O_ACCMODE);
98 fsp->oplock_type = NO_OPLOCK;
101 pstrcpy(fname,fname1);
103 /* Check permissions */
106 * This code was changed after seeing a client open request
107 * containing the open mode of (DENY_WRITE/read-only) with
108 * the 'create if not exist' bit set. The previous code
109 * would fail to open the file read only on a read-only share
110 * as it was checking the flags parameter directly against O_RDONLY,
111 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
115 if (!CAN_WRITE(conn)) {
116 /* It's a read-only share - fail if we wanted to write. */
117 if(accmode != O_RDONLY) {
118 DEBUG(3,("Permission denied opening %s\n",fname));
119 check_for_pipe(fname);
121 } else if(flags & O_CREAT) {
122 /* We don't want to write - but we must make sure that O_CREAT
123 doesn't create the file if we have write access into the
130 /* actually do the open */
131 fsp->fd = fd_open(conn, fname, flags, mode);
134 DEBUG(3,("Error opening file %s (%s) (flags=%d)\n",
135 fname,strerror(errno),flags));
136 check_for_pipe(fname);
140 if (!VALID_STAT(*psbuf)) {
141 if (vfs_fstat(fsp,fsp->fd,psbuf) == -1) {
142 DEBUG(0,("Error doing fstat on open file %s (%s)\n", fname,strerror(errno) ));
149 * POSIX allows read-only opens of directories. We don't
150 * want to do this (we use a different code path for this)
151 * so catch a directory open and return an EISDIR. JRA.
154 if(S_ISDIR(psbuf->st_mode)) {
160 fsp->mode = psbuf->st_mode;
161 fsp->inode = psbuf->st_ino;
162 fsp->dev = psbuf->st_dev;
163 GetTimeOfDay(&fsp->open_time);
164 fsp->vuid = current_user.vuid;
165 fsp->size = psbuf->st_size;
167 fsp->can_lock = True;
168 fsp->can_read = ((flags & O_WRONLY)==0);
169 fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
171 fsp->print_file = False;
172 fsp->modified = False;
173 fsp->oplock_type = NO_OPLOCK;
174 fsp->sent_oplock_break = NO_BREAK_SENT;
175 fsp->is_directory = False;
176 fsp->stat_open = False;
177 fsp->directory_delete_on_close = False;
180 * Note that the file name here is the *untranslated* name
181 * ie. it is still in the DOS codepage sent from the client.
182 * All use of this filename will pass though the sys_xxxx
183 * functions which will do the dos_to_unix translation before
184 * mapping into a UNIX filename. JRA.
186 string_set(&fsp->fsp_name,fname);
187 fsp->wbmpx_ptr = NULL;
188 fsp->wcp = NULL; /* Write cache pointer. */
190 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
191 *current_user_info.smb_name ? current_user_info.smb_name : conn->user,fsp->fsp_name,
192 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
193 conn->num_files_open + 1));
196 * Take care of inherited ACLs on created files. JRA.
199 if ((flags & O_CREAT) && (conn->vfs_ops.fchmod_acl != NULL)) {
200 int saved_errno = errno; /* We might get ENOSYS in the next call.. */
201 if (conn->vfs_ops.fchmod_acl(fsp, fsp->fd, mode) == -1 && errno == ENOSYS)
202 errno = saved_errno; /* Ignore ENOSYS */
208 /****************************************************************************
210 Helper for open_file_shared.
211 Truncate a file after checking locking; close file if locked.
212 **************************************************************************/
214 static int truncate_unless_locked(struct connection_struct *conn, files_struct *fsp)
216 SMB_BIG_UINT mask = (SMB_BIG_UINT)-1;
221 if (is_locked(fsp,fsp->conn,mask,0,WRITE_LOCK)){
223 unix_ERR_class = ERRDOS;
224 unix_ERR_code = ERRlock;
227 return conn->vfs_ops.ftruncate(fsp,fsp->fd,0);
231 /*******************************************************************
232 return True if the filename is one of the special executable types
233 ********************************************************************/
234 static BOOL is_executable(const char *fname)
236 if ((fname = strrchr(fname,'.'))) {
237 if (strequal(fname,".com") ||
238 strequal(fname,".dll") ||
239 strequal(fname,".exe") ||
240 strequal(fname,".sym")) {
247 enum {AFAIL,AREAD,AWRITE,AALL};
249 /*******************************************************************
250 reproduce the share mode access table
251 this is horrendoously complex, and really can't be justified on any
252 rational grounds except that this is _exactly_ what NT does. See
253 the DENY1 and DENY2 tests in smbtorture for a comprehensive set of
255 ********************************************************************/
256 static int access_table(int new_deny,int old_deny,int old_mode,
257 BOOL same_pid, BOOL isexe)
259 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
262 if (isexe && old_mode == DOS_OPEN_RDONLY &&
263 old_deny == DENY_DOS && new_deny == DENY_READ) {
266 if (!isexe && old_mode == DOS_OPEN_RDONLY &&
267 old_deny == DENY_DOS && new_deny == DENY_DOS) {
270 if (new_deny == DENY_FCB && old_deny == DENY_DOS) {
271 if (isexe) return AFAIL;
272 if (old_mode == DOS_OPEN_RDONLY) return AFAIL;
275 if (old_mode == DOS_OPEN_RDONLY && old_deny == DENY_DOS) {
276 if (new_deny == DENY_FCB || new_deny == DENY_READ) {
277 if (isexe) return AREAD;
281 if (old_deny == DENY_FCB) {
282 if (new_deny == DENY_DOS || new_deny == DENY_FCB) return AALL;
287 if (old_deny == DENY_DOS || new_deny == DENY_DOS ||
288 old_deny == DENY_FCB || new_deny == DENY_FCB) {
290 if (old_deny == DENY_FCB || new_deny == DENY_FCB) {
293 if (old_deny == DENY_DOS) {
294 if (new_deny == DENY_READ &&
295 (old_mode == DOS_OPEN_RDONLY ||
296 old_mode == DOS_OPEN_RDWR)) {
299 if (new_deny == DENY_WRITE &&
300 (old_mode == DOS_OPEN_WRONLY ||
301 old_mode == DOS_OPEN_RDWR)) {
306 if (old_deny == DENY_NONE) return AALL;
307 if (old_deny == DENY_READ) return AWRITE;
308 if (old_deny == DENY_WRITE) return AREAD;
310 /* it isn't a exe, dll, sym or com file */
311 if (old_deny == new_deny && same_pid)
314 if (old_deny == DENY_READ || new_deny == DENY_READ) return AFAIL;
315 if (old_mode == DOS_OPEN_RDONLY) return(AREAD);
323 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_RDONLY) return(AREAD);
324 if (old_deny==DENY_READ && old_mode==DOS_OPEN_RDONLY) return(AWRITE);
325 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_RDONLY) return(AALL);
328 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_WRONLY) return(AREAD);
329 if (old_deny==DENY_READ && old_mode==DOS_OPEN_WRONLY) return(AWRITE);
330 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_WRONLY) return(AALL);
333 if (old_deny==DENY_WRITE) return(AREAD);
334 if (old_deny==DENY_READ) return(AWRITE);
335 if (old_deny==DENY_NONE) return(AALL);
342 /****************************************************************************
343 check if we can open a file with a share mode
344 ****************************************************************************/
346 static int check_share_mode( share_mode_entry *share, int share_mode,
347 const char *fname, BOOL fcbopen, int *flags)
349 int deny_mode = GET_DENY_MODE(share_mode);
350 int old_open_mode = GET_OPEN_MODE(share->share_mode);
351 int old_deny_mode = GET_DENY_MODE(share->share_mode);
354 * Don't allow any opens once the delete on close flag has been
358 if (GET_DELETE_ON_CLOSE_FLAG(share->share_mode)) {
359 DEBUG(5,("check_share_mode: Failing open on file %s as delete on close flag is set.\n",
361 unix_ERR_class = ERRDOS;
362 unix_ERR_code = ERRnoaccess;
367 * If delete access was requested and the existing share mode doesn't have
368 * ALLOW_SHARE_DELETE then deny.
371 if (GET_DELETE_ACCESS_REQUESTED(share_mode) && !GET_ALLOW_SHARE_DELETE(share->share_mode)) {
372 DEBUG(5,("check_share_mode: Failing open on file %s as delete access requested and allow share delete not set.\n",
374 unix_ERR_class = ERRDOS;
375 unix_ERR_code = ERRbadshare;
381 * The inverse of the above.
382 * If delete access was granted and the new share mode doesn't have
383 * ALLOW_SHARE_DELETE then deny.
386 if (GET_DELETE_ACCESS_REQUESTED(share->share_mode) && !GET_ALLOW_SHARE_DELETE(share_mode)) {
387 DEBUG(5,("check_share_mode: Failing open on file %s as delete access granted and allow share delete not requested.\n",
389 unix_ERR_class = ERRDOS;
390 unix_ERR_code = ERRbadshare;
396 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
397 (share->pid == sys_getpid()),is_executable(fname));
399 if ((access_allowed == AFAIL) ||
400 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
401 (access_allowed == AREAD && *flags != O_RDONLY) ||
402 (access_allowed == AWRITE && *flags != O_WRONLY)) {
404 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s,fcbopen = %d, flags = %d) = %d\n",
405 deny_mode,old_deny_mode,old_open_mode,
406 (int)share->pid,fname, fcbopen, *flags, access_allowed));
408 unix_ERR_class = ERRDOS;
409 unix_ERR_code = ERRbadshare;
414 if (access_allowed == AREAD)
417 if (access_allowed == AWRITE)
425 /****************************************************************************
426 Deal with open deny mode and oplock break processing.
427 Invarient: Share mode must be locked on entry and exit.
428 Returns -1 on error, or number of share modes on success (may be zero).
429 ****************************************************************************/
431 static int open_mode_check(connection_struct *conn, const char *fname, SMB_DEV_T dev,
432 SMB_INO_T inode, int share_mode, int *p_flags, int *p_oplock_request,
433 BOOL *p_all_current_opens_are_level_II)
437 int oplock_contention_count = 0;
438 share_mode_entry *old_shares = 0;
439 BOOL fcbopen = False;
442 if(GET_OPEN_MODE(share_mode) == DOS_OPEN_FCB)
445 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
447 if(num_share_modes == 0)
451 * Check if the share modes will give us access.
456 broke_oplock = False;
457 *p_all_current_opens_are_level_II = True;
459 for(i = 0; i < num_share_modes; i++) {
460 share_mode_entry *share_entry = &old_shares[i];
463 * By observation of NetBench, oplocks are broken *before* share
464 * modes are checked. This allows a file to be closed by the client
465 * if the share mode would deny access and the client has an oplock.
466 * Check if someone has an oplock on this file. If so we must break
467 * it before continuing.
470 if((*p_oplock_request && EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) ||
471 (!*p_oplock_request && (share_entry->op_type != NO_OPLOCK))) {
475 DEBUG(5,("open_mode_check: breaking oplock (%x) on file %s, \
476 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
478 /* Oplock break - unlock to request it. */
479 unlock_share_entry(conn, dev, inode);
481 opb_ret = request_oplock_break(share_entry, dev, inode);
484 lock_share_entry(conn, dev, inode);
486 if(opb_ret == False) {
487 free((char *)old_shares);
488 DEBUG(0,("open_mode_check: FAILED when breaking oplock (%x) on file %s, \
489 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
491 unix_ERR_class = ERRDOS;
492 unix_ERR_code = ERRbadshare;
497 *p_all_current_opens_are_level_II = False;
500 } else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
501 *p_all_current_opens_are_level_II = False;
504 /* someone else has a share lock on it, check to see
507 if(check_share_mode(share_entry, share_mode, fname, fcbopen, p_flags) == False) {
508 free((char *)old_shares);
516 free((char *)old_shares);
517 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
518 oplock_contention_count++;
520 } while(broke_oplock);
523 free((char *)old_shares);
526 * Refuse to grant an oplock in case the contention limit is
527 * reached when going through the lock list multiple times.
530 if(oplock_contention_count >= lp_oplock_contention_limit(SNUM(conn))) {
531 *p_oplock_request = 0;
532 DEBUG(4,("open_mode_check: oplock contention = %d. Not granting oplock.\n",
533 oplock_contention_count ));
536 return num_share_modes;
539 /****************************************************************************
540 set a kernel flock on a file for NFS interoperability
541 this requires a patch to Linux
542 ****************************************************************************/
543 static void kernel_flock(files_struct *fsp, int deny_mode)
545 #if HAVE_KERNEL_SHARE_MODES
547 if (deny_mode == DENY_READ) kernel_mode = LOCK_MAND|LOCK_WRITE;
548 else if (deny_mode == DENY_WRITE) kernel_mode = LOCK_MAND|LOCK_READ;
549 else if (deny_mode == DENY_ALL) kernel_mode = LOCK_MAND;
550 if (kernel_mode) flock(fsp->fd, kernel_mode);
555 /****************************************************************************
556 Open a file with a share mode. On output from this open we are guarenteeing
558 ****************************************************************************/
559 files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_STAT *psbuf,
560 int share_mode,int ofun, mode_t mode,int oplock_request, int *Access,int *action)
564 int deny_mode = GET_DENY_MODE(share_mode);
565 BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
566 BOOL delete_access_requested = GET_DELETE_ACCESS_REQUESTED(share_mode);
567 BOOL file_existed = VALID_STAT(*psbuf);
568 BOOL fcbopen = False;
571 int num_share_modes = 0;
572 BOOL all_current_opens_are_level_II = False;
573 BOOL fsp_open = False;
574 files_struct *fsp = NULL;
579 /* printers are handled completely differently. Most of the passed parameters are
581 *Access = DOS_OPEN_WRONLY;
582 *action = FILE_WAS_CREATED;
583 return print_fsp_open(conn, fname);
586 fsp = file_new(conn);
590 DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
591 fname, share_mode, ofun, (int)mode, oplock_request ));
593 if (!check_name(fname,conn)) {
598 /* ignore any oplock requests if oplocks are disabled */
599 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break) {
603 /* this is for OS/2 EAs - try and say we don't support them */
604 if (strstr(fname,".+,;=[].")) {
605 unix_ERR_class = ERRDOS;
606 /* OS/2 Workplace shell fix may be main code stream in a later release. */
607 #if 1 /* OS2_WPS_FIX - Recent versions of OS/2 need this. */
608 unix_ERR_code = ERRcannotopen;
609 #else /* OS2_WPS_FIX */
610 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
611 #endif /* OS2_WPS_FIX */
613 DEBUG(5,("open_file_shared: OS/2 EA's are not supported.\n"));
618 if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed) {
619 DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
626 if (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST)
629 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)
632 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL)
635 /* note that we ignore the append flag as
636 append does not mean the same thing under dos and unix */
638 switch (GET_OPEN_MODE(share_mode)) {
639 case DOS_OPEN_WRONLY:
651 * This little piece of insanity is inspired by the
652 * fact that an NT client can open a file for O_RDONLY,
653 * but set the create disposition to FILE_EXISTS_TRUNCATE.
654 * If the client *can* write to the file, then it expects to
655 * truncate the file, even though it is opening for readonly.
656 * Quicken uses this stupid trick in backup file creation...
657 * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
658 * for helping track this one down. It didn't bite us in 2.0.x
659 * as we always opened files read-write in that release. JRA.
662 if (flags2 & O_TRUNC)
670 if (GET_FILE_SYNC_OPENMODE(share_mode)) {
675 if (flags != O_RDONLY && file_existed &&
676 (!CAN_WRITE(conn) || IS_DOS_READONLY(dos_mode(conn,fname,psbuf)))) {
678 DEBUG(5,("open_file_shared: read/write access requested for file %s on read only %s\n",
679 fname, !CAN_WRITE(conn) ? "share" : "file" ));
687 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB) {
688 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
697 inode = psbuf->st_ino;
699 lock_share_entry(conn, dev, inode);
701 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
702 &flags, &oplock_request, &all_current_opens_are_level_II);
703 if(num_share_modes == -1) {
706 * This next line is a subtlety we need for MS-Access. If a file open will
707 * fail due to share permissions and also for security (access)
708 * reasons, we need to return the access failed error, not the
709 * share error. This means we must attempt to open the file anyway
710 * in order to get the UNIX access error - even if we're going to
711 * fail the open for share reasons. This is bad, as we're burning
712 * another fd if there are existing locks but there's nothing else
713 * we can do. We also ensure we're not going to create or tuncate
714 * the file as we only want an access decision at this stage. JRA.
716 fsp_open = open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC|O_CREAT)),mode);
718 DEBUG(4,("open_file_shared : share_mode deny - calling open_file with \
719 flags=0x%X flags2=0x%X mode=0%o returned %d\n",
720 flags,(flags2&~(O_TRUNC|O_CREAT)),(int)mode,(int)fsp_open ));
722 unlock_share_entry(conn, dev, inode);
730 * We exit this block with the share entry *locked*.....
734 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
735 flags,flags2,(int)mode));
737 fsp_open = open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC)),mode);
739 if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
740 if((fsp_open = open_file(fsp,conn,fname,psbuf,O_RDONLY,mode)) == True)
746 unlock_share_entry(conn, dev, inode);
752 * Deal with the race condition where two smbd's detect the file doesn't
753 * exist and do the create at the same time. One of them will win and
754 * set a share mode, the other (ie. this one) should check if the
755 * requested share mode for this create is allowed.
760 lock_share_entry_fsp(fsp);
762 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
763 &flags, &oplock_request, &all_current_opens_are_level_II);
765 if(num_share_modes == -1) {
766 unlock_share_entry_fsp(fsp);
773 * We exit this block with the share entry *locked*.....
777 /* note that we ignore failure for the following. It is
778 basically a hack for NFS, and NFS will never set one of
779 these only read them. Nobody but Samba can ever set a deny
780 mode and we have already checked our more authoritative
781 locking database for permission to set this deny mode. If
782 the kernel refuses the operations then the kernel is wrong */
783 kernel_flock(fsp, deny_mode);
786 * At this point onwards, we can guarentee that the share entry
787 * is locked, whether we created the file or not, and that the
788 * deny mode is compatible with all current opens.
792 * If requested, truncate the file.
795 if (flags2&O_TRUNC) {
797 * We are modifing the file after open - update the stat struct..
799 if ((truncate_unless_locked(conn,fsp) == -1) || (vfs_fstat(fsp,fsp->fd,psbuf)==-1)) {
800 unlock_share_entry_fsp(fsp);
809 open_mode = DOS_OPEN_RDONLY;
812 open_mode = DOS_OPEN_RDWR;
815 open_mode = DOS_OPEN_WRONLY;
819 fsp->share_mode = SET_DENY_MODE(deny_mode) |
820 SET_OPEN_MODE(open_mode) |
821 SET_ALLOW_SHARE_DELETE(allow_share_delete) |
822 SET_DELETE_ACCESS_REQUESTED(delete_access_requested);
824 DEBUG(10,("open_file_shared : share_mode = %x\n", fsp->share_mode ));
827 (*Access) = open_mode;
830 if (file_existed && !(flags2 & O_TRUNC))
831 *action = FILE_WAS_OPENED;
833 *action = FILE_WAS_CREATED;
834 if (file_existed && (flags2 & O_TRUNC))
835 *action = FILE_WAS_OVERWRITTEN;
839 * Setup the oplock info in both the shared memory and
843 if(oplock_request && (num_share_modes == 0) &&
844 !IS_VETO_OPLOCK_PATH(conn,fname) && set_file_oplock(fsp, oplock_request) ) {
845 port = global_oplock_port;
846 } else if (oplock_request && all_current_opens_are_level_II) {
847 port = global_oplock_port;
848 oplock_request = LEVEL_II_OPLOCK;
849 set_file_oplock(fsp, oplock_request);
855 set_share_mode(fsp, port, oplock_request);
857 unlock_share_entry_fsp(fsp);
859 conn->num_files_open++;
864 /****************************************************************************
865 Open a file for permissions read only. Return a pseudo file entry
866 with the 'stat_open' flag set
867 ****************************************************************************/
869 files_struct *open_file_stat(connection_struct *conn, char *fname,
870 SMB_STRUCT_STAT *psbuf, int smb_ofun, int *action)
872 extern struct current_user current_user;
873 files_struct *fsp = NULL;
875 if (!VALID_STAT(*psbuf)) {
876 DEBUG(0,("open_file_stat: unable to stat name = %s. Error was %s\n", fname, strerror(errno) ));
880 if(S_ISDIR(psbuf->st_mode)) {
881 DEBUG(0,("open_file_stat: %s is a directory !\n", fname ));
885 fsp = file_new(conn);
889 *action = FILE_WAS_OPENED;
891 DEBUG(5,("open_file_stat: opening file %s as a stat entry\n", fname));
894 * Setup the files_struct for it.
898 fsp->mode = psbuf->st_mode;
899 fsp->inode = psbuf->st_ino;
900 fsp->dev = psbuf->st_dev;
901 GetTimeOfDay(&fsp->open_time);
902 fsp->size = psbuf->st_size;
903 fsp->vuid = current_user.vuid;
905 fsp->can_lock = False;
906 fsp->can_read = False;
907 fsp->can_write = False;
909 fsp->print_file = False;
910 fsp->modified = False;
911 fsp->oplock_type = NO_OPLOCK;
912 fsp->sent_oplock_break = NO_BREAK_SENT;
913 fsp->is_directory = False;
914 fsp->stat_open = True;
915 fsp->directory_delete_on_close = False;
918 * Note that the file name here is the *untranslated* name
919 * ie. it is still in the DOS codepage sent from the client.
920 * All use of this filename will pass though the sys_xxxx
921 * functions which will do the dos_to_unix translation before
922 * mapping into a UNIX filename. JRA.
924 string_set(&fsp->fsp_name,fname);
925 fsp->wbmpx_ptr = NULL;
926 fsp->wcp = NULL; /* Write cache pointer. */
928 conn->num_files_open++;
933 /****************************************************************************
934 Open a file for for write to ensure that we can fchmod it.
935 ****************************************************************************/
937 files_struct *open_file_fchmod(connection_struct *conn, char *fname, SMB_STRUCT_STAT *psbuf)
939 files_struct *fsp = NULL;
942 if (!VALID_STAT(*psbuf))
945 fsp = file_new(conn);
949 fsp_open = open_file(fsp,conn,fname,psbuf,O_WRONLY,0);
952 * This is not a user visible file open.
953 * Don't set a share mode and don't increment
954 * the conn->num_files_open.
965 /****************************************************************************
966 Close the fchmod file fd - ensure no locks are lost.
967 ****************************************************************************/
969 int close_file_fchmod(files_struct *fsp)
971 int ret = fd_close(fsp->conn, fsp);
976 /****************************************************************************
977 Open a directory from an NT SMB call.
978 ****************************************************************************/
980 files_struct *open_directory(connection_struct *conn, char *fname,
981 SMB_STRUCT_STAT *psbuf, int smb_ofun, mode_t unixmode, int *action)
983 extern struct current_user current_user;
984 BOOL got_stat = False;
985 files_struct *fsp = file_new(conn);
990 fsp->conn = conn; /* The vfs_fXXX() macros need this. */
992 if (VALID_STAT(*psbuf))
995 if (got_stat && (GET_FILE_OPEN_DISPOSITION(smb_ofun) == FILE_EXISTS_FAIL)) {
997 errno = EEXIST; /* Setup so correct error is returned to client. */
1001 if (GET_FILE_CREATE_DISPOSITION(smb_ofun) == FILE_CREATE_IF_NOT_EXIST) {
1005 if(!S_ISDIR(psbuf->st_mode)) {
1006 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1011 *action = FILE_WAS_OPENED;
1016 * Try and create the directory.
1019 if(!CAN_WRITE(conn)) {
1020 DEBUG(2,("open_directory: failing create on read-only share\n"));
1026 if(vfs_mkdir(conn,fname, unix_mode(conn,aDIR, fname)) < 0) {
1027 DEBUG(0,("open_directory: unable to create %s. Error was %s\n",
1028 fname, strerror(errno) ));
1033 if(vfs_stat(conn,fname, psbuf) != 0) {
1038 *action = FILE_WAS_CREATED;
1044 * Don't create - just check that it *was* a directory.
1048 DEBUG(0,("open_directory: unable to stat name = %s. Error was %s\n",
1049 fname, strerror(errno) ));
1054 if(!S_ISDIR(psbuf->st_mode)) {
1055 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1060 *action = FILE_WAS_OPENED;
1063 DEBUG(5,("open_directory: opening directory %s\n", fname));
1066 * Setup the files_struct for it.
1070 fsp->mode = psbuf->st_mode;
1071 fsp->inode = psbuf->st_ino;
1072 fsp->dev = psbuf->st_dev;
1073 GetTimeOfDay(&fsp->open_time);
1074 fsp->size = psbuf->st_size;
1075 fsp->vuid = current_user.vuid;
1077 fsp->can_lock = True;
1078 fsp->can_read = False;
1079 fsp->can_write = False;
1080 fsp->share_mode = 0;
1081 fsp->print_file = False;
1082 fsp->modified = False;
1083 fsp->oplock_type = NO_OPLOCK;
1084 fsp->sent_oplock_break = NO_BREAK_SENT;
1085 fsp->is_directory = True;
1086 fsp->directory_delete_on_close = False;
1089 * Note that the file name here is the *untranslated* name
1090 * ie. it is still in the DOS codepage sent from the client.
1091 * All use of this filename will pass though the sys_xxxx
1092 * functions which will do the dos_to_unix translation before
1093 * mapping into a UNIX filename. JRA.
1095 string_set(&fsp->fsp_name,fname);
1096 fsp->wbmpx_ptr = NULL;
1098 conn->num_files_open++;
1103 /*******************************************************************
1104 Check if the share mode on a file allows it to be deleted or unlinked.
1105 Return True if sharing doesn't prevent the operation.
1106 ********************************************************************/
1108 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
1112 share_mode_entry *old_shares = 0;
1113 int num_share_modes;
1114 SMB_STRUCT_STAT sbuf;
1115 pid_t pid = sys_getpid();
1119 if (vfs_stat(conn,fname,&sbuf) == -1)
1123 inode = sbuf.st_ino;
1125 lock_share_entry(conn, dev, inode);
1126 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1129 * Check if the share modes will give us access.
1132 if(num_share_modes != 0)
1139 broke_oplock = False;
1140 for(i = 0; i < num_share_modes; i++)
1142 share_mode_entry *share_entry = &old_shares[i];
1145 * Break oplocks before checking share modes. See comment in
1146 * open_file_shared for details.
1147 * Check if someone has an oplock on this file. If so we must
1148 * break it before continuing.
1150 if(BATCH_OPLOCK_TYPE(share_entry->op_type))
1155 /* JRA. Try removing this code to see if the new oplock changes
1156 fix the problem. I'm dubious, but Andrew is recommending we
1161 * It appears that the NT redirector may have a bug, in that
1162 * it tries to do an SMBmv on a file that it has open with a
1163 * batch oplock, and then fails to respond to the oplock break
1164 * request. This only seems to occur when the client is doing an
1165 * SMBmv to the smbd it is using - thus we try and detect this
1166 * condition by checking if the file being moved is open and oplocked by
1167 * this smbd process, and then not sending the oplock break in this
1168 * special case. If the file was open with a deny mode that
1169 * prevents the move the SMBmv will fail anyway with a share
1170 * violation error. JRA.
1172 if(rename_op && (share_entry->pid == pid))
1175 DEBUG(0,("check_file_sharing: NT redirector workaround - rename attempted on \
1176 batch oplocked file %s, dev = %x, inode = %.0f\n", fname, (unsigned int)dev, (double)inode));
1179 * This next line is a test that allows the deny-mode
1180 * processing to be skipped. This seems to be needed as
1181 * NT insists on the rename succeeding (in Office 9x no less !).
1182 * This should be removed as soon as (a) MS fix the redirector
1183 * bug or (b) NT SMB support in Samba makes NT not issue the
1184 * call (as is my fervent hope). JRA.
1192 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1193 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
1195 /* Oplock break.... */
1196 unlock_share_entry(conn, dev, inode);
1197 if(request_oplock_break(share_entry, dev, inode) == False)
1199 free((char *)old_shares);
1201 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1202 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
1206 lock_share_entry(conn, dev, inode);
1207 broke_oplock = True;
1213 * If this is a delete request and ALLOW_SHARE_DELETE is set then allow
1214 * this to proceed. This takes precedence over share modes.
1217 if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
1221 * Someone else has a share lock on it, check to see
1225 if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) ||
1226 (share_entry->pid != pid))
1233 free((char *)old_shares);
1234 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1236 } while(broke_oplock);
1239 /* XXXX exactly what share mode combinations should be allowed for
1240 deleting/renaming? */
1242 * If we got here then either there were no share modes or
1243 * all share modes were DENY_DOS and the pid == getpid() or
1244 * delete access was requested and all share modes had the
1245 * ALLOW_SHARE_DELETE bit set (takes precedence over other
1253 unlock_share_entry(conn, dev, inode);
1254 if(old_shares != NULL)
1255 free((char *)old_shares);