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 pstring sesssetup_user;
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_attempt_open(char *fname, int flags, mode_t mode)
36 int fd = dos_open(fname,flags,mode);
38 /* Fix for files ending in '.' */
39 if((fd == -1) && (errno == ENOENT) &&
40 (strchr(fname,'.')==NULL))
43 fd = dos_open(fname,flags,mode);
46 #if (defined(ENAMETOOLONG) && defined(HAVE_PATHCONF))
47 if ((fd == -1) && (errno == ENAMETOOLONG))
50 char *p = strrchr(fname, '/');
52 if (p == fname) /* name is "/xxx" */
54 max_len = pathconf("/", _PC_NAME_MAX);
57 else if ((p == NULL) || (p == fname))
60 max_len = pathconf(".", _PC_NAME_MAX);
65 max_len = pathconf(fname, _PC_NAME_MAX);
69 if (strlen(p) > max_len)
71 char tmp = p[max_len];
74 if ((fd = dos_open(fname,flags,mode)) == -1)
82 /****************************************************************************
83 Cache a uid_t currently with this file open. This is an optimization only
84 used when multiple sessionsetup's have been done to one smbd.
85 ****************************************************************************/
87 void fd_add_to_uid_cache(file_fd_struct *fd_ptr, uid_t u)
89 if(fd_ptr->uid_cache_count >= sizeof(fd_ptr->uid_users_cache)/sizeof(uid_t))
91 fd_ptr->uid_users_cache[fd_ptr->uid_cache_count++] = u;
94 /****************************************************************************
95 Remove a uid_t that currently has this file open. This is an optimization only
96 used when multiple sessionsetup's have been done to one smbd.
97 ****************************************************************************/
99 static void fd_remove_from_uid_cache(file_fd_struct *fd_ptr, uid_t u)
102 for(i = 0; i < fd_ptr->uid_cache_count; i++)
103 if(fd_ptr->uid_users_cache[i] == u) {
104 if(i < (fd_ptr->uid_cache_count-1))
105 memmove((char *)&fd_ptr->uid_users_cache[i], (char *)&fd_ptr->uid_users_cache[i+1],
106 sizeof(uid_t)*(fd_ptr->uid_cache_count-1-i) );
107 fd_ptr->uid_cache_count--;
112 /****************************************************************************
113 Check if a uid_t that currently has this file open is present. This is an
114 optimization only used when multiple sessionsetup's have been done to one smbd.
115 ****************************************************************************/
117 static BOOL fd_is_in_uid_cache(file_fd_struct *fd_ptr, uid_t u)
120 for(i = 0; i < fd_ptr->uid_cache_count; i++)
121 if(fd_ptr->uid_users_cache[i] == u)
126 /****************************************************************************
127 fd support routines - attempt to re-open an already open fd as O_RDWR.
128 Save the already open fd (we cannot close due to POSIX file locking braindamage.
129 ****************************************************************************/
131 static void fd_attempt_reopen(char *fname, mode_t mode, file_fd_struct *fd_ptr)
133 int fd = dos_open( fname, O_RDWR, mode);
138 if(fd_ptr->real_open_flags == O_RDONLY)
139 fd_ptr->fd_readonly = fd_ptr->fd;
140 if(fd_ptr->real_open_flags == O_WRONLY)
141 fd_ptr->fd_writeonly = fd_ptr->fd;
144 fd_ptr->real_open_flags = O_RDWR;
147 /****************************************************************************
148 fd support routines - attempt to close the file referenced by this fd.
149 Decrements the ref_count and returns it.
150 ****************************************************************************/
152 uint16 fd_attempt_close(file_fd_struct *fd_ptr, int *err_ret)
154 extern struct current_user current_user;
155 uint16 ret_ref = fd_ptr->ref_count;
159 DEBUG(3,("fd_attempt_close fd = %d, dev = %x, inode = %.0f, open_flags = %d, ref_count = %d.\n",
160 fd_ptr->fd, (unsigned int)fd_ptr->dev, (double)fd_ptr->inode,
161 fd_ptr->real_open_flags,
164 SMB_ASSERT(fd_ptr->ref_count != 0);
167 ret_ref = fd_ptr->ref_count;
169 if(fd_ptr->ref_count == 0) {
171 if(fd_ptr->fd != -1) {
172 if(close(fd_ptr->fd) < 0)
176 if(fd_ptr->fd_readonly != -1) {
177 if(close(fd_ptr->fd_readonly) < 0) {
183 if(fd_ptr->fd_writeonly != -1) {
184 if( close(fd_ptr->fd_writeonly) < 0) {
191 * Delete this fd_ptr.
195 fd_remove_from_uid_cache(fd_ptr, (uid_t)current_user.uid);
201 /****************************************************************************
202 fd support routines - check that current user has permissions
203 to open this file. Used when uid not found in optimization cache.
204 This is really ugly code, as due to POSIX locking braindamage we must
205 fork and then attempt to open the file, and return success or failure
207 ****************************************************************************/
209 static BOOL check_access_allowed_for_current_user( char *fname, int accmode )
214 * We need to temporarily stop CatchChild from eating
215 * SIGCLD signals as it also eats the exit status code. JRA.
218 CatchChildLeaveStatus();
220 if((child_pid = fork()) < 0) {
221 DEBUG(0,("check_access_allowed_for_current_user: fork failed.\n"));
233 while ((wpid = sys_waitpid(child_pid, &status_code, 0)) < 0) {
238 DEBUG(0,("check_access_allowed_for_current_user: The process \
239 is no longer waiting ! Error = %s\n", strerror(errno) ));
245 * Go back to ignoring children.
249 if (child_pid != wpid) {
250 DEBUG(0,("check_access_allowed_for_current_user: We were waiting for the wrong process ID\n"));
253 #if defined(WIFEXITED) && defined(WEXITSTATUS)
254 if (WIFEXITED(status_code) == 0) {
255 DEBUG(0,("check_access_allowed_for_current_user: The process exited while we were waiting\n"));
258 if (WEXITSTATUS(status_code) != 0) {
259 DEBUG(9,("check_access_allowed_for_current_user: The status of the process exiting was %d. Returning access denied.\n", status_code));
262 #else /* defined(WIFEXITED) && defined(WEXITSTATUS) */
263 if(status_code != 0) {
264 DEBUG(9,("check_access_allowed_for_current_user: The status of the process exiting was %d. Returning access denied.\n", status_code));
267 #endif /* defined(WIFEXITED) && defined(WEXITSTATUS) */
270 * Success - the child could open the file.
272 DEBUG(9,("check_access_allowed_for_current_user: The status of the process exiting was %d. Returning access allowed.\n", status_code));
279 DEBUG(9,("check_access_allowed_for_current_user: Child - attempting to open %s with mode %d.\n", fname, accmode ));
280 if((fd = fd_attempt_open( fname, accmode, 0)) < 0) {
285 DEBUG(9,("check_access_allowed_for_current_user: Child - returning ok.\n"));
292 /****************************************************************************
293 check a filename for the pipe string
294 ****************************************************************************/
296 static void check_for_pipe(char *fname)
298 /* special case of pipe opens */
300 StrnCpy(s,fname,sizeof(s)-1);
302 if (strstr(s,"pipe/")) {
303 DEBUG(3,("Rejecting named pipe open for %s\n",fname));
304 unix_ERR_class = ERRSRV;
305 unix_ERR_code = ERRaccess;
309 /****************************************************************************
311 ****************************************************************************/
313 static void open_file(files_struct *fsp,connection_struct *conn,
314 char *fname1,int flags,mode_t mode, SMB_STRUCT_STAT *sbuf)
316 extern struct current_user current_user;
318 SMB_STRUCT_STAT statbuf;
319 file_fd_struct *fd_ptr;
320 int accmode = (flags & O_ACCMODE);
324 fsp->oplock_type = NO_OPLOCK;
327 pstrcpy(fname,fname1);
329 /* check permissions */
332 * This code was changed after seeing a client open request
333 * containing the open mode of (DENY_WRITE/read-only) with
334 * the 'create if not exist' bit set. The previous code
335 * would fail to open the file read only on a read-only share
336 * as it was checking the flags parameter directly against O_RDONLY,
337 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
341 if (!CAN_WRITE(conn) && !conn->printer) {
342 /* It's a read-only share - fail if we wanted to write. */
343 if(accmode != O_RDONLY) {
344 DEBUG(3,("Permission denied opening %s\n",fname));
345 check_for_pipe(fname);
347 } else if(flags & O_CREAT) {
348 /* We don't want to write - but we must make sure that O_CREAT
349 doesn't create the file if we have write access into the
356 /* this handles a bug in Win95 - it doesn't say to create the file when it
359 flags |= (O_CREAT|O_EXCL);
363 if (flags == O_WRONLY)
364 DEBUG(3,("Bug in client? Set O_WRONLY without O_CREAT\n"));
368 * Ensure we have a valid struct stat so we can search the
372 if(dos_stat(fname, &statbuf) < 0) {
373 if(errno != ENOENT) {
374 DEBUG(3,("Error doing stat on file %s (%s)\n",
375 fname,strerror(errno)));
377 check_for_pipe(fname);
387 * Check to see if we have this file already
388 * open. If we do, just use the already open fd and increment the
389 * reference count (fd_get_already_open increments the ref_count).
391 if((fd_ptr = fd_get_already_open(sbuf))!= 0) {
393 * File was already open.
397 * Check it wasn't open for exclusive use.
399 if((flags & O_CREAT) && (flags & O_EXCL)) {
406 * Ensure that the user attempting to open
407 * this file has permissions to do so, if
408 * the user who originally opened the file wasn't
409 * the same as the current user.
412 if(!fd_is_in_uid_cache(fd_ptr, (uid_t)current_user.uid)) {
413 if(!check_access_allowed_for_current_user( fname, accmode )) {
414 /* Error - permission denied. */
415 DEBUG(3,("Permission denied opening file %s (flags=%d, accmode = %d)\n",
416 fname, flags, accmode));
417 /* Ensure the ref_count is decremented. */
419 fd_remove_from_uid_cache(fd_ptr, (uid_t)current_user.uid);
425 fd_add_to_uid_cache(fd_ptr, (uid_t)current_user.uid);
428 * If not opened O_RDWR try
429 * and do that here - a chmod may have been done
430 * between the last open and now.
432 if(fd_ptr->real_open_flags != O_RDWR)
433 fd_attempt_reopen(fname, mode, fd_ptr);
436 * Ensure that if we wanted write access
437 * it has been opened for write, and if we wanted read it
440 if(((accmode == O_WRONLY) && (fd_ptr->real_open_flags == O_RDONLY)) ||
441 ((accmode == O_RDONLY) && (fd_ptr->real_open_flags == O_WRONLY)) ||
442 ((accmode == O_RDWR) && (fd_ptr->real_open_flags != O_RDWR))) {
443 DEBUG(3,("Error opening (already open for flags=%d) file %s (%s) (flags=%d)\n",
444 fd_ptr->real_open_flags, fname,strerror(EACCES),flags));
445 check_for_pipe(fname);
446 fd_remove_from_uid_cache(fd_ptr, (uid_t)current_user.uid);
453 /* We need to allocate a new file_fd_struct (this increments the
455 if((fd_ptr = fd_get_new()) == 0)
458 * Whatever the requested flags, attempt read/write access,
459 * as we don't know what flags future file opens may require.
460 * If this fails, try again with the required flags.
461 * Even if we open read/write when only read access was
462 * requested the setting of the can_write flag in
463 * the file_struct will protect us from errant
464 * write requests. We never need to worry about O_APPEND
465 * as this is not set anywhere in Samba.
467 fd_ptr->real_open_flags = O_RDWR;
468 /* Set the flags as needed without the read/write modes. */
469 open_flags = flags & ~(O_RDWR|O_WRONLY|O_RDONLY);
470 fd_ptr->fd = fd_attempt_open(fname, open_flags|O_RDWR, mode);
472 * On some systems opening a file for R/W access on a read only
473 * filesystems sets errno to EROFS.
476 if((fd_ptr->fd == -1) && ((errno == EACCES) || (errno == EROFS))) {
478 if((fd_ptr->fd == -1) && (errno == EACCES)) {
480 if(accmode != O_RDWR) {
481 fd_ptr->fd = fd_attempt_open(fname, open_flags|accmode, mode);
482 fd_ptr->real_open_flags = accmode;
487 if ((fd_ptr->fd >=0) &&
488 conn->printer && lp_minprintspace(SNUM(conn))) {
490 SMB_BIG_UINT dum1,dum2,dum3;
492 pstrcpy(dname,fname);
493 p = strrchr(dname,'/');
495 if (sys_disk_free(dname,False,&dum1,&dum2,&dum3) < (SMB_BIG_UINT)lp_minprintspace(SNUM(conn))) {
497 if(fd_attempt_close(fd_ptr, &err) == 0)
508 DEBUG(3,("Error opening file %s (%s) (flags=%d)\n",
509 fname,strerror(errno),flags));
510 /* Ensure the ref_count is decremented. */
511 fd_attempt_close(fd_ptr,&err);
512 check_for_pipe(fname);
520 if(sys_fstat(fd_ptr->fd, &statbuf) == -1) {
522 /* Error - backout !! */
523 DEBUG(3,("Error doing fstat on fd %d, file %s (%s)\n",
524 fd_ptr->fd, fname,strerror(errno)));
525 /* Ensure the ref_count is decremented. */
526 fd_attempt_close(fd_ptr,&err);
532 /* Set the correct entries in fd_ptr. */
533 fd_ptr->dev = sbuf->st_dev;
534 fd_ptr->inode = sbuf->st_ino;
536 fsp->fd_ptr = fd_ptr;
537 conn->num_files_open++;
538 fsp->mode = sbuf->st_mode;
539 GetTimeOfDay(&fsp->open_time);
540 fsp->vuid = current_user.vuid;
544 fsp->can_lock = True;
545 fsp->can_read = ((flags & O_WRONLY)==0);
546 fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
548 fsp->print_file = conn->printer;
549 fsp->modified = False;
550 fsp->oplock_type = NO_OPLOCK;
551 fsp->sent_oplock_break = NO_BREAK_SENT;
552 fsp->is_directory = False;
553 fsp->stat_open = False;
554 fsp->directory_delete_on_close = False;
557 * Note that the file name here is the *untranslated* name
558 * ie. it is still in the DOS codepage sent from the client.
559 * All use of this filename will pass though the sys_xxxx
560 * functions which will do the dos_to_unix translation before
561 * mapping into a UNIX filename. JRA.
563 string_set(&fsp->fsp_name,fname);
564 fsp->wbmpx_ptr = NULL;
565 fsp->wcp = NULL; /* Write cache pointer. */
568 * If the printer is marked as postscript output a leading
569 * file identifier to ensure the file is treated as a raw
571 * This has a similar effect as CtrlD=0 in WIN.INI file.
572 * tim@fsg.com 09/06/94
574 if (fsp->print_file && lp_postscript(SNUM(conn)) && fsp->can_write) {
575 DEBUG(3,("Writing postscript line\n"));
576 write_file(fsp,"%!\n",-1,3);
579 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
580 *sesssetup_user ? sesssetup_user : conn->user,fsp->fsp_name,
581 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
582 conn->num_files_open));
587 /****************************************************************************
589 Helper for open_file_shared.
590 Truncate a file after checking locking; close file if locked.
591 **************************************************************************/
593 static void truncate_unless_locked(files_struct *fsp, connection_struct *conn, int token,
597 SMB_OFF_T mask2 = ((SMB_OFF_T)0x3) << (SMB_OFF_T_BITS-4);
598 SMB_OFF_T mask = (mask2<<2);
600 if (is_locked(fsp,conn,~mask,0,WRITE_LOCK)){
601 /* If share modes are in force for this connection we
602 have the share entry locked. Unlock it before closing. */
603 if (*share_locked && lp_share_modes(SNUM(conn)))
604 unlock_share_entry( conn, fsp->fd_ptr->dev,
606 close_file(fsp,False);
607 /* Share mode no longer locked. */
608 *share_locked = False;
610 unix_ERR_class = ERRDOS;
611 unix_ERR_code = ERRlock;
613 sys_ftruncate(fsp->fd_ptr->fd,0);
619 /*******************************************************************
620 return True if the filename is one of the special executable types
621 ********************************************************************/
622 static BOOL is_executable(char *fname)
624 if ((fname = strrchr(fname,'.'))) {
625 if (strequal(fname,".com") ||
626 strequal(fname,".dll") ||
627 strequal(fname,".exe") ||
628 strequal(fname,".sym")) {
635 enum {AFAIL,AREAD,AWRITE,AALL};
637 /*******************************************************************
638 reproduce the share mode access table
639 this is horrendoously complex, and really can't be justified on any
640 rational grounds except that this is _exactly_ what NT does. See
641 the DENY1 and DENY2 tests in smbtorture for a comprehensive set of
643 ********************************************************************/
644 static int access_table(int new_deny,int old_deny,int old_mode,
645 BOOL same_pid, BOOL isexe)
647 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
650 if (isexe && old_mode == O_RDONLY &&
651 old_deny == DENY_DOS && new_deny == DENY_READ) {
654 if (!isexe && old_mode == O_RDONLY &&
655 old_deny == DENY_DOS && new_deny == DENY_DOS) {
658 if (new_deny == DENY_FCB && old_deny == DENY_DOS) {
659 if (isexe) return AFAIL;
660 if (old_mode == DOS_OPEN_RDONLY) return AFAIL;
663 if (old_mode == O_RDONLY && old_deny == DENY_DOS) {
664 if (new_deny == DENY_FCB || new_deny == DENY_READ) {
665 if (isexe) return AREAD;
669 if (old_deny == DENY_FCB) {
670 if (new_deny == DENY_DOS || new_deny == DENY_FCB) return AALL;
675 if (old_deny == DENY_DOS || new_deny == DENY_DOS ||
676 old_deny == DENY_FCB || new_deny == DENY_FCB) {
678 if (old_deny == DENY_FCB || new_deny == DENY_FCB) {
681 if (old_deny == DENY_DOS) {
682 if (new_deny == DENY_READ &&
683 (old_mode == DOS_OPEN_RDONLY ||
684 old_mode == DOS_OPEN_RDWR)) {
687 if (new_deny == DENY_WRITE &&
688 (old_mode == DOS_OPEN_WRONLY ||
689 old_mode == DOS_OPEN_RDWR)) {
694 if (old_deny == DENY_NONE) return AALL;
695 if (old_deny == DENY_READ) return AWRITE;
696 if (old_deny == DENY_WRITE) return AREAD;
698 /* it isn't a exe, dll, sym or com file */
699 if (old_deny == new_deny && same_pid)
702 if (old_deny == DENY_READ || new_deny == DENY_READ) return AFAIL;
703 if (old_mode == DOS_OPEN_RDONLY) return(AREAD);
711 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_RDONLY) return(AREAD);
712 if (old_deny==DENY_READ && old_mode==DOS_OPEN_RDONLY) return(AWRITE);
713 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_RDONLY) return(AALL);
716 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_WRONLY) return(AREAD);
717 if (old_deny==DENY_READ && old_mode==DOS_OPEN_WRONLY) return(AWRITE);
718 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_WRONLY) return(AALL);
721 if (old_deny==DENY_WRITE) return(AREAD);
722 if (old_deny==DENY_READ) return(AWRITE);
723 if (old_deny==DENY_NONE) return(AALL);
730 /****************************************************************************
731 check if we can open a file with a share mode
732 ****************************************************************************/
734 static int check_share_mode( share_mode_entry *share, int deny_mode,
736 BOOL fcbopen, int *flags)
738 int old_open_mode = GET_OPEN_MODE(share->share_mode);
739 int old_deny_mode = GET_DENY_MODE(share->share_mode);
742 * Don't allow any open once the delete on close flag has been
746 if(GET_DELETE_ON_CLOSE_FLAG(share->share_mode))
748 DEBUG(5,("check_share_mode: Failing open on file %s as delete on close flag is set.\n",
750 unix_ERR_class = ERRDOS;
751 unix_ERR_code = ERRnoaccess;
756 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
757 (share->pid == getpid()),is_executable(fname));
759 if ((access_allowed == AFAIL) ||
760 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
761 (access_allowed == AREAD && *flags != O_RDONLY) ||
762 (access_allowed == AWRITE && *flags != O_WRONLY))
764 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s,fcbopen = %d, flags = %d) = %d\n",
765 deny_mode,old_deny_mode,old_open_mode,
766 (int)share->pid,fname, fcbopen, *flags, access_allowed));
768 unix_ERR_class = ERRDOS;
769 unix_ERR_code = ERRbadshare;
774 if (access_allowed == AREAD)
777 if (access_allowed == AWRITE)
785 /****************************************************************************
786 open a file with a share mode
787 ****************************************************************************/
789 void open_file_shared(files_struct *fsp,connection_struct *conn,char *fname,int share_mode,int ofun,
790 mode_t mode,int oplock_request, int *Access,int *action)
794 int deny_mode = GET_DENY_MODE(share_mode);
795 BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
796 SMB_STRUCT_STAT sbuf;
797 BOOL file_existed = dos_file_exist(fname,&sbuf);
798 BOOL share_locked = False;
799 BOOL fcbopen = False;
803 int num_share_modes = 0;
804 int oplock_contention_count = 0;
805 BOOL all_current_opens_are_level_II = False;
809 DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
810 fname, share_mode, ofun, (int)mode, oplock_request ));
813 /* ignore any oplock requests if oplocks are disabled */
814 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break) {
818 /* this is for OS/2 EAs - try and say we don't support them */
819 if (strstr(fname,".+,;=[]."))
821 unix_ERR_class = ERRDOS;
822 /* OS/2 Workplace shell fix may be main code stream in a later release. */
823 #if 1 /* OS2_WPS_FIX - Recent versions of OS/2 need this. */
824 unix_ERR_code = ERRcannotopen;
825 #else /* OS2_WPS_FIX */
826 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
827 #endif /* OS2_WPS_FIX */
829 DEBUG(5,("open_file_shared: OS/2 EA's are not supported.\n"));
833 if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed)
835 DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
841 if (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST)
844 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)
847 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL)
850 /* note that we ignore the append flag as
851 append does not mean the same thing under dos and unix */
853 switch (GET_OPEN_MODE(share_mode))
855 case DOS_OPEN_WRONLY:
871 if (GET_FILE_SYNC_OPENMODE(share_mode)) {
876 if (flags != O_RDONLY && file_existed &&
877 (!CAN_WRITE(conn) || IS_DOS_READONLY(dos_mode(conn,fname,&sbuf))))
881 DEBUG(5,("open_file_shared: read/write access requested for file %s on read only %s\n",
882 fname, !CAN_WRITE(conn) ? "share" : "file" ));
889 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB)
891 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
896 if (lp_share_modes(SNUM(conn)))
899 share_mode_entry *old_shares = 0;
905 lock_share_entry(conn, dev, inode);
907 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
911 * Check if the share modes will give us access.
914 if(share_locked && (num_share_modes != 0))
921 broke_oplock = False;
922 all_current_opens_are_level_II = True;
924 for(i = 0; i < num_share_modes; i++)
926 share_mode_entry *share_entry = &old_shares[i];
929 * By observation of NetBench, oplocks are broken *before* share
930 * modes are checked. This allows a file to be closed by the client
931 * if the share mode would deny access and the client has an oplock.
932 * Check if someone has an oplock on this file. If so we must break
933 * it before continuing.
935 if((oplock_request && EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) ||
936 (!oplock_request && (share_entry->op_type != NO_OPLOCK)))
939 DEBUG(5,("open_file_shared: breaking oplock (%x) on file %s, \
940 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
942 /* Oplock break.... */
943 unlock_share_entry(conn, dev, inode);
944 if(request_oplock_break(share_entry, dev, inode) == False)
946 free((char *)old_shares);
948 DEBUG(0,("open_file_shared: FAILED when breaking oplock (%x) on file %s, \
949 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
952 unix_ERR_class = ERRDOS;
953 unix_ERR_code = ERRbadshare;
956 lock_share_entry(conn, dev, inode);
958 all_current_opens_are_level_II = False;
960 } else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
961 all_current_opens_are_level_II = False;
964 /* someone else has a share lock on it, check to see
966 if(check_share_mode(share_entry, deny_mode, fname, fcbopen, &flags) == False)
968 free((char *)old_shares);
969 unlock_share_entry(conn, dev, inode);
978 free((char *)old_shares);
979 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
980 oplock_contention_count++;
982 } while(broke_oplock);
986 free((char *)old_shares);
990 * Refuse to grant an oplock in case the contention limit is
991 * reached when going through the lock list multiple times.
994 if(oplock_contention_count >= lp_oplock_contention_limit(SNUM(conn)))
997 DEBUG(4,("open_file_shared: oplock contention = %d. Not granting oplock.\n",
998 oplock_contention_count ));
1001 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
1002 flags,flags2,(int)mode));
1004 open_file(fsp,conn,fname,flags|(flags2&~(O_TRUNC)),mode,file_existed ? &sbuf : 0);
1005 if (!fsp->open && flags==O_RDWR && errno!=ENOENT && fcbopen)
1008 open_file(fsp,conn,fname,flags,mode,file_existed ? &sbuf : 0 );
1015 if((share_locked == False) && lp_share_modes(SNUM(conn)))
1017 /* We created the file - thus we must now lock the share entry before creating it. */
1018 dev = fsp->fd_ptr->dev;
1019 inode = fsp->fd_ptr->inode;
1020 lock_share_entry(conn, dev, inode);
1021 share_locked = True;
1027 open_mode = DOS_OPEN_RDONLY;
1030 open_mode = DOS_OPEN_RDWR;
1033 open_mode = DOS_OPEN_WRONLY;
1037 fsp->share_mode = SET_DENY_MODE(deny_mode) |
1038 SET_OPEN_MODE(open_mode) |
1039 SET_ALLOW_SHARE_DELETE(allow_share_delete);
1042 (*Access) = open_mode;
1046 if (file_existed && !(flags2 & O_TRUNC)) *action = FILE_WAS_OPENED;
1047 if (!file_existed) *action = FILE_WAS_CREATED;
1048 if (file_existed && (flags2 & O_TRUNC)) *action = FILE_WAS_OVERWRITTEN;
1050 /* We must create the share mode entry before truncate as
1051 truncate can fail due to locking and have to close the
1052 file (which expects the share_mode_entry to be there).
1054 if (lp_share_modes(SNUM(conn)))
1059 * Setup the oplock info in both the shared memory and
1063 if(oplock_request && (num_share_modes == 0) &&
1064 !IS_VETO_OPLOCK_PATH(conn,fname) && set_file_oplock(fsp, oplock_request) ) {
1065 port = global_oplock_port;
1066 } else if (oplock_request && all_current_opens_are_level_II) {
1067 port = global_oplock_port;
1068 oplock_request = LEVEL_II_OPLOCK;
1069 set_file_oplock(fsp, oplock_request);
1075 set_share_mode(fsp, port, oplock_request);
1078 if ((flags2&O_TRUNC) && file_existed)
1079 truncate_unless_locked(fsp,conn,token,&share_locked);
1082 if (share_locked && lp_share_modes(SNUM(conn)))
1083 unlock_share_entry( conn, dev, inode);
1086 /****************************************************************************
1087 Open a file for permissions read only. Return a pseudo file entry
1088 with the 'stat_open' flag set and a fd_ptr of NULL.
1089 ****************************************************************************/
1091 int open_file_stat(files_struct *fsp,connection_struct *conn,
1092 char *fname, int smb_ofun, SMB_STRUCT_STAT *pst, int *action)
1094 extern struct current_user current_user;
1096 if(dos_stat(fname, pst) < 0) {
1097 DEBUG(0,("open_file_stat: unable to stat name = %s. Error was %s\n",
1098 fname, strerror(errno) ));
1102 if(S_ISDIR(pst->st_mode)) {
1103 DEBUG(0,("open_file_stat: %s is a directory !\n", fname ));
1107 *action = FILE_WAS_OPENED;
1109 DEBUG(5,("open_file_stat: opening file %s as a stat entry\n", fname));
1112 * Setup the files_struct for it.
1116 conn->num_files_open++;
1118 GetTimeOfDay(&fsp->open_time);
1119 fsp->vuid = current_user.vuid;
1123 fsp->can_lock = False;
1124 fsp->can_read = False;
1125 fsp->can_write = False;
1126 fsp->share_mode = 0;
1127 fsp->print_file = False;
1128 fsp->modified = False;
1129 fsp->oplock_type = NO_OPLOCK;
1130 fsp->sent_oplock_break = NO_BREAK_SENT;
1131 fsp->is_directory = False;
1132 fsp->stat_open = True;
1133 fsp->directory_delete_on_close = False;
1136 * Note that the file name here is the *untranslated* name
1137 * ie. it is still in the DOS codepage sent from the client.
1138 * All use of this filename will pass though the sys_xxxx
1139 * functions which will do the dos_to_unix translation before
1140 * mapping into a UNIX filename. JRA.
1142 string_set(&fsp->fsp_name,fname);
1143 fsp->wbmpx_ptr = NULL;
1144 fsp->wcp = NULL; /* Write cache pointer. */
1149 /****************************************************************************
1150 Open a directory from an NT SMB call.
1151 ****************************************************************************/
1153 int open_directory(files_struct *fsp,connection_struct *conn,
1154 char *fname, int smb_ofun, mode_t unixmode, int *action)
1156 extern struct current_user current_user;
1158 BOOL got_stat = False;
1160 if(dos_stat(fname, &st) == 0) {
1164 if (got_stat && (GET_FILE_OPEN_DISPOSITION(smb_ofun) == FILE_EXISTS_FAIL)) {
1165 errno = EEXIST; /* Setup so correct error is returned to client. */
1169 if (GET_FILE_CREATE_DISPOSITION(smb_ofun) == FILE_CREATE_IF_NOT_EXIST) {
1173 if(!S_ISDIR(st.st_mode)) {
1174 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1178 *action = FILE_WAS_OPENED;
1183 * Try and create the directory.
1186 if(!CAN_WRITE(conn)) {
1187 DEBUG(2,("open_directory: failing create on read-only share\n"));
1192 if(dos_mkdir(fname, unix_mode(conn,aDIR, fname)) < 0) {
1193 DEBUG(0,("open_directory: unable to create %s. Error was %s\n",
1194 fname, strerror(errno) ));
1197 *action = FILE_WAS_CREATED;
1203 * Don't create - just check that it *was* a directory.
1207 DEBUG(0,("open_directory: unable to stat name = %s. Error was %s\n",
1208 fname, strerror(errno) ));
1212 if(!S_ISDIR(st.st_mode)) {
1213 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1217 *action = FILE_WAS_OPENED;
1220 DEBUG(5,("open_directory: opening directory %s\n",
1224 * Setup the files_struct for it.
1228 conn->num_files_open++;
1230 GetTimeOfDay(&fsp->open_time);
1231 fsp->vuid = current_user.vuid;
1235 fsp->can_lock = True;
1236 fsp->can_read = False;
1237 fsp->can_write = False;
1238 fsp->share_mode = 0;
1239 fsp->print_file = False;
1240 fsp->modified = False;
1241 fsp->oplock_type = NO_OPLOCK;
1242 fsp->sent_oplock_break = NO_BREAK_SENT;
1243 fsp->is_directory = True;
1244 fsp->directory_delete_on_close = False;
1247 * Note that the file name here is the *untranslated* name
1248 * ie. it is still in the DOS codepage sent from the client.
1249 * All use of this filename will pass though the sys_xxxx
1250 * functions which will do the dos_to_unix translation before
1251 * mapping into a UNIX filename. JRA.
1253 string_set(&fsp->fsp_name,fname);
1254 fsp->wbmpx_ptr = NULL;
1259 /*******************************************************************
1260 Check if the share mode on a file allows it to be deleted or unlinked.
1261 Return True if sharing doesn't prevent the operation.
1262 ********************************************************************/
1264 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
1268 share_mode_entry *old_shares = 0;
1269 int num_share_modes;
1270 SMB_STRUCT_STAT sbuf;
1271 pid_t pid = getpid();
1275 if(!lp_share_modes(SNUM(conn)))
1278 if (dos_stat(fname,&sbuf) == -1) return(True);
1281 inode = sbuf.st_ino;
1283 lock_share_entry(conn, dev, inode);
1284 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1287 * Check if the share modes will give us access.
1290 if(num_share_modes != 0)
1297 broke_oplock = False;
1298 for(i = 0; i < num_share_modes; i++)
1300 share_mode_entry *share_entry = &old_shares[i];
1303 * Break oplocks before checking share modes. See comment in
1304 * open_file_shared for details.
1305 * Check if someone has an oplock on this file. If so we must
1306 * break it before continuing.
1308 if(BATCH_OPLOCK_TYPE(share_entry->op_type))
1313 /* JRA. Try removing this code to see if the new oplock changes
1314 fix the problem. I'm dubious, but Andrew is recommending we
1319 * It appears that the NT redirector may have a bug, in that
1320 * it tries to do an SMBmv on a file that it has open with a
1321 * batch oplock, and then fails to respond to the oplock break
1322 * request. This only seems to occur when the client is doing an
1323 * SMBmv to the smbd it is using - thus we try and detect this
1324 * condition by checking if the file being moved is open and oplocked by
1325 * this smbd process, and then not sending the oplock break in this
1326 * special case. If the file was open with a deny mode that
1327 * prevents the move the SMBmv will fail anyway with a share
1328 * violation error. JRA.
1330 if(rename_op && (share_entry->pid == pid))
1333 DEBUG(0,("check_file_sharing: NT redirector workaround - rename attempted on \
1334 batch oplocked file %s, dev = %x, inode = %.0f\n", fname, (unsigned int)dev, (double)inode));
1337 * This next line is a test that allows the deny-mode
1338 * processing to be skipped. This seems to be needed as
1339 * NT insists on the rename succeeding (in Office 9x no less !).
1340 * This should be removed as soon as (a) MS fix the redirector
1341 * bug or (b) NT SMB support in Samba makes NT not issue the
1342 * call (as is my fervent hope). JRA.
1350 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1351 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
1353 /* Oplock break.... */
1354 unlock_share_entry(conn, dev, inode);
1355 if(request_oplock_break(share_entry, dev, inode) == False)
1357 free((char *)old_shares);
1359 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1360 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
1364 lock_share_entry(conn, dev, inode);
1365 broke_oplock = True;
1371 * If this is a delete request and ALLOW_SHARE_DELETE is set then allow
1372 * this to proceed. This takes precedence over share modes.
1375 if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
1379 * Someone else has a share lock on it, check to see
1383 if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) ||
1384 (share_entry->pid != pid))
1391 free((char *)old_shares);
1392 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1394 } while(broke_oplock);
1397 /* XXXX exactly what share mode combinations should be allowed for
1398 deleting/renaming? */
1400 * If we got here then either there were no share modes or
1401 * all share modes were DENY_DOS and the pid == getpid() or
1402 * delete access was requested and all share modes had the
1403 * ALLOW_SHARE_DELETE bit set (takes precedence over other
1411 unlock_share_entry(conn, dev, inode);
1412 if(old_shares != NULL)
1413 free((char *)old_shares);