2 Unix SMB/Netbios implementation.
4 Main SMB server routines
5 Copyright (C) Andrew Tridgell 1992-1997
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.
25 pstring servicesf = CONFIGFILE;
26 extern pstring debugf;
27 extern pstring sesssetup_user;
28 extern fstring myworkgroup;
30 char *InBuffer = NULL;
31 char *OutBuffer = NULL;
32 char *last_inbuf = NULL;
37 /* the last message the was processed */
38 int last_message = -1;
40 /* a useful macro to debug the last message processed */
41 #define LAST_MESSAGE() smb_fn_name(last_message)
44 extern int DEBUGLEVEL;
45 extern int case_default;
46 extern BOOL case_sensitive;
47 extern BOOL case_preserve;
48 extern BOOL use_mangled_map;
49 extern BOOL short_case_preserve;
50 extern BOOL case_mangle;
51 extern time_t smb_last_time;
53 extern int smb_read_error;
55 extern pstring user_socket_options;
57 connection_struct Connections[MAX_CONNECTIONS];
58 files_struct Files[MAX_OPEN_FILES];
61 * Indirection for file fd's. Needed as POSIX locking
62 * is based on file/process, not fd/process.
64 file_fd_struct FileFd[MAX_OPEN_FILES];
65 int max_file_fd_used = 0;
70 * Size of data we can send to client. Set
71 * by the client for all protocols above CORE.
72 * Set by us for CORE protocol.
74 int max_send = BUFFER_SIZE;
76 * Size of the data we can receive. Set by us.
77 * Can be modified by the max xmit parameter.
79 int max_recv = BUFFER_SIZE;
81 /* a fnum to use when chaining */
84 /* number of open connections */
85 static int num_connections_open = 0;
88 /* Oplock ipc UDP socket. */
90 uint16 oplock_port = 0;
91 /* Current number of oplocks we have outstanding. */
92 int32 global_oplocks_open = 0;
93 #endif /* USE_OPLOCKS */
95 BOOL global_oplock_break = False;
97 extern fstring remote_machine;
101 /* these can be set by some functions to override the error codes */
102 int unix_ERR_class=SUCCESS;
106 extern int extra_time_offset;
108 extern pstring myhostname;
110 static int find_free_connection(int hash);
112 /* for readability... */
113 #define IS_DOS_READONLY(test_mode) (((test_mode) & aRONLY) != 0)
114 #define IS_DOS_DIR(test_mode) (((test_mode) & aDIR) != 0)
115 #define IS_DOS_ARCHIVE(test_mode) (((test_mode) & aARCH) != 0)
116 #define IS_DOS_SYSTEM(test_mode) (((test_mode) & aSYSTEM) != 0)
117 #define IS_DOS_HIDDEN(test_mode) (((test_mode) & aHIDDEN) != 0)
119 /****************************************************************************
120 when exiting, take the whole family
121 ****************************************************************************/
124 exit_server("caught signal");
125 return 0; /* Keep -Wall happy :-) */
127 /****************************************************************************
128 Send a SIGTERM to our process group.
129 *****************************************************************************/
132 if(am_parent) kill(0,SIGTERM);
135 /****************************************************************************
136 change a dos mode to a unix mode
137 base permission for files:
138 everybody gets read bit set
139 dos readonly is represented in unix by removing everyone's write bit
140 dos archive is represented in unix by the user's execute bit
141 dos system is represented in unix by the group's execute bit
142 dos hidden is represented in unix by the other's execute bit
143 Then apply create mask,
145 base permission for directories:
146 dos directory is represented in unix by unix's dir bit and the exec bit
147 Then apply create mask,
149 ****************************************************************************/
150 mode_t unix_mode(int cnum,int dosmode)
152 mode_t result = (S_IRUSR | S_IRGRP | S_IROTH);
154 if ( !IS_DOS_READONLY(dosmode) )
155 result |= (S_IWUSR | S_IWGRP | S_IWOTH);
157 if (IS_DOS_DIR(dosmode)) {
158 /* We never make directories read only for the owner as under DOS a user
159 can always create a file in a read-only directory. */
160 result |= (S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH | S_IWUSR);
161 /* Apply directory mask */
162 result &= lp_dir_mode(SNUM(cnum));
163 /* Add in force bits */
164 result |= lp_force_dir_mode(SNUM(cnum));
166 if (MAP_ARCHIVE(cnum) && IS_DOS_ARCHIVE(dosmode))
169 if (MAP_SYSTEM(cnum) && IS_DOS_SYSTEM(dosmode))
172 if (MAP_HIDDEN(cnum) && IS_DOS_HIDDEN(dosmode))
175 /* Apply mode mask */
176 result &= lp_create_mode(SNUM(cnum));
177 /* Add in force bits */
178 result |= lp_force_create_mode(SNUM(cnum));
184 /****************************************************************************
185 change a unix mode to a dos mode
186 ****************************************************************************/
187 int dos_mode(int cnum,char *path,struct stat *sbuf)
190 extern struct current_user current_user;
192 DEBUG(8,("dos_mode: %d %s\n", cnum, path));
194 if (CAN_WRITE(cnum) && !lp_alternate_permissions(SNUM(cnum))) {
195 if (!((sbuf->st_mode & S_IWOTH) ||
196 Connections[cnum].admin_user ||
197 ((sbuf->st_mode & S_IWUSR) && current_user.uid==sbuf->st_uid) ||
198 ((sbuf->st_mode & S_IWGRP) &&
199 in_group(sbuf->st_gid,current_user.gid,
200 current_user.ngroups,current_user.igroups))))
203 if ((sbuf->st_mode & S_IWUSR) == 0)
207 if (MAP_ARCHIVE(cnum) && ((sbuf->st_mode & S_IXUSR) != 0))
210 if (MAP_SYSTEM(cnum) && ((sbuf->st_mode & S_IXGRP) != 0))
213 if (MAP_HIDDEN(cnum) && ((sbuf->st_mode & S_IXOTH) != 0))
216 if (S_ISDIR(sbuf->st_mode))
217 result = aDIR | (result & aRONLY);
220 if (S_ISLNK(sbuf->st_mode) && S_ISDIR(sbuf->st_mode))
224 /* hide files with a name starting with a . */
225 if (lp_hide_dot_files(SNUM(cnum)))
227 char *p = strrchr(path,'/');
233 if (p[0] == '.' && p[1] != '.' && p[1] != 0)
237 /* Optimization : Only call is_hidden_path if it's not already
239 if (!(result & aHIDDEN) && IS_HIDDEN_PATH(cnum,path))
244 DEBUG(8,("dos_mode returning "));
246 if (result & aHIDDEN) DEBUG(8, ("h"));
247 if (result & aRONLY ) DEBUG(8, ("r"));
248 if (result & aSYSTEM) DEBUG(8, ("s"));
249 if (result & aDIR ) DEBUG(8, ("d"));
250 if (result & aARCH ) DEBUG(8, ("a"));
258 /*******************************************************************
259 chmod a file - but preserve some bits
260 ********************************************************************/
261 int dos_chmod(int cnum,char *fname,int dosmode,struct stat *st)
270 if (sys_stat(fname,st)) return(-1);
273 if (S_ISDIR(st->st_mode)) dosmode |= aDIR;
275 if (dos_mode(cnum,fname,st) == dosmode) return(0);
277 unixmode = unix_mode(cnum,dosmode);
279 /* preserve the s bits */
280 mask |= (S_ISUID | S_ISGID);
282 /* preserve the t bit */
287 /* possibly preserve the x bits */
288 if (!MAP_ARCHIVE(cnum)) mask |= S_IXUSR;
289 if (!MAP_SYSTEM(cnum)) mask |= S_IXGRP;
290 if (!MAP_HIDDEN(cnum)) mask |= S_IXOTH;
292 unixmode |= (st->st_mode & mask);
294 /* if we previously had any r bits set then leave them alone */
295 if ((tmp = st->st_mode & (S_IRUSR|S_IRGRP|S_IROTH))) {
296 unixmode &= ~(S_IRUSR|S_IRGRP|S_IROTH);
300 /* if we previously had any w bits set then leave them alone
301 if the new mode is not rdonly */
302 if (!IS_DOS_READONLY(dosmode) &&
303 (tmp = st->st_mode & (S_IWUSR|S_IWGRP|S_IWOTH))) {
304 unixmode &= ~(S_IWUSR|S_IWGRP|S_IWOTH);
308 return(sys_chmod(fname,unixmode));
312 /****************************************************************************
313 check if two filenames are equal
315 this needs to be careful about whether we are case sensitive
316 ****************************************************************************/
317 static BOOL fname_equal(char *name1, char *name2)
319 int l1 = strlen(name1);
320 int l2 = strlen(name2);
322 /* handle filenames ending in a single dot */
323 if (l1-l2 == 1 && name1[l1-1] == '.' && lp_strip_dot())
327 ret = fname_equal(name1,name2);
332 if (l2-l1 == 1 && name2[l2-1] == '.' && lp_strip_dot())
336 ret = fname_equal(name1,name2);
341 /* now normal filename handling */
343 return(strcmp(name1,name2) == 0);
345 return(strequal(name1,name2));
349 /****************************************************************************
350 mangle the 2nd name and check if it is then equal to the first name
351 ****************************************************************************/
352 static BOOL mangled_equal(char *name1, char *name2)
356 if (is_8_3(name2, True))
359 strcpy(tmpname,name2);
360 mangle_name_83(tmpname);
362 return(strequal(name1,tmpname));
366 /****************************************************************************
367 scan a directory to find a filename, matching without case sensitivity
369 If the name looks like a mangled name then try via the mangling functions
370 ****************************************************************************/
371 static BOOL scan_directory(char *path, char *name,int cnum,BOOL docache)
378 mangled = is_mangled(name);
380 /* handle null paths */
384 if (docache && (dname = DirCacheCheck(path,name,SNUM(cnum)))) {
390 check_mangled_stack(name);
392 /* open the directory */
393 if (!(cur_dir = OpenDir(cnum, path, True)))
395 DEBUG(3,("scan dir didn't open dir [%s]\n",path));
399 /* now scan for matching names */
400 while ((dname = ReadDirName(cur_dir)))
403 (strequal(dname,".") || strequal(dname,"..")))
406 pstrcpy(name2,dname);
407 if (!name_map_mangle(name2,False,SNUM(cnum))) continue;
409 if ((mangled && mangled_equal(name,name2))
410 || fname_equal(name, name2)) /* name2 here was changed to dname - since 1.9.16p2 - not sure of reason (jra) */
412 /* we've found the file, change it's name and return */
413 if (docache) DirCacheAdd(path,name,dname,SNUM(cnum));
424 /****************************************************************************
425 This routine is called to convert names from the dos namespace to unix
426 namespace. It needs to handle any case conversions, mangling, format
429 We assume that we have already done a chdir() to the right "root" directory
432 The function will return False if some part of the name except for the last
433 part cannot be resolved
435 If the saved_last_component != 0, then the unmodified last component
436 of the pathname is returned there. This is used in an exceptional
437 case in reply_mv (so far). If saved_last_component == 0 then nothing
440 The bad_path arg is set to True if the filename walk failed. This is
441 used to pick the correct error code to return between ENOENT and ENOTDIR
442 as Windows applications depend on ERRbadpath being returned if a component
443 of a pathname does not exist.
444 ****************************************************************************/
445 BOOL unix_convert(char *name,int cnum,pstring saved_last_component, BOOL *bad_path)
455 if(saved_last_component)
456 *saved_last_component = 0;
458 /* convert to basic unix format - removing \ chars and cleaning it up */
460 unix_clean_name(name);
462 /* names must be relative to the root of the service - trim any leading /.
463 also trim trailing /'s */
464 trim_string(name,"/","/");
467 * Ensure saved_last_component is valid even if file exists.
469 if(saved_last_component) {
470 end = strrchr(name, '/');
472 strcpy(saved_last_component, end + 1);
474 strcpy(saved_last_component, name);
477 if (!case_sensitive &&
478 (!case_preserve || (is_8_3(name, False) && !short_case_preserve)))
481 /* check if it's a printer file */
482 if (Connections[cnum].printer)
484 if ((! *name) || strchr(name,'/') || !is_8_3(name, True))
488 sprintf(name2,"%.6s.XXXXXX",remote_machine);
489 /* sanitise the name */
490 for (s=name2 ; *s ; s++)
491 if (!issafe(*s)) *s = '_';
492 strcpy(name,(char *)mktemp(name2));
497 /* stat the name - if it exists then we are all done! */
498 if (sys_stat(name,&st) == 0)
503 DEBUG(5,("unix_convert(%s,%d)\n",name,cnum));
505 /* a special case - if we don't have any mangling chars and are case
506 sensitive then searching won't help */
507 if (case_sensitive && !is_mangled(name) &&
508 !lp_strip_dot() && !use_mangled_map && (saved_errno != ENOENT))
511 /* now we need to recursively match the name against the real
512 directory structure */
515 while (strncmp(start,"./",2) == 0)
518 /* now match each part of the path name separately, trying the names
519 as is first, then trying to scan the directory for matching names */
520 for (;start;start = (end?end+1:(char *)NULL))
522 /* pinpoint the end of this section of the filename */
523 end = strchr(start, '/');
525 /* chop the name at this point */
528 if(saved_last_component != 0)
529 strcpy(saved_last_component, end ? end + 1 : start);
531 /* check if the name exists up to this point */
532 if (sys_stat(name, &st) == 0)
534 /* it exists. it must either be a directory or this must be
535 the last part of the path for it to be OK */
536 if (end && !(st.st_mode & S_IFDIR))
538 /* an intermediate part of the name isn't a directory */
539 DEBUG(5,("Not a dir %s\n",start));
550 /* remember the rest of the pathname so it can be restored
552 if (end) pstrcpy(rest,end+1);
554 /* try to find this part of the path in the directory */
555 if (strchr(start,'?') || strchr(start,'*') ||
556 !scan_directory(dirpath, start, cnum, end?True:False))
560 /* an intermediate part of the name can't be found */
561 DEBUG(5,("Intermediate not found %s\n",start));
563 /* We need to return the fact that the intermediate
564 name resolution failed. This is used to return an
565 error of ERRbadpath rather than ERRbadfile. Some
566 Windows applications depend on the difference between
573 /* just the last part of the name doesn't exist */
574 /* we may need to strupper() or strlower() it in case
575 this conversion is being used for file creation
577 /* if the filename is of mixed case then don't normalise it */
578 if (!case_preserve &&
579 (!strhasupper(start) || !strhaslower(start)))
582 /* check on the mangled stack to see if we can recover the
583 base of the filename */
584 if (is_mangled(start))
585 check_mangled_stack(start);
587 DEBUG(5,("New file %s\n",start));
591 /* restore the rest of the string */
594 strcpy(start+strlen(start)+1,rest);
595 end = start + strlen(start);
599 /* add to the dirpath that we have resolved so far */
600 if (*dirpath) strcat(dirpath,"/");
601 strcat(dirpath,start);
603 /* restore the / that we wiped out earlier */
607 /* the name has been resolved */
608 DEBUG(5,("conversion finished %s\n",name));
613 /****************************************************************************
614 normalise for DOS usage
615 ****************************************************************************/
616 static void disk_norm(int *bsize,int *dfree,int *dsize)
618 /* check if the disk is beyond the max disk size */
619 int maxdisksize = lp_maxdisksize();
621 /* convert to blocks - and don't overflow */
622 maxdisksize = ((maxdisksize*1024)/(*bsize))*1024;
623 if (*dsize > maxdisksize) *dsize = maxdisksize;
624 if (*dfree > maxdisksize) *dfree = maxdisksize-1; /* the -1 should stop
629 while (*dfree > WORDMAX || *dsize > WORDMAX || *bsize < 512)
634 if (*bsize > WORDMAX )
637 if (*dsize > WORDMAX)
639 if (*dfree > WORDMAX)
646 /****************************************************************************
647 return number of 1K blocks available on a path and total number
648 ****************************************************************************/
649 int disk_free(char *path,int *bsize,int *dfree,int *dsize)
651 char *df_command = lp_dfree_command();
672 /* possibly use system() to get the result */
673 if (df_command && *df_command)
679 sprintf(outfile,"%s/dfree.smb.%d",tmpdir(),(int)getpid());
680 sprintf(syscmd,"%s %s",df_command,path);
681 standard_sub_basic(syscmd);
683 ret = smbrun(syscmd,outfile,False);
684 DEBUG(3,("Running the command `%s' gave %d\n",syscmd,ret));
687 FILE *f = fopen(outfile,"r");
693 fscanf(f,"%d %d %d",dsize,dfree,bsize);
697 DEBUG(0,("Can't open %s\n",outfile));
701 disk_norm(bsize,dfree,dsize);
702 dfree_retval = ((*bsize)/1024)*(*dfree);
704 /* Ensure we return the min value between the users quota and
705 what's free on the disk. Thanks to Albrecht Gebhardt
706 <albrecht.gebhardt@uni-klu.ac.at> for this fix.
708 if (disk_quotas(path, &bsizeq, &dfreeq, &dsizeq))
710 disk_norm(&bsizeq, &dfreeq, &dsizeq);
711 dfreeq_retval = ((bsizeq)/1024)*(dfreeq);
712 dfree_retval = ( dfree_retval < dfreeq_retval ) ?
713 dfree_retval : dfreeq_retval ;
714 /* maybe dfree and dfreeq are calculated using different bsizes
715 so convert dfree from bsize into bsizeq */
716 *dfree = ((*dfree) * (*bsize)) / (bsizeq);
717 *dfree = ( *dfree < dfreeq ) ? *dfree : dfreeq ;
722 return(dfree_retval);
726 DEBUG(1,("Warning - no statfs function\n"));
730 if (statfs(path,&fs,sizeof(fs),0) != 0)
733 if (statvfs(path, &fs))
736 if (statfs(path,&fs,sizeof(fs)) == -1)
738 if (statfs(path,&fs) == -1)
740 #endif /* USE_STATVFS */
743 DEBUG(3,("dfree call failed code errno=%d\n",errno));
747 return(((*bsize)/1024)*(*dfree));
752 *dfree = fs.fd_req.bfree;
753 *dsize = fs.fd_req.btot;
756 *bsize = fs.f_frsize;
759 /* eg: osf1 has f_fsize = fundamental filesystem block size,
760 f_bsize = optimal transfer block size (MX: 94-04-19) */
765 #endif /* USE_STATVFS */
770 *dfree = fs.f_bavail;
772 *dsize = fs.f_blocks;
775 #if defined(SCO) || defined(ISC) || defined(MIPS)
779 /* handle rediculous bsize values - some OSes are broken */
780 if ((*bsize) < 512 || (*bsize)>0xFFFF) *bsize = 1024;
782 disk_norm(bsize,dfree,dsize);
788 DEBUG(0,("dfree seems to be broken on your system\n"));
789 *dsize = 20*1024*1024/(*bsize);
790 *dfree = MAX(1,*dfree);
792 dfree_retval = ((*bsize)/1024)*(*dfree);
794 /* Ensure we return the min value between the users quota and
795 what's free on the disk. Thanks to Albrecht Gebhardt
796 <albrecht.gebhardt@uni-klu.ac.at> for this fix.
798 if (disk_quotas(path, &bsizeq, &dfreeq, &dsizeq))
800 disk_norm(&bsizeq, &dfreeq, &dsizeq);
801 dfreeq_retval = ((bsizeq)/1024)*(dfreeq);
802 dfree_retval = ( dfree_retval < dfreeq_retval ) ?
803 dfree_retval : dfreeq_retval ;
804 /* maybe dfree and dfreeq are calculated using different bsizes
805 so convert dfree from bsize into bsizeq */
806 *dfree = ((*dfree) * (*bsize)) / (bsizeq);
807 *dfree = ( *dfree < dfreeq ) ? *dfree : dfreeq ;
812 return(dfree_retval);
817 /****************************************************************************
818 wrap it to get filenames right
819 ****************************************************************************/
820 int sys_disk_free(char *path,int *bsize,int *dfree,int *dsize)
822 return(disk_free(dos_to_unix(path,False),bsize,dfree,dsize));
827 /****************************************************************************
828 check a filename - possibly caling reducename
830 This is called by every routine before it allows an operation on a filename.
831 It does any final confirmation necessary to ensure that the filename is
832 a valid one for the user to access.
833 ****************************************************************************/
834 BOOL check_name(char *name,int cnum)
840 if( IS_VETO_PATH(cnum, name))
842 DEBUG(5,("file path name %s vetoed\n",name));
846 ret = reduce_name(name,Connections[cnum].connectpath,lp_widelinks(SNUM(cnum)));
848 /* Check if we are allowing users to follow symlinks */
849 /* Patch from David Clerc <David.Clerc@cui.unige.ch>
850 University of Geneva */
852 if (!lp_symlinks(SNUM(cnum)))
855 if ( (sys_lstat(name,&statbuf) != -1) &&
856 (S_ISLNK(statbuf.st_mode)) )
858 DEBUG(3,("check_name: denied: file path name %s is a symlink\n",name));
864 DEBUG(5,("check_name on %s failed\n",name));
869 /****************************************************************************
870 check a filename - possibly caling reducename
871 ****************************************************************************/
872 static void check_for_pipe(char *fname)
874 /* special case of pipe opens */
878 if (strstr(s,"pipe/"))
880 DEBUG(3,("Rejecting named pipe open for %s\n",fname));
881 unix_ERR_class = ERRSRV;
882 unix_ERR_code = ERRaccess;
886 /****************************************************************************
887 fd support routines - attempt to do a sys_open
888 ****************************************************************************/
889 static int fd_attempt_open(char *fname, int flags, int mode)
891 int fd = sys_open(fname,flags,mode);
893 /* Fix for files ending in '.' */
894 if((fd == -1) && (errno == ENOENT) &&
895 (strchr(fname,'.')==NULL))
898 fd = sys_open(fname,flags,mode);
901 #if (defined(ENAMETOOLONG) && defined(HAVE_PATHCONF))
902 if ((fd == -1) && (errno == ENAMETOOLONG))
905 char *p = strrchr(fname, '/');
907 if (p == fname) /* name is "/xxx" */
909 max_len = pathconf("/", _PC_NAME_MAX);
912 else if ((p == NULL) || (p == fname))
915 max_len = pathconf(".", _PC_NAME_MAX);
920 max_len = pathconf(fname, _PC_NAME_MAX);
924 if (strlen(p) > max_len)
926 char tmp = p[max_len];
929 if ((fd = sys_open(fname,flags,mode)) == -1)
937 /****************************************************************************
938 fd support routines - attempt to find an already open file by dev
939 and inode - increments the ref_count of the returned file_fd_struct *.
940 ****************************************************************************/
941 static file_fd_struct *fd_get_already_open(struct stat *sbuf)
944 file_fd_struct *fd_ptr;
949 for(i = 0; i <= max_file_fd_used; i++) {
951 if((fd_ptr->ref_count > 0) &&
952 (((uint32)sbuf->st_dev) == fd_ptr->dev) &&
953 (((uint32)sbuf->st_ino) == fd_ptr->inode)) {
956 ("Re-used file_fd_struct %d, dev = %x, inode = %x, ref_count = %d\n",
957 i, fd_ptr->dev, fd_ptr->inode, fd_ptr->ref_count));
964 /****************************************************************************
965 fd support routines - attempt to find a empty slot in the FileFd array.
966 Increments the ref_count of the returned entry.
967 ****************************************************************************/
968 static file_fd_struct *fd_get_new()
971 file_fd_struct *fd_ptr;
973 for(i = 0; i < MAX_OPEN_FILES; i++) {
975 if(fd_ptr->ref_count == 0) {
976 fd_ptr->dev = (uint32)-1;
977 fd_ptr->inode = (uint32)-1;
979 fd_ptr->fd_readonly = -1;
980 fd_ptr->fd_writeonly = -1;
981 fd_ptr->real_open_flags = -1;
983 /* Increment max used counter if neccessary, cuts down
984 on search time when re-using */
985 if(i > max_file_fd_used)
986 max_file_fd_used = i;
987 DEBUG(3,("Allocated new file_fd_struct %d, dev = %x, inode = %x\n",
988 i, fd_ptr->dev, fd_ptr->inode));
992 DEBUG(1,("ERROR! Out of file_fd structures - perhaps increase MAX_OPEN_FILES?\
997 /****************************************************************************
998 fd support routines - attempt to re-open an already open fd as O_RDWR.
999 Save the already open fd (we cannot close due to POSIX file locking braindamage.
1000 ****************************************************************************/
1001 static void fd_attempt_reopen(char *fname, int mode, file_fd_struct *fd_ptr)
1003 int fd = sys_open( fname, O_RDWR, mode);
1008 if(fd_ptr->real_open_flags == O_RDONLY)
1009 fd_ptr->fd_readonly = fd_ptr->fd;
1010 if(fd_ptr->real_open_flags == O_WRONLY)
1011 fd_ptr->fd_writeonly = fd_ptr->fd;
1014 fd_ptr->real_open_flags = O_RDWR;
1017 /****************************************************************************
1018 fd support routines - attempt to close the file referenced by this fd.
1019 Decrements the ref_count and returns it.
1020 ****************************************************************************/
1021 static int fd_attempt_close(file_fd_struct *fd_ptr)
1023 DEBUG(3,("fd_attempt_close on file_fd_struct %d, fd = %d, dev = %x, inode = %x, open_flags = %d, ref_count = %d.\n",
1024 fd_ptr - &FileFd[0],
1025 fd_ptr->fd, fd_ptr->dev, fd_ptr->inode,
1026 fd_ptr->real_open_flags,
1027 fd_ptr->ref_count));
1028 if(fd_ptr->ref_count > 0) {
1029 fd_ptr->ref_count--;
1030 if(fd_ptr->ref_count == 0) {
1031 if(fd_ptr->fd != -1)
1033 if(fd_ptr->fd_readonly != -1)
1034 close(fd_ptr->fd_readonly);
1035 if(fd_ptr->fd_writeonly != -1)
1036 close(fd_ptr->fd_writeonly);
1038 fd_ptr->fd_readonly = -1;
1039 fd_ptr->fd_writeonly = -1;
1040 fd_ptr->real_open_flags = -1;
1041 fd_ptr->dev = (uint32)-1;
1042 fd_ptr->inode = (uint32)-1;
1045 return fd_ptr->ref_count;
1048 /****************************************************************************
1050 ****************************************************************************/
1051 static void open_file(int fnum,int cnum,char *fname1,int flags,int mode, struct stat *sbuf)
1053 extern struct current_user current_user;
1055 struct stat statbuf;
1056 file_fd_struct *fd_ptr;
1057 files_struct *fsp = &Files[fnum];
1061 fsp->granted_oplock = False;
1064 pstrcpy(fname,fname1);
1066 /* check permissions */
1067 if ((flags != O_RDONLY) && !CAN_WRITE(cnum) && !Connections[cnum].printer)
1069 DEBUG(3,("Permission denied opening %s\n",fname));
1070 check_for_pipe(fname);
1074 /* this handles a bug in Win95 - it doesn't say to create the file when it
1076 if (Connections[cnum].printer)
1080 if (flags == O_WRONLY)
1081 DEBUG(3,("Bug in client? Set O_WRONLY without O_CREAT\n"));
1084 #if UTIME_WORKAROUND
1085 /* XXXX - is this OK?? */
1086 /* this works around a utime bug but can cause other problems */
1087 if ((flags & (O_WRONLY|O_RDWR)) && (flags & O_CREAT) && !(flags & O_APPEND))
1092 * Ensure we have a valid struct stat so we can search the
1096 if(stat(fname, &statbuf) < 0) {
1097 if(errno != ENOENT) {
1098 DEBUG(3,("Error doing stat on file %s (%s)\n",
1099 fname,strerror(errno)));
1101 check_for_pipe(fname);
1111 * Check to see if we have this file already
1112 * open. If we do, just use the already open fd and increment the
1113 * reference count (fd_get_already_open increments the ref_count).
1115 if((fd_ptr = fd_get_already_open(sbuf))!= 0) {
1117 int accmode = (flags & (O_RDONLY | O_WRONLY | O_RDWR));
1119 /* File was already open. */
1120 if((flags & O_CREAT) && (flags & O_EXCL)) {
1121 fd_ptr->ref_count--;
1127 * If not opened O_RDWR try
1128 * and do that here - a chmod may have been done
1129 * between the last open and now.
1131 if(fd_ptr->real_open_flags != O_RDWR)
1132 fd_attempt_reopen(fname, mode, fd_ptr);
1135 * Ensure that if we wanted write access
1136 * it has been opened for write, and if we wanted read it
1137 * was open for read.
1139 if(((accmode == O_WRONLY) && (fd_ptr->real_open_flags == O_RDONLY)) ||
1140 ((accmode == O_RDONLY) && (fd_ptr->real_open_flags == O_WRONLY)) ||
1141 ((accmode == O_RDWR) && (fd_ptr->real_open_flags != O_RDWR))) {
1142 DEBUG(3,("Error opening (already open for flags=%d) file %s (%s) (flags=%d)\n",
1143 fd_ptr->real_open_flags, fname,strerror(EACCES),flags));
1144 check_for_pipe(fname);
1145 fd_ptr->ref_count--;
1151 /* We need to allocate a new file_fd_struct (this increments the
1153 if((fd_ptr = fd_get_new()) == 0)
1156 * Whatever the requested flags, attempt read/write access,
1157 * as we don't know what flags future file opens may require.
1158 * If this fails, try again with the required flags.
1159 * Even if we open read/write when only read access was
1160 * requested the setting of the can_write flag in
1161 * the file_struct will protect us from errant
1162 * write requests. We never need to worry about O_APPEND
1163 * as this is not set anywhere in Samba.
1165 fd_ptr->real_open_flags = O_RDWR;
1166 /* Set the flags as needed without the read/write modes. */
1167 open_flags = flags & ~(O_RDWR|O_WRONLY|O_RDONLY);
1168 fd_ptr->fd = fd_attempt_open(fname, open_flags|O_RDWR, mode);
1170 * On some systems opening a file for R/W access on a read only
1171 * filesystems sets errno to EROFS.
1174 if((fd_ptr->fd == -1) && ((errno == EACCES) || (errno == EROFS))) {
1175 #else /* No EROFS */
1176 if((fd_ptr->fd == -1) && (errno == EACCES)) {
1178 if(flags & O_WRONLY) {
1179 fd_ptr->fd = fd_attempt_open(fname, open_flags|O_WRONLY, mode);
1180 fd_ptr->real_open_flags = O_WRONLY;
1182 fd_ptr->fd = fd_attempt_open(fname, open_flags|O_RDONLY, mode);
1183 fd_ptr->real_open_flags = O_RDONLY;
1188 if ((fd_ptr->fd >=0) &&
1189 Connections[cnum].printer && lp_minprintspace(SNUM(cnum))) {
1193 pstrcpy(dname,fname);
1194 p = strrchr(dname,'/');
1196 if (sys_disk_free(dname,&dum1,&dum2,&dum3) <
1197 lp_minprintspace(SNUM(cnum))) {
1198 fd_attempt_close(fd_ptr);
1200 if(fd_ptr->ref_count == 0)
1209 DEBUG(3,("Error opening file %s (%s) (flags=%d)\n",
1210 fname,strerror(errno),flags));
1211 /* Ensure the ref_count is decremented. */
1212 fd_attempt_close(fd_ptr);
1213 check_for_pipe(fname);
1217 if (fd_ptr->fd >= 0)
1221 if(fstat(fd_ptr->fd, &statbuf) == -1) {
1222 /* Error - backout !! */
1223 DEBUG(3,("Error doing fstat on fd %d, file %s (%s)\n",
1224 fd_ptr->fd, fname,strerror(errno)));
1225 /* Ensure the ref_count is decremented. */
1226 fd_attempt_close(fd_ptr);
1231 /* Set the correct entries in fd_ptr. */
1232 fd_ptr->dev = (uint32)sbuf->st_dev;
1233 fd_ptr->inode = (uint32)sbuf->st_ino;
1235 fsp->fd_ptr = fd_ptr;
1236 Connections[cnum].num_files_open++;
1237 fsp->mode = sbuf->st_mode;
1238 GetTimeOfDay(&fsp->open_time);
1239 fsp->uid = current_user.id;
1243 fsp->mmap_ptr = NULL;
1245 fsp->can_lock = True;
1246 fsp->can_read = ((flags & O_WRONLY)==0);
1247 fsp->can_write = ((flags & (O_WRONLY|O_RDWR))!=0);
1248 fsp->share_mode = 0;
1249 fsp->print_file = Connections[cnum].printer;
1250 fsp->modified = False;
1251 fsp->granted_oplock = False;
1253 string_set(&fsp->name,dos_to_unix(fname,False));
1254 fsp->wbmpx_ptr = NULL;
1257 * If the printer is marked as postscript output a leading
1258 * file identifier to ensure the file is treated as a raw
1260 * This has a similar effect as CtrlD=0 in WIN.INI file.
1261 * tim@fsg.com 09/06/94
1263 if (fsp->print_file && POSTSCRIPT(cnum) &&
1266 DEBUG(3,("Writing postscript line\n"));
1267 write_file(fnum,"%!\n",3);
1270 DEBUG(2,("%s %s opened file %s read=%s write=%s (numopen=%d fnum=%d)\n",
1271 timestring(),Connections[cnum].user,fname,
1272 BOOLSTR(fsp->can_read),BOOLSTR(fsp->can_write),
1273 Connections[cnum].num_files_open,fnum));
1278 /* mmap it if read-only */
1279 if (!fsp->can_write)
1281 fsp->mmap_size = file_size(fname);
1282 fsp->mmap_ptr = (char *)mmap(NULL,fsp->mmap_size,
1283 PROT_READ,MAP_SHARED,fsp->fd_ptr->fd,0);
1285 if (fsp->mmap_ptr == (char *)-1 || !fsp->mmap_ptr)
1287 DEBUG(3,("Failed to mmap() %s - %s\n",fname,strerror(errno)));
1288 fsp->mmap_ptr = NULL;
1294 /*******************************************************************
1296 ********************************************************************/
1297 void sync_file(int fnum)
1300 fsync(Files[fnum].fd_ptr->fd);
1304 /****************************************************************************
1305 run a file if it is a magic script
1306 ****************************************************************************/
1307 static void check_magic(int fnum,int cnum)
1309 if (!*lp_magicscript(SNUM(cnum)))
1312 DEBUG(5,("checking magic for %s\n",Files[fnum].name));
1316 if (!(p = strrchr(Files[fnum].name,'/')))
1317 p = Files[fnum].name;
1321 if (!strequal(lp_magicscript(SNUM(cnum)),p))
1327 pstring magic_output;
1329 pstrcpy(fname,Files[fnum].name);
1331 if (*lp_magicoutput(SNUM(cnum)))
1332 pstrcpy(magic_output,lp_magicoutput(SNUM(cnum)));
1334 sprintf(magic_output,"%s.out",fname);
1337 ret = smbrun(fname,magic_output,False);
1338 DEBUG(3,("Invoking magic command %s gave %d\n",fname,ret));
1344 /****************************************************************************
1345 close a file - possibly invalidating the read prediction
1346 ****************************************************************************/
1347 void close_file(int fnum)
1349 files_struct *fs_p = &Files[fnum];
1350 int cnum = fs_p->cnum;
1351 uint32 dev = fs_p->fd_ptr->dev;
1352 uint32 inode = fs_p->fd_ptr->inode;
1353 share_lock_token token;
1355 invalidate_read_prediction(fs_p->fd_ptr->fd);
1357 Connections[cnum].num_files_open--;
1360 free((char *)fs_p->wbmpx_ptr);
1361 fs_p->wbmpx_ptr = NULL;
1367 munmap(fs_p->mmap_ptr,fs_p->mmap_size);
1368 fs_p->mmap_ptr = NULL;
1372 if (lp_share_modes(SNUM(cnum)))
1374 lock_share_entry( cnum, dev, inode, &token);
1375 del_share_mode(token, fnum);
1378 fd_attempt_close(fs_p->fd_ptr);
1380 if (lp_share_modes(SNUM(cnum)))
1381 unlock_share_entry( cnum, dev, inode, token);
1383 /* NT uses smbclose to start a print - weird */
1384 if (fs_p->print_file)
1387 /* check for magic scripts */
1388 check_magic(fnum,cnum);
1390 DEBUG(2,("%s %s closed file %s (numopen=%d)\n",
1391 timestring(),Connections[cnum].user,fs_p->name,
1392 Connections[cnum].num_files_open));
1395 enum {AFAIL,AREAD,AWRITE,AALL};
1397 /*******************************************************************
1398 reproduce the share mode access table
1399 ********************************************************************/
1400 static int access_table(int new_deny,int old_deny,int old_mode,
1401 int share_pid,char *fname)
1403 if (new_deny == DENY_ALL || old_deny == DENY_ALL) return(AFAIL);
1405 if (new_deny == DENY_DOS || old_deny == DENY_DOS) {
1407 if (old_deny == new_deny && share_pid == pid)
1410 if (old_mode == 0) return(AREAD);
1412 /* the new smbpub.zip spec says that if the file extension is
1413 .com, .dll, .exe or .sym then allow the open. I will force
1414 it to read-only as this seems sensible although the spec is
1415 a little unclear on this. */
1416 if ((fname = strrchr(fname,'.'))) {
1417 if (strequal(fname,".com") ||
1418 strequal(fname,".dll") ||
1419 strequal(fname,".exe") ||
1420 strequal(fname,".sym"))
1430 if (old_deny==DENY_WRITE && old_mode==0) return(AREAD);
1431 if (old_deny==DENY_READ && old_mode==0) return(AWRITE);
1432 if (old_deny==DENY_NONE && old_mode==0) return(AALL);
1435 if (old_deny==DENY_WRITE && old_mode==1) return(AREAD);
1436 if (old_deny==DENY_READ && old_mode==1) return(AWRITE);
1437 if (old_deny==DENY_NONE && old_mode==1) return(AALL);
1440 if (old_deny==DENY_WRITE) return(AREAD);
1441 if (old_deny==DENY_READ) return(AWRITE);
1442 if (old_deny==DENY_NONE) return(AALL);
1448 /*******************************************************************
1449 check if the share mode on a file allows it to be deleted or unlinked
1450 return True if sharing doesn't prevent the operation
1451 ********************************************************************/
1452 BOOL check_file_sharing(int cnum,char *fname)
1456 min_share_mode_entry *old_shares = 0;
1457 int num_share_modes;
1459 share_lock_token token;
1463 if(!lp_share_modes(SNUM(cnum)))
1466 if (stat(fname,&sbuf) == -1) return(True);
1468 dev = (uint32)sbuf.st_dev;
1469 inode = (uint32)sbuf.st_ino;
1471 lock_share_entry(cnum, dev, inode, &token);
1472 num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
1475 * Check if the share modes will give us access.
1478 if(num_share_modes != 0)
1485 broke_oplock = False;
1486 for(i = 0; i < num_share_modes; i++)
1488 min_share_mode_entry *share_entry = &old_shares[i];
1492 * Break oplocks before checking share modes. See comment in
1493 * open_file_shared for details.
1494 * Check if someone has an oplock on this file. If so we must
1495 * break it before continuing.
1497 if(share_entry->op_type & BATCH_OPLOCK)
1500 DEBUG(5,("check_file_sharing: breaking oplock (%x) on file %s, \
1501 dev = %x, inode = %x\n", share_entry->op_type, fname, dev, inode));
1503 /* Oplock break.... */
1504 unlock_share_entry(cnum, dev, inode, token);
1505 if(request_oplock_break(share_entry, dev, inode) == False)
1507 free((char *)old_shares);
1508 DEBUG(0,("check_file_sharing: FAILED when breaking oplock (%x) on file %s, \
1509 dev = %x, inode = %x\n", old_shares[i].op_type, fname, dev, inode));
1512 lock_share_entry(cnum, dev, inode, &token);
1513 broke_oplock = True;
1516 #endif /* USE_OPLOCKS */
1518 /* someone else has a share lock on it, check to see
1520 if ((share_entry->share_mode != DENY_DOS) || (share_entry->pid != pid))
1527 free((char *)old_shares);
1528 num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
1530 } while(broke_oplock);
1533 /* XXXX exactly what share mode combinations should be allowed for
1534 deleting/renaming? */
1535 /* If we got here then either there were no share modes or
1536 all share modes were DENY_DOS and the pid == getpid() */
1541 unlock_share_entry(cnum, dev, inode, token);
1542 if(old_shares != NULL)
1543 free((char *)old_shares);
1547 /****************************************************************************
1549 Helper for open_file_shared.
1550 Truncate a file after checking locking; close file if locked.
1551 **************************************************************************/
1552 static void truncate_unless_locked(int fnum, int cnum, share_lock_token token,
1555 if (Files[fnum].can_write){
1556 if (is_locked(fnum,cnum,0x3FFFFFFF,0)){
1557 /* If share modes are in force for this connection we
1558 have the share entry locked. Unlock it before closing. */
1559 if (*share_locked && lp_share_modes(SNUM(cnum)))
1560 unlock_share_entry( cnum, Files[fnum].fd_ptr->dev,
1561 Files[fnum].fd_ptr->inode, token);
1563 /* Share mode no longer locked. */
1564 *share_locked = False;
1566 unix_ERR_class = ERRDOS;
1567 unix_ERR_code = ERRlock;
1570 ftruncate(Files[fnum].fd_ptr->fd,0);
1574 /****************************************************************************
1575 check if we can open a file with a share mode
1576 ****************************************************************************/
1577 int check_share_mode( min_share_mode_entry *share, int deny_mode, char *fname,
1578 BOOL fcbopen, int *flags)
1580 int old_open_mode = share->share_mode &0xF;
1581 int old_deny_mode = (share->share_mode >>4)&7;
1583 if (old_deny_mode > 4 || old_open_mode > 2)
1585 DEBUG(0,("Invalid share mode found (%d,%d,%d) on file %s\n",
1586 deny_mode,old_deny_mode,old_open_mode,fname));
1591 int access_allowed = access_table(deny_mode,old_deny_mode,old_open_mode,
1594 if ((access_allowed == AFAIL) ||
1595 (!fcbopen && (access_allowed == AREAD && *flags == O_RDWR)) ||
1596 (access_allowed == AREAD && *flags == O_WRONLY) ||
1597 (access_allowed == AWRITE && *flags == O_RDONLY))
1599 DEBUG(2,("Share violation on file (%d,%d,%d,%d,%s) = %d\n",
1600 deny_mode,old_deny_mode,old_open_mode,
1601 share->pid,fname, access_allowed));
1605 if (access_allowed == AREAD)
1608 if (access_allowed == AWRITE)
1615 /****************************************************************************
1616 open a file with a share mode
1617 ****************************************************************************/
1618 void open_file_shared(int fnum,int cnum,char *fname,int share_mode,int ofun,
1619 int mode,int oplock_request, int *Access,int *action)
1621 files_struct *fs_p = &Files[fnum];
1624 int deny_mode = (share_mode>>4)&7;
1626 BOOL file_existed = file_exist(fname,&sbuf);
1627 BOOL share_locked = False;
1628 BOOL fcbopen = False;
1629 share_lock_token token;
1632 int num_share_modes = 0;
1637 /* this is for OS/2 EAs - try and say we don't support them */
1638 if (strstr(fname,".+,;=[]."))
1640 unix_ERR_class = ERRDOS;
1641 /* OS/2 Workplace shell fix may be main code stream in a later release. */
1643 unix_ERR_code = ERRcannotopen;
1644 #else /* OS2_WPS_FIX */
1645 unix_ERR_code = ERROR_EAS_NOT_SUPPORTED;
1646 #endif /* OS2_WPS_FIX */
1651 if ((ofun & 0x3) == 0 && file_existed)
1659 if ((ofun & 0x3) == 2)
1662 /* note that we ignore the append flag as
1663 append does not mean the same thing under dos and unix */
1665 switch (share_mode&0xF)
1682 if (flags != O_RDONLY && file_existed &&
1683 (!CAN_WRITE(cnum) || IS_DOS_READONLY(dos_mode(cnum,fname,&sbuf))))
1693 if (deny_mode > DENY_NONE && deny_mode!=DENY_FCB)
1695 DEBUG(2,("Invalid deny mode %d on file %s\n",deny_mode,fname));
1700 if (deny_mode == DENY_FCB) deny_mode = DENY_DOS;
1702 if (lp_share_modes(SNUM(cnum)))
1705 min_share_mode_entry *old_shares = 0;
1709 dev = (uint32)sbuf.st_dev;
1710 inode = (uint32)sbuf.st_ino;
1711 lock_share_entry(cnum, dev, inode, &token);
1712 share_locked = True;
1713 num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
1717 * Check if the share modes will give us access.
1720 if(share_locked && (num_share_modes != 0))
1727 broke_oplock = False;
1728 for(i = 0; i < num_share_modes; i++)
1730 min_share_mode_entry *share_entry = &old_shares[i];
1734 * By observation of NetBench, oplocks are broken *before* share
1735 * modes are checked. This allows a file to be closed by the client
1736 * if the share mode would deny access and the client has an oplock.
1737 * Check if someone has an oplock on this file. If so we must break
1738 * it before continuing.
1740 if(share_entry->op_type & (EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
1743 DEBUG(5,("open_file_shared: breaking oplock (%x) on file %s, \
1744 dev = %x, inode = %x\n", share_entry->op_type, fname, dev, inode));
1746 /* Oplock break.... */
1747 unlock_share_entry(cnum, dev, inode, token);
1748 if(request_oplock_break(share_entry, dev, inode) == False)
1750 free((char *)old_shares);
1751 DEBUG(0,("open_file_shared: FAILED when breaking oplock (%x) on file %s, \
1752 dev = %x, inode = %x\n", old_shares[i].op_type, fname, dev, inode));
1754 unix_ERR_class = ERRDOS;
1755 unix_ERR_code = ERRbadshare;
1758 lock_share_entry(cnum, dev, inode, &token);
1759 broke_oplock = True;
1762 #endif /* USE_OPLOCKS */
1764 /* someone else has a share lock on it, check to see
1766 if(check_share_mode(share_entry, deny_mode, fname, fcbopen, &flags) == False)
1768 free((char *)old_shares);
1769 unlock_share_entry(cnum, dev, inode, token);
1771 unix_ERR_class = ERRDOS;
1772 unix_ERR_code = ERRbadshare;
1780 free((char *)old_shares);
1781 num_share_modes = get_share_modes(cnum, token, dev, inode, &old_shares);
1783 } while(broke_oplock);
1787 free((char *)old_shares);
1790 DEBUG(4,("calling open_file with flags=0x%X flags2=0x%X mode=0%o\n",
1791 flags,flags2,mode));
1793 open_file(fnum,cnum,fname,flags|(flags2&~(O_TRUNC)),mode,file_existed ? &sbuf : 0);
1794 if (!fs_p->open && flags==O_RDWR && errno!=ENOENT && fcbopen)
1797 open_file(fnum,cnum,fname,flags,mode,file_existed ? &sbuf : 0 );
1804 if((share_locked == False) && lp_share_modes(SNUM(cnum)))
1806 /* We created the file - thus we must now lock the share entry before creating it. */
1807 dev = fs_p->fd_ptr->dev;
1808 inode = fs_p->fd_ptr->inode;
1809 lock_share_entry(cnum, dev, inode, &token);
1810 share_locked = True;
1826 fs_p->share_mode = (deny_mode<<4) | open_mode;
1829 (*Access) = open_mode;
1833 if (file_existed && !(flags2 & O_TRUNC)) *action = 1;
1834 if (!file_existed) *action = 2;
1835 if (file_existed && (flags2 & O_TRUNC)) *action = 3;
1837 /* We must create the share mode entry before truncate as
1838 truncate can fail due to locking and have to close the
1839 file (which expects the share_mode_entry to be there).
1841 if (lp_share_modes(SNUM(cnum)))
1845 /* JRA. Currently this only services Exlcusive and batch
1846 oplocks (no other opens on this file). This needs to
1847 be extended to level II oplocks (multiple reader
1850 if(oplock_request && (num_share_modes == 0) && lp_oplocks(SNUM(cnum)))
1852 fs_p->granted_oplock = True;
1853 global_oplocks_open++;
1856 DEBUG(5,("open_file_shared: granted oplock (%x) on file %s, \
1857 dev = %x, inode = %x\n", oplock_request, fname, dev, inode));
1865 #else /* USE_OPLOCKS */
1868 #endif /* USE_OPLOCKS */
1869 set_share_mode(token, fnum, port, oplock_request);
1872 if ((flags2&O_TRUNC) && file_existed)
1873 truncate_unless_locked(fnum,cnum,token,&share_locked);
1876 if (share_locked && lp_share_modes(SNUM(cnum)))
1877 unlock_share_entry( cnum, dev, inode, token);
1880 /****************************************************************************
1881 seek a file. Try to avoid the seek if possible
1882 ****************************************************************************/
1883 int seek_file(int fnum,uint32 pos)
1886 if (Files[fnum].print_file && POSTSCRIPT(Files[fnum].cnum))
1889 Files[fnum].pos = (int)(lseek(Files[fnum].fd_ptr->fd,pos+offset,SEEK_SET)
1891 return(Files[fnum].pos);
1894 /****************************************************************************
1896 ****************************************************************************/
1897 int read_file(int fnum,char *data,uint32 pos,int n)
1901 if (!Files[fnum].can_write)
1903 ret = read_predict(Files[fnum].fd_ptr->fd,pos,data,NULL,n);
1911 if (Files[fnum].mmap_ptr)
1913 int num = MIN(n,(int)(Files[fnum].mmap_size-pos));
1916 memcpy(data,Files[fnum].mmap_ptr+pos,num);
1928 if (seek_file(fnum,pos) != pos)
1930 DEBUG(3,("Failed to seek to %d\n",pos));
1935 readret = read(Files[fnum].fd_ptr->fd,data,n);
1936 if (readret > 0) ret += readret;
1943 /****************************************************************************
1945 ****************************************************************************/
1946 int write_file(int fnum,char *data,int n)
1948 if (!Files[fnum].can_write) {
1953 if (!Files[fnum].modified) {
1955 Files[fnum].modified = True;
1956 if (fstat(Files[fnum].fd_ptr->fd,&st) == 0) {
1957 int dosmode = dos_mode(Files[fnum].cnum,Files[fnum].name,&st);
1958 if (MAP_ARCHIVE(Files[fnum].cnum) && !IS_DOS_ARCHIVE(dosmode)) {
1959 dos_chmod(Files[fnum].cnum,Files[fnum].name,dosmode | aARCH,&st);
1964 return(write_data(Files[fnum].fd_ptr->fd,data,n));
1968 /****************************************************************************
1969 load parameters specific to a connection/service
1970 ****************************************************************************/
1971 BOOL become_service(int cnum,BOOL do_chdir)
1973 extern char magic_char;
1974 static int last_cnum = -1;
1977 if (!OPEN_CNUM(cnum))
1983 Connections[cnum].lastused = smb_last_time;
1988 ChDir(Connections[cnum].connectpath) != 0 &&
1989 ChDir(Connections[cnum].origpath) != 0)
1991 DEBUG(0,("%s chdir (%s) failed cnum=%d\n",timestring(),
1992 Connections[cnum].connectpath,cnum));
1996 if (cnum == last_cnum)
2001 case_default = lp_defaultcase(snum);
2002 case_preserve = lp_preservecase(snum);
2003 short_case_preserve = lp_shortpreservecase(snum);
2004 case_mangle = lp_casemangle(snum);
2005 case_sensitive = lp_casesensitive(snum);
2006 magic_char = lp_magicchar(snum);
2007 use_mangled_map = (*lp_mangled_map(snum) ? True:False);
2012 /****************************************************************************
2013 find a service entry
2014 ****************************************************************************/
2015 int find_service(char *service)
2019 string_sub(service,"\\","/");
2021 iService = lp_servicenumber(service);
2023 /* now handle the special case of a home directory */
2026 char *phome_dir = get_home_dir(service);
2027 DEBUG(3,("checking for home directory %s gave %s\n",service,
2028 phome_dir?phome_dir:"(NULL)"));
2032 if ((iHomeService = lp_servicenumber(HOMES_NAME)) >= 0)
2034 lp_add_home(service,iHomeService,phome_dir);
2035 iService = lp_servicenumber(service);
2040 /* If we still don't have a service, attempt to add it as a printer. */
2043 int iPrinterService;
2045 if ((iPrinterService = lp_servicenumber(PRINTERS_NAME)) >= 0)
2049 DEBUG(3,("checking whether %s is a valid printer name...\n", service));
2051 if ((pszTemp != NULL) && pcap_printername_ok(service, pszTemp))
2053 DEBUG(3,("%s is a valid printer name\n", service));
2054 DEBUG(3,("adding %s as a printer service\n", service));
2055 lp_add_printer(service,iPrinterService);
2056 iService = lp_servicenumber(service);
2058 DEBUG(0,("failed to add %s as a printer service!\n", service));
2061 DEBUG(3,("%s is not a valid printer name\n", service));
2065 /* just possibly it's a default service? */
2068 char *defservice = lp_defaultservice();
2069 if (defservice && *defservice && !strequal(defservice,service)) {
2070 iService = find_service(defservice);
2071 if (iService >= 0) {
2072 string_sub(service,"_","/");
2073 iService = lp_add_service(service,iService);
2079 if (!VALID_SNUM(iService))
2081 DEBUG(0,("Invalid snum %d for %s\n",iService,service));
2086 DEBUG(3,("find_service() failed to find service %s\n", service));
2092 /****************************************************************************
2093 create an error packet from a cached error.
2094 ****************************************************************************/
2095 int cached_error_packet(char *inbuf,char *outbuf,int fnum,int line)
2097 write_bmpx_struct *wbmpx = Files[fnum].wbmpx_ptr;
2099 int32 eclass = wbmpx->wr_errclass;
2100 int32 err = wbmpx->wr_error;
2102 /* We can now delete the auxiliary struct */
2103 free((char *)wbmpx);
2104 Files[fnum].wbmpx_ptr = NULL;
2105 return error_packet(inbuf,outbuf,eclass,err,line);
2114 } unix_smb_errmap[] =
2116 {EPERM,ERRDOS,ERRnoaccess},
2117 {EACCES,ERRDOS,ERRnoaccess},
2118 {ENOENT,ERRDOS,ERRbadfile},
2119 {ENOTDIR,ERRDOS,ERRbadpath},
2120 {EIO,ERRHRD,ERRgeneral},
2121 {EBADF,ERRSRV,ERRsrverror},
2122 {EINVAL,ERRSRV,ERRsrverror},
2123 {EEXIST,ERRDOS,ERRfilexists},
2124 {ENFILE,ERRDOS,ERRnofids},
2125 {EMFILE,ERRDOS,ERRnofids},
2126 {ENOSPC,ERRHRD,ERRdiskfull},
2128 {EDQUOT,ERRHRD,ERRdiskfull},
2131 {ENOTEMPTY,ERRDOS,ERRnoaccess},
2134 {EXDEV,ERRDOS,ERRdiffdevice},
2136 {EROFS,ERRHRD,ERRnowrite},
2140 /****************************************************************************
2141 create an error packet from errno
2142 ****************************************************************************/
2143 int unix_error_packet(char *inbuf,char *outbuf,int def_class,uint32 def_code,int line)
2145 int eclass=def_class;
2149 if (unix_ERR_class != SUCCESS)
2151 eclass = unix_ERR_class;
2152 ecode = unix_ERR_code;
2153 unix_ERR_class = SUCCESS;
2158 while (unix_smb_errmap[i].smbclass != 0)
2160 if (unix_smb_errmap[i].unixerror == errno)
2162 eclass = unix_smb_errmap[i].smbclass;
2163 ecode = unix_smb_errmap[i].smbcode;
2170 return(error_packet(inbuf,outbuf,eclass,ecode,line));
2174 /****************************************************************************
2175 create an error packet. Normally called using the ERROR() macro
2176 ****************************************************************************/
2177 int error_packet(char *inbuf,char *outbuf,int error_class,uint32 error_code,int line)
2179 int outsize = set_message(outbuf,0,0,True);
2181 cmd = CVAL(inbuf,smb_com);
2183 CVAL(outbuf,smb_rcls) = error_class;
2184 SSVAL(outbuf,smb_err,error_code);
2186 DEBUG(3,("%s error packet at line %d cmd=%d (%s) eclass=%d ecode=%d\n",
2189 (int)CVAL(inbuf,smb_com),
2190 smb_fn_name(CVAL(inbuf,smb_com)),
2195 DEBUG(3,("error string = %s\n",strerror(errno)));
2201 #ifndef SIGCLD_IGNORE
2202 /****************************************************************************
2203 this prevents zombie child processes
2204 ****************************************************************************/
2205 static int sig_cld()
2207 static int depth = 0;
2210 DEBUG(0,("ERROR: Recursion in sig_cld? Perhaps you need `#define USE_WAITPID'?\n"));
2216 BlockSignals(True,SIGCLD);
2217 DEBUG(5,("got SIGCLD\n"));
2220 while (sys_waitpid((pid_t)-1,(int *)NULL, WNOHANG) > 0);
2224 /* Stevens, Adv. Unix Prog. says that on system V you must call
2225 wait before reinstalling the signal handler, because the kernel
2226 calls the handler from within the signal-call when there is a
2227 child that has exited. This would lead to an infinite recursion
2228 if done vice versa. */
2230 #ifndef DONT_REINSTALL_SIG
2231 #ifdef SIGCLD_IGNORE
2232 signal(SIGCLD, SIG_IGN);
2234 signal(SIGCLD, SIGNAL_CAST sig_cld);
2239 while (wait3(WAIT3_CAST1 NULL, WNOHANG, WAIT3_CAST2 NULL) > 0);
2242 BlockSignals(False,SIGCLD);
2247 /****************************************************************************
2248 this is called when the client exits abruptly
2249 **************************************************************************/
2250 static int sig_pipe()
2252 extern int password_client;
2253 BlockSignals(True,SIGPIPE);
2255 if (password_client != -1) {
2256 DEBUG(3,("lost connection to password server\n"));
2257 close(password_client);
2258 password_client = -1;
2259 #ifndef DONT_REINSTALL_SIG
2260 signal(SIGPIPE, SIGNAL_CAST sig_pipe);
2262 BlockSignals(False,SIGPIPE);
2266 exit_server("Got sigpipe\n");
2270 /****************************************************************************
2271 open the socket communication
2272 ****************************************************************************/
2273 static BOOL open_sockets(BOOL is_daemon,int port)
2280 struct sockaddr addr;
2281 int in_addrlen = sizeof(addr);
2284 #ifdef SIGCLD_IGNORE
2285 signal(SIGCLD, SIG_IGN);
2287 signal(SIGCLD, SIGNAL_CAST sig_cld);
2290 /* open an incoming socket */
2291 s = open_socket_in(SOCK_STREAM, port, 0,interpret_addr(lp_socket_address()));
2295 /* ready to listen */
2296 if (listen(s, 5) == -1)
2298 DEBUG(0,("listen: %s\n",strerror(errno)));
2306 /* now accept incoming connections - forking a new process
2307 for each incoming connection */
2308 DEBUG(2,("waiting for a connection\n"));
2311 Client = accept(s,&addr,&in_addrlen);
2313 if (Client == -1 && errno == EINTR)
2318 DEBUG(0,("accept: %s\n",strerror(errno)));
2322 #ifdef NO_FORK_DEBUG
2323 #ifndef NO_SIGNAL_TEST
2324 signal(SIGPIPE, SIGNAL_CAST sig_pipe);
2325 signal(SIGCLD, SIGNAL_CAST SIG_DFL);
2329 if (Client != -1 && fork()==0)
2331 /* Child code ... */
2332 #ifndef NO_SIGNAL_TEST
2333 signal(SIGPIPE, SIGNAL_CAST sig_pipe);
2334 signal(SIGCLD, SIGNAL_CAST SIG_DFL);
2336 /* close the listening socket */
2339 /* close our standard file descriptors */
2343 set_socket_options(Client,"SO_KEEPALIVE");
2344 set_socket_options(Client,user_socket_options);
2346 /* Reset global variables in util.c so that
2347 client substitutions will be done correctly
2350 reset_globals_after_fork();
2353 close(Client); /* The parent doesn't need this socket */
2359 /* We will abort gracefully when the client or remote system
2361 #ifndef NO_SIGNAL_TEST
2362 signal(SIGPIPE, SIGNAL_CAST sig_pipe);
2366 /* close our standard file descriptors */
2369 set_socket_options(Client,"SO_KEEPALIVE");
2370 set_socket_options(Client,user_socket_options);
2376 /****************************************************************************
2377 process an smb from the client - split out from the process() code so
2378 it can be used by the oplock break code.
2379 ****************************************************************************/
2381 static void process_smb(char *inbuf, char *outbuf)
2384 static int trans_num;
2385 int msg_type = CVAL(inbuf,0);
2386 int32 len = smb_len(inbuf);
2387 int nread = len + 4;
2389 if (trans_num == 0) {
2390 /* on the first packet, check the global hosts allow/ hosts
2391 deny parameters before doing any parsing of the packet
2392 passed to us by the client. This prevents attacks on our
2393 parsing code from hosts not in the hosts allow list */
2394 if (!check_access(-1)) {
2395 /* send a negative session response "not listining on calling
2397 static unsigned char buf[5] = {0x83, 0, 0, 1, 0x81};
2398 DEBUG(1,("%s Connection denied from %s\n",
2399 timestring(),client_addr()));
2400 send_smb(Client,(char *)buf);
2401 exit_server("connection denied");
2405 DEBUG(6,("got message type 0x%x of len 0x%x\n",msg_type,len));
2406 DEBUG(3,("%s Transaction %d of length %d\n",timestring(),trans_num,nread));
2409 if(trans_num == 1 && VT_Check(inbuf))
2419 nread = construct_reply(inbuf,outbuf,nread,max_send);
2423 if (CVAL(outbuf,0) == 0)
2426 if (nread != smb_len(outbuf) + 4)
2428 DEBUG(0,("ERROR: Invalid message response size! %d %d\n",
2429 nread, smb_len(outbuf)));
2432 send_smb(Client,outbuf);
2438 /****************************************************************************
2439 open the oplock IPC socket communication
2440 ****************************************************************************/
2441 static BOOL open_oplock_ipc()
2443 struct sockaddr_in sock_name;
2444 int name_len = sizeof(sock_name);
2446 DEBUG(3,("open_oplock_ipc: opening loopback UDP socket.\n"));
2448 /* Open a lookback UDP socket on a random port. */
2449 oplock_sock = open_socket_in(SOCK_DGRAM, 0, 0, htonl(INADDR_LOOPBACK));
2450 if (oplock_sock == -1)
2452 DEBUG(0,("open_oplock_ipc: Failed to get local UDP socket for \
2453 address %x. Error was %s\n", htonl(INADDR_LOOPBACK), strerror(errno)));
2458 /* Find out the transient UDP port we have been allocated. */
2459 if(getsockname(oplock_sock, (struct sockaddr *)&sock_name, &name_len)<0)
2461 DEBUG(0,("open_oplock_ipc: Failed to get local UDP port. Error was %s\n",
2468 oplock_port = ntohs(sock_name.sin_port);
2473 /****************************************************************************
2474 process an oplock break message.
2475 ****************************************************************************/
2476 static BOOL process_local_message(int oplock_sock, char *buffer, int buf_size)
2482 msg_len = IVAL(buffer,UDP_CMD_LEN_OFFSET);
2483 from_port = SVAL(buffer,UDP_CMD_PORT_OFFSET);
2485 msg_start = &buffer[UDP_CMD_HEADER_LEN];
2487 DEBUG(5,("process_local_message: Got a message of length %d from port (%d)\n",
2488 msg_len, from_port));
2490 /* Switch on message command - currently OPLOCK_BREAK_CMD is the
2491 only valid request. */
2493 switch(SVAL(msg_start,UDP_MESSAGE_CMD_OFFSET))
2495 case OPLOCK_BREAK_CMD:
2496 /* Ensure that the msg length is correct. */
2497 if(msg_len != OPLOCK_BREAK_MSG_LEN)
2499 DEBUG(0,("process_local_message: incorrect length for OPLOCK_BREAK_CMD (was %d, \
2500 should be %d).\n", msg_len, OPLOCK_BREAK_MSG_LEN));
2504 uint32 remotepid = IVAL(msg_start,OPLOCK_BREAK_PID_OFFSET);
2505 uint32 dev = IVAL(msg_start,OPLOCK_BREAK_DEV_OFFSET);
2506 uint32 inode = IVAL(msg_start, OPLOCK_BREAK_INODE_OFFSET);
2507 struct timeval tval;
2508 struct sockaddr_in toaddr;
2510 tval.tv_sec = IVAL(msg_start, OPLOCK_BREAK_SEC_OFFSET);
2511 tval.tv_usec = IVAL(msg_start, OPLOCK_BREAK_USEC_OFFSET);
2513 DEBUG(5,("process_local_message: oplock break request from \
2514 pid %d, port %d, dev = %x, inode = %x\n", remotepid, from_port, dev, inode));
2517 * If we have no record of any currently open oplocks,
2518 * it's not an error, as a close command may have
2519 * just been issued on the file that was oplocked.
2520 * Just return success in this case.
2523 if(global_oplocks_open != 0)
2525 if(oplock_break(dev, inode, &tval) == False)
2527 DEBUG(0,("process_local_message: oplock break failed - \
2528 not returning udp message.\n"));
2534 DEBUG(3,("process_local_message: oplock break requested with no outstanding \
2535 oplocks. Returning success.\n"));
2538 /* Send the message back after OR'ing in the 'REPLY' bit. */
2539 SSVAL(msg_start,UDP_MESSAGE_CMD_OFFSET,OPLOCK_BREAK_CMD | CMD_REPLY);
2541 bzero((char *)&toaddr,sizeof(toaddr));
2542 toaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
2543 toaddr.sin_port = htons(from_port);
2544 toaddr.sin_family = AF_INET;
2546 if(sendto( oplock_sock, msg_start, OPLOCK_BREAK_MSG_LEN, 0,
2547 (struct sockaddr *)&toaddr, sizeof(toaddr)) < 0)
2549 DEBUG(0,("process_local_message: sendto process %d failed. Errno was %s\n",
2550 remotepid, strerror(errno)));
2554 DEBUG(5,("process_local_message: oplock break reply sent to \
2555 pid %d, port %d, for file dev = %x, inode = %x\n", remotepid,
2556 from_port, dev, inode));
2561 DEBUG(0,("process_local_message: unknown UDP message command code (%x) - ignoring.\n",
2562 (unsigned int)SVAL(msg_start,0)));
2568 /****************************************************************************
2569 Process an oplock break directly.
2570 ****************************************************************************/
2571 BOOL oplock_break(uint32 dev, uint32 inode, struct timeval *tval)
2574 static char *inbuf = NULL;
2575 static char *outbuf = NULL;
2576 files_struct *fsp = NULL;
2579 BOOL shutdown_server = False;
2581 DEBUG(5,("oplock_break: called for dev = %x, inode = %x. Current \
2582 global_oplocks_open = %d\n", dev, inode, global_oplocks_open));
2586 inbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
2588 DEBUG(0,("oplock_break: malloc fail for input buffer.\n"));
2591 outbuf = (char *)malloc(BUFFER_SIZE + SAFETY_MARGIN);
2592 if(outbuf == NULL) {
2593 DEBUG(0,("oplock_break: malloc fail for output buffer.\n"));
2600 /* We need to search the file open table for the
2601 entry containing this dev and inode, and ensure
2602 we have an oplock on it. */
2603 for( fnum = 0; fnum < MAX_OPEN_FILES; fnum++)
2608 if((fsp->fd_ptr->dev == dev) && (fsp->fd_ptr->inode == inode) &&
2609 (fsp->open_time.tv_sec == tval->tv_sec) &&
2610 (fsp->open_time.tv_usec == tval->tv_usec))
2617 /* The file could have been closed in the meantime - return success. */
2618 DEBUG(3,("oplock_break: cannot find open file with dev = %x, inode = %x (fnum = %d) \
2619 allowing break to succeed.\n", dev, inode, fnum));
2623 /* Ensure we have an oplock on the file */
2625 /* There is a potential race condition in that an oplock could
2626 have been broken due to another udp request, and yet there are
2627 still oplock break messages being sent in the udp message
2628 queue for this file. So return true if we don't have an oplock,
2629 as we may have just freed it.
2632 if(!fsp->granted_oplock)
2634 DEBUG(3,("oplock_break: file %s (fnum = %d, dev = %x, inode = %x) has no oplock. \
2635 Allowing break to succeed regardless.\n", fsp->name, fnum, dev, inode));
2639 /* Now comes the horrid part. We must send an oplock break to the client,
2640 and then process incoming messages until we get a close or oplock release.
2643 /* Prepare the SMBlockingX message. */
2644 bzero(outbuf,smb_size);
2645 set_message(outbuf,8,0,True);
2647 SCVAL(outbuf,smb_com,SMBlockingX);
2648 SSVAL(outbuf,smb_tid,fsp->cnum);
2649 SSVAL(outbuf,smb_pid,0xFFFF);
2650 SSVAL(outbuf,smb_uid,0);
2651 SSVAL(outbuf,smb_mid,0xFFFF);
2652 SCVAL(outbuf,smb_vwv0,0xFF);
2653 SSVAL(outbuf,smb_vwv2,fnum);
2654 SCVAL(outbuf,smb_vwv3,LOCKING_ANDX_OPLOCK_RELEASE);
2655 /* Change this when we have level II oplocks. */
2656 SCVAL(outbuf,smb_vwv3+1,OPLOCKLEVEL_NONE);
2658 send_smb(Client, outbuf);
2660 global_oplock_break = True;
2662 /* Process incoming messages. */
2664 /* JRA - If we don't get a break from the client in OPLOCK_BREAK_TIMEOUT
2665 seconds we should just die.... */
2667 start_time = time(NULL);
2669 while(OPEN_FNUM(fnum) && fsp->granted_oplock)
2671 if(receive_smb(Client,inbuf,OPLOCK_BREAK_TIMEOUT * 1000) == False)
2674 * Die if we got an error.
2677 if (smb_read_error == READ_EOF)
2678 DEBUG(0,("oplock_break: end of file from client\n"));
2680 if (smb_read_error == READ_ERROR)
2681 DEBUG(0,("oplock_break: receive_smb error (%s)\n",
2684 if (smb_read_error == READ_TIMEOUT)
2685 DEBUG(0,("oplock_break: receive_smb timed out after %d seconds.\n",
2686 OPLOCK_BREAK_TIMEOUT));
2688 DEBUG(0,("oplock_break failed for file %s (fnum = %d, dev = %x, \
2689 inode = %x).\n", fsp->name, fnum, dev, inode));
2690 shutdown_server = True;
2693 process_smb(inbuf, outbuf);
2695 /* We only need this in case a readraw crossed on the wire. */
2696 if(global_oplock_break)
2697 global_oplock_break = False;
2700 * Die if we go over the time limit.
2703 if((time(NULL) - start_time) > OPLOCK_BREAK_TIMEOUT)
2705 DEBUG(0,("oplock_break: no break received from client within \
2706 %d seconds.\n", OPLOCK_BREAK_TIMEOUT));
2707 DEBUG(0,("oplock_break failed for file %s (fnum = %d, dev = %x, \
2708 inode = %x).\n", fsp->name, fnum, dev, inode));
2709 shutdown_server = True;
2715 * If the client did not respond we must die.
2720 DEBUG(0,("oplock_break: client failure in break - shutting down this smbd.\n"));
2723 exit_server("oplock break failure");
2728 /* The lockingX reply will have removed the oplock flag
2729 from the sharemode. */
2731 fsp->granted_oplock = False;
2734 global_oplocks_open--;
2736 /* Santity check - remove this later. JRA */
2737 if(global_oplocks_open < 0)
2739 DEBUG(0,("oplock_break: global_oplocks_open < 0 (%d). PANIC ERROR\n",
2740 global_oplocks_open));
2744 DEBUG(5,("oplock_break: returning success for fnum = %d, dev = %x, inode = %x. Current \
2745 global_oplocks_open = %d\n", fnum, dev, inode, global_oplocks_open));
2750 /****************************************************************************
2751 Send an oplock break message to another smbd process. If the oplock is held
2752 by the local smbd then call the oplock break function directly.
2753 ****************************************************************************/
2755 BOOL request_oplock_break(min_share_mode_entry *share_entry,
2756 uint32 dev, uint32 inode)
2758 char op_break_msg[OPLOCK_BREAK_MSG_LEN];
2759 struct sockaddr_in addr_out;
2762 if(pid == share_entry->pid)
2764 /* We are breaking our own oplock, make sure it's us. */
2765 if(share_entry->op_port != oplock_port)
2767 DEBUG(0,("request_oplock_break: corrupt share mode entry - pid = %d, port = %d \
2768 should be %d\n", pid, share_entry->op_port, oplock_port));
2772 DEBUG(5,("request_oplock_break: breaking our own oplock\n"));
2774 /* Call oplock break direct. */
2775 return oplock_break(dev, inode, &share_entry->time);
2778 /* We need to send a OPLOCK_BREAK_CMD message to the
2779 port in the share mode entry. */
2781 SSVAL(op_break_msg,UDP_MESSAGE_CMD_OFFSET,OPLOCK_BREAK_CMD);
2782 SIVAL(op_break_msg,OPLOCK_BREAK_PID_OFFSET,pid);
2783 SIVAL(op_break_msg,OPLOCK_BREAK_DEV_OFFSET,dev);
2784 SIVAL(op_break_msg,OPLOCK_BREAK_INODE_OFFSET,inode);
2785 SIVAL(op_break_msg,OPLOCK_BREAK_SEC_OFFSET,(uint32)share_entry->time.tv_sec);
2786 SIVAL(op_break_msg,OPLOCK_BREAK_USEC_OFFSET,(uint32)share_entry->time.tv_usec);
2788 /* set the address and port */
2789 bzero((char *)&addr_out,sizeof(addr_out));
2790 addr_out.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
2791 addr_out.sin_port = htons( share_entry->op_port );
2792 addr_out.sin_family = AF_INET;
2794 DEBUG(3,("request_oplock_break: sending a oplock break message to pid %d on port %d \
2795 for dev = %x, inode = %x\n", share_entry->pid, share_entry->op_port, dev, inode));
2797 if(sendto(oplock_sock,op_break_msg,OPLOCK_BREAK_MSG_LEN,0,
2798 (struct sockaddr *)&addr_out,sizeof(addr_out)) < 0)
2800 DEBUG(0,("request_oplock_break: failed when sending a oplock break message \
2801 to pid %d on port %d for dev = %x, inode = %x. Error was %s\n",
2802 share_entry->pid, share_entry->op_port, dev, inode,
2808 * Now we must await the oplock broken message coming back
2809 * from the target smbd process. Timeout if it fails to
2810 * return in OPLOCK_BREAK_TIMEOUT seconds.
2811 * While we get messages that aren't ours, loop.
2816 char op_break_reply[UDP_CMD_HEADER_LEN+OPLOCK_BREAK_MSG_LEN];
2817 int32 reply_msg_len;
2818 int16 reply_from_port;
2819 char *reply_msg_start;
2821 if(receive_local_message(oplock_sock, op_break_reply, sizeof(op_break_reply),
2822 OPLOCK_BREAK_TIMEOUT * 1000) == False)
2824 if(smb_read_error == READ_TIMEOUT)
2825 DEBUG(0,("request_oplock_break: no response received to oplock break request to \
2826 pid %d on port %d for dev = %x, inode = %x\n", share_entry->pid,
2827 share_entry->op_port, dev, inode));
2829 DEBUG(0,("request_oplock_break: error in response received to oplock break request to \
2830 pid %d on port %d for dev = %x, inode = %x. Error was (%s).\n", share_entry->pid,
2831 share_entry->op_port, dev, inode, strerror(errno)));
2836 * If the response we got was not an answer to our message, but
2837 * was a completely different request, push it onto the pending
2838 * udp message stack so that we can deal with it in the main loop.
2839 * It may be another oplock break request to us.
2843 * Local note from JRA. There exists the possibility of a denial
2844 * of service attack here by allowing non-root processes running
2845 * on a local machine sending many of these pending messages to
2846 * a smbd port. Currently I'm not sure how to restrict the messages
2847 * I will queue (although I could add a limit to the queue) to
2848 * those received by root processes only. There should be a
2849 * way to make this bulletproof....
2852 reply_msg_len = IVAL(op_break_reply,UDP_CMD_LEN_OFFSET);
2853 reply_from_port = SVAL(op_break_reply,UDP_CMD_PORT_OFFSET);
2855 reply_msg_start = &op_break_reply[UDP_CMD_HEADER_LEN];
2857 if(reply_msg_len != OPLOCK_BREAK_MSG_LEN)
2860 DEBUG(0,("request_oplock_break: invalid message length received. Ignoring\n"));
2864 if(((SVAL(reply_msg_start,UDP_MESSAGE_CMD_OFFSET) & CMD_REPLY) == 0) ||
2865 (reply_from_port != share_entry->op_port) ||
2866 (memcmp(&reply_msg_start[OPLOCK_BREAK_PID_OFFSET],
2867 &op_break_msg[OPLOCK_BREAK_PID_OFFSET],
2868 OPLOCK_BREAK_MSG_LEN - OPLOCK_BREAK_PID_OFFSET) != 0))
2870 DEBUG(3,("request_oplock_break: received other message whilst awaiting \
2871 oplock break response from pid %d on port %d for dev = %x, inode = %x.\n",
2872 share_entry->pid, share_entry->op_port, dev, inode));
2873 if(push_local_message(op_break_reply, sizeof(op_break_reply)) == False)
2880 DEBUG(3,("request_oplock_break: broke oplock.\n"));
2885 #endif /* USE_OPLOCKS */
2887 /****************************************************************************
2888 check if a snum is in use
2889 ****************************************************************************/
2890 BOOL snum_used(int snum)
2893 for (i=0;i<MAX_CONNECTIONS;i++)
2894 if (OPEN_CNUM(i) && (SNUM(i) == snum))
2899 /****************************************************************************
2900 reload the services file
2901 **************************************************************************/
2902 BOOL reload_services(BOOL test)
2909 pstrcpy(fname,lp_configfile());
2910 if (file_exist(fname,NULL) && !strcsequal(fname,servicesf))
2912 pstrcpy(servicesf,fname);
2919 if (test && !lp_file_list_changed())
2922 lp_killunused(snum_used);
2924 ret = lp_load(servicesf,False);
2926 /* perhaps the config filename is now set */
2928 reload_services(True);
2937 set_socket_options(Client,"SO_KEEPALIVE");
2938 set_socket_options(Client,user_socket_options);
2942 create_mangled_stack(lp_mangledstack());
2944 /* this forces service parameters to be flushed */
2945 become_service(-1,True);
2952 /****************************************************************************
2953 this prevents zombie child processes
2954 ****************************************************************************/
2955 static int sig_hup()
2957 BlockSignals(True,SIGHUP);
2958 DEBUG(0,("Got SIGHUP\n"));
2959 reload_services(False);
2960 #ifndef DONT_REINSTALL_SIG
2961 signal(SIGHUP,SIGNAL_CAST sig_hup);
2963 BlockSignals(False,SIGHUP);
2967 /****************************************************************************
2968 Setup the groups a user belongs to.
2969 ****************************************************************************/
2970 int setup_groups(char *user, int uid, int gid, int *p_ngroups,
2971 int **p_igroups, gid_t **p_groups)
2973 if (-1 == initgroups(user,gid))
2977 DEBUG(0,("Unable to initgroups!\n"));
2978 if (gid < 0 || gid > 16000 || uid < 0 || uid > 16000)
2979 DEBUG(0,("This is probably a problem with the account %s\n",user));
2987 ngroups = getgroups(0,&grp);
2990 igroups = (int *)malloc(sizeof(int)*ngroups);
2991 for (i=0;i<ngroups;i++)
2992 igroups[i] = 0x42424242;
2993 ngroups = getgroups(ngroups,(gid_t *)igroups);
2995 if (igroups[0] == 0x42424242)
2998 *p_ngroups = ngroups;
3000 /* The following bit of code is very strange. It is due to the
3001 fact that some OSes use int* and some use gid_t* for
3002 getgroups, and some (like SunOS) use both, one in prototypes,
3003 and one in man pages and the actual code. Thus we detect it
3004 dynamically using some very ugly code */
3007 /* does getgroups return ints or gid_t ?? */
3008 static BOOL groups_use_ints = True;
3010 if (groups_use_ints &&
3012 SVAL(igroups,2) == 0x4242)
3013 groups_use_ints = False;
3015 for (i=0;groups_use_ints && i<ngroups;i++)
3016 if (igroups[i] == 0x42424242)
3017 groups_use_ints = False;
3019 if (groups_use_ints)
3021 *p_igroups = igroups;
3022 *p_groups = (gid_t *)igroups;
3026 gid_t *groups = (gid_t *)igroups;
3027 igroups = (int *)malloc(sizeof(int)*ngroups);
3028 for (i=0;i<ngroups;i++)
3029 igroups[i] = groups[i];
3030 *p_igroups = igroups;
3031 *p_groups = (gid_t *)groups;
3034 DEBUG(3,("%s is in %d groups\n",user,ngroups));
3035 for (i=0;i<ngroups;i++)
3036 DEBUG(3,("%d ",igroups[i]));
3042 /****************************************************************************
3043 make a connection to a service
3044 ****************************************************************************/
3045 int make_connection(char *service,char *user,char *password, int pwlen, char *dev,uint16 vuid)
3049 struct passwd *pass = NULL;
3050 connection_struct *pcon;
3053 static BOOL first_connection = True;
3057 snum = find_service(service);
3060 if (strequal(service,"IPC$"))
3062 DEBUG(3,("%s refusing IPC connection\n",timestring()));
3066 DEBUG(0,("%s couldn't find service %s\n",timestring(),service));
3070 if (strequal(service,HOMES_NAME))
3072 if (*user && Get_Pwnam(user,True))
3073 return(make_connection(user,user,password,pwlen,dev,vuid));
3075 if (validated_username(vuid))
3077 strcpy(user,validated_username(vuid));
3078 return(make_connection(user,user,password,pwlen,dev,vuid));
3082 if (!lp_snum_ok(snum) || !check_access(snum)) {
3086 /* you can only connect to the IPC$ service as an ipc device */
3087 if (strequal(service,"IPC$"))
3090 if (*dev == '?' || !*dev)
3092 if (lp_print_ok(snum))
3093 strcpy(dev,"LPT1:");
3098 /* if the request is as a printer and you can't print then refuse */
3100 if (!lp_print_ok(snum) && (strncmp(dev,"LPT",3) == 0)) {
3101 DEBUG(1,("Attempt to connect to non-printer as a printer\n"));
3105 /* lowercase the user name */
3108 /* add it as a possible user name */
3109 add_session_user(service);
3111 /* shall we let them in? */
3112 if (!authorise_login(snum,user,password,pwlen,&guest,&force,vuid))
3114 DEBUG(2,("%s invalid username/password for %s\n",timestring(),service));
3118 cnum = find_free_connection(str_checksum(service) + str_checksum(user));
3121 DEBUG(0,("%s couldn't find free connection\n",timestring()));
3125 pcon = &Connections[cnum];
3126 bzero((char *)pcon,sizeof(*pcon));
3128 /* find out some info about the user */
3129 pass = Get_Pwnam(user,True);
3133 DEBUG(0,("%s couldn't find account %s\n",timestring(),user));
3137 pcon->read_only = lp_readonly(snum);
3141 StrnCpy(list,lp_readlist(snum),sizeof(pstring)-1);
3142 string_sub(list,"%S",service);
3144 if (user_in_list(user,list))
3145 pcon->read_only = True;
3147 StrnCpy(list,lp_writelist(snum),sizeof(pstring)-1);
3148 string_sub(list,"%S",service);
3150 if (user_in_list(user,list))
3151 pcon->read_only = False;
3154 /* admin user check */
3155 if (user_in_list(user,lp_admin_users(snum)) &&
3158 pcon->admin_user = True;
3159 DEBUG(0,("%s logged in as admin user (root privileges)\n",user));
3162 pcon->admin_user = False;
3164 pcon->force_user = force;
3166 pcon->uid = pass->pw_uid;
3167 pcon->gid = pass->pw_gid;
3168 pcon->num_files_open = 0;
3169 pcon->lastused = time(NULL);
3170 pcon->service = snum;
3172 pcon->printer = (strncmp(dev,"LPT",3) == 0);
3173 pcon->ipc = (strncmp(dev,"IPC",3) == 0);
3174 pcon->dirptr = NULL;
3175 pcon->veto_list = NULL;
3176 pcon->hide_list = NULL;
3177 string_set(&pcon->dirpath,"");
3178 string_set(&pcon->user,user);
3181 if (*lp_force_group(snum))
3186 StrnCpy(gname,lp_force_group(snum),sizeof(pstring)-1);
3187 /* default service may be a group name */
3188 string_sub(gname,"%S",service);
3189 gptr = (struct group *)getgrnam(gname);
3193 pcon->gid = gptr->gr_gid;
3194 DEBUG(3,("Forced group %s\n",gname));
3197 DEBUG(1,("Couldn't find group %s\n",gname));
3201 if (*lp_force_user(snum))
3203 struct passwd *pass2;
3205 fstrcpy(fuser,lp_force_user(snum));
3206 pass2 = (struct passwd *)Get_Pwnam(fuser,True);
3209 pcon->uid = pass2->pw_uid;
3210 string_set(&pcon->user,fuser);
3211 fstrcpy(user,fuser);
3212 pcon->force_user = True;
3213 DEBUG(3,("Forced user %s\n",fuser));
3216 DEBUG(1,("Couldn't find user %s\n",fuser));
3221 pstrcpy(s,lp_pathname(snum));
3222 standard_sub(cnum,s);
3223 string_set(&pcon->connectpath,s);
3224 DEBUG(3,("Connect path is %s\n",s));
3227 /* groups stuff added by ih */
3229 pcon->groups = NULL;
3233 /* Find all the groups this uid is in and store them. Used by become_user() */
3234 setup_groups(pcon->user,pcon->uid,pcon->gid,&pcon->ngroups,&pcon->igroups,&pcon->groups);
3236 /* check number of connections */
3237 if (!claim_connection(cnum,
3238 lp_servicename(SNUM(cnum)),
3239 lp_max_connections(SNUM(cnum)),False))
3241 DEBUG(1,("too many connections - rejected\n"));
3245 if (lp_status(SNUM(cnum)))
3246 claim_connection(cnum,"STATUS.",MAXSTATUS,first_connection);
3248 first_connection = False;
3253 /* execute any "root preexec = " line */
3254 if (*lp_rootpreexec(SNUM(cnum)))
3257 pstrcpy(cmd,lp_rootpreexec(SNUM(cnum)));
3258 standard_sub(cnum,cmd);
3259 DEBUG(5,("cmd=%s\n",cmd));
3260 smbrun(cmd,NULL,False);
3263 if (!become_user(cnum,pcon->vuid))
3265 DEBUG(0,("Can't become connected user!\n"));
3267 if (!IS_IPC(cnum)) {
3268 yield_connection(cnum,
3269 lp_servicename(SNUM(cnum)),
3270 lp_max_connections(SNUM(cnum)));
3271 if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
3276 if (ChDir(pcon->connectpath) != 0)
3278 DEBUG(0,("Can't change directory to %s (%s)\n",
3279 pcon->connectpath,strerror(errno)));
3282 if (!IS_IPC(cnum)) {
3283 yield_connection(cnum,
3284 lp_servicename(SNUM(cnum)),
3285 lp_max_connections(SNUM(cnum)));
3286 if (lp_status(SNUM(cnum))) yield_connection(cnum,"STATUS.",MAXSTATUS);
3291 string_set(&pcon->origpath,pcon->connectpath);
3293 #if SOFTLINK_OPTIMISATION
3294 /* resolve any soft links early */
3297 pstrcpy(s,pcon->connectpath);
3299 string_set(&pcon->connectpath,s);
3300 ChDir(pcon->connectpath);
3304 num_connections_open++;
3305 add_session_user(user);
3307 /* execute any "preexec = " line */
3308 if (*lp_preexec(SNUM(cnum)))
3311 pstrcpy(cmd,lp_preexec(SNUM(cnum)));
3312 standard_sub(cnum,cmd);
3313 smbrun(cmd,NULL,False);
3316 /* we've finished with the sensitive stuff */
3319 /* Add veto/hide lists */
3320 if (!IS_IPC(cnum) && !IS_PRINT(cnum))
3322 set_namearray( &pcon->veto_list, lp_veto_files(SNUM(cnum)));
3323 set_namearray( &pcon->hide_list, lp_hide_files(SNUM(cnum)));
3327 DEBUG(IS_IPC(cnum)?3:1,("%s %s (%s) connect to service %s as user %s (uid=%d,gid=%d) (pid %d)\n",
3331 lp_servicename(SNUM(cnum)),user,
3341 /****************************************************************************
3342 find first available file slot
3343 ****************************************************************************/
3344 int find_free_file(void )
3347 /* we start at 1 here for an obscure reason I can't now remember,
3348 but I think is important :-) */
3349 for (i=1;i<MAX_OPEN_FILES;i++)
3352 DEBUG(1,("ERROR! Out of file structures - perhaps increase MAX_OPEN_FILES?\n"));
3356 /****************************************************************************
3357 find first available connection slot, starting from a random position.
3358 The randomisation stops problems with the server dieing and clients
3359 thinking the server is still available.
3360 ****************************************************************************/
3361 static int find_free_connection(int hash )
3365 hash = (hash % (MAX_CONNECTIONS-2))+1;
3369 for (i=hash+1;i!=hash;)
3371 if (!Connections[i].open && Connections[i].used == used)
3373 DEBUG(3,("found free connection number %d\n",i));
3377 if (i == MAX_CONNECTIONS)
3387 DEBUG(1,("ERROR! Out of connection structures\n"));
3392 /****************************************************************************
3393 reply for the core protocol
3394 ****************************************************************************/
3395 int reply_corep(char *outbuf)
3397 int outsize = set_message(outbuf,1,0,True);
3399 Protocol = PROTOCOL_CORE;
3405 /****************************************************************************
3406 reply for the coreplus protocol
3407 ****************************************************************************/
3408 int reply_coreplus(char *outbuf)
3410 int raw = (lp_readraw()?1:0) | (lp_writeraw()?2:0);
3411 int outsize = set_message(outbuf,13,0,True);
3412 SSVAL(outbuf,smb_vwv5,raw); /* tell redirector we support
3413 readbraw and writebraw (possibly) */
3414 CVAL(outbuf,smb_flg) = 0x81; /* Reply, SMBlockread, SMBwritelock supported */
3415 SSVAL(outbuf,smb_vwv1,0x1); /* user level security, don't encrypt */
3417 Protocol = PROTOCOL_COREPLUS;
3423 /****************************************************************************
3424 reply for the lanman 1.0 protocol
3425 ****************************************************************************/
3426 int reply_lanman1(char *outbuf)
3428 int raw = (lp_readraw()?1:0) | (lp_writeraw()?2:0);
3430 BOOL doencrypt = SMBENCRYPT();
3431 time_t t = time(NULL);
3432 /* We need to save and restore this as it can be destroyed
3433 if we call another server if security=server
3434 Thanks to Paul Nelson @ Thursby for pointing this out.
3436 uint16 mid = SVAL(outbuf, smb_mid);
3438 if (lp_security()>=SEC_USER) secword |= 1;
3439 if (doencrypt) secword |= 2;
3441 set_message(outbuf,13,doencrypt?8:0,True);
3442 SSVAL(outbuf,smb_vwv1,secword);
3443 /* Create a token value and add it to the outgoing packet. */
3445 generate_next_challenge(smb_buf(outbuf));
3447 Protocol = PROTOCOL_LANMAN1;
3449 if (lp_security() == SEC_SERVER && server_cryptkey(outbuf)) {
3450 DEBUG(3,("using password server validation\n"));
3451 if (doencrypt) set_challenge(smb_buf(outbuf));
3454 CVAL(outbuf,smb_flg) = 0x81; /* Reply, SMBlockread, SMBwritelock supported */
3455 SSVAL(outbuf,smb_mid,mid); /* Restore possibly corrupted mid */
3456 SSVAL(outbuf,smb_vwv2,max_recv);
3457 SSVAL(outbuf,smb_vwv3,lp_maxmux()); /* maxmux */
3458 SSVAL(outbuf,smb_vwv4,1);
3459 SSVAL(outbuf,smb_vwv5,raw); /* tell redirector we support
3460 readbraw writebraw (possibly) */
3461 SIVAL(outbuf,smb_vwv6,getpid());
3462 SSVAL(outbuf,smb_vwv10, TimeDiff(t)/60);
3464 put_dos_date(outbuf,smb_vwv8,t);
3466 return (smb_len(outbuf)+4);
3470 /****************************************************************************
3471 reply for the lanman 2.0 protocol
3472 ****************************************************************************/
3473 int reply_lanman2(char *outbuf)
3475 int raw = (lp_readraw()?1:0) | (lp_writeraw()?2:0);
3477 BOOL doencrypt = SMBENCRYPT();
3478 time_t t = time(NULL);
3479 /* We need to save and restore this as it can be destroyed
3480 if we call another server if security=server
3481 Thanks to Paul Nelson @ Thursby for pointing this out.
3483 uint16 mid = SVAL(outbuf, smb_mid);
3485 if (lp_security()>=SEC_USER) secword |= 1;
3486 if (doencrypt) secword |= 2;
3488 set_message(outbuf,13,doencrypt?8:0,True);
3489 SSVAL(outbuf,smb_vwv1,secword);
3490 /* Create a token value and add it to the outgoing packet. */
3492 generate_next_challenge(smb_buf(outbuf));
3494 SIVAL(outbuf,smb_vwv6,getpid());
3496 Protocol = PROTOCOL_LANMAN2;
3498 if (lp_security() == SEC_SERVER && server_cryptkey(outbuf)) {
3499 DEBUG(3,("using password server validation\n"));
3500 if (doencrypt) set_challenge(smb_buf(outbuf));
3503 CVAL(outbuf,smb_flg) = 0x81; /* Reply, SMBlockread, SMBwritelock supported */
3504 SSVAL(outbuf,smb_mid,mid); /* Restore possibly corrupted mid */
3505 SSVAL(outbuf,smb_vwv2,max_recv);
3506 SSVAL(outbuf,smb_vwv3,lp_maxmux());
3507 SSVAL(outbuf,smb_vwv4,1);
3508 SSVAL(outbuf,smb_vwv5,raw); /* readbraw and/or writebraw */
3509 SSVAL(outbuf,smb_vwv10, TimeDiff(t)/60);
3510 put_dos_date(outbuf,smb_vwv8,t);
3512 return (smb_len(outbuf)+4);
3516 /****************************************************************************
3517 reply for the nt protocol
3518 ****************************************************************************/
3519 int reply_nt1(char *outbuf)
3521 /* dual names + lock_and_read + nt SMBs + remote API calls */
3522 int capabilities = CAP_NT_FIND|CAP_LOCK_AND_READ;
3524 other valid capabilities which we may support at some time...
3525 CAP_LARGE_FILES|CAP_NT_SMBS|CAP_RPC_REMOTE_APIS;
3526 CAP_LARGE_FILES|CAP_LARGE_READX|
3527 CAP_STATUS32|CAP_LEVEL_II_OPLOCKS;
3531 BOOL doencrypt = SMBENCRYPT();
3532 time_t t = time(NULL);
3535 char challenge_len = 8;
3536 /* We need to save and restore this as it can be destroyed
3537 if we call another server if security=server
3538 Thanks to Paul Nelson @ Thursby for pointing this out.
3540 uint16 mid = SVAL(outbuf, smb_mid);
3542 if (lp_readraw() && lp_writeraw())
3544 capabilities |= CAP_RAW_MODE;
3547 if (lp_security()>=SEC_USER) secword |= 1;
3548 if (doencrypt) secword |= 2;
3550 /* decide where (if) to put the encryption challenge, and
3551 follow it with the OEM'd domain name
3553 encrypt_len = doencrypt?challenge_len:0;
3555 data_len = encrypt_len + 2*(strlen(myworkgroup)+1);
3557 data_len = encrypt_len + strlen(myworkgroup) + 1;
3560 set_message(outbuf,17,data_len,True);
3563 /* put the OEM'd domain name */
3564 PutUniCode(smb_buf(outbuf)+encrypt_len,myworkgroup);
3566 strcpy(smb_buf(outbuf)+encrypt_len, myworkgroup);
3569 CVAL(outbuf,smb_vwv1) = secword;
3570 /* Create a token value and add it to the outgoing packet. */
3573 generate_next_challenge(smb_buf(outbuf));
3575 /* Tell the nt machine how long the challenge is. */
3576 SSVALS(outbuf,smb_vwv16+1,challenge_len);
3579 Protocol = PROTOCOL_NT1;
3581 if (lp_security() == SEC_SERVER && server_cryptkey(outbuf)) {
3582 DEBUG(3,("using password server validation\n"));
3583 if (doencrypt) set_challenge(smb_buf(outbuf));
3586 SSVAL(outbuf,smb_mid,mid); /* Restore possibly corrupted mid */
3587 SSVAL(outbuf,smb_vwv1+1,lp_maxmux()); /* maxmpx */
3588 SSVAL(outbuf,smb_vwv2+1,1); /* num vcs */
3589 SIVAL(outbuf,smb_vwv3+1,0xffff); /* max buffer. LOTS! */
3590 SIVAL(outbuf,smb_vwv5+1,0xffff); /* raw size. LOTS! */
3591 SIVAL(outbuf,smb_vwv7+1,getpid()); /* session key */
3592 SIVAL(outbuf,smb_vwv9+1,capabilities); /* capabilities */
3593 put_long_date(outbuf+smb_vwv11+1,t);
3594 SSVALS(outbuf,smb_vwv15+1,TimeDiff(t)/60);
3595 SSVAL(outbuf,smb_vwv17,data_len); /* length of challenge+domain strings */
3597 return (smb_len(outbuf)+4);
3600 /* these are the protocol lists used for auto architecture detection:
3603 protocol [PC NETWORK PROGRAM 1.0]
3604 protocol [XENIX CORE]
3605 protocol [MICROSOFT NETWORKS 1.03]
3606 protocol [LANMAN1.0]
3607 protocol [Windows for Workgroups 3.1a]
3608 protocol [LM1.2X002]
3609 protocol [LANMAN2.1]
3610 protocol [NT LM 0.12]
3613 protocol [PC NETWORK PROGRAM 1.0]
3614 protocol [XENIX CORE]
3615 protocol [MICROSOFT NETWORKS 1.03]
3616 protocol [LANMAN1.0]
3617 protocol [Windows for Workgroups 3.1a]
3618 protocol [LM1.2X002]
3619 protocol [LANMAN2.1]
3620 protocol [NT LM 0.12]
3623 protocol [PC NETWORK PROGRAM 1.0]
3624 protocol [XENIX CORE]
3625 protocol [LANMAN1.0]
3626 protocol [LM1.2X002]
3627 protocol [LANMAN2.1]
3631 * Modified to recognize the architecture of the remote machine better.
3633 * This appears to be the matrix of which protocol is used by which
3635 Protocol WfWg Win95 WinNT OS/2
3636 PC NETWORK PROGRAM 1.0 1 1 1 1
3638 MICROSOFT NETWORKS 3.0 2 2
3640 MICROSOFT NETWORKS 1.03 3
3643 Windows for Workgroups 3.1a 5 5 5
3648 * tim@fsg.com 09/29/95
3651 #define ARCH_WFWG 0x3 /* This is a fudge because WfWg is like Win95 */
3652 #define ARCH_WIN95 0x2
3653 #define ARCH_OS2 0xC /* Again OS/2 is like NT */
3654 #define ARCH_WINNT 0x8
3655 #define ARCH_SAMBA 0x10
3657 #define ARCH_ALL 0x1F
3659 /* List of supported protocols, most desired first */
3663 int (*proto_reply_fn)(char *);
3665 } supported_protocols[] = {
3666 {"NT LANMAN 1.0", "NT1", reply_nt1, PROTOCOL_NT1},
3667 {"NT LM 0.12", "NT1", reply_nt1, PROTOCOL_NT1},
3668 {"LM1.2X002", "LANMAN2", reply_lanman2, PROTOCOL_LANMAN2},
3669 {"Samba", "LANMAN2", reply_lanman2, PROTOCOL_LANMAN2},
3670 {"DOS LM1.2X002", "LANMAN2", reply_lanman2, PROTOCOL_LANMAN2},
3671 {"LANMAN1.0", "LANMAN1", reply_lanman1, PROTOCOL_LANMAN1},
3672 {"MICROSOFT NETWORKS 3.0", "LANMAN1", reply_lanman1, PROTOCOL_LANMAN1},
3673 {"MICROSOFT NETWORKS 1.03", "COREPLUS", reply_coreplus, PROTOCOL_COREPLUS},
3674 {"PC NETWORK PROGRAM 1.0", "CORE", reply_corep, PROTOCOL_CORE},
3679 /****************************************************************************
3681 ****************************************************************************/
3682 static int reply_negprot(char *inbuf,char *outbuf)
3684 int outsize = set_message(outbuf,1,0,True);
3689 int bcc = SVAL(smb_buf(inbuf),-2);
3690 int arch = ARCH_ALL;
3692 p = smb_buf(inbuf)+1;
3693 while (p < (smb_buf(inbuf) + bcc))
3696 DEBUG(3,("Requested protocol [%s]\n",p));
3697 if (strcsequal(p,"Windows for Workgroups 3.1a"))
3698 arch &= ( ARCH_WFWG | ARCH_WIN95 | ARCH_WINNT );
3699 else if (strcsequal(p,"DOS LM1.2X002"))
3700 arch &= ( ARCH_WFWG | ARCH_WIN95 );
3701 else if (strcsequal(p,"DOS LANMAN2.1"))
3702 arch &= ( ARCH_WFWG | ARCH_WIN95 );
3703 else if (strcsequal(p,"NT LM 0.12"))
3704 arch &= ( ARCH_WIN95 | ARCH_WINNT );
3705 else if (strcsequal(p,"LANMAN2.1"))
3706 arch &= ( ARCH_WINNT | ARCH_OS2 );
3707 else if (strcsequal(p,"LM1.2X002"))
3708 arch &= ( ARCH_WINNT | ARCH_OS2 );
3709 else if (strcsequal(p,"MICROSOFT NETWORKS 1.03"))
3711 else if (strcsequal(p,"XENIX CORE"))
3712 arch &= ( ARCH_WINNT | ARCH_OS2 );
3713 else if (strcsequal(p,"Samba")) {
3723 set_remote_arch(RA_SAMBA);
3726 set_remote_arch(RA_WFWG);
3729 set_remote_arch(RA_WIN95);
3732 set_remote_arch(RA_WINNT);
3735 set_remote_arch(RA_OS2);
3738 set_remote_arch(RA_UNKNOWN);
3742 /* possibly reload - change of architecture */
3743 reload_services(True);
3745 /* a special case to stop password server loops */
3746 if (Index == 1 && strequal(remote_machine,myhostname) &&
3747 lp_security()==SEC_SERVER)
3748 exit_server("Password server loop!");
3750 /* Check for protocols, most desirable first */
3751 for (protocol = 0; supported_protocols[protocol].proto_name; protocol++)
3753 p = smb_buf(inbuf)+1;
3755 if (lp_maxprotocol() >= supported_protocols[protocol].protocol_level)
3756 while (p < (smb_buf(inbuf) + bcc))
3758 if (strequal(p,supported_protocols[protocol].proto_name))
3767 SSVAL(outbuf,smb_vwv0,choice);
3769 extern fstring remote_proto;
3770 fstrcpy(remote_proto,supported_protocols[protocol].short_name);
3771 reload_services(True);
3772 outsize = supported_protocols[protocol].proto_reply_fn(outbuf);
3773 DEBUG(3,("Selected protocol %s\n",supported_protocols[protocol].proto_name));
3776 DEBUG(0,("No protocol supported !\n"));
3778 SSVAL(outbuf,smb_vwv0,choice);
3780 DEBUG(5,("%s negprot index=%d\n",timestring(),choice));
3786 /****************************************************************************
3787 close all open files for a connection
3788 ****************************************************************************/
3789 static void close_open_files(int cnum)
3792 for (i=0;i<MAX_OPEN_FILES;i++)
3793 if( Files[i].cnum == cnum && Files[i].open) {
3800 /****************************************************************************
3802 ****************************************************************************/
3803 void close_cnum(int cnum, uint16 vuid)
3805 DirCacheFlush(SNUM(cnum));
3809 if (!OPEN_CNUM(cnum))
3811 DEBUG(0,("Can't close cnum %d\n",cnum));
3815 DEBUG(IS_IPC(cnum)?3:1,("%s %s (%s) closed connection to service %s\n",
3817 remote_machine,client_addr(),
3818 lp_servicename(SNUM(cnum))));
3820 yield_connection(cnum,
3821 lp_servicename(SNUM(cnum)),
3822 lp_max_connections(SNUM(cnum)));
3824 if (lp_status(SNUM(cnum)))
3825 yield_connection(cnum,"STATUS.",MAXSTATUS);
3827 close_open_files(cnum);
3828 dptr_closecnum(cnum);
3830 /* execute any "postexec = " line */
3831 if (*lp_postexec(SNUM(cnum)) && become_user(cnum,vuid))
3834 strcpy(cmd,lp_postexec(SNUM(cnum)));
3835 standard_sub(cnum,cmd);
3836 smbrun(cmd,NULL,False);
3841 /* execute any "root postexec = " line */
3842 if (*lp_rootpostexec(SNUM(cnum)))
3845 strcpy(cmd,lp_rootpostexec(SNUM(cnum)));
3846 standard_sub(cnum,cmd);
3847 smbrun(cmd,NULL,False);
3850 Connections[cnum].open = False;
3851 num_connections_open--;
3852 if (Connections[cnum].ngroups && Connections[cnum].groups)
3854 if (Connections[cnum].igroups != (int *)Connections[cnum].groups)
3855 free(Connections[cnum].groups);
3856 free(Connections[cnum].igroups);
3857 Connections[cnum].groups = NULL;
3858 Connections[cnum].igroups = NULL;
3859 Connections[cnum].ngroups = 0;
3862 free_namearray(Connections[cnum].veto_list);
3863 free_namearray(Connections[cnum].hide_list);
3865 string_set(&Connections[cnum].user,"");
3866 string_set(&Connections[cnum].dirpath,"");
3867 string_set(&Connections[cnum].connectpath,"");
3871 /****************************************************************************
3872 simple routines to do connection counting
3873 ****************************************************************************/
3874 BOOL yield_connection(int cnum,char *name,int max_connections)
3876 struct connect_record crec;
3879 int mypid = getpid();
3882 DEBUG(3,("Yielding connection to %d %s\n",cnum,name));
3884 if (max_connections <= 0)
3887 bzero(&crec,sizeof(crec));
3889 pstrcpy(fname,lp_lockdir());
3890 standard_sub(cnum,fname);
3891 trim_string(fname,"","/");
3895 strcat(fname,".LCK");
3897 f = fopen(fname,"r+");
3900 DEBUG(2,("Couldn't open lock file %s (%s)\n",fname,strerror(errno)));
3904 fseek(f,0,SEEK_SET);
3906 /* find a free spot */
3907 for (i=0;i<max_connections;i++)
3909 if (fread(&crec,sizeof(crec),1,f) != 1)
3911 DEBUG(2,("Entry not found in lock file %s\n",fname));
3915 if (crec.pid == mypid && crec.cnum == cnum)
3919 if (crec.pid != mypid || crec.cnum != cnum)
3922 DEBUG(2,("Entry not found in lock file %s\n",fname));
3926 bzero((void *)&crec,sizeof(crec));
3928 /* remove our mark */
3929 if (fseek(f,i*sizeof(crec),SEEK_SET) != 0 ||