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 int saved_errno = errno; /* We might get ENOSYS in the next call.. */
199 if (conn->vfs_ops.fchmod_acl(fsp, fsp->fd, mode) == -1 && errno == ENOSYS)
200 errno = saved_errno; /* Ignore ENOSYS */
206 /****************************************************************************
208 Helper for open_file_shared.
209 Truncate a file after checking locking; close file if locked.
210 **************************************************************************/
212 static int truncate_unless_locked(struct connection_struct *conn, files_struct *fsp)
214 SMB_BIG_UINT mask = (SMB_BIG_UINT)-1;
219 if (is_locked(fsp,fsp->conn,mask,0,WRITE_LOCK)){
221 unix_ERR_class = ERRDOS;
222 unix_ERR_code = ERRlock;
225 return conn->vfs_ops.ftruncate(fsp,fsp->fd,0);
229 /*******************************************************************
230 return True if the filename is one of the special executable types
231 ********************************************************************/
232 static BOOL is_executable(const char *fname)
234 if ((fname = strrchr(fname,'.'))) {
235 if (strequal(fname,".com") ||
236 strequal(fname,".dll") ||
237 strequal(fname,".exe") ||
238 strequal(fname,".sym")) {
245 enum {AFAIL,AREAD,AWRITE,AALL};
247 /*******************************************************************
248 reproduce the share mode access table
249 this is horrendoously complex, and really can't be justified on any
250 rational grounds except that this is _exactly_ what NT does. See
251 the DENY1 and DENY2 tests in smbtorture for a comprehensive set of
253 ********************************************************************/
254 static int access_table(int new_deny,int old_deny,int old_mode,
255 BOOL same_pid, BOOL isexe)
257 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
260 if (isexe && old_mode == DOS_OPEN_RDONLY &&
261 old_deny == DENY_DOS && new_deny == DENY_READ) {
264 if (!isexe && old_mode == DOS_OPEN_RDONLY &&
265 old_deny == DENY_DOS && new_deny == DENY_DOS) {
268 if (new_deny == DENY_FCB && old_deny == DENY_DOS) {
269 if (isexe) return AFAIL;
270 if (old_mode == DOS_OPEN_RDONLY) return AFAIL;
273 if (old_mode == DOS_OPEN_RDONLY && old_deny == DENY_DOS) {
274 if (new_deny == DENY_FCB || new_deny == DENY_READ) {
275 if (isexe) return AREAD;
279 if (old_deny == DENY_FCB) {
280 if (new_deny == DENY_DOS || new_deny == DENY_FCB) return AALL;
285 if (old_deny == DENY_DOS || new_deny == DENY_DOS ||
286 old_deny == DENY_FCB || new_deny == DENY_FCB) {
288 if (old_deny == DENY_FCB || new_deny == DENY_FCB) {
291 if (old_deny == DENY_DOS) {
292 if (new_deny == DENY_READ &&
293 (old_mode == DOS_OPEN_RDONLY ||
294 old_mode == DOS_OPEN_RDWR)) {
297 if (new_deny == DENY_WRITE &&
298 (old_mode == DOS_OPEN_WRONLY ||
299 old_mode == DOS_OPEN_RDWR)) {
304 if (old_deny == DENY_NONE) return AALL;
305 if (old_deny == DENY_READ) return AWRITE;
306 if (old_deny == DENY_WRITE) return AREAD;
308 /* it isn't a exe, dll, sym or com file */
309 if (old_deny == new_deny && same_pid)
312 if (old_deny == DENY_READ || new_deny == DENY_READ) return AFAIL;
313 if (old_mode == DOS_OPEN_RDONLY) return(AREAD);
321 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_RDONLY) return(AREAD);
322 if (old_deny==DENY_READ && old_mode==DOS_OPEN_RDONLY) return(AWRITE);
323 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_RDONLY) return(AALL);
326 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_WRONLY) return(AREAD);
327 if (old_deny==DENY_READ && old_mode==DOS_OPEN_WRONLY) return(AWRITE);
328 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_WRONLY) return(AALL);
331 if (old_deny==DENY_WRITE) return(AREAD);
332 if (old_deny==DENY_READ) return(AWRITE);
333 if (old_deny==DENY_NONE) return(AALL);
340 /****************************************************************************
341 check if we can open a file with a share mode
342 ****************************************************************************/
344 static int check_share_mode( share_mode_entry *share, int share_mode,
345 const char *fname, BOOL fcbopen, int *flags)
347 int deny_mode = GET_DENY_MODE(share_mode);
348 int old_open_mode = GET_OPEN_MODE(share->share_mode);
349 int old_deny_mode = GET_DENY_MODE(share->share_mode);
352 * Don't allow any opens once the delete on close flag has been
356 if (GET_DELETE_ON_CLOSE_FLAG(share->share_mode)) {
357 DEBUG(5,("check_share_mode: Failing open on file %s as delete on close flag is set.\n",
359 unix_ERR_class = ERRDOS;
360 unix_ERR_code = ERRnoaccess;
365 * If delete access was requested and the existing share mode doesn't have
366 * ALLOW_SHARE_DELETE then deny.
369 if (GET_DELETE_ACCESS_REQUESTED(share_mode) && !GET_ALLOW_SHARE_DELETE(share->share_mode)) {
370 DEBUG(5,("check_share_mode: Failing open on file %s as delete access requested and allow share delete not set.\n",
372 unix_ERR_class = ERRDOS;
373 unix_ERR_code = ERRbadshare;
379 * The inverse of the above.
380 * If delete access was granted and the new share mode doesn't have
381 * ALLOW_SHARE_DELETE then deny.
384 if (GET_DELETE_ACCESS_REQUESTED(share->share_mode) && !GET_ALLOW_SHARE_DELETE(share_mode)) {
385 DEBUG(5,("check_share_mode: Failing open on file %s as delete access granted and allow share delete not requested.\n",
387 unix_ERR_class = ERRDOS;
388 unix_ERR_code = ERRbadshare;
394 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
395 (share->pid == sys_getpid()),is_executable(fname));
397 if ((access_allowed == AFAIL) ||
398 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
399 (access_allowed == AREAD && *flags != O_RDONLY) ||
400 (access_allowed == AWRITE && *flags != O_WRONLY)) {
402 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s,fcbopen = %d, flags = %d) = %d\n",
403 deny_mode,old_deny_mode,old_open_mode,
404 (int)share->pid,fname, fcbopen, *flags, access_allowed));
406 unix_ERR_class = ERRDOS;
407 unix_ERR_code = ERRbadshare;
412 if (access_allowed == AREAD)
415 if (access_allowed == AWRITE)
423 /****************************************************************************
424 Deal with open deny mode and oplock break processing.
425 Invarient: Share mode must be locked on entry and exit.
426 Returns -1 on error, or number of share modes on success (may be zero).
427 ****************************************************************************/
429 static int open_mode_check(connection_struct *conn, const char *fname, SMB_DEV_T dev,
430 SMB_INO_T inode, int share_mode, int *p_flags, int *p_oplock_request,
431 BOOL *p_all_current_opens_are_level_II)
435 int oplock_contention_count = 0;
436 share_mode_entry *old_shares = 0;
437 BOOL fcbopen = False;
440 if(GET_OPEN_MODE(share_mode) == DOS_OPEN_FCB)
443 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
445 if(num_share_modes == 0)
449 * Check if the share modes will give us access.
454 broke_oplock = False;
455 *p_all_current_opens_are_level_II = True;
457 for(i = 0; i < num_share_modes; i++) {
458 share_mode_entry *share_entry = &old_shares[i];
461 * By observation of NetBench, oplocks are broken *before* share
462 * modes are checked. This allows a file to be closed by the client
463 * if the share mode would deny access and the client has an oplock.
464 * Check if someone has an oplock on this file. If so we must break
465 * it before continuing.
468 if((*p_oplock_request && EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) ||
469 (!*p_oplock_request && (share_entry->op_type != NO_OPLOCK))) {
473 DEBUG(5,("open_mode_check: breaking oplock (%x) on file %s, \
474 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
476 /* Oplock break - unlock to request it. */
477 unlock_share_entry(conn, dev, inode);
479 opb_ret = request_oplock_break(share_entry, dev, inode);
482 lock_share_entry(conn, dev, inode);
484 if(opb_ret == False) {
485 free((char *)old_shares);
486 DEBUG(0,("open_mode_check: FAILED when breaking oplock (%x) on file %s, \
487 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
489 unix_ERR_class = ERRDOS;
490 unix_ERR_code = ERRbadshare;
495 *p_all_current_opens_are_level_II = False;
498 } else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
499 *p_all_current_opens_are_level_II = False;
502 /* someone else has a share lock on it, check to see
505 if(check_share_mode(share_entry, share_mode, fname, fcbopen, p_flags) == False) {
506 free((char *)old_shares);
514 free((char *)old_shares);
515 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
516 oplock_contention_count++;
518 } while(broke_oplock);
521 free((char *)old_shares);
524 * Refuse to grant an oplock in case the contention limit is
525 * reached when going through the lock list multiple times.
528 if(oplock_contention_count >= lp_oplock_contention_limit(SNUM(conn))) {
529 *p_oplock_request = 0;
530 DEBUG(4,("open_mode_check: oplock contention = %d. Not granting oplock.\n",
531 oplock_contention_count ));
534 return num_share_modes;
537 /****************************************************************************
538 set a kernel flock on a file for NFS interoperability
539 this requires a patch to Linux
540 ****************************************************************************/
541 static void kernel_flock(files_struct *fsp, int deny_mode)
543 #if HAVE_KERNEL_SHARE_MODES
545 if (deny_mode == DENY_READ) kernel_mode = LOCK_MAND|LOCK_WRITE;
546 else if (deny_mode == DENY_WRITE) kernel_mode = LOCK_MAND|LOCK_READ;
547 else if (deny_mode == DENY_ALL) kernel_mode = LOCK_MAND;
548 if (kernel_mode) flock(fsp->fd, kernel_mode);
553 /****************************************************************************
554 Open a file with a share mode. On output from this open we are guarenteeing
556 ****************************************************************************/
557 files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_STAT *psbuf,
558 int share_mode,int ofun, mode_t mode,int oplock_request, int *Access,int *action)
562 int deny_mode = GET_DENY_MODE(share_mode);
563 BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
564 BOOL delete_access_requested = GET_DELETE_ACCESS_REQUESTED(share_mode);
565 BOOL file_existed = VALID_STAT(*psbuf);
566 BOOL fcbopen = False;
569 int num_share_modes = 0;
570 BOOL all_current_opens_are_level_II = False;
571 BOOL fsp_open = False;
572 files_struct *fsp = NULL;
577 /* printers are handled completely differently. Most of the passed parameters are
579 *Access = DOS_OPEN_WRONLY;
580 *action = FILE_WAS_CREATED;
581 return print_fsp_open(conn, fname);
589 fsp->conn = conn; /* The vfs_fXXX() macros need this. */
591 DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
592 fname, share_mode, ofun, (int)mode, oplock_request ));
594 if (!check_name(fname,conn)) {
599 /* ignore any oplock requests if oplocks are disabled */
600 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break) {
604 /* this is for OS/2 EAs - try and say we don't support them */
605 if (strstr(fname,".+,;=[].")) {
606 unix_ERR_class = ERRDOS;
607 /* OS/2 Workplace shell fix may be main code stream in a later release. */
608 #if 1 /* OS2_WPS_FIX - Recent versions of OS/2 need this. */
609 unix_ERR_code = ERRcannotopen;
610 #else /* OS2_WPS_FIX */
611 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
612 #endif /* OS2_WPS_FIX */
614 DEBUG(5,("open_file_shared: OS/2 EA's are not supported.\n"));
619 if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed) {
620 DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
627 if (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST)
630 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)
633 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL)
636 /* note that we ignore the append flag as
637 append does not mean the same thing under dos and unix */
639 switch (GET_OPEN_MODE(share_mode)) {
640 case DOS_OPEN_WRONLY:
656 if (GET_FILE_SYNC_OPENMODE(share_mode)) {
661 if (flags != O_RDONLY && file_existed &&
662 (!CAN_WRITE(conn) || IS_DOS_READONLY(dos_mode(conn,fname,psbuf)))) {
664 DEBUG(5,("open_file_shared: read/write access requested for file %s on read only %s\n",
665 fname, !CAN_WRITE(conn) ? "share" : "file" ));
673 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB) {
674 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
683 inode = psbuf->st_ino;
685 lock_share_entry(conn, dev, inode);
687 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
688 &flags, &oplock_request, &all_current_opens_are_level_II);
689 if(num_share_modes == -1) {
692 * This next line is a subtlety we need for MS-Access. If a file open will
693 * fail due to share permissions and also for security (access)
694 * reasons, we need to return the access failed error, not the
695 * share error. This means we must attempt to open the file anyway
696 * in order to get the UNIX access error - even if we're going to
697 * fail the open for share reasons. This is bad, as we're burning
698 * another fd if there are existing locks but there's nothing else
699 * we can do. We also ensure we're not going to create or tuncate
700 * the file as we only want an access decision at this stage. JRA.
702 open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC|O_CREAT)),mode);
704 unlock_share_entry(conn, dev, inode);
710 * We exit this block with the share entry *locked*.....
714 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
715 flags,flags2,(int)mode));
717 fsp_open = open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC)),mode);
719 if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
720 if((fsp_open = open_file(fsp,conn,fname,psbuf,O_RDONLY,mode)) == True)
726 unlock_share_entry(conn, dev, inode);
732 * Deal with the race condition where two smbd's detect the file doesn't
733 * exist and do the create at the same time. One of them will win and
734 * set a share mode, the other (ie. this one) should check if the
735 * requested share mode for this create is allowed.
740 lock_share_entry_fsp(fsp);
742 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
743 &flags, &oplock_request, &all_current_opens_are_level_II);
745 if(num_share_modes == -1) {
746 unlock_share_entry_fsp(fsp);
753 * We exit this block with the share entry *locked*.....
757 /* note that we ignore failure for the following. It is
758 basically a hack for NFS, and NFS will never set one of
759 these only read them. Nobody but Samba can ever set a deny
760 mode and we have already checked our more authoritative
761 locking database for permission to set this deny mode. If
762 the kernel refuses the operations then the kernel is wrong */
763 kernel_flock(fsp, deny_mode);
766 * At this point onwards, we can guarentee that the share entry
767 * is locked, whether we created the file or not, and that the
768 * deny mode is compatible with all current opens.
772 * If requested, truncate the file.
775 if (flags2&O_TRUNC) {
777 * We are modifing the file after open - update the stat struct..
779 if ((truncate_unless_locked(conn,fsp) == -1) || (vfs_fstat(fsp,fsp->fd,psbuf)==-1)) {
780 unlock_share_entry_fsp(fsp);
789 open_mode = DOS_OPEN_RDONLY;
792 open_mode = DOS_OPEN_RDWR;
795 open_mode = DOS_OPEN_WRONLY;
799 fsp->share_mode = SET_DENY_MODE(deny_mode) |
800 SET_OPEN_MODE(open_mode) |
801 SET_ALLOW_SHARE_DELETE(allow_share_delete) |
802 SET_DELETE_ACCESS_REQUESTED(delete_access_requested);
804 DEBUG(10,("open_file_shared : share_mode = %x\n", fsp->share_mode ));
807 (*Access) = open_mode;
810 if (file_existed && !(flags2 & O_TRUNC))
811 *action = FILE_WAS_OPENED;
813 *action = FILE_WAS_CREATED;
814 if (file_existed && (flags2 & O_TRUNC))
815 *action = FILE_WAS_OVERWRITTEN;
819 * Setup the oplock info in both the shared memory and
823 if(oplock_request && (num_share_modes == 0) &&
824 !IS_VETO_OPLOCK_PATH(conn,fname) && set_file_oplock(fsp, oplock_request) ) {
825 port = global_oplock_port;
826 } else if (oplock_request && all_current_opens_are_level_II) {
827 port = global_oplock_port;
828 oplock_request = LEVEL_II_OPLOCK;
829 set_file_oplock(fsp, oplock_request);
835 set_share_mode(fsp, port, oplock_request);
837 unlock_share_entry_fsp(fsp);
839 conn->num_files_open++;
844 /****************************************************************************
845 Open a file for permissions read only. Return a pseudo file entry
846 with the 'stat_open' flag set
847 ****************************************************************************/
849 files_struct *open_file_stat(connection_struct *conn, char *fname,
850 SMB_STRUCT_STAT *psbuf, int smb_ofun, int *action)
852 extern struct current_user current_user;
853 files_struct *fsp = NULL;
855 if (!VALID_STAT(*psbuf)) {
856 DEBUG(0,("open_file_stat: unable to stat name = %s. Error was %s\n", fname, strerror(errno) ));
860 if(S_ISDIR(psbuf->st_mode)) {
861 DEBUG(0,("open_file_stat: %s is a directory !\n", fname ));
869 *action = FILE_WAS_OPENED;
871 DEBUG(5,("open_file_stat: opening file %s as a stat entry\n", fname));
874 * Setup the files_struct for it.
878 fsp->mode = psbuf->st_mode;
879 fsp->inode = psbuf->st_ino;
880 fsp->dev = psbuf->st_dev;
881 GetTimeOfDay(&fsp->open_time);
882 fsp->size = psbuf->st_size;
883 fsp->vuid = current_user.vuid;
885 fsp->can_lock = False;
886 fsp->can_read = False;
887 fsp->can_write = False;
889 fsp->print_file = False;
890 fsp->modified = False;
891 fsp->oplock_type = NO_OPLOCK;
892 fsp->sent_oplock_break = NO_BREAK_SENT;
893 fsp->is_directory = False;
894 fsp->stat_open = True;
895 fsp->directory_delete_on_close = False;
898 * Note that the file name here is the *untranslated* name
899 * ie. it is still in the DOS codepage sent from the client.
900 * All use of this filename will pass though the sys_xxxx
901 * functions which will do the dos_to_unix translation before
902 * mapping into a UNIX filename. JRA.
904 string_set(&fsp->fsp_name,fname);
905 fsp->wbmpx_ptr = NULL;
906 fsp->wcp = NULL; /* Write cache pointer. */
908 conn->num_files_open++;
913 /****************************************************************************
914 Open a directory from an NT SMB call.
915 ****************************************************************************/
917 files_struct *open_directory(connection_struct *conn, char *fname,
918 SMB_STRUCT_STAT *psbuf, int smb_ofun, mode_t unixmode, int *action)
920 extern struct current_user current_user;
921 BOOL got_stat = False;
922 files_struct *fsp = file_new();
927 fsp->conn = conn; /* THe vfs_fXXX() macros need this. */
929 if (VALID_STAT(*psbuf))
932 if (got_stat && (GET_FILE_OPEN_DISPOSITION(smb_ofun) == FILE_EXISTS_FAIL)) {
934 errno = EEXIST; /* Setup so correct error is returned to client. */
938 if (GET_FILE_CREATE_DISPOSITION(smb_ofun) == FILE_CREATE_IF_NOT_EXIST) {
942 if(!S_ISDIR(psbuf->st_mode)) {
943 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
948 *action = FILE_WAS_OPENED;
953 * Try and create the directory.
956 if(!CAN_WRITE(conn)) {
957 DEBUG(2,("open_directory: failing create on read-only share\n"));
963 if(vfs_mkdir(conn,fname, unix_mode(conn,aDIR, fname)) < 0) {
964 DEBUG(0,("open_directory: unable to create %s. Error was %s\n",
965 fname, strerror(errno) ));
970 if(vfs_stat(conn,fname, psbuf) != 0) {
975 *action = FILE_WAS_CREATED;
981 * Don't create - just check that it *was* a directory.
985 DEBUG(0,("open_directory: unable to stat name = %s. Error was %s\n",
986 fname, strerror(errno) ));
991 if(!S_ISDIR(psbuf->st_mode)) {
992 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
997 *action = FILE_WAS_OPENED;
1000 DEBUG(5,("open_directory: opening directory %s\n", fname));
1003 * Setup the files_struct for it.
1007 fsp->mode = psbuf->st_mode;
1008 fsp->inode = psbuf->st_ino;
1009 fsp->dev = psbuf->st_dev;
1010 GetTimeOfDay(&fsp->open_time);
1011 fsp->size = psbuf->st_size;
1012 fsp->vuid = current_user.vuid;
1014 fsp->can_lock = True;
1015 fsp->can_read = False;
1016 fsp->can_write = False;
1017 fsp->share_mode = 0;
1018 fsp->print_file = False;
1019 fsp->modified = False;
1020 fsp->oplock_type = NO_OPLOCK;
1021 fsp->sent_oplock_break = NO_BREAK_SENT;
1022 fsp->is_directory = True;
1023 fsp->directory_delete_on_close = False;
1026 * Note that the file name here is the *untranslated* name
1027 * ie. it is still in the DOS codepage sent from the client.
1028 * All use of this filename will pass though the sys_xxxx
1029 * functions which will do the dos_to_unix translation before
1030 * mapping into a UNIX filename. JRA.
1032 string_set(&fsp->fsp_name,fname);
1033 fsp->wbmpx_ptr = NULL;
1035 conn->num_files_open++;
1040 /*******************************************************************
1041 Check if the share mode on a file allows it to be deleted or unlinked.
1042 Return True if sharing doesn't prevent the operation.
1043 ********************************************************************/
1045 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
1049 share_mode_entry *old_shares = 0;
1050 int num_share_modes;
1051 SMB_STRUCT_STAT sbuf;
1052 pid_t pid = sys_getpid();
1056 if (vfs_stat(conn,fname,&sbuf) == -1)
1060 inode = sbuf.st_ino;
1062 lock_share_entry(conn, dev, inode);
1063 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1066 * Check if the share modes will give us access.
1069 if(num_share_modes != 0)
1076 broke_oplock = False;
1077 for(i = 0; i < num_share_modes; i++)
1079 share_mode_entry *share_entry = &old_shares[i];
1082 * Break oplocks before checking share modes. See comment in
1083 * open_file_shared for details.
1084 * Check if someone has an oplock on this file. If so we must
1085 * break it before continuing.
1087 if(BATCH_OPLOCK_TYPE(share_entry->op_type))
1092 /* JRA. Try removing this code to see if the new oplock changes
1093 fix the problem. I'm dubious, but Andrew is recommending we
1098 * It appears that the NT redirector may have a bug, in that
1099 * it tries to do an SMBmv on a file that it has open with a
1100 * batch oplock, and then fails to respond to the oplock break
1101 * request. This only seems to occur when the client is doing an
1102 * SMBmv to the smbd it is using - thus we try and detect this
1103 * condition by checking if the file being moved is open and oplocked by
1104 * this smbd process, and then not sending the oplock break in this
1105 * special case. If the file was open with a deny mode that
1106 * prevents the move the SMBmv will fail anyway with a share
1107 * violation error. JRA.
1109 if(rename_op && (share_entry->pid == pid))
1112 DEBUG(0,("check_file_sharing: NT redirector workaround - rename attempted on \
1113 batch oplocked file %s, dev = %x, inode = %.0f\n", fname, (unsigned int)dev, (double)inode));
1116 * This next line is a test that allows the deny-mode
1117 * processing to be skipped. This seems to be needed as
1118 * NT insists on the rename succeeding (in Office 9x no less !).
1119 * This should be removed as soon as (a) MS fix the redirector
1120 * bug or (b) NT SMB support in Samba makes NT not issue the
1121 * call (as is my fervent hope). JRA.
1129 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1130 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
1132 /* Oplock break.... */
1133 unlock_share_entry(conn, dev, inode);
1134 if(request_oplock_break(share_entry, dev, inode) == False)
1136 free((char *)old_shares);
1138 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1139 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
1143 lock_share_entry(conn, dev, inode);
1144 broke_oplock = True;
1150 * If this is a delete request and ALLOW_SHARE_DELETE is set then allow
1151 * this to proceed. This takes precedence over share modes.
1154 if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
1158 * Someone else has a share lock on it, check to see
1162 if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) ||
1163 (share_entry->pid != pid))
1170 free((char *)old_shares);
1171 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1173 } while(broke_oplock);
1176 /* XXXX exactly what share mode combinations should be allowed for
1177 deleting/renaming? */
1179 * If we got here then either there were no share modes or
1180 * all share modes were DENY_DOS and the pid == getpid() or
1181 * delete access was requested and all share modes had the
1182 * ALLOW_SHARE_DELETE bit set (takes precedence over other
1190 unlock_share_entry(conn, dev, inode);
1191 if(old_shares != NULL)
1192 free((char *)old_shares);