Commit an updated configure, but the build_farm should run autoconf!
[Samba.git] / source3 / smbd / open.c
bloba32e0329213f6708e827076c67ad6b92fe82c082
1 /*
2 Unix SMB/Netbios implementation.
3 Version 1.9.
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.
22 #include "includes.h"
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)
37 int fd;
38 #ifdef O_NONBLOCK
39 flags |= O_NONBLOCK;
40 #endif
41 fd = conn->vfs_ops.open(conn,fname,flags,mode);
43 /* Fix for files ending in '.' */
44 if((fd == -1) && (errno == ENOENT) &&
45 (strchr_m(fname,'.')==NULL)) {
46 pstrcat(fname,".");
47 fd = conn->vfs_ops.open(conn,fname,flags,mode);
50 DEBUG(10,("fd_open: name %s, flags = 0%o mode = 0%o, fd = %d. %s\n", fname,
51 flags, (int)mode, fd, (fd == -1) ? strerror(errno) : "" ));
53 return fd;
56 /****************************************************************************
57 Close the file associated with a fsp.
58 ****************************************************************************/
60 int fd_close(struct connection_struct *conn, files_struct *fsp)
62 if (fsp->fd == -1)
63 return -1;
64 return fd_close_posix(conn, fsp);
68 /****************************************************************************
69 Check a filename for the pipe string.
70 ****************************************************************************/
72 static void check_for_pipe(char *fname)
74 /* special case of pipe opens */
75 char s[10];
76 StrnCpy(s,fname,sizeof(s)-1);
77 strlower(s);
78 if (strstr(s,"pipe/")) {
79 DEBUG(3,("Rejecting named pipe open for %s\n",fname));
80 unix_ERR_class = ERRSRV;
81 unix_ERR_code = ERRaccess;
85 /****************************************************************************
86 Open a file.
87 ****************************************************************************/
89 static BOOL open_file(files_struct *fsp,connection_struct *conn,
90 char *fname1,SMB_STRUCT_STAT *psbuf,int flags,mode_t mode)
92 extern struct current_user current_user;
93 pstring fname;
94 int accmode = (flags & O_ACCMODE);
95 int local_flags = flags;
97 fsp->fd = -1;
98 fsp->oplock_type = NO_OPLOCK;
99 errno = EPERM;
101 pstrcpy(fname,fname1);
103 /* Check permissions */
106 * This code was changed after seeing a client open request
107 * containing the open mode of (DENY_WRITE/read-only) with
108 * the 'create if not exist' bit set. The previous code
109 * would fail to open the file read only on a read-only share
110 * as it was checking the flags parameter directly against O_RDONLY,
111 * this was failing as the flags parameter was set to O_RDONLY|O_CREAT.
112 * JRA.
115 if (!CAN_WRITE(conn)) {
116 /* It's a read-only share - fail if we wanted to write. */
117 if(accmode != O_RDONLY) {
118 DEBUG(3,("Permission denied opening %s\n",fname));
119 check_for_pipe(fname);
120 return False;
121 } else if(flags & O_CREAT) {
122 /* We don't want to write - but we must make sure that O_CREAT
123 doesn't create the file if we have write access into the
124 directory.
126 flags &= ~O_CREAT;
131 * This little piece of insanity is inspired by the
132 * fact that an NT client can open a file for O_RDONLY,
133 * but set the create disposition to FILE_EXISTS_TRUNCATE.
134 * If the client *can* write to the file, then it expects to
135 * truncate the file, even though it is opening for readonly.
136 * Quicken uses this stupid trick in backup file creation...
137 * Thanks *greatly* to "David W. Chapman Jr." <dwcjr@inethouston.net>
138 * for helping track this one down. It didn't bite us in 2.0.x
139 * as we always opened files read-write in that release. JRA.
142 if ((accmode == O_RDONLY) && ((flags & O_TRUNC) == O_TRUNC))
143 local_flags = (flags & ~O_ACCMODE)|O_RDWR;
146 * We can't actually truncate here as the file may be locked.
147 * open_file_shared will take care of the truncate later. JRA.
150 local_flags &= ~O_TRUNC;
152 /* actually do the open */
153 fsp->fd = fd_open(conn, fname, local_flags, mode);
155 if (fsp->fd == -1) {
156 DEBUG(3,("Error opening file %s (%s) (local_flags=%d) (flags=%d)\n",
157 fname,strerror(errno),local_flags,flags));
158 check_for_pipe(fname);
159 return False;
162 if (!VALID_STAT(*psbuf)) {
163 if (vfs_fstat(fsp,fsp->fd,psbuf) == -1) {
164 DEBUG(0,("Error doing fstat on open file %s (%s)\n", fname,strerror(errno) ));
165 fd_close(conn, fsp);
166 return False;
171 * POSIX allows read-only opens of directories. We don't
172 * want to do this (we use a different code path for this)
173 * so catch a directory open and return an EISDIR. JRA.
176 if(S_ISDIR(psbuf->st_mode)) {
177 fd_close(conn, fsp);
178 errno = EISDIR;
179 return False;
182 fsp->mode = psbuf->st_mode;
183 fsp->inode = psbuf->st_ino;
184 fsp->dev = psbuf->st_dev;
185 GetTimeOfDay(&fsp->open_time);
186 fsp->vuid = current_user.vuid;
187 fsp->size = psbuf->st_size;
188 fsp->pos = -1;
189 fsp->can_lock = True;
190 fsp->can_read = ((flags & O_WRONLY)==0);
191 fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
192 fsp->share_mode = 0;
193 fsp->print_file = False;
194 fsp->modified = False;
195 fsp->oplock_type = NO_OPLOCK;
196 fsp->sent_oplock_break = NO_BREAK_SENT;
197 fsp->is_directory = False;
198 fsp->stat_open = False;
199 fsp->directory_delete_on_close = False;
200 fsp->conn = conn;
201 string_set(&fsp->fsp_name,fname);
202 fsp->wbmpx_ptr = NULL;
203 fsp->wcp = NULL; /* Write cache pointer. */
205 DEBUG(2,("%s opened file %s read=%s write=%s (numopen=%d)\n",
206 *current_user_info.smb_name ? current_user_info.smb_name : conn->user,fsp->fsp_name,
207 BOOLSTR(fsp->can_read), BOOLSTR(fsp->can_write),
208 conn->num_files_open + 1));
211 * Take care of inherited ACLs on created files. JRA.
214 if ((flags & O_CREAT) && (conn->vfs_ops.fchmod_acl != NULL)) {
215 int saved_errno = errno; /* We might get ENOSYS in the next call.. */
216 if (conn->vfs_ops.fchmod_acl(fsp, fsp->fd, mode) == -1 && errno == ENOSYS)
217 errno = saved_errno; /* Ignore ENOSYS */
220 return True;
223 /****************************************************************************
224 C. Hoch 11/22/95
225 Helper for open_file_shared.
226 Truncate a file after checking locking; close file if locked.
227 **************************************************************************/
229 static int truncate_unless_locked(struct connection_struct *conn, files_struct *fsp)
231 SMB_BIG_UINT mask = (SMB_BIG_UINT)-1;
233 if (is_locked(fsp,fsp->conn,mask,0,WRITE_LOCK,True)){
234 errno = EACCES;
235 unix_ERR_class = ERRDOS;
236 unix_ERR_code = ERRlock;
237 return -1;
238 } else {
239 return conn->vfs_ops.ftruncate(fsp,fsp->fd,0);
243 /*******************************************************************
244 return True if the filename is one of the special executable types
245 ********************************************************************/
246 static BOOL is_executable(const char *fname)
248 if ((fname = strrchr_m(fname,'.'))) {
249 if (strequal(fname,".com") ||
250 strequal(fname,".dll") ||
251 strequal(fname,".exe") ||
252 strequal(fname,".sym")) {
253 return True;
256 return False;
259 enum {AFAIL,AREAD,AWRITE,AALL};
261 /*******************************************************************
262 reproduce the share mode access table
263 this is horrendoously complex, and really can't be justified on any
264 rational grounds except that this is _exactly_ what NT does. See
265 the DENY1 and DENY2 tests in smbtorture for a comprehensive set of
266 test routines.
267 ********************************************************************/
268 static int access_table(int new_deny,int old_deny,int old_mode,
269 BOOL same_pid, BOOL isexe)
271 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
273 if (same_pid) {
274 if (isexe && old_mode == DOS_OPEN_RDONLY &&
275 old_deny == DENY_DOS && new_deny == DENY_READ) {
276 return AFAIL;
278 if (!isexe && old_mode == DOS_OPEN_RDONLY &&
279 old_deny == DENY_DOS && new_deny == DENY_DOS) {
280 return AREAD;
282 if (new_deny == DENY_FCB && old_deny == DENY_DOS) {
283 if (isexe) return AFAIL;
284 if (old_mode == DOS_OPEN_RDONLY) return AFAIL;
285 return AALL;
287 if (old_mode == DOS_OPEN_RDONLY && old_deny == DENY_DOS) {
288 if (new_deny == DENY_FCB || new_deny == DENY_READ) {
289 if (isexe) return AREAD;
290 return AFAIL;
293 if (old_deny == DENY_FCB) {
294 if (new_deny == DENY_DOS || new_deny == DENY_FCB) return AALL;
295 return AFAIL;
299 if (old_deny == DENY_DOS || new_deny == DENY_DOS ||
300 old_deny == DENY_FCB || new_deny == DENY_FCB) {
301 if (isexe) {
302 if (old_deny == DENY_FCB || new_deny == DENY_FCB) {
303 return AFAIL;
305 if (old_deny == DENY_DOS) {
306 if (new_deny == DENY_READ &&
307 (old_mode == DOS_OPEN_RDONLY ||
308 old_mode == DOS_OPEN_RDWR)) {
309 return AFAIL;
311 if (new_deny == DENY_WRITE &&
312 (old_mode == DOS_OPEN_WRONLY ||
313 old_mode == DOS_OPEN_RDWR)) {
314 return AFAIL;
316 return AALL;
318 if (old_deny == DENY_NONE) return AALL;
319 if (old_deny == DENY_READ) return AWRITE;
320 if (old_deny == DENY_WRITE) return AREAD;
322 /* it isn't a exe, dll, sym or com file */
323 if (old_deny == new_deny && same_pid)
324 return(AALL);
326 if (old_deny == DENY_READ || new_deny == DENY_READ) return AFAIL;
327 if (old_mode == DOS_OPEN_RDONLY) return(AREAD);
329 return(AFAIL);
332 switch (new_deny)
334 case DENY_WRITE:
335 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_RDONLY) return(AREAD);
336 if (old_deny==DENY_READ && old_mode==DOS_OPEN_RDONLY) return(AWRITE);
337 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_RDONLY) return(AALL);
338 return(AFAIL);
339 case DENY_READ:
340 if (old_deny==DENY_WRITE && old_mode==DOS_OPEN_WRONLY) return(AREAD);
341 if (old_deny==DENY_READ && old_mode==DOS_OPEN_WRONLY) return(AWRITE);
342 if (old_deny==DENY_NONE && old_mode==DOS_OPEN_WRONLY) return(AALL);
343 return(AFAIL);
344 case DENY_NONE:
345 if (old_deny==DENY_WRITE) return(AREAD);
346 if (old_deny==DENY_READ) return(AWRITE);
347 if (old_deny==DENY_NONE) return(AALL);
348 return(AFAIL);
350 return(AFAIL);
354 /****************************************************************************
355 check if we can open a file with a share mode
356 ****************************************************************************/
358 static int check_share_mode( share_mode_entry *share, int share_mode,
359 const char *fname, BOOL fcbopen, int *flags)
361 int deny_mode = GET_DENY_MODE(share_mode);
362 int old_open_mode = GET_OPEN_MODE(share->share_mode);
363 int old_deny_mode = GET_DENY_MODE(share->share_mode);
366 * Don't allow any opens once the delete on close flag has been
367 * set.
370 if (GET_DELETE_ON_CLOSE_FLAG(share->share_mode)) {
371 DEBUG(5,("check_share_mode: Failing open on file %s as delete on close flag is set.\n",
372 fname ));
373 unix_ERR_class = ERRDOS;
374 unix_ERR_code = ERRnoaccess;
375 return False;
379 * If delete access was requested and the existing share mode doesn't have
380 * ALLOW_SHARE_DELETE then deny.
383 if (GET_DELETE_ACCESS_REQUESTED(share_mode) && !GET_ALLOW_SHARE_DELETE(share->share_mode)) {
384 DEBUG(5,("check_share_mode: Failing open on file %s as delete access requested and allow share delete not set.\n",
385 fname ));
386 unix_ERR_class = ERRDOS;
387 unix_ERR_code = ERRbadshare;
389 return False;
393 * The inverse of the above.
394 * If delete access was granted and the new share mode doesn't have
395 * ALLOW_SHARE_DELETE then deny.
398 if (GET_DELETE_ACCESS_REQUESTED(share->share_mode) && !GET_ALLOW_SHARE_DELETE(share_mode)) {
399 DEBUG(5,("check_share_mode: Failing open on file %s as delete access granted and allow share delete not requested.\n",
400 fname ));
401 unix_ERR_class = ERRDOS;
402 unix_ERR_code = ERRbadshare;
404 return False;
408 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
409 (share->pid == sys_getpid()),is_executable(fname));
411 if ((access_allowed == AFAIL) ||
412 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
413 (access_allowed == AREAD && *flags != O_RDONLY) ||
414 (access_allowed == AWRITE && *flags != O_WRONLY)) {
416 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s,fcbopen = %d, flags = %d) = %d\n",
417 deny_mode,old_deny_mode,old_open_mode,
418 (int)share->pid,fname, fcbopen, *flags, access_allowed));
420 unix_ERR_class = ERRDOS;
421 unix_ERR_code = ERRbadshare;
423 return False;
426 if (access_allowed == AREAD)
427 *flags = O_RDONLY;
429 if (access_allowed == AWRITE)
430 *flags = O_WRONLY;
434 return True;
437 /****************************************************************************
438 Deal with open deny mode and oplock break processing.
439 Invarient: Share mode must be locked on entry and exit.
440 Returns -1 on error, or number of share modes on success (may be zero).
441 ****************************************************************************/
443 static int open_mode_check(connection_struct *conn, const char *fname, SMB_DEV_T dev,
444 SMB_INO_T inode, int share_mode, int *p_flags, int *p_oplock_request,
445 BOOL *p_all_current_opens_are_level_II)
447 int i;
448 int num_share_modes;
449 int oplock_contention_count = 0;
450 share_mode_entry *old_shares = 0;
451 BOOL fcbopen = False;
452 BOOL broke_oplock;
454 if(GET_OPEN_MODE(share_mode) == DOS_OPEN_FCB)
455 fcbopen = True;
457 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
459 if(num_share_modes == 0)
460 return 0;
463 * Check if the share modes will give us access.
466 do {
468 broke_oplock = False;
469 *p_all_current_opens_are_level_II = True;
471 for(i = 0; i < num_share_modes; i++) {
472 share_mode_entry *share_entry = &old_shares[i];
475 * By observation of NetBench, oplocks are broken *before* share
476 * modes are checked. This allows a file to be closed by the client
477 * if the share mode would deny access and the client has an oplock.
478 * Check if someone has an oplock on this file. If so we must break
479 * it before continuing.
482 if((*p_oplock_request && EXCLUSIVE_OPLOCK_TYPE(share_entry->op_type)) ||
483 (!*p_oplock_request && (share_entry->op_type != NO_OPLOCK))) {
485 BOOL opb_ret;
487 DEBUG(5,("open_mode_check: oplock_request = %d, breaking oplock (%x) on file %s, \
488 dev = %x, inode = %.0f\n", *p_oplock_request, share_entry->op_type, fname, (unsigned int)dev, (double)inode));
490 /* Oplock break - unlock to request it. */
491 unlock_share_entry(conn, dev, inode);
493 opb_ret = request_oplock_break(share_entry, dev, inode);
495 /* Now relock. */
496 lock_share_entry(conn, dev, inode);
498 if(opb_ret == False) {
499 free((char *)old_shares);
500 DEBUG(0,("open_mode_check: FAILED when breaking oplock (%x) on file %s, \
501 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
502 errno = EACCES;
503 unix_ERR_class = ERRDOS;
504 unix_ERR_code = ERRbadshare;
505 return -1;
508 broke_oplock = True;
509 break;
511 } else if (!LEVEL_II_OPLOCK_TYPE(share_entry->op_type)) {
512 *p_all_current_opens_are_level_II = False;
515 /* someone else has a share lock on it, check to see
516 if we can too */
518 if(check_share_mode(share_entry, share_mode, fname, fcbopen, p_flags) == False) {
519 free((char *)old_shares);
520 errno = EACCES;
521 return -1;
524 } /* end for */
526 if(broke_oplock) {
527 free((char *)old_shares);
528 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
529 oplock_contention_count++;
531 } while(broke_oplock);
533 if(old_shares != 0)
534 free((char *)old_shares);
537 * Refuse to grant an oplock in case the contention limit is
538 * reached when going through the lock list multiple times.
541 if(oplock_contention_count >= lp_oplock_contention_limit(SNUM(conn))) {
542 *p_oplock_request = 0;
543 DEBUG(4,("open_mode_check: oplock contention = %d. Not granting oplock.\n",
544 oplock_contention_count ));
547 return num_share_modes;
550 /****************************************************************************
551 set a kernel flock on a file for NFS interoperability
552 this requires a patch to Linux
553 ****************************************************************************/
554 static void kernel_flock(files_struct *fsp, int deny_mode)
556 #if HAVE_KERNEL_SHARE_MODES
557 int kernel_mode = 0;
558 if (deny_mode == DENY_READ) kernel_mode = LOCK_MAND|LOCK_WRITE;
559 else if (deny_mode == DENY_WRITE) kernel_mode = LOCK_MAND|LOCK_READ;
560 else if (deny_mode == DENY_ALL) kernel_mode = LOCK_MAND;
561 if (kernel_mode) flock(fsp->fd, kernel_mode);
562 #endif
566 /****************************************************************************
567 Open a file with a share mode. On output from this open we are guarenteeing
568 that
569 ****************************************************************************/
570 files_struct *open_file_shared(connection_struct *conn,char *fname, SMB_STRUCT_STAT *psbuf,
571 int share_mode,int ofun, mode_t mode,int oplock_request, int *Access,int *action)
573 int flags=0;
574 int flags2=0;
575 int deny_mode = GET_DENY_MODE(share_mode);
576 BOOL allow_share_delete = GET_ALLOW_SHARE_DELETE(share_mode);
577 BOOL delete_access_requested = GET_DELETE_ACCESS_REQUESTED(share_mode);
578 BOOL file_existed = VALID_STAT(*psbuf);
579 BOOL fcbopen = False;
580 SMB_DEV_T dev = 0;
581 SMB_INO_T inode = 0;
582 int num_share_modes = 0;
583 BOOL all_current_opens_are_level_II = False;
584 BOOL fsp_open = False;
585 files_struct *fsp = NULL;
586 int open_mode=0;
587 uint16 port = 0;
589 if (conn->printer) {
590 /* printers are handled completely differently. Most of the passed parameters are
591 ignored */
592 *Access = DOS_OPEN_WRONLY;
593 *action = FILE_WAS_CREATED;
594 return print_fsp_open(conn);
597 fsp = file_new(conn);
598 if(!fsp)
599 return NULL;
601 DEBUG(10,("open_file_shared: fname = %s, share_mode = %x, ofun = %x, mode = %o, oplock request = %d\n",
602 fname, share_mode, ofun, (int)mode, oplock_request ));
604 if (!check_name(fname,conn)) {
605 file_free(fsp);
606 return NULL;
609 /* ignore any oplock requests if oplocks are disabled */
610 if (!lp_oplocks(SNUM(conn)) || global_client_failed_oplock_break) {
611 oplock_request = 0;
614 /* this is for OS/2 EAs - try and say we don't support them */
615 if (strstr(fname,".+,;=[].")) {
616 unix_ERR_class = ERRDOS;
617 /* OS/2 Workplace shell fix may be main code stream in a later release. */
618 #if 1 /* OS2_WPS_FIX - Recent versions of OS/2 need this. */
619 unix_ERR_code = ERRcannotopen;
620 #else /* OS2_WPS_FIX */
621 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
622 #endif /* OS2_WPS_FIX */
624 DEBUG(5,("open_file_shared: OS/2 EA's are not supported.\n"));
625 file_free(fsp);
626 return NULL;
629 if ((GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL) && file_existed) {
630 DEBUG(5,("open_file_shared: create new requested for file %s and file already exists.\n",
631 fname ));
632 file_free(fsp);
633 errno = EEXIST;
634 return NULL;
637 if (GET_FILE_CREATE_DISPOSITION(ofun) == FILE_CREATE_IF_NOT_EXIST)
638 flags2 |= O_CREAT;
640 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_TRUNCATE)
641 flags2 |= O_TRUNC;
643 if (GET_FILE_OPEN_DISPOSITION(ofun) == FILE_EXISTS_FAIL)
644 flags2 |= O_EXCL;
646 /* note that we ignore the append flag as
647 append does not mean the same thing under dos and unix */
649 switch (GET_OPEN_MODE(share_mode)) {
650 case DOS_OPEN_WRONLY:
651 flags = O_WRONLY;
652 break;
653 case DOS_OPEN_FCB:
654 fcbopen = True;
655 flags = O_RDWR;
656 break;
657 case DOS_OPEN_RDWR:
658 flags = O_RDWR;
659 break;
660 default:
661 flags = O_RDONLY;
662 break;
665 #if defined(O_SYNC)
666 if (GET_FILE_SYNC_OPENMODE(share_mode)) {
667 flags2 |= O_SYNC;
669 #endif /* O_SYNC */
671 if (flags != O_RDONLY && file_existed &&
672 (!CAN_WRITE(conn) || IS_DOS_READONLY(dos_mode(conn,fname,psbuf)))) {
673 if (!fcbopen) {
674 DEBUG(5,("open_file_shared: read/write access requested for file %s on read only %s\n",
675 fname, !CAN_WRITE(conn) ? "share" : "file" ));
676 file_free(fsp);
677 errno = EACCES;
678 return NULL;
680 flags = O_RDONLY;
683 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB) {
684 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
685 file_free(fsp);
686 errno = EINVAL;
687 return NULL;
690 if (file_existed) {
692 dev = psbuf->st_dev;
693 inode = psbuf->st_ino;
695 lock_share_entry(conn, dev, inode);
697 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
698 &flags, &oplock_request, &all_current_opens_are_level_II);
699 if(num_share_modes == -1) {
702 * This next line is a subtlety we need for MS-Access. If a file open will
703 * fail due to share permissions and also for security (access)
704 * reasons, we need to return the access failed error, not the
705 * share error. This means we must attempt to open the file anyway
706 * in order to get the UNIX access error - even if we're going to
707 * fail the open for share reasons. This is bad, as we're burning
708 * another fd if there are existing locks but there's nothing else
709 * we can do. We also ensure we're not going to create or tuncate
710 * the file as we only want an access decision at this stage. JRA.
712 fsp_open = open_file(fsp,conn,fname,psbuf,flags|(flags2&~(O_TRUNC|O_CREAT)),mode);
714 DEBUG(4,("open_file_shared : share_mode deny - calling open_file with \
715 flags=0x%X flags2=0x%X mode=0%o returned %d\n",
716 flags,(flags2&~(O_TRUNC|O_CREAT)),(int)mode,(int)fsp_open ));
718 unlock_share_entry(conn, dev, inode);
719 if (fsp_open)
720 fd_close(conn, fsp);
721 file_free(fsp);
722 return NULL;
726 * We exit this block with the share entry *locked*.....
730 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
731 flags,flags2,(int)mode));
734 * open_file strips any O_TRUNC flags itself.
737 fsp_open = open_file(fsp,conn,fname,psbuf,flags|flags2,mode);
739 if (!fsp_open && (flags == O_RDWR) && (errno != ENOENT) && fcbopen) {
740 if((fsp_open = open_file(fsp,conn,fname,psbuf,O_RDONLY,mode)) == True)
741 flags = O_RDONLY;
744 if (!fsp_open) {
745 if(file_existed)
746 unlock_share_entry(conn, dev, inode);
747 file_free(fsp);
748 return NULL;
752 * Deal with the race condition where two smbd's detect the file doesn't
753 * exist and do the create at the same time. One of them will win and
754 * set a share mode, the other (ie. this one) should check if the
755 * requested share mode for this create is allowed.
758 if (!file_existed) {
760 lock_share_entry_fsp(fsp);
762 num_share_modes = open_mode_check(conn, fname, dev, inode, share_mode,
763 &flags, &oplock_request, &all_current_opens_are_level_II);
765 if(num_share_modes == -1) {
766 unlock_share_entry_fsp(fsp);
767 fd_close(conn,fsp);
768 file_free(fsp);
769 return NULL;
773 * If there are any share modes set then the file *did*
774 * exist. Ensure we return the correct value for action.
777 if (num_share_modes > 0)
778 file_existed = True;
781 * We exit this block with the share entry *locked*.....
785 /* note that we ignore failure for the following. It is
786 basically a hack for NFS, and NFS will never set one of
787 these only read them. Nobody but Samba can ever set a deny
788 mode and we have already checked our more authoritative
789 locking database for permission to set this deny mode. If
790 the kernel refuses the operations then the kernel is wrong */
791 kernel_flock(fsp, deny_mode);
794 * At this point onwards, we can guarentee that the share entry
795 * is locked, whether we created the file or not, and that the
796 * deny mode is compatible with all current opens.
800 * If requested, truncate the file.
803 if (flags2&O_TRUNC) {
805 * We are modifing the file after open - update the stat struct..
807 if ((truncate_unless_locked(conn,fsp) == -1) || (vfs_fstat(fsp,fsp->fd,psbuf)==-1)) {
808 unlock_share_entry_fsp(fsp);
809 fd_close(conn,fsp);
810 file_free(fsp);
811 return NULL;
815 switch (flags) {
816 case O_RDONLY:
817 open_mode = DOS_OPEN_RDONLY;
818 break;
819 case O_RDWR:
820 open_mode = DOS_OPEN_RDWR;
821 break;
822 case O_WRONLY:
823 open_mode = DOS_OPEN_WRONLY;
824 break;
827 fsp->share_mode = SET_DENY_MODE(deny_mode) |
828 SET_OPEN_MODE(open_mode) |
829 SET_ALLOW_SHARE_DELETE(allow_share_delete) |
830 SET_DELETE_ACCESS_REQUESTED(delete_access_requested);
832 DEBUG(10,("open_file_shared : share_mode = %x\n", fsp->share_mode ));
834 if (Access)
835 (*Access) = open_mode;
837 if (action) {
838 if (file_existed && !(flags2 & O_TRUNC))
839 *action = FILE_WAS_OPENED;
840 if (!file_existed)
841 *action = FILE_WAS_CREATED;
842 if (file_existed && (flags2 & O_TRUNC))
843 *action = FILE_WAS_OVERWRITTEN;
847 * Setup the oplock info in both the shared memory and
848 * file structs.
851 if(oplock_request && (num_share_modes == 0) &&
852 !IS_VETO_OPLOCK_PATH(conn,fname) && set_file_oplock(fsp, oplock_request) ) {
853 port = global_oplock_port;
854 } else if (oplock_request && all_current_opens_are_level_II) {
855 port = global_oplock_port;
856 oplock_request = LEVEL_II_OPLOCK;
857 set_file_oplock(fsp, oplock_request);
858 } else {
859 port = 0;
860 oplock_request = 0;
863 set_share_mode(fsp, port, oplock_request);
865 unlock_share_entry_fsp(fsp);
867 conn->num_files_open++;
869 return fsp;
872 /****************************************************************************
873 Open a file for permissions read only. Return a pseudo file entry
874 with the 'stat_open' flag set
875 ****************************************************************************/
877 files_struct *open_file_stat(connection_struct *conn, char *fname,
878 SMB_STRUCT_STAT *psbuf, int smb_ofun, int *action)
880 extern struct current_user current_user;
881 files_struct *fsp = NULL;
883 if (!VALID_STAT(*psbuf)) {
884 DEBUG(0,("open_file_stat: unable to stat name = %s. Error was %s\n", fname, strerror(errno) ));
885 return NULL;
888 if(S_ISDIR(psbuf->st_mode)) {
889 DEBUG(0,("open_file_stat: %s is a directory !\n", fname ));
890 return NULL;
893 fsp = file_new(conn);
894 if(!fsp)
895 return NULL;
897 *action = FILE_WAS_OPENED;
899 DEBUG(5,("open_file_stat: opening file %s as a stat entry\n", fname));
902 * Setup the files_struct for it.
905 fsp->fd = -1;
906 fsp->mode = psbuf->st_mode;
907 fsp->inode = psbuf->st_ino;
908 fsp->dev = psbuf->st_dev;
909 GetTimeOfDay(&fsp->open_time);
910 fsp->size = psbuf->st_size;
911 fsp->vuid = current_user.vuid;
912 fsp->pos = -1;
913 fsp->can_lock = False;
914 fsp->can_read = False;
915 fsp->can_write = False;
916 fsp->share_mode = 0;
917 fsp->print_file = False;
918 fsp->modified = False;
919 fsp->oplock_type = NO_OPLOCK;
920 fsp->sent_oplock_break = NO_BREAK_SENT;
921 fsp->is_directory = False;
922 fsp->stat_open = True;
923 fsp->directory_delete_on_close = False;
924 fsp->conn = conn;
925 string_set(&fsp->fsp_name,fname);
926 fsp->wbmpx_ptr = NULL;
927 fsp->wcp = NULL; /* Write cache pointer. */
929 conn->num_files_open++;
931 return fsp;
934 /****************************************************************************
935 Open a file for for write to ensure that we can fchmod it.
936 ****************************************************************************/
938 files_struct *open_file_fchmod(connection_struct *conn, char *fname, SMB_STRUCT_STAT *psbuf)
940 files_struct *fsp = NULL;
941 BOOL fsp_open;
943 if (!VALID_STAT(*psbuf))
944 return NULL;
946 fsp = file_new(conn);
947 if(!fsp)
948 return NULL;
950 fsp_open = open_file(fsp,conn,fname,psbuf,O_WRONLY,0);
953 * This is not a user visible file open.
954 * Don't set a share mode and don't increment
955 * the conn->num_files_open.
958 if (!fsp_open) {
959 file_free(fsp);
960 return NULL;
963 return fsp;
966 /****************************************************************************
967 Close the fchmod file fd - ensure no locks are lost.
968 ****************************************************************************/
970 int close_file_fchmod(files_struct *fsp)
972 int ret = fd_close(fsp->conn, fsp);
973 file_free(fsp);
974 return ret;
977 /****************************************************************************
978 Open a directory from an NT SMB call.
979 ****************************************************************************/
981 files_struct *open_directory(connection_struct *conn, char *fname,
982 SMB_STRUCT_STAT *psbuf, int smb_ofun, mode_t unixmode, int *action)
984 extern struct current_user current_user;
985 BOOL got_stat = False;
986 files_struct *fsp = file_new(conn);
988 if(!fsp)
989 return NULL;
991 fsp->conn = conn; /* The vfs_fXXX() macros need this. */
993 if (VALID_STAT(*psbuf))
994 got_stat = True;
996 if (got_stat && (GET_FILE_OPEN_DISPOSITION(smb_ofun) == FILE_EXISTS_FAIL)) {
997 file_free(fsp);
998 errno = EEXIST; /* Setup so correct error is returned to client. */
999 return NULL;
1002 if (GET_FILE_CREATE_DISPOSITION(smb_ofun) == FILE_CREATE_IF_NOT_EXIST) {
1004 if (got_stat) {
1006 if(!S_ISDIR(psbuf->st_mode)) {
1007 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1008 file_free(fsp);
1009 errno = EACCES;
1010 return NULL;
1012 *action = FILE_WAS_OPENED;
1014 } else {
1017 * Try and create the directory.
1020 if(!CAN_WRITE(conn)) {
1021 DEBUG(2,("open_directory: failing create on read-only share\n"));
1022 file_free(fsp);
1023 errno = EACCES;
1024 return NULL;
1027 if(vfs_mkdir(conn,fname, unix_mode(conn,aDIR, fname)) < 0) {
1028 DEBUG(0,("open_directory: unable to create %s. Error was %s\n",
1029 fname, strerror(errno) ));
1030 file_free(fsp);
1031 return NULL;
1034 if(vfs_stat(conn,fname, psbuf) != 0) {
1035 file_free(fsp);
1036 return NULL;
1039 *action = FILE_WAS_CREATED;
1042 } else {
1045 * Don't create - just check that it *was* a directory.
1048 if(!got_stat) {
1049 DEBUG(0,("open_directory: unable to stat name = %s. Error was %s\n",
1050 fname, strerror(errno) ));
1051 file_free(fsp);
1052 return NULL;
1055 if(!S_ISDIR(psbuf->st_mode)) {
1056 DEBUG(0,("open_directory: %s is not a directory !\n", fname ));
1057 file_free(fsp);
1058 return NULL;
1061 *action = FILE_WAS_OPENED;
1064 DEBUG(5,("open_directory: opening directory %s\n", fname));
1067 * Setup the files_struct for it.
1070 fsp->fd = -1;
1071 fsp->mode = psbuf->st_mode;
1072 fsp->inode = psbuf->st_ino;
1073 fsp->dev = psbuf->st_dev;
1074 GetTimeOfDay(&fsp->open_time);
1075 fsp->size = psbuf->st_size;
1076 fsp->vuid = current_user.vuid;
1077 fsp->pos = -1;
1078 fsp->can_lock = True;
1079 fsp->can_read = False;
1080 fsp->can_write = False;
1081 fsp->share_mode = 0;
1082 fsp->print_file = False;
1083 fsp->modified = False;
1084 fsp->oplock_type = NO_OPLOCK;
1085 fsp->sent_oplock_break = NO_BREAK_SENT;
1086 fsp->is_directory = True;
1087 fsp->directory_delete_on_close = False;
1088 fsp->conn = conn;
1089 string_set(&fsp->fsp_name,fname);
1090 fsp->wbmpx_ptr = NULL;
1092 conn->num_files_open++;
1094 return fsp;
1097 /*******************************************************************
1098 Check if the share mode on a file allows it to be deleted or unlinked.
1099 Return True if sharing doesn't prevent the operation.
1100 ********************************************************************/
1102 BOOL check_file_sharing(connection_struct *conn,char *fname, BOOL rename_op)
1104 int i;
1105 int ret = False;
1106 share_mode_entry *old_shares = 0;
1107 int num_share_modes;
1108 SMB_STRUCT_STAT sbuf;
1109 pid_t pid = sys_getpid();
1110 SMB_DEV_T dev;
1111 SMB_INO_T inode;
1113 if (vfs_stat(conn,fname,&sbuf) == -1)
1114 return(True);
1116 dev = sbuf.st_dev;
1117 inode = sbuf.st_ino;
1119 lock_share_entry(conn, dev, inode);
1120 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1123 * Check if the share modes will give us access.
1126 if(num_share_modes != 0)
1128 BOOL broke_oplock;
1133 broke_oplock = False;
1134 for(i = 0; i < num_share_modes; i++)
1136 share_mode_entry *share_entry = &old_shares[i];
1139 * Break oplocks before checking share modes. See comment in
1140 * open_file_shared for details.
1141 * Check if someone has an oplock on this file. If so we must
1142 * break it before continuing.
1144 if(BATCH_OPLOCK_TYPE(share_entry->op_type))
1147 #if 0
1149 /* JRA. Try removing this code to see if the new oplock changes
1150 fix the problem. I'm dubious, but Andrew is recommending we
1151 try this....
1155 * It appears that the NT redirector may have a bug, in that
1156 * it tries to do an SMBmv on a file that it has open with a
1157 * batch oplock, and then fails to respond to the oplock break
1158 * request. This only seems to occur when the client is doing an
1159 * SMBmv to the smbd it is using - thus we try and detect this
1160 * condition by checking if the file being moved is open and oplocked by
1161 * this smbd process, and then not sending the oplock break in this
1162 * special case. If the file was open with a deny mode that
1163 * prevents the move the SMBmv will fail anyway with a share
1164 * violation error. JRA.
1166 if(rename_op && (share_entry->pid == pid))
1169 DEBUG(0,("check_file_sharing: NT redirector workaround - rename attempted on \
1170 batch oplocked file %s, dev = %x, inode = %.0f\n", fname, (unsigned int)dev, (double)inode));
1173 * This next line is a test that allows the deny-mode
1174 * processing to be skipped. This seems to be needed as
1175 * NT insists on the rename succeeding (in Office 9x no less !).
1176 * This should be removed as soon as (a) MS fix the redirector
1177 * bug or (b) NT SMB support in Samba makes NT not issue the
1178 * call (as is my fervent hope). JRA.
1180 continue;
1182 else
1183 #endif /* 0 */
1186 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1187 dev = %x, inode = %.0f\n", share_entry->op_type, fname, (unsigned int)dev, (double)inode));
1189 /* Oplock break.... */
1190 unlock_share_entry(conn, dev, inode);
1191 if(request_oplock_break(share_entry, dev, inode) == False)
1193 free((char *)old_shares);
1195 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1196 dev = %x, inode = %.0f\n", old_shares[i].op_type, fname, (unsigned int)dev, (double)inode));
1198 return False;
1200 lock_share_entry(conn, dev, inode);
1201 broke_oplock = True;
1202 break;
1207 * If this is a delete request and ALLOW_SHARE_DELETE is set then allow
1208 * this to proceed. This takes precedence over share modes.
1211 if(!rename_op && GET_ALLOW_SHARE_DELETE(share_entry->share_mode))
1212 continue;
1215 * Someone else has a share lock on it, check to see
1216 * if we can too.
1219 if ((GET_DENY_MODE(share_entry->share_mode) != DENY_DOS) ||
1220 (share_entry->pid != pid))
1221 goto free_and_exit;
1223 } /* end for */
1225 if(broke_oplock)
1227 free((char *)old_shares);
1228 num_share_modes = get_share_modes(conn, dev, inode, &old_shares);
1230 } while(broke_oplock);
1233 /* XXXX exactly what share mode combinations should be allowed for
1234 deleting/renaming? */
1236 * If we got here then either there were no share modes or
1237 * all share modes were DENY_DOS and the pid == getpid() or
1238 * delete access was requested and all share modes had the
1239 * ALLOW_SHARE_DELETE bit set (takes precedence over other
1240 * share modes).
1243 ret = True;
1245 free_and_exit:
1247 unlock_share_entry(conn, dev, inode);
1248 if(old_shares != NULL)
1249 free((char *)old_shares);
1250 return(ret);