4 Unix SMB/Netbios implementation.
6 file opening and share modes
7 Copyright (C) Andrew Tridgell 1992-1998
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 extern int DEBUGLEVEL;
28 extern pstring sesssetup_user;
29 extern uint16 global_oplock_port;
30 extern BOOL global_client_failed_oplock_break;
32 /****************************************************************************
33 fd support routines - attempt to do a dos_open.
34 ****************************************************************************/
36 static int fd_open(struct connection_struct *conn, char *fname,
37 int flags, mode_t mode)
44 fd = conn->vfs_ops.open(conn,dos_to_unix(fname,False),flags,mode);
46 /* Fix for files ending in '.' */
47 if((fd == -1) && (errno == ENOENT) &&
48 (strchr(fname,'.')==NULL)) {
50 fd = conn->vfs_ops.open(conn,dos_to_unix(fname,False),flags,mode);
53 DEBUG(10,("fd_open: name %s, mode = %d, fd = %d. %s\n", fname, (int)mode, fd,
54 (fd == -1) ? strerror(errno) : "" ));
59 /****************************************************************************
60 Close the file associated with a fsp.
61 ****************************************************************************/
63 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,int flags,mode_t mode)
93 extern struct current_user current_user;
95 int accmode = (flags & O_ACCMODE);
99 fsp->oplock_type = NO_OPLOCK;
102 pstrcpy(fname,fname1);
104 /* Check permissions */
107 * This code was changed after seeing a client open request
108 * containing the open mode of (DENY_WRITE/read-only) with
109 * the 'create if not exist' bit set. The previous code
110 * would fail to open the file read only on a read-only share
111 * as it was checking the flags parameter directly against O_RDONLY,
112 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
116 if (!CAN_WRITE(conn)) {
117 /* It's a read-only share - fail if we wanted to write. */
118 if(accmode != O_RDONLY) {
119 DEBUG(3,("Permission denied opening %s\n",fname));
120 check_for_pipe(fname);
122 } else if(flags & O_CREAT) {
123 /* We don't want to write - but we must make sure that O_CREAT
124 doesn't create the file if we have write access into the
131 /* actually do the open */
132 fsp->fd = fd_open(conn, fname, flags, mode);
135 DEBUG(3,("Error opening file %s (%s) (flags=%d)\n",
136 fname,strerror(errno),flags));
137 check_for_pipe(fname);
141 if (conn->vfs_ops.fstat(fsp,fsp->fd, &sbuf) == -1) {
142 DEBUG(0,("Error doing fstat on open file %s (%s)\n", fname,strerror(errno) ));
148 * POSIX allows read-only opens of directories. We don't
149 * want to do this (we use a different code path for this)
150 * so catch a directory open and return an EISDIR. JRA.
153 if(S_ISDIR(sbuf.st_mode)) {
159 fsp->mode = sbuf.st_mode;
160 fsp->inode = sbuf.st_ino;
161 fsp->dev = sbuf.st_dev;
162 GetTimeOfDay(&fsp->open_time);
163 fsp->vuid = current_user.vuid;
166 fsp->can_lock = True;
167 fsp->can_read = ((flags & O_WRONLY)==0);
168 fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
170 fsp->print_file = False;
171 fsp->modified = False;
172 fsp->oplock_type = NO_OPLOCK;
173 fsp->sent_oplock_break = NO_BREAK_SENT;
174 fsp->is_directory = False;
175 fsp->stat_open = False;
176 fsp->directory_delete_on_close = False;
179 * Note that the file name here is the *untranslated* name
180 * ie. it is still in the DOS codepage sent from the client.
181 * All use of this filename will pass though the sys_xxxx
182 * functions which will do the dos_to_unix translation before
183 * mapping into a UNIX filename. JRA.
185 string_set(&fsp->fsp_name,fname);
186 fsp->wbmpx_ptr = NULL;
187 fsp->wcp = NULL; /* Write cache pointer. */
189 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
190 *sesssetup_user ? sesssetup_user : conn->user,fsp->fsp_name,
191 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
192 conn->num_files_open + 1));
197 /****************************************************************************
199 Helper for open_file_shared.
200 Truncate a file after checking locking; close file if locked.
201 **************************************************************************/
203 static int truncate_unless_locked(struct connection_struct *conn, files_struct *fsp)
205 SMB_BIG_UINT mask = (SMB_BIG_UINT)-1;
210 if (is_locked(fsp,fsp->conn,mask,0,WRITE_LOCK)){
212 unix_ERR_class = ERRDOS;
213 unix_ERR_code = ERRlock;
216 return conn->vfs_ops.ftruncate(fsp,fsp->fd,0);
220 /*******************************************************************
221 return True if the filename is one of the special executable types
222 ********************************************************************/
223 static BOOL is_executable(const char *fname)
225 if ((fname = strrchr(fname,'.'))) {
226 if (strequal(fname,".com") ||
227 strequal(fname,".dll") ||
228 strequal(fname,".exe") ||
229 strequal(fname,".sym")) {
236 enum {AFAIL,AREAD,AWRITE,AALL};
238 /*******************************************************************
239 reproduce the share mode access table
240 this is horrendoously complex, and really can't be justified on any
241 rational grounds except that this is _exactly_ what NT does. See
242 the DENY1 and DENY2 tests in smbtorture for a comprehensive set of
244 ********************************************************************/
245 static int access_table(int new_deny,int old_deny,int old_mode,
246 BOOL same_pid, BOOL isexe)
248 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
251 if (isexe && old_mode == DOS_OPEN_RDONLY &&
252 old_deny == DENY_DOS && new_deny == DENY_READ) {
255 if (!isexe && old_mode == DOS_OPEN_RDONLY &&
256 old_deny == DENY_DOS && new_deny == DENY_DOS) {
259 if (new_deny == DENY_FCB && old_deny == DENY_DOS) {
260 if (isexe) return AFAIL;
261 if (old_mode == DOS_OPEN_RDONLY) return AFAIL;
264 if (old_mode == DOS_OPEN_RDONLY && old_deny == DENY_DOS) {
265 if (new_deny == DENY_FCB || new_deny == DENY_READ) {
266 if (isexe) return AREAD;
270 if (old_deny == DENY_FCB) {
271 if (new_deny == DENY_DOS || new_deny == DENY_FCB) return AALL;
276 if (old_deny == DENY_DOS || new_deny == DENY_DOS ||
277 old_deny == DENY_FCB || new_deny == DENY_FCB) {
279 if (old_deny == DENY_FCB || new_deny == DENY_FCB) {
282 if (old_deny == DENY_DOS) {
283 if (new_deny == DENY_READ &&
284 (old_mode == DOS_OPEN_RDONLY ||
285 old_mode == DOS_OPEN_RDWR)) {
288 if (new_deny == DENY_WRITE &&
289 (old_mode == DOS_OPEN_WRONLY ||
290 old_mode == DOS_OPEN_RDWR)) {
295 if (old_deny == DENY_NONE) return AALL;
296 if (old_deny == DENY_READ) return AWRITE;
297 if (old_deny == DENY_WRITE) return AREAD;
299 /* it isn't a exe, dll, sym or com file */
300 if (old_deny == new_deny && same_pid)
303 if (old_deny == DENY_READ || new_deny == DENY_READ) return AFAIL;
304 if (old_mode == DOS_OPEN_RDONLY) return(AREAD);
312 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_RDONLY) return(AREAD);
313 if (old_deny==DENY_READ && old_mode==DOS_OPEN_RDONLY) return(AWRITE);
314 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_RDONLY) return(AALL);
317 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_WRONLY) return(AREAD);
318 if (old_deny==DENY_READ && old_mode==DOS_OPEN_WRONLY) return(AWRITE);
319 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_WRONLY) return(AALL);
322 if (old_deny==DENY_WRITE) return(AREAD);
323 if (old_deny==DENY_READ) return(AWRITE);
324 if (old_deny==DENY_NONE) return(AALL);
331 /****************************************************************************
332 check if we can open a file with a share mode
333 ****************************************************************************/
335 static int check_share_mode( share_mode_entry *share, int deny_mode,
336 const char *fname, BOOL fcbopen, int *flags)
338 int old_open_mode = GET_OPEN_MODE(share->share_mode);
339 int old_deny_mode = GET_DENY_MODE(share->share_mode);
342 * Don't allow any open once the delete on close flag has been
346 if(GET_DELETE_ON_CLOSE_FLAG(share->share_mode)) {
347 DEBUG(5,("check_share_mode: Failing open on file %s as delete on close flag is set.\n",
349 unix_ERR_class = ERRDOS;
350 unix_ERR_code = ERRnoaccess;
355 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
356 (share->pid == sys_getpid()),is_executable(fname));
358 if ((access_allowed == AFAIL) ||
359 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
360 (access_allowed == AREAD && *flags != O_RDONLY) ||
361 (access_allowed == AWRITE && *flags != O_WRONLY)) {
363 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s,fcbopen = %d, flags = %d) = %d\n",
364 deny_mode,old_deny_mode,old_open_mode,
365 (int)share->pid,fname, fcbopen, *flags, access_allowed));
367 unix_ERR_class = ERRDOS;
368 unix_ERR_code = ERRbadshare;
373 if (access_allowed == AREAD)
376 if (access_allowed == AWRITE)
384 /****************************************************************************
385 Deal with open deny mode and oplock break processing.
386 Invarient: Share mode must be locked on entry and exit.
387 Returns -1 on error, or number of share modes on success (may be zero).
388 ****************************************************************************/
390 static int open_mode_check(connection_struct *conn, const char *fname, SMB_DEV_T dev,
391 SMB_INO_T inode, int share_mode, int *p_flags, int *p_oplock_request,
392 BOOL *p_all_current_opens_are_level_II)
396 int oplock_contention_count = 0;
397 share_mode_entry *old_shares = 0;
398 BOOL fcbopen = False;
399 int deny_mode = GET_DENY_MODE(share_mode);
402 if(GET_OPEN_MODE(share_mode) == DOS_OPEN_FCB)
405 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
407 if(num_share_modes == 0)
411 * Check if the share modes will give us access.
416 broke_oplock = False;
417 *p_all_current_opens_are_level_II = True;
419 for(i = 0; i < num_share_modes; i++) {
420 share_mode_entry *share_entry = &old_shares[i];
423 * By observation of NetBench, oplocks are broken *before* share
424 * modes are checked. This allows a file to be closed by the client
425 * if the share mode would deny access and the client has an oplock.
426 * Check if someone has an oplock on this file. If so we must break
427 * it before continuing.
430 if((*p_oplock_request && EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) ||
431 (!*p_oplock_request && (share_entry->op_type != NO_OPLOCK))) {
435 DEBUG(5,("open_mode_check: breaking oplock (%x) on file %s, \
436 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
438 /* Oplock break - unlock to request it. */
439 unlock_share_entry(conn, dev, inode);
441 opb_ret = request_oplock_break(share_entry, dev, inode);
444 lock_share_entry(conn, dev, inode);
446 if(opb_ret == False) {
447 free((char *)old_shares);
448 DEBUG(0,("open_mode_check: FAILED when breaking oplock (%x) on file %s, \
449 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
451 unix_ERR_class = ERRDOS;
452 unix_ERR_code = ERRbadshare;
457 *p_all_current_opens_are_level_II = False;
460 } else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
461 *p_all_current_opens_are_level_II = False;
464 /* someone else has a share lock on it, check to see
467 if(check_share_mode(share_entry, deny_mode, fname, fcbopen, p_flags) == False) {
468 free((char *)old_shares);
476 free((char *)old_shares);
477 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
478 oplock_contention_count++;
480 } while(broke_oplock);
483 free((char *)old_shares);
486 * Refuse to grant an oplock in case the contention limit is
487 * reached when going through the lock list multiple times.
490 if(oplock_contention_count >= lp_oplock_contention_limit(SNUM(conn))) {
491 *p_oplock_request = 0;
492 DEBUG(4,("open_mode_check: oplock contention = %d. Not granting oplock.\n",
493 oplock_contention_count ));
496 return num_share_modes;
499 /****************************************************************************
500 set a kernel flock on a file for NFS interoperability
501 this requires a patch to Linux
502 ****************************************************************************/
503 static void kernel_flock(files_struct *fsp, int deny_mode)
505 #if HAVE_KERNEL_SHARE_MODES
507 if (deny_mode == DENY_READ) kernel_mode = LOCK_MAND|LOCK_WRITE;
508 else if (deny_mode == DENY_WRITE) kernel_mode = LOCK_MAND|LOCK_READ;
509 else if (deny_mode == DENY_ALL) kernel_mode = LOCK_MAND;
510 if (kernel_mode) flock(fsp->fd, kernel_mode);
515 /****************************************************************************
516 Open a file with a share mode.
517 ****************************************************************************/
518 files_struct *open_file_shared(connection_struct *conn,char *fname,int share_mode,int ofun,
519 mode_t mode,int oplock_request, int *Access,int *action)
523 int deny_mode = GET_DENY_MODE(share_mode);
524 BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
525 SMB_STRUCT_STAT sbuf;
526 BOOL file_existed = vfs_file_exist(conn, fname, &sbuf);
527 BOOL fcbopen = False;
530 int num_share_modes = 0;
531 BOOL all_current_opens_are_level_II = False;
532 BOOL fsp_open = False;
533 files_struct *fsp = NULL;
538 /* printers are handled completely differently. Most of the passed parameters are
540 *Access = DOS_OPEN_WRONLY;
541 *action = FILE_WAS_CREATED;
542 return print_fsp_open(conn, fname);
551 DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
552 fname, share_mode, ofun, (int)mode, oplock_request ));
554 if (!check_name(fname,conn)) {
559 /* ignore any oplock requests if oplocks are disabled */
560 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break) {
564 /* this is for OS/2 EAs - try and say we don't support them */
565 if (strstr(fname,".+,;=[].")) {
566 unix_ERR_class = ERRDOS;
567 /* OS/2 Workplace shell fix may be main code stream in a later release. */
568 #if 1 /* OS2_WPS_FIX - Recent versions of OS/2 need this. */
569 unix_ERR_code = ERRcannotopen;
570 #else /* OS2_WPS_FIX */
571 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
572 #endif /* OS2_WPS_FIX */
574 DEBUG(5,("open_file_shared: OS/2 EA's are not supported.\n"));
579 if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed) {
580 DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
587 if (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST)
590 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)
593 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL)
596 /* note that we ignore the append flag as
597 append does not mean the same thing under dos and unix */
599 switch (GET_OPEN_MODE(share_mode)) {
600 case DOS_OPEN_WRONLY:
616 if (GET_FILE_SYNC_OPENMODE(share_mode)) {
621 if (flags != O_RDONLY && file_existed &&
622 (!CAN_WRITE(conn) || IS_DOS_READONLY(dos_mode(conn,fname,&sbuf)))) {
624 DEBUG(5,("open_file_shared: read/write access requested for file %s on read only %s\n",
625 fname, !CAN_WRITE(conn) ? "share" : "file" ));
633 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB) {
634 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
644 lock_share_entry(conn, dev, inode);
646 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
647 &flags, &oplock_request, &all_current_opens_are_level_II);
648 if(num_share_modes == -1) {
649 unlock_share_entry(conn, dev, inode);
655 * We exit this block with the share entry *locked*.....
659 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
660 flags,flags2,(int)mode));
662 fsp_open = open_file(fsp,conn,fname,flags|(flags2&~(O_TRUNC)),mode);
664 if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
665 if((fsp_open = open_file(fsp,conn,fname,O_RDONLY,mode)) == True)
671 unlock_share_entry(conn, dev, inode);
676 /* not that we ignore failure for the following. It is
677 basically a hack for NFS, and NFS will never set one of
678 these only read them. Nobody but Samba can ever set a deny
679 mode and we have already checked our more authoritative
680 locking database for permission to set this deny mode. If
681 the kernel refuses the operations then the kernel is wrong */
682 kernel_flock(fsp, deny_mode);
685 * Deal with the race condition where two smbd's detect the file doesn't
686 * exist and do the create at the same time. One of them will win and
687 * set a share mode, the other (ie. this one) should check if the
688 * requested share mode for this create is allowed.
693 lock_share_entry_fsp(fsp);
695 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
696 &flags, &oplock_request, &all_current_opens_are_level_II);
698 if(num_share_modes == -1) {
699 unlock_share_entry_fsp(fsp);
706 * We exit this block with the share entry *locked*.....
711 * At this point onwards, we can guarentee that the share entry
712 * is locked, whether we created the file or not, and that the
713 * deny mode is compatible with all current opens.
717 * If requested, truncate the file.
720 if ((flags2&O_TRUNC) && (truncate_unless_locked(conn,fsp) == -1)) {
721 unlock_share_entry_fsp(fsp);
729 open_mode = DOS_OPEN_RDONLY;
732 open_mode = DOS_OPEN_RDWR;
735 open_mode = DOS_OPEN_WRONLY;
739 fsp->share_mode = SET_DENY_MODE(deny_mode) |
740 SET_OPEN_MODE(open_mode) |
741 SET_ALLOW_SHARE_DELETE(allow_share_delete);
744 (*Access) = open_mode;
747 if (file_existed && !(flags2 & O_TRUNC))
748 *action = FILE_WAS_OPENED;
750 *action = FILE_WAS_CREATED;
751 if (file_existed && (flags2 & O_TRUNC))
752 *action = FILE_WAS_OVERWRITTEN;
756 * Setup the oplock info in both the shared memory and
760 if(oplock_request && (num_share_modes == 0) &&
761 !IS_VETO_OPLOCK_PATH(conn,fname) && set_file_oplock(fsp, oplock_request) ) {
762 port = global_oplock_port;
763 } else if (oplock_request && all_current_opens_are_level_II) {
764 port = global_oplock_port;
765 oplock_request = LEVEL_II_OPLOCK;
766 set_file_oplock(fsp, oplock_request);
772 set_share_mode(fsp, port, oplock_request);
774 unlock_share_entry_fsp(fsp);
776 conn->num_files_open++;
781 /****************************************************************************
782 Open a file for permissions read only. Return a pseudo file entry
783 with the 'stat_open' flag set
784 ****************************************************************************/
786 files_struct *open_file_stat(connection_struct *conn,
787 char *fname, int smb_ofun, SMB_STRUCT_STAT *pst, int *action)
789 extern struct current_user current_user;
790 files_struct *fsp = file_new();
795 if(conn->vfs_ops.stat(conn,dos_to_unix(fname, False), pst) < 0) {
796 DEBUG(0,("open_file_stat: unable to stat name = %s. Error was %s\n",
797 fname, strerror(errno) ));
802 if(S_ISDIR(pst->st_mode)) {
803 DEBUG(0,("open_file_stat: %s is a directory !\n", fname ));
808 *action = FILE_WAS_OPENED;
810 DEBUG(5,("open_file_stat: opening file %s as a stat entry\n", fname));
813 * Setup the files_struct for it.
818 GetTimeOfDay(&fsp->open_time);
819 fsp->vuid = current_user.vuid;
822 fsp->can_lock = False;
823 fsp->can_read = False;
824 fsp->can_write = False;
826 fsp->print_file = False;
827 fsp->modified = False;
828 fsp->oplock_type = NO_OPLOCK;
829 fsp->sent_oplock_break = NO_BREAK_SENT;
830 fsp->is_directory = False;
831 fsp->stat_open = True;
832 fsp->directory_delete_on_close = False;
835 * Note that the file name here is the *untranslated* name
836 * ie. it is still in the DOS codepage sent from the client.
837 * All use of this filename will pass though the sys_xxxx
838 * functions which will do the dos_to_unix translation before
839 * mapping into a UNIX filename. JRA.
841 string_set(&fsp->fsp_name,fname);
842 fsp->wbmpx_ptr = NULL;
843 fsp->wcp = NULL; /* Write cache pointer. */
845 conn->num_files_open++;
850 /****************************************************************************
851 Open a directory from an NT SMB call.
852 ****************************************************************************/
854 files_struct *open_directory(connection_struct *conn,
855 char *fname, int smb_ofun, mode_t unixmode, int *action)
857 extern struct current_user current_user;
859 BOOL got_stat = False;
860 files_struct *fsp = file_new();
865 if(conn->vfs_ops.stat(conn,dos_to_unix(fname, False), &st) == 0) {
869 if (got_stat && (GET_FILE_OPEN_DISPOSITION(smb_ofun) == FILE_EXISTS_FAIL)) {
871 errno = EEXIST; /* Setup so correct error is returned to client. */
875 if (GET_FILE_CREATE_DISPOSITION(smb_ofun) == FILE_CREATE_IF_NOT_EXIST) {
879 if(!S_ISDIR(st.st_mode)) {
880 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
885 *action = FILE_WAS_OPENED;
890 * Try and create the directory.
893 if(!CAN_WRITE(conn)) {
894 DEBUG(2,("open_directory: failing create on read-only share\n"));
900 if(vfs_mkdir(conn,fname, unix_mode(conn,aDIR, fname)) < 0) {
901 DEBUG(0,("open_directory: unable to create %s. Error was %s\n",
902 fname, strerror(errno) ));
906 *action = FILE_WAS_CREATED;
912 * Don't create - just check that it *was* a directory.
916 DEBUG(0,("open_directory: unable to stat name = %s. Error was %s\n",
917 fname, strerror(errno) ));
922 if(!S_ISDIR(st.st_mode)) {
923 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
928 *action = FILE_WAS_OPENED;
931 DEBUG(5,("open_directory: opening directory %s\n",
935 * Setup the files_struct for it.
940 GetTimeOfDay(&fsp->open_time);
941 fsp->vuid = current_user.vuid;
944 fsp->can_lock = True;
945 fsp->can_read = False;
946 fsp->can_write = False;
948 fsp->print_file = False;
949 fsp->modified = False;
950 fsp->oplock_type = NO_OPLOCK;
951 fsp->sent_oplock_break = NO_BREAK_SENT;
952 fsp->is_directory = True;
953 fsp->directory_delete_on_close = False;
956 * Note that the file name here is the *untranslated* name
957 * ie. it is still in the DOS codepage sent from the client.
958 * All use of this filename will pass though the sys_xxxx
959 * functions which will do the dos_to_unix translation before
960 * mapping into a UNIX filename. JRA.
962 string_set(&fsp->fsp_name,fname);
963 fsp->wbmpx_ptr = NULL;
965 conn->num_files_open++;
970 /*******************************************************************
971 Check if the share mode on a file allows it to be deleted or unlinked.
972 Return True if sharing doesn't prevent the operation.
973 ********************************************************************/
975 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
979 share_mode_entry *old_shares = 0;
981 SMB_STRUCT_STAT sbuf;
982 pid_t pid = sys_getpid();
986 if (conn->vfs_ops.stat(conn,dos_to_unix(fname,False),&sbuf) == -1)
992 lock_share_entry(conn, dev, inode);
993 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
996 * Check if the share modes will give us access.
999 if(num_share_modes != 0)
1006 broke_oplock = False;
1007 for(i = 0; i < num_share_modes; i++)
1009 share_mode_entry *share_entry = &old_shares[i];
1012 * Break oplocks before checking share modes. See comment in
1013 * open_file_shared for details.
1014 * Check if someone has an oplock on this file. If so we must
1015 * break it before continuing.
1017 if(BATCH_OPLOCK_TYPE(share_entry->op_type))
1022 /* JRA. Try removing this code to see if the new oplock changes
1023 fix the problem. I'm dubious, but Andrew is recommending we
1028 * It appears that the NT redirector may have a bug, in that
1029 * it tries to do an SMBmv on a file that it has open with a
1030 * batch oplock, and then fails to respond to the oplock break
1031 * request. This only seems to occur when the client is doing an
1032 * SMBmv to the smbd it is using - thus we try and detect this
1033 * condition by checking if the file being moved is open and oplocked by
1034 * this smbd process, and then not sending the oplock break in this
1035 * special case. If the file was open with a deny mode that
1036 * prevents the move the SMBmv will fail anyway with a share
1037 * violation error. JRA.
1039 if(rename_op && (share_entry->pid == pid))
1042 DEBUG(0,("check_file_sharing: NT redirector workaround - rename attempted on \
1043 batch oplocked file %s, dev = %x, inode = %.0f\n", fname, (unsigned int)dev, (double)inode));
1046 * This next line is a test that allows the deny-mode
1047 * processing to be skipped. This seems to be needed as
1048 * NT insists on the rename succeeding (in Office 9x no less !).
1049 * This should be removed as soon as (a) MS fix the redirector
1050 * bug or (b) NT SMB support in Samba makes NT not issue the
1051 * call (as is my fervent hope). JRA.
1059 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1060 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
1062 /* Oplock break.... */
1063 unlock_share_entry(conn, dev, inode);
1064 if(request_oplock_break(share_entry, dev, inode) == False)
1066 free((char *)old_shares);
1068 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1069 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
1073 lock_share_entry(conn, dev, inode);
1074 broke_oplock = True;
1080 * If this is a delete request and ALLOW_SHARE_DELETE is set then allow
1081 * this to proceed. This takes precedence over share modes.
1084 if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
1088 * Someone else has a share lock on it, check to see
1092 if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) ||
1093 (share_entry->pid != pid))
1100 free((char *)old_shares);
1101 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1103 } while(broke_oplock);
1106 /* XXXX exactly what share mode combinations should be allowed for
1107 deleting/renaming? */
1109 * If we got here then either there were no share modes or
1110 * all share modes were DENY_DOS and the pid == getpid() or
1111 * delete access was requested and all share modes had the
1112 * ALLOW_SHARE_DELETE bit set (takes precedence over other
1120 unlock_share_entry(conn, dev, inode);
1121 if(old_shares != NULL)
1122 free((char *)old_shares);