2 Unix SMB/Netbios implementation.
4 Samba utility functions
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.
30 int Protocol = PROTOCOL_COREPLUS;
32 /* a default finfo structure to ensure all fields are sensible */
33 file_info def_finfo = {-1,0,0,0,0,0,0,""};
35 /* these are some file handles where debug info will be stored */
38 /* the client file descriptor */
41 /* the last IP received from */
42 struct in_addr lastip;
44 /* the last port received from */
47 /* this is used by the chaining code */
53 case handling on filenames
55 int case_default = CASE_LOWER;
60 /* the following control case operations - they are put here so the
61 client can link easily */
64 BOOL use_mangled_map = False;
65 BOOL short_case_preserve;
68 fstring remote_machine="";
69 fstring local_machine="";
70 fstring remote_arch="UNKNOWN";
71 fstring remote_proto="UNKNOWN";
72 pstring myhostname="";
73 pstring user_socket_options="";
74 pstring sesssetup_user="";
76 fstring myworkgroup = "";
77 char **my_netbios_names;
79 int smb_read_error = 0;
81 static BOOL stdout_logging = False;
83 static char *filename_dos(char *path,char *buf);
85 /*******************************************************************
86 get ready for syslog stuff
87 ******************************************************************/
88 void setup_logging(char *pname,BOOL interactive)
92 char *p = strrchr(pname,'/');
94 openlog(pname, LOG_PID, LOG_DAEMON);
98 stdout_logging = True;
104 BOOL append_log=False;
107 /****************************************************************************
109 ****************************************************************************/
110 void reopen_logs(void)
117 strcpy(fname,debugf);
118 if (lp_loaded() && (*lp_logfile()))
119 strcpy(fname,lp_logfile());
121 if (!strcsequal(fname,debugf) || !dbf || !file_exist(debugf,NULL))
123 int oldumask = umask(022);
124 strcpy(debugf,fname);
125 if (dbf) fclose(dbf);
127 dbf = fopen(debugf,"a");
129 dbf = fopen(debugf,"w");
130 if (dbf) setbuf(dbf,NULL);
145 /*******************************************************************
146 check if the log has grown too big
147 ********************************************************************/
148 static void check_log_size(void)
150 static int debug_count=0;
154 if (debug_count++ < 100) return;
156 maxlog = lp_max_log_size() * 1024;
157 if (!dbf || maxlog <= 0) return;
159 if (fstat(fileno(dbf),&st) == 0 && st.st_size > maxlog) {
160 fclose(dbf); dbf = NULL;
162 if (dbf && file_size(debugf) > maxlog) {
164 fclose(dbf); dbf = NULL;
165 sprintf(name,"%s.old",debugf);
166 sys_rename(debugf,name);
174 /*******************************************************************
175 write an debug message on the debugfile. This is called by the DEBUG
177 ********************************************************************/
179 int Debug1(char *format_str, ...)
189 if (stdout_logging) {
191 va_start(ap, format_str);
194 format_str = va_arg(ap,char *);
196 vfprintf(dbf,format_str,ap);
202 if (!lp_syslog_only())
207 int oldumask = umask(022);
208 dbf = fopen(debugf,"w");
218 if (syslog_level < lp_syslog())
221 * map debug levels to syslog() priorities
222 * note that not all DEBUG(0, ...) calls are
225 static int priority_map[] = {
234 if (syslog_level >= sizeof(priority_map) / sizeof(priority_map[0]) ||
236 priority = LOG_DEBUG;
238 priority = priority_map[syslog_level];
241 va_start(ap, format_str);
244 format_str = va_arg(ap,char *);
246 vsprintf(msgbuf, format_str, ap);
250 syslog(priority, "%s", msgbuf);
255 if (!lp_syslog_only())
259 va_start(ap, format_str);
262 format_str = va_arg(ap,char *);
264 vfprintf(dbf,format_str,ap);
274 /****************************************************************************
275 find a suitable temporary directory. The result should be copied immediately
276 as it may be overwritten by a subsequent call
277 ****************************************************************************/
281 if ((p = getenv("TMPDIR"))) {
289 /****************************************************************************
290 determine if a file descriptor is in fact a socket
291 ****************************************************************************/
292 BOOL is_a_socket(int fd)
296 return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0);
300 static char *last_ptr=NULL;
302 /****************************************************************************
303 Get the next token from a string, return False if none found
304 handles double-quotes.
305 Based on a routine by GJC@VILLAGE.COM.
306 Extensively modified by Andrew.Tridgell@anu.edu.au
307 ****************************************************************************/
308 BOOL next_token(char **ptr,char *buff,char *sep)
313 if (!ptr) ptr = &last_ptr;
314 if (!ptr) return(False);
318 /* default to simple separators */
319 if (!sep) sep = " \t\n\r";
321 /* find the first non sep char */
322 while(*s && strchr(sep,*s)) s++;
325 if (! *s) return(False);
327 /* copy over the token */
328 for (quoted = False; *s && (quoted || !strchr(sep,*s)); s++)
336 *ptr = (*s) ? s+1 : s;
343 /****************************************************************************
344 Convert list of tokens to array; dependent on above routine.
345 Uses last_ptr from above - bit of a hack.
346 ****************************************************************************/
347 char **toktocliplist(int *ctok, char *sep)
353 if (!sep) sep = " \t\n\r";
355 while(*s && strchr(sep,*s)) s++;
358 if (!*s) return(NULL);
362 while(*s && (!strchr(sep,*s))) s++;
363 while(*s && strchr(sep,*s)) *s++=0;
369 if (!(ret=iret=malloc(ictok*sizeof(char *)))) return NULL;
381 /*******************************************************************
382 safely copies memory, ensuring no overlap problems.
383 this is only used if the machine does not have it's own memmove().
384 this is not the fastest algorithm in town, but it will do for our
386 ********************************************************************/
387 void *MemMove(void *dest,void *src,int size)
391 if (dest==src || !size) return(dest);
393 d = (unsigned long)dest;
394 s = (unsigned long)src;
396 if ((d >= (s+size)) || (s >= (d+size))) {
398 memcpy(dest,src,size);
404 /* we can forward copy */
405 if (s-d >= sizeof(int) &&
406 !(s%sizeof(int)) && !(d%sizeof(int)) && !(size%sizeof(int))) {
407 /* do it all as words */
408 int *idest = (int *)dest;
409 int *isrc = (int *)src;
411 for (i=0;i<size;i++) idest[i] = isrc[i];
414 char *cdest = (char *)dest;
415 char *csrc = (char *)src;
416 for (i=0;i<size;i++) cdest[i] = csrc[i];
421 /* must backward copy */
422 if (d-s >= sizeof(int) &&
423 !(s%sizeof(int)) && !(d%sizeof(int)) && !(size%sizeof(int))) {
424 /* do it all as words */
425 int *idest = (int *)dest;
426 int *isrc = (int *)src;
428 for (i=size-1;i>=0;i--) idest[i] = isrc[i];
431 char *cdest = (char *)dest;
432 char *csrc = (char *)src;
433 for (i=size-1;i>=0;i--) cdest[i] = csrc[i];
441 /****************************************************************************
442 prompte a dptr (to make it recently used)
443 ****************************************************************************/
444 void array_promote(char *array,int elsize,int element)
450 p = (char *)malloc(elsize);
454 DEBUG(5,("Ahh! Can't malloc\n"));
457 memcpy(p,array + element * elsize, elsize);
458 memmove(array + elsize,array,elsize*element);
459 memcpy(array,p,elsize);
463 enum SOCK_OPT_TYPES {OPT_BOOL,OPT_INT,OPT_ON};
472 } socket_options[] = {
473 {"SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE, 0, OPT_BOOL},
474 {"SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR, 0, OPT_BOOL},
475 {"SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, 0, OPT_BOOL},
477 {"TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, 0, OPT_BOOL},
479 #ifdef IPTOS_LOWDELAY
480 {"IPTOS_LOWDELAY", IPPROTO_IP, IP_TOS, IPTOS_LOWDELAY, OPT_ON},
482 #ifdef IPTOS_THROUGHPUT
483 {"IPTOS_THROUGHPUT", IPPROTO_IP, IP_TOS, IPTOS_THROUGHPUT, OPT_ON},
486 {"SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, 0, OPT_INT},
489 {"SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, 0, OPT_INT},
492 {"SO_SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT, 0, OPT_INT},
495 {"SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, 0, OPT_INT},
498 {"SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, 0, OPT_INT},
501 {"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, 0, OPT_INT},
507 /****************************************************************************
508 set user socket options
509 ****************************************************************************/
510 void set_socket_options(int fd, char *options)
514 while (next_token(&options,tok," \t,"))
519 BOOL got_value = False;
521 if ((p = strchr(tok,'=')))
528 for (i=0;socket_options[i].name;i++)
529 if (strequal(socket_options[i].name,tok))
532 if (!socket_options[i].name)
534 DEBUG(0,("Unknown socket option %s\n",tok));
538 switch (socket_options[i].opttype)
542 ret = setsockopt(fd,socket_options[i].level,
543 socket_options[i].option,(char *)&value,sizeof(int));
548 DEBUG(0,("syntax error - %s does not take a value\n",tok));
551 int on = socket_options[i].value;
552 ret = setsockopt(fd,socket_options[i].level,
553 socket_options[i].option,(char *)&on,sizeof(int));
559 DEBUG(0,("Failed to set socket option %s\n",tok));
565 /****************************************************************************
566 close the socket communication
567 ****************************************************************************/
568 void close_sockets(void )
574 /****************************************************************************
575 determine whether we are in the specified group
576 ****************************************************************************/
577 BOOL in_group(gid_t group, int current_gid, int ngroups, int *groups)
581 if (group == current_gid) return(True);
583 for (i=0;i<ngroups;i++)
584 if (group == groups[i])
590 /****************************************************************************
591 this is a safer strcpy(), meant to prevent core dumps when nasty things happen
592 ****************************************************************************/
593 char *StrCpy(char *dest,char *src)
598 /* I don't want to get lazy with these ... */
600 DEBUG(0,("ERROR: NULL StrCpy() called!\n"));
605 if (!dest) return(NULL);
610 while ((*d++ = *src++)) ;
614 /****************************************************************************
615 line strncpy but always null terminates. Make sure there is room!
616 ****************************************************************************/
617 char *StrnCpy(char *dest,char *src,int n)
620 if (!dest) return(NULL);
625 while (n-- && (*d++ = *src++)) ;
631 /*******************************************************************
632 copy an IP address from one buffer to another
633 ********************************************************************/
634 void putip(void *dest,void *src)
640 /****************************************************************************
641 interpret the weird netbios "name". Return the name type
642 ****************************************************************************/
643 static int name_interpret(char *in,char *out)
646 int len = (*in++) / 2;
650 if (len > 30 || len<1) return(0);
654 if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') {
658 *out = ((in[0]-'A')<<4) + (in[1]-'A');
666 /* Handle any scope names */
669 *out++ = '.'; /* Scope names are separated by periods */
670 len = *(unsigned char *)in++;
671 StrnCpy(out, in, len);
680 /****************************************************************************
681 mangle a name into netbios format
682 ****************************************************************************/
683 int name_mangle(char *In,char *Out,char name_type)
687 char *in = (char *)&buf[0];
688 char *out = (char *)Out;
693 StrnCpy(name,In,sizeof(name)-1);
694 sprintf(buf,"%-15.15s%c",name,name_type);
697 memset(&buf[1],0,16);
702 char c = toupper(in[i]);
703 out[i*2] = (c>>4) + 'A';
704 out[i*2+1] = (c & 0xF) + 'A';
712 p = strchr(label, '.');
714 p = label + strlen(label);
716 memcpy(out, label, p - label);
718 label += p - label + (*p == '.');
721 return(name_len(Out));
725 /*******************************************************************
726 check if a file exists
727 ********************************************************************/
728 BOOL file_exist(char *fname,struct stat *sbuf)
731 if (!sbuf) sbuf = &st;
733 if (sys_stat(fname,sbuf) != 0)
736 return(S_ISREG(sbuf->st_mode));
739 /*******************************************************************
740 check a files mod time
741 ********************************************************************/
742 time_t file_modtime(char *fname)
746 if (sys_stat(fname,&st) != 0)
752 /*******************************************************************
753 check if a directory exists
754 ********************************************************************/
755 BOOL directory_exist(char *dname,struct stat *st)
762 if (sys_stat(dname,st) != 0)
765 ret = S_ISDIR(st->st_mode);
771 /*******************************************************************
772 returns the size in bytes of the named file
773 ********************************************************************/
774 uint32 file_size(char *file_name)
778 sys_stat(file_name,&buf);
782 /*******************************************************************
783 return a string representing an attribute for a file
784 ********************************************************************/
785 char *attrib_string(int mode)
787 static char attrstr[10];
791 if (mode & aVOLID) strcat(attrstr,"V");
792 if (mode & aDIR) strcat(attrstr,"D");
793 if (mode & aARCH) strcat(attrstr,"A");
794 if (mode & aHIDDEN) strcat(attrstr,"H");
795 if (mode & aSYSTEM) strcat(attrstr,"S");
796 if (mode & aRONLY) strcat(attrstr,"R");
802 /*******************************************************************
803 case insensitive string compararison
804 ********************************************************************/
805 int StrCaseCmp(const char *s, const char *t)
807 /* compare until we run out of string, either t or s, or find a difference */
808 /* We *must* use toupper rather than tolower here due to the
809 asynchronous upper to lower mapping.
811 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
812 /* Win95 treats full width ascii characters as case sensitive. */
817 return toupper (*s) - toupper (*t);
818 else if (is_sj_alph (*s) && is_sj_alph (*t))
820 diff = sj_toupper2 (*(s+1)) - sj_toupper2 (*(t+1));
826 else if (is_shift_jis (*s) && is_shift_jis (*t))
828 diff = ((int) (unsigned char) *s) - ((int) (unsigned char) *t);
831 diff = ((int) (unsigned char) *(s+1)) - ((int) (unsigned char) *(t+1));
837 else if (is_shift_jis (*s))
839 else if (is_shift_jis (*t))
843 diff = toupper (*s) - toupper (*t);
851 while (*s && *t && toupper(*s) == toupper(*t))
856 return(toupper(*s) - toupper(*t));
860 /*******************************************************************
861 case insensitive string compararison, length limited
862 ********************************************************************/
863 int StrnCaseCmp(const char *s, const char *t, int n)
865 /* compare until we run out of string, either t or s, or chars */
866 /* We *must* use toupper rather than tolower here due to the
867 asynchronous upper to lower mapping.
869 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
870 /* Win95 treats full width ascii characters as case sensitive. */
875 return toupper (*s) - toupper (*t);
876 else if (is_sj_alph (*s) && is_sj_alph (*t))
878 diff = sj_toupper2 (*(s+1)) - sj_toupper2 (*(t+1));
885 else if (is_shift_jis (*s) && is_shift_jis (*t))
887 diff = ((int) (unsigned char) *s) - ((int) (unsigned char) *t);
890 diff = ((int) (unsigned char) *(s+1)) - ((int) (unsigned char) *(t+1));
897 else if (is_shift_jis (*s))
899 else if (is_shift_jis (*t))
903 diff = toupper (*s) - toupper (*t);
913 while (n-- && *s && *t && toupper(*s) == toupper(*t))
918 /* not run out of chars - strings are different lengths */
919 if (n) return(toupper(*s) - toupper(*t));
921 /* identical up to where we run out of chars, and strings are same length */
926 /*******************************************************************
928 ********************************************************************/
929 BOOL strequal(const char *s1, const char *s2)
931 if (s1 == s2) return(True);
932 if (!s1 || !s2) return(False);
934 return(StrCaseCmp(s1,s2)==0);
937 /*******************************************************************
938 compare 2 strings up to and including the nth char.
939 ******************************************************************/
940 BOOL strnequal(const char *s1,const char *s2,int n)
942 if (s1 == s2) return(True);
943 if (!s1 || !s2 || !n) return(False);
945 return(StrnCaseCmp(s1,s2,n)==0);
948 /*******************************************************************
949 compare 2 strings (case sensitive)
950 ********************************************************************/
951 BOOL strcsequal(char *s1,char *s2)
953 if (s1 == s2) return(True);
954 if (!s1 || !s2) return(False);
956 return(strcmp(s1,s2)==0);
960 /*******************************************************************
961 convert a string to lower case
962 ********************************************************************/
963 void strlower(char *s)
967 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
968 /* Win95 treats full width ascii characters as case sensitive. */
969 if (is_shift_jis (*s)) {
970 if (is_sj_upper (s[0], s[1])) {
971 s[1] = sj_tolower2 (s[1]);
974 } else if (is_kana (*s)) {
989 /*******************************************************************
990 convert a string to upper case
991 ********************************************************************/
992 void strupper(char *s)
996 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
997 /* Win95 treats full width ascii characters as case sensitive. */
998 if (is_shift_jis (*s)) {
999 if (is_sj_lower (s[0], s[1])) {
1000 s[1] = sj_toupper2 (s[1]);
1003 } else if (is_kana (*s)) {
1018 /*******************************************************************
1019 convert a string to "normal" form
1020 ********************************************************************/
1021 void strnorm(char *s)
1023 if (case_default == CASE_UPPER)
1029 /*******************************************************************
1030 check if a string is in "normal" case
1031 ********************************************************************/
1032 BOOL strisnormal(char *s)
1034 if (case_default == CASE_UPPER)
1035 return(!strhaslower(s));
1037 return(!strhasupper(s));
1041 /****************************************************************************
1043 ****************************************************************************/
1044 void string_replace(char *s,char oldc,char newc)
1048 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
1049 /* Win95 treats full width ascii characters as case sensitive. */
1050 if (is_shift_jis (*s)) {
1052 } else if (is_kana (*s)) {
1067 /****************************************************************************
1068 make a file into unix format
1069 ****************************************************************************/
1070 void unix_format(char *fname)
1073 string_replace(fname,'\\','/');
1077 strcpy(namecopy,fname);
1079 strcat(fname,namecopy);
1083 /****************************************************************************
1084 make a file into dos format
1085 ****************************************************************************/
1086 void dos_format(char *fname)
1088 string_replace(fname,'/','\\');
1092 /*******************************************************************
1093 show a smb message structure
1094 ********************************************************************/
1095 void show_msg(char *buf)
1103 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
1105 (int)CVAL(buf,smb_com),
1106 (int)CVAL(buf,smb_rcls),
1107 (int)CVAL(buf,smb_reh),
1108 (int)SVAL(buf,smb_err),
1109 (int)CVAL(buf,smb_flg),
1110 (int)SVAL(buf,smb_flg2)));
1111 DEBUG(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\nsmt_wct=%d\n",
1112 (int)SVAL(buf,smb_tid),
1113 (int)SVAL(buf,smb_pid),
1114 (int)SVAL(buf,smb_uid),
1115 (int)SVAL(buf,smb_mid),
1116 (int)CVAL(buf,smb_wct)));
1117 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
1118 DEBUG(5,("smb_vwv[%d]=%d (0x%X)\n",i,
1119 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
1120 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
1121 DEBUG(5,("smb_bcc=%d\n",bcc));
1122 if (DEBUGLEVEL < 10)
1124 for (i = 0; i < MIN(bcc, 256); i += 16)
1126 for (j = 0; j < 16 && i+j < MIN(bcc,256); j++)
1129 DEBUG(10,("%2X ",CVAL(smb_buf(buf),i+j)));
1130 if (j == 7) DEBUG(10, (" "));
1135 for (j = 0; j < 16 && i+j < MIN(bcc,256); j++)
1137 unsigned char c = CVAL(smb_buf(buf),i+j);
1138 if (c < 32 || c > 128) c = '.';
1141 if (j == 7) DEBUG(10, (" "));
1148 /*******************************************************************
1149 return the length of an smb packet
1150 ********************************************************************/
1151 int smb_len(char *buf)
1153 return( PVAL(buf,3) | (PVAL(buf,2)<<8) | ((PVAL(buf,1)&1)<<16) );
1156 /*******************************************************************
1157 set the length of an smb packet
1158 ********************************************************************/
1159 void _smb_setlen(char *buf,int len)
1162 buf[1] = (len&0x10000)>>16;
1163 buf[2] = (len&0xFF00)>>8;
1167 /*******************************************************************
1168 set the length and marker of an smb packet
1169 ********************************************************************/
1170 void smb_setlen(char *buf,int len)
1172 _smb_setlen(buf,len);
1180 /*******************************************************************
1181 setup the word count and byte count for a smb message
1182 ********************************************************************/
1183 int set_message(char *buf,int num_words,int num_bytes,BOOL zero)
1186 bzero(buf + smb_size,num_words*2 + num_bytes);
1187 CVAL(buf,smb_wct) = num_words;
1188 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
1189 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
1190 return (smb_size + num_words*2 + num_bytes);
1193 /*******************************************************************
1194 return the number of smb words
1195 ********************************************************************/
1196 int smb_numwords(char *buf)
1198 return (CVAL(buf,smb_wct));
1201 /*******************************************************************
1202 return the size of the smb_buf region of a message
1203 ********************************************************************/
1204 int smb_buflen(char *buf)
1206 return(SVAL(buf,smb_vwv0 + smb_numwords(buf)*2));
1209 /*******************************************************************
1210 return a pointer to the smb_buf data area
1211 ********************************************************************/
1212 int smb_buf_ofs(char *buf)
1214 return (smb_size + CVAL(buf,smb_wct)*2);
1217 /*******************************************************************
1218 return a pointer to the smb_buf data area
1219 ********************************************************************/
1220 char *smb_buf(char *buf)
1222 return (buf + smb_buf_ofs(buf));
1225 /*******************************************************************
1226 return the SMB offset into an SMB buffer
1227 ********************************************************************/
1228 int smb_offset(char *p,char *buf)
1230 return(PTR_DIFF(p,buf+4) + chain_size);
1234 /*******************************************************************
1235 skip past some strings in a buffer
1236 ********************************************************************/
1237 char *skip_string(char *buf,int n)
1240 buf += strlen(buf) + 1;
1244 /*******************************************************************
1245 trim the specified elements off the front and back of a string
1246 ********************************************************************/
1247 BOOL trim_string(char *s,char *front,char *back)
1250 while (front && *front && strncmp(s,front,strlen(front)) == 0)
1256 if (!(*p = p[strlen(front)]))
1261 while (back && *back && strlen(s) >= strlen(back) &&
1262 (strncmp(s+strlen(s)-strlen(back),back,strlen(back))==0))
1265 s[strlen(s)-strlen(back)] = 0;
1271 /*******************************************************************
1272 reduce a file name, removing .. elements.
1273 ********************************************************************/
1274 void dos_clean_name(char *s)
1278 DEBUG(3,("dos_clean_name [%s]\n",s));
1280 /* remove any double slashes */
1281 string_sub(s, "\\\\", "\\");
1283 while ((p = strstr(s,"\\..\\")) != NULL)
1290 if ((p=strrchr(s,'\\')) != NULL)
1297 trim_string(s,NULL,"\\..");
1299 string_sub(s, "\\.\\", "\\");
1302 /*******************************************************************
1303 reduce a file name, removing .. elements.
1304 ********************************************************************/
1305 void unix_clean_name(char *s)
1309 DEBUG(3,("unix_clean_name [%s]\n",s));
1311 /* remove any double slashes */
1312 string_sub(s, "//","/");
1314 /* Remove leading ./ characters */
1315 if(strncmp(s, "./", 2) == 0) {
1316 trim_string(s, "./", NULL);
1321 while ((p = strstr(s,"/../")) != NULL)
1328 if ((p=strrchr(s,'/')) != NULL)
1335 trim_string(s,NULL,"/..");
1339 /*******************************************************************
1340 a wrapper for the normal chdir() function
1341 ********************************************************************/
1342 int ChDir(char *path)
1345 static pstring LastDir="";
1347 if (strcsequal(path,".")) return(0);
1349 if (*path == '/' && strcsequal(LastDir,path)) return(0);
1350 DEBUG(3,("chdir to %s\n",path));
1351 res = sys_chdir(path);
1353 strcpy(LastDir,path);
1357 /* number of list structures for a caching GetWd function. */
1358 #define MAX_GETWDCACHE (50)
1366 } ino_list[MAX_GETWDCACHE];
1368 BOOL use_getwd_cache=True;
1370 /*******************************************************************
1371 return the absolute current directory path
1372 ********************************************************************/
1373 char *GetWd(char *str)
1376 static BOOL getwd_cache_init = False;
1377 struct stat st, st2;
1382 if (!use_getwd_cache)
1383 return(sys_getwd(str));
1385 /* init the cache */
1386 if (!getwd_cache_init)
1388 getwd_cache_init = True;
1389 for (i=0;i<MAX_GETWDCACHE;i++)
1391 string_init(&ino_list[i].text,"");
1392 ino_list[i].valid = False;
1396 /* Get the inode of the current directory, if this doesn't work we're
1399 if (stat(".",&st) == -1)
1401 DEBUG(0,("Very strange, couldn't stat \".\"\n"));
1402 return(sys_getwd(str));
1406 for (i=0; i<MAX_GETWDCACHE; i++)
1407 if (ino_list[i].valid)
1410 /* If we have found an entry with a matching inode and dev number
1411 then find the inode number for the directory in the cached string.
1412 If this agrees with that returned by the stat for the current
1413 directory then all is o.k. (but make sure it is a directory all
1416 if (st.st_ino == ino_list[i].inode &&
1417 st.st_dev == ino_list[i].dev)
1419 if (stat(ino_list[i].text,&st2) == 0)
1421 if (st.st_ino == st2.st_ino &&
1422 st.st_dev == st2.st_dev &&
1423 (st2.st_mode & S_IFMT) == S_IFDIR)
1425 strcpy (str, ino_list[i].text);
1427 /* promote it for future use */
1428 array_promote((char *)&ino_list[0],sizeof(ino_list[0]),i);
1433 /* If the inode is different then something's changed,
1434 scrub the entry and start from scratch. */
1435 ino_list[i].valid = False;
1442 /* We don't have the information to hand so rely on traditional methods.
1443 The very slow getcwd, which spawns a process on some systems, or the
1444 not quite so bad getwd. */
1448 DEBUG(0,("Getwd failed, errno %d\n",errno));
1454 DEBUG(5,("GetWd %s, inode %d, dev %x\n",s,(int)st.st_ino,(int)st.st_dev));
1456 /* add it to the cache */
1457 i = MAX_GETWDCACHE - 1;
1458 string_set(&ino_list[i].text,s);
1459 ino_list[i].dev = st.st_dev;
1460 ino_list[i].inode = st.st_ino;
1461 ino_list[i].valid = True;
1463 /* put it at the top of the list */
1464 array_promote((char *)&ino_list[0],sizeof(ino_list[0]),i);
1471 /*******************************************************************
1472 reduce a file name, removing .. elements and checking that
1473 it is below dir in the heirachy. This uses GetWd() and so must be run
1474 on the system that has the referenced file system.
1476 widelinks are allowed if widelinks is true
1477 ********************************************************************/
1478 BOOL reduce_name(char *s,char *dir,BOOL widelinks)
1480 #ifndef REDUCE_PATHS
1488 BOOL relative = (*s != '/');
1490 *dir2 = *wd = *basename = *newname = 0;
1495 /* can't have a leading .. */
1496 if (strncmp(s,"..",2) == 0 && (s[2]==0 || s[2]=='/'))
1498 DEBUG(3,("Illegal file name? (%s)\n",s));
1508 DEBUG(3,("reduce_name [%s] [%s]\n",s,dir));
1510 /* remove any double slashes */
1511 string_sub(s,"//","/");
1514 p = strrchr(basename,'/');
1521 DEBUG(0,("couldn't getwd for %s %s\n",s,dir));
1525 if (ChDir(dir) != 0)
1527 DEBUG(0,("couldn't chdir to %s\n",dir));
1533 DEBUG(0,("couldn't getwd for %s\n",dir));
1539 if (p && (p != basename))
1542 if (strcmp(p+1,".")==0)
1544 if (strcmp(p+1,"..")==0)
1548 if (ChDir(basename) != 0)
1551 DEBUG(3,("couldn't chdir for %s %s basename=%s\n",s,dir,basename));
1555 if (!GetWd(newname))
1558 DEBUG(2,("couldn't get wd for %s %s\n",s,dir2));
1562 if (p && (p != basename))
1564 strcat(newname,"/");
1565 strcat(newname,p+1);
1569 int l = strlen(dir2);
1570 if (dir2[l-1] == '/')
1573 if (strncmp(newname,dir2,l) != 0)
1576 DEBUG(2,("Bad access attempt? s=%s dir=%s newname=%s l=%d\n",s,dir2,newname,l));
1582 if (newname[l] == '/')
1583 strcpy(s,newname + l + 1);
1585 strcpy(s,newname+l);
1596 DEBUG(3,("reduced to %s\n",s));
1601 /****************************************************************************
1603 ****************************************************************************/
1604 static void expand_one(char *Mask,int len)
1607 while ((p1 = strchr(Mask,'*')) != NULL)
1609 int lfill = (len+1) - strlen(Mask);
1610 int l1= (p1 - Mask);
1613 memset(tmp+l1,'?',lfill);
1614 strcpy(tmp + l1 + lfill,Mask + l1 + 1);
1619 /****************************************************************************
1620 expand a wildcard expression, replacing *s with ?s
1621 ****************************************************************************/
1622 void expand_mask(char *Mask,BOOL doext)
1627 BOOL hasdot = False;
1629 BOOL absolute = (*Mask == '\\');
1631 *mbeg = *mext = *dirpart = *filepart = 0;
1633 /* parse the directory and filename */
1634 if (strchr(Mask,'\\'))
1635 dirname_dos(Mask,dirpart);
1637 filename_dos(Mask,filepart);
1639 strcpy(mbeg,filepart);
1640 if ((p1 = strchr(mbeg,'.')) != NULL)
1650 if (strlen(mbeg) > 8)
1652 strcpy(mext,mbeg + 8);
1658 strcpy(mbeg,"????????");
1659 if ((*mext == 0) && doext && !hasdot)
1662 if (strequal(mbeg,"*") && *mext==0)
1670 strcpy(Mask,dirpart);
1671 if (*dirpart || absolute) strcat(Mask,"\\");
1676 DEBUG(6,("Mask expanded to [%s]\n",Mask));
1680 /****************************************************************************
1681 does a string have any uppercase chars in it?
1682 ****************************************************************************/
1683 BOOL strhasupper(char *s)
1687 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
1688 /* Win95 treats full width ascii characters as case sensitive. */
1689 if (is_shift_jis (*s)) {
1691 } else if (is_kana (*s)) {
1694 if (isupper(*s)) return(True);
1698 if (isupper(*s)) return(True);
1705 /****************************************************************************
1706 does a string have any lowercase chars in it?
1707 ****************************************************************************/
1708 BOOL strhaslower(char *s)
1712 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
1713 /* Win95 treats full width ascii characters as case sensitive. */
1714 if (is_shift_jis (*s)) {
1715 if (is_sj_upper (s[0], s[1])) return(True);
1716 if (is_sj_lower (s[0], s[1])) return (True);
1718 } else if (is_kana (*s)) {
1721 if (islower(*s)) return(True);
1725 if (islower(*s)) return(True);
1732 /****************************************************************************
1733 find the number of chars in a string
1734 ****************************************************************************/
1735 int count_chars(char *s,char c)
1738 #if defined(KANJI) && !defined(KANJI_WIN95_COMPATIBILITY)
1739 /* Win95 treats full width ascii characters as case sensitive. */
1742 if (is_shift_jis (*s))
1763 /****************************************************************************
1765 ****************************************************************************/
1766 void make_dir_struct(char *buf,char *mask,char *fname,unsigned int size,int mode,time_t date)
1773 if ((mode & aDIR) != 0)
1776 memset(buf+1,' ',11);
1777 if ((p = strchr(mask2,'.')) != NULL)
1780 memcpy(buf+1,mask2,MIN(strlen(mask2),8));
1781 memcpy(buf+9,p+1,MIN(strlen(p+1),3));
1785 memcpy(buf+1,mask2,MIN(strlen(mask2),11));
1787 bzero(buf+21,DIR_STRUCT_SIZE-21);
1788 CVAL(buf,21) = mode;
1789 put_dos_date(buf,22,date);
1790 SSVAL(buf,26,size & 0xFFFF);
1791 SSVAL(buf,28,size >> 16);
1792 StrnCpy(buf+30,fname,12);
1793 if (!case_sensitive)
1795 DEBUG(8,("put name [%s] into dir struct\n",buf+30));
1799 /*******************************************************************
1800 close the low 3 fd's and open dev/null in their place
1801 ********************************************************************/
1802 void close_low_fds(void)
1806 close(0); close(1); close(2);
1807 /* try and use up these file descriptors, so silly
1808 library routines writing to stdout etc won't cause havoc */
1810 fd = open("/dev/null",O_RDWR,0);
1811 if (fd < 0) fd = open("/dev/null",O_WRONLY,0);
1813 DEBUG(0,("Can't open /dev/null\n"));
1817 DEBUG(0,("Didn't get file descriptor %d\n",i));
1823 /****************************************************************************
1824 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
1826 if SYSV use O_NDELAY
1828 ****************************************************************************/
1829 int set_blocking(int fd, BOOL set)
1833 #define FLAG_TO_SET O_NONBLOCK
1836 #define FLAG_TO_SET O_NDELAY
1838 #define FLAG_TO_SET FNDELAY
1842 if((val = fcntl(fd, F_GETFL, 0)) == -1)
1844 if(set) /* Turn blocking on - ie. clear nonblock flag */
1845 val &= ~FLAG_TO_SET;
1848 return fcntl( fd, F_SETFL, val);
1853 /****************************************************************************
1855 ****************************************************************************/
1856 int write_socket(int fd,char *buf,int len)
1862 DEBUG(6,("write_socket(%d,%d)\n",fd,len));
1863 ret = write_data(fd,buf,len);
1865 DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,len,ret));
1869 /****************************************************************************
1871 ****************************************************************************/
1872 int read_udp_socket(int fd,char *buf,int len)
1875 struct sockaddr sock;
1878 socklen = sizeof(sock);
1879 bzero((char *)&sock,socklen);
1880 bzero((char *)&lastip,sizeof(lastip));
1881 ret = recvfrom(fd,buf,len,0,&sock,&socklen);
1883 DEBUG(2,("read socket failed. ERRNO=%d\n",errno));
1887 lastip = *(struct in_addr *) &sock.sa_data[2];
1888 lastport = ntohs(((struct sockaddr_in *)&sock)->sin_port);
1893 /****************************************************************************
1894 read data from a device with a timout in msec.
1895 mincount = if timeout, minimum to read before returning
1896 maxcount = number to be read.
1897 ****************************************************************************/
1898 int read_with_timeout(int fd,char *buf,int mincnt,int maxcnt,long time_out)
1904 struct timeval timeout;
1906 /* just checking .... */
1907 if (maxcnt <= 0) return(0);
1912 if (time_out <= 0) {
1913 if (mincnt == 0) mincnt = maxcnt;
1915 while (nread < mincnt) {
1916 readret = read(fd, buf + nread, maxcnt - nread);
1918 smb_read_error = READ_EOF;
1922 if (readret == -1) {
1923 smb_read_error = READ_ERROR;
1931 /* Most difficult - timeout read */
1932 /* If this is ever called on a disk file and
1933 mincnt is greater then the filesize then
1934 system performance will suffer severely as
1935 select always return true on disk files */
1937 /* Set initial timeout */
1938 timeout.tv_sec = time_out / 1000;
1939 timeout.tv_usec = 1000 * (time_out % 1000);
1941 for (nread=0; nread<mincnt; )
1946 selrtn = sys_select(&fds,&timeout);
1948 /* Check if error */
1950 /* something is wrong. Maybe the socket is dead? */
1951 smb_read_error = READ_ERROR;
1955 /* Did we timeout ? */
1957 smb_read_error = READ_TIMEOUT;
1961 readret = read(fd, buf+nread, maxcnt-nread);
1963 /* we got EOF on the file descriptor */
1964 smb_read_error = READ_EOF;
1968 if (readret == -1) {
1969 /* the descriptor is probably dead */
1970 smb_read_error = READ_ERROR;
1977 /* Return the number we got */
1981 /****************************************************************************
1982 read data from the client. Maxtime is in milliseconds
1983 ****************************************************************************/
1984 int read_max_udp(int fd,char *buffer,int bufsize,int maxtime)
1989 struct timeval timeout;
1994 timeout.tv_sec = maxtime / 1000;
1995 timeout.tv_usec = (maxtime % 1000) * 1000;
1997 selrtn = sys_select(&fds,maxtime>0?&timeout:NULL);
1999 if (!FD_ISSET(fd,&fds))
2002 nread = read_udp_socket(fd, buffer, bufsize);
2004 /* return the number got */
2008 /*******************************************************************
2009 find the difference in milliseconds between two struct timeval
2011 ********************************************************************/
2012 int TvalDiff(struct timeval *tvalold,struct timeval *tvalnew)
2014 return((tvalnew->tv_sec - tvalold->tv_sec)*1000 +
2015 ((int)tvalnew->tv_usec - (int)tvalold->tv_usec)/1000);
2018 /****************************************************************************
2019 send a keepalive packet (rfc1002)
2020 ****************************************************************************/
2021 BOOL send_keepalive(int client)
2023 unsigned char buf[4];
2026 buf[1] = buf[2] = buf[3] = 0;
2028 return(write_data(client,(char *)buf,4) == 4);
2033 /****************************************************************************
2034 read data from the client, reading exactly N bytes.
2035 ****************************************************************************/
2036 int read_data(int fd,char *buffer,int N)
2045 ret = read(fd,buffer + total,N - total);
2047 smb_read_error = READ_EOF;
2051 smb_read_error = READ_ERROR;
2060 /****************************************************************************
2062 ****************************************************************************/
2063 int write_data(int fd,char *buffer,int N)
2070 ret = write(fd,buffer + total,N - total);
2072 if (ret == -1) return -1;
2073 if (ret == 0) return total;
2081 /****************************************************************************
2082 transfer some data between two fd's
2083 ****************************************************************************/
2084 int transfer_file(int infd,int outfd,int n,char *header,int headlen,int align)
2086 static char *buf=NULL;
2091 DEBUG(4,("transfer_file %d (head=%d) called\n",n,headlen));
2094 size = lp_readsize();
2095 size = MAX(size,1024);
2098 while (!buf && size>0) {
2099 buf = (char *)Realloc(buf,size+8);
2100 if (!buf) size /= 2;
2104 DEBUG(0,("Can't allocate transfer buffer!\n"));
2108 abuf = buf + (align%8);
2115 int s = MIN(n,size);
2120 if (header && (headlen >= MIN(s,1024))) {
2130 if (header && headlen > 0)
2132 ret = MIN(headlen,size);
2133 memcpy(buf1,header,ret);
2136 if (headlen <= 0) header = NULL;
2140 ret += read(infd,buf1+ret,s-ret);
2144 ret2 = (outfd>=0?write_data(outfd,buf1,ret):ret);
2145 if (ret2 > 0) total += ret2;
2146 /* if we can't write then dump excess data */
2148 transfer_file(infd,-1,n-(ret+headlen),NULL,0,0);
2150 if (ret <= 0 || ret2 != ret)
2158 /****************************************************************************
2159 read 4 bytes of a smb packet and return the smb length of the packet
2160 possibly store the result in the buffer
2161 ****************************************************************************/
2162 int read_smb_length(int fd,char *inbuf,int timeout)
2166 int len=0, msg_type;
2177 ok = (read_with_timeout(fd,buffer,4,4,timeout) == 4);
2179 ok = (read_data(fd,buffer,4) == 4);
2184 len = smb_len(buffer);
2185 msg_type = CVAL(buffer,0);
2187 if (msg_type == 0x85)
2189 DEBUG(5,("Got keepalive packet\n"));
2194 DEBUG(10,("got smb length of %d\n",len));
2201 /****************************************************************************
2202 read an smb from a fd and return it's length
2203 The timeout is in milli seconds
2204 ****************************************************************************/
2205 BOOL receive_smb(int fd,char *buffer,int timeout)
2211 bzero(buffer,smb_size + 100);
2213 len = read_smb_length(fd,buffer,timeout);
2217 if (len > BUFFER_SIZE) {
2218 DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
2219 if (len > BUFFER_SIZE + (SAFETY_MARGIN/2))
2223 ret = read_data(fd,buffer+4,len);
2225 smb_read_error = READ_ERROR;
2233 /****************************************************************************
2235 ****************************************************************************/
2236 BOOL send_smb(int fd,char *buffer)
2240 len = smb_len(buffer) + 4;
2242 while (nwritten < len)
2244 ret = write_socket(fd,buffer+nwritten,len - nwritten);
2247 DEBUG(0,("Error writing %d bytes to client. %d. Exiting\n",len,ret));
2259 /****************************************************************************
2260 find a pointer to a netbios name
2261 ****************************************************************************/
2262 char *name_ptr(char *buf,int ofs)
2264 unsigned char c = *(unsigned char *)(buf+ofs);
2266 if ((c & 0xC0) == 0xC0)
2270 memcpy(p,buf+ofs,2);
2273 DEBUG(5,("name ptr to pos %d from %d is %s\n",l,ofs,buf+l));
2280 /****************************************************************************
2281 extract a netbios name from a buf
2282 ****************************************************************************/
2283 int name_extract(char *buf,int ofs,char *name)
2285 char *p = name_ptr(buf,ofs);
2286 int d = PTR_DIFF(p,buf+ofs);
2288 if (d < -50 || d > 50) return(0);
2289 return(name_interpret(p,name));
2293 /****************************************************************************
2294 return the total storage length of a mangled name
2295 ****************************************************************************/
2296 int name_len(char *s)
2299 unsigned char c = *(unsigned char *)s;
2300 if ((c & 0xC0) == 0xC0)
2302 while (*s) s += (*s)+1;
2303 return(PTR_DIFF(s,s0)+1);
2306 /****************************************************************************
2307 send a single packet to a port on another machine
2308 ****************************************************************************/
2309 BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type)
2313 struct sockaddr_in sock_out;
2318 /* create a socket to write to */
2319 out_fd = socket(AF_INET, type, 0);
2322 DEBUG(0,("socket failed"));
2326 /* set the address and port */
2327 bzero((char *)&sock_out,sizeof(sock_out));
2328 putip((char *)&sock_out.sin_addr,(char *)&ip);
2329 sock_out.sin_port = htons( port );
2330 sock_out.sin_family = AF_INET;
2333 DEBUG(3,("sending a packet of len %d to (%s) on port %d of type %s\n",
2334 len,inet_ntoa(ip),port,type==SOCK_DGRAM?"DGRAM":"STREAM"));
2337 ret = (sendto(out_fd,buf,len,0,(struct sockaddr *)&sock_out,sizeof(sock_out)) >= 0);
2340 DEBUG(0,("Packet send to %s(%d) failed ERRNO=%d\n",
2341 inet_ntoa(ip),port,errno));
2347 /*******************************************************************
2348 sleep for a specified number of milliseconds
2349 ********************************************************************/
2353 struct timeval tval,t1,t2;
2360 tval.tv_sec = (t-tdiff)/1000;
2361 tval.tv_usec = 1000*((t-tdiff)%1000);
2365 sys_select(&fds,&tval);
2368 tdiff = TvalDiff(&t1,&t2);
2372 /****************************************************************************
2373 check if a string is part of a list
2374 ****************************************************************************/
2375 BOOL in_list(char *s,char *list,BOOL casesensitive)
2380 if (!list) return(False);
2382 while (next_token(&p,tok,LIST_SEP))
2384 if (casesensitive) {
2385 if (strcmp(tok,s) == 0)
2388 if (StrCaseCmp(tok,s) == 0)
2395 /* this is used to prevent lots of mallocs of size 1 */
2396 static char *null_string = NULL;
2398 /****************************************************************************
2399 set a string value, allocing the space for the string
2400 ****************************************************************************/
2401 BOOL string_init(char **dest,char *src)
2412 null_string = (char *)malloc(1);
2415 *dest = null_string;
2419 *dest = (char *)malloc(l+1);
2425 /****************************************************************************
2427 ****************************************************************************/
2428 void string_free(char **s)
2430 if (!s || !(*s)) return;
2431 if (*s == null_string)
2437 /****************************************************************************
2438 set a string value, allocing the space for the string, and deallocating any
2440 ****************************************************************************/
2441 BOOL string_set(char **dest,char *src)
2445 return(string_init(dest,src));
2448 /****************************************************************************
2449 substitute a string for a pattern in another string. Make sure there is
2452 This routine looks for pattern in s and replaces it with
2453 insert. It may do multiple replacements.
2455 return True if a substitution was done.
2456 ****************************************************************************/
2457 BOOL string_sub(char *s,char *pattern,char *insert)
2463 if (!insert || !pattern || !s) return(False);
2466 lp = strlen(pattern);
2467 li = strlen(insert);
2469 if (!*pattern) return(False);
2471 while (lp <= ls && (p = strstr(s,pattern)))
2474 memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp));
2475 memcpy(p,insert,li);
2484 /*********************************************************
2485 * Recursive routine that is called by mask_match.
2486 * Does the actual matching.
2487 *********************************************************/
2488 BOOL do_match(char *str, char *regexp, int case_sig)
2492 for( p = regexp; *p && *str; ) {
2499 /* Look for a character matching
2500 the one after the '*' */
2503 return True; /* Automatic match */
2505 while(*str && (case_sig ? (*p != *str) : (toupper(*p)!=toupper(*str))))
2507 if(do_match(str,p,case_sig))
2521 if(toupper(*str) != toupper(*p))
2531 if (!*p && str[0] == '.' && str[1] == 0)
2534 if (!*str && *p == '?')
2536 while (*p == '?') p++;
2540 if(!*str && (*p == '*' && p[1] == '\0'))
2546 /*********************************************************
2547 * Routine to match a given string with a regexp - uses
2548 * simplified regexp that takes * and ? only. Case can be
2549 * significant or not.
2550 *********************************************************/
2551 BOOL mask_match(char *str, char *regexp, int case_sig,BOOL trans2)
2555 fstring ebase,eext,sbase,sext;
2559 /* Make local copies of str and regexp */
2560 StrnCpy(p1,regexp,sizeof(pstring)-1);
2561 StrnCpy(p2,str,sizeof(pstring)-1);
2563 if (!strchr(p2,'.')) {
2568 if (!strchr(p1,'.')) {
2576 string_sub(p1,"*.*","*");
2577 string_sub(p1,".*","*");
2581 /* Remove any *? and ** as they are meaningless */
2582 for(p = p1; *p; p++)
2583 while( *p == '*' && (p[1] == '?' ||p[1] == '*'))
2584 (void)strcpy( &p[1], &p[2]);
2586 if (strequal(p1,"*")) return(True);
2588 DEBUG(5,("mask_match str=<%s> regexp=<%s>, case_sig = %d\n", p2, p1, case_sig));
2594 if ((p=strrchr(p1,'.'))) {
2603 if (!strequal(p2,".") && !strequal(p2,"..") && (p=strrchr(p2,'.'))) {
2613 matched = do_match(sbase,ebase,case_sig) &&
2614 (trans2 || do_match(sext,eext,case_sig));
2616 DEBUG(5,("mask_match returning %d\n", matched));
2623 /****************************************************************************
2624 become a daemon, discarding the controlling terminal
2625 ****************************************************************************/
2626 void become_daemon(void)
2628 #ifndef NO_FORK_DEBUG
2632 /* detach from the terminal */
2635 #else /* USE_SETSID */
2638 int i = open("/dev/tty", O_RDWR);
2641 ioctl(i, (int) TIOCNOTTY, (char *)0);
2645 #endif /* TIOCNOTTY */
2646 #endif /* USE_SETSID */
2647 /* Close fd's 0,1,2. Needed if started by rsh */
2649 #endif /* NO_FORK_DEBUG */
2653 /****************************************************************************
2654 put up a yes/no prompt
2655 ****************************************************************************/
2661 if (!fgets(ans,sizeof(ans)-1,stdin))
2664 if (*ans == 'y' || *ans == 'Y')
2670 /****************************************************************************
2671 read a line from a file with possible \ continuation chars.
2672 Blanks at the start or end of a line are stripped.
2673 The string will be allocated if s2 is NULL
2674 ****************************************************************************/
2675 char *fgets_slash(char *s2,int maxlen,FILE *f)
2680 BOOL start_of_line = True;
2687 maxlen = MIN(maxlen,8);
2688 s = (char *)Realloc(s,maxlen);
2691 if (!s || maxlen < 2) return(NULL);
2695 while (len < maxlen-1)
2703 while (len > 0 && s[len-1] == ' ')
2707 if (len > 0 && s[len-1] == '\\')
2710 start_of_line = True;
2715 if (len <= 0 && !s2)
2717 return(len>0?s:NULL);
2722 start_of_line = False;
2726 if (!s2 && len > maxlen-3)
2729 s = (char *)Realloc(s,maxlen);
2730 if (!s) return(NULL);
2738 /****************************************************************************
2739 set the length of a file from a filedescriptor.
2740 Returns 0 on success, -1 on failure.
2741 ****************************************************************************/
2742 int set_filelen(int fd, long len)
2744 /* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
2745 extend a file with ftruncate. Provide alternate implementation
2748 #if FTRUNCATE_CAN_EXTEND
2749 return ftruncate(fd, len);
2753 long currpos = lseek(fd, 0L, SEEK_CUR);
2757 /* Do an fstat to see if the file is longer than
2758 the requested size (call ftruncate),
2759 or shorter, in which case seek to len - 1 and write 1
2761 if(fstat(fd, &st)<0)
2765 if (S_ISFIFO(st.st_mode)) return 0;
2768 if(st.st_size == len)
2770 if(st.st_size > len)
2771 return ftruncate(fd, len);
2773 if(lseek(fd, len-1, SEEK_SET) != len -1)
2775 if(write(fd, &c, 1)!=1)
2777 /* Seek to where we were */
2778 lseek(fd, currpos, SEEK_SET);
2784 /****************************************************************************
2785 return the byte checksum of some data
2786 ****************************************************************************/
2787 int byte_checksum(char *buf,int len)
2789 unsigned char *p = (unsigned char *)buf;
2799 /****************************************************************************
2800 this is a version of setbuffer() for those machines that only have setvbuf
2801 ****************************************************************************/
2802 void setbuffer(FILE *f,char *buf,int bufsize)
2804 setvbuf(f,buf,_IOFBF,bufsize);
2809 /****************************************************************************
2810 parse out a directory name from a path name. Assumes dos style filenames.
2811 ****************************************************************************/
2812 char *dirname_dos(char *path,char *buf)
2814 char *p = strrchr(path,'\\');
2829 /****************************************************************************
2830 parse out a filename from a path name. Assumes dos style filenames.
2831 ****************************************************************************/
2832 static char *filename_dos(char *path,char *buf)
2834 char *p = strrchr(path,'\\');
2846 /****************************************************************************
2847 expand a pointer to be a particular size
2848 ****************************************************************************/
2849 void *Realloc(void *p,int size)
2855 DEBUG(5,("Realloc asked for 0 bytes\n"));
2860 ret = (void *)malloc(size);
2862 ret = (void *)realloc(p,size);
2865 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",size));
2871 /****************************************************************************
2873 ****************************************************************************/
2874 char *strdup(char *s)
2877 if (!s) return(NULL);
2878 ret = (char *)malloc(strlen(s)+1);
2879 if (!ret) return(NULL);
2886 /****************************************************************************
2887 Signal handler for SIGPIPE (write on a disconnected socket)
2888 ****************************************************************************/
2891 DEBUG(0,("Probably got SIGPIPE\nExiting\n"));
2895 /****************************************************************************
2896 get my own name and IP
2897 ****************************************************************************/
2898 BOOL get_myname(char *my_name,struct in_addr *ip)
2905 /* get my host name */
2906 if (gethostname(hostname, MAXHOSTNAMELEN) == -1)
2908 DEBUG(0,("gethostname failed\n"));
2913 if ((hp = Get_Hostbyname(hostname)) == 0)
2915 DEBUG(0,( "Get_Hostbyname: Unknown host %s.\n",hostname));
2921 /* split off any parts after an initial . */
2922 char *p = strchr(hostname,'.');
2925 strcpy(my_name,hostname);
2929 putip((char *)ip,(char *)hp->h_addr);
2935 /****************************************************************************
2936 true if two IP addresses are equal
2937 ****************************************************************************/
2938 BOOL ip_equal(struct in_addr ip1,struct in_addr ip2)
2941 a1 = ntohl(ip1.s_addr);
2942 a2 = ntohl(ip2.s_addr);
2947 /****************************************************************************
2948 open a socket of the specified type, port and address for incoming data
2949 ****************************************************************************/
2950 int open_socket_in(int type, int port, int dlevel,uint32 socket_addr)
2953 struct sockaddr_in sock;
2957 /* get my host name */
2958 if (gethostname(host_name, MAXHOSTNAMELEN) == -1)
2959 { DEBUG(0,("gethostname failed\n")); return -1; }
2962 if ((hp = Get_Hostbyname(host_name)) == 0)
2964 DEBUG(0,( "Get_Hostbyname: Unknown host. %s\n",host_name));
2968 bzero((char *)&sock,sizeof(sock));
2969 memcpy((char *)&sock.sin_addr,(char *)hp->h_addr, hp->h_length);
2970 #if defined(__FreeBSD__) || defined(NETBSD) /* XXX not the right ifdef */
2971 sock.sin_len = sizeof(sock);
2973 sock.sin_port = htons( port );
2974 sock.sin_family = hp->h_addrtype;
2975 sock.sin_addr.s_addr = socket_addr;
2976 res = socket(hp->h_addrtype, type, 0);
2978 { DEBUG(0,("socket failed\n")); return -1; }
2982 setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(one));
2985 /* now we've got a socket - we need to bind it */
2986 if (bind(res, (struct sockaddr * ) &sock,sizeof(sock)) < 0)
2989 if (port == SMB_PORT || port == NMB_PORT)
2990 DEBUG(dlevel,("bind failed on port %d socket_addr=%x (%s)\n",
2991 port,socket_addr,strerror(errno)));
2994 if (dlevel > 0 && port < 1000)
2997 if (port >= 1000 && port < 9000)
2998 return(open_socket_in(type,port+1,dlevel,socket_addr));
3003 DEBUG(3,("bind succeeded on port %d\n",port));
3009 /****************************************************************************
3010 create an outgoing socket
3011 **************************************************************************/
3012 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
3014 struct sockaddr_in sock_out;
3016 int connect_loop = 250; /* 250 milliseconds */
3017 int loops = (timeout * 1000) / connect_loop;
3019 /* create a socket to write to */
3020 res = socket(PF_INET, type, 0);
3022 { DEBUG(0,("socket error\n")); return -1; }
3024 if (type != SOCK_STREAM) return(res);
3026 bzero((char *)&sock_out,sizeof(sock_out));
3027 putip((char *)&sock_out.sin_addr,(char *)addr);
3029 sock_out.sin_port = htons( port );
3030 sock_out.sin_family = PF_INET;
3032 /* set it non-blocking */
3033 set_blocking(res,False);
3035 DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
3037 /* and connect it to the destination */
3039 ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
3041 /* Some systems return EAGAIN when they mean EINPROGRESS */
3042 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
3043 errno == EAGAIN) && loops--) {
3044 msleep(connect_loop);
3048 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
3050 DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
3056 if (ret < 0 && errno == EISCONN) {
3063 DEBUG(1,("error connecting to %s:%d (%s)\n",
3064 inet_ntoa(*addr),port,strerror(errno)));
3068 /* set it blocking again */
3069 set_blocking(res,True);
3075 /****************************************************************************
3076 interpret a protocol description string, with a default
3077 ****************************************************************************/
3078 int interpret_protocol(char *str,int def)
3080 if (strequal(str,"NT1"))
3081 return(PROTOCOL_NT1);
3082 if (strequal(str,"LANMAN2"))
3083 return(PROTOCOL_LANMAN2);
3084 if (strequal(str,"LANMAN1"))
3085 return(PROTOCOL_LANMAN1);
3086 if (strequal(str,"CORE"))
3087 return(PROTOCOL_CORE);
3088 if (strequal(str,"COREPLUS"))
3089 return(PROTOCOL_COREPLUS);
3090 if (strequal(str,"CORE+"))
3091 return(PROTOCOL_COREPLUS);
3093 DEBUG(0,("Unrecognised protocol level %s\n",str));
3098 /****************************************************************************
3099 interpret a security level
3100 ****************************************************************************/
3101 int interpret_security(char *str,int def)
3103 if (strequal(str,"SERVER"))
3105 if (strequal(str,"USER"))
3107 if (strequal(str,"SHARE"))
3110 DEBUG(0,("Unrecognised security level %s\n",str));
3116 /****************************************************************************
3117 interpret an internet address or name into an IP address in 4 byte form
3118 ****************************************************************************/
3119 uint32 interpret_addr(char *str)
3124 BOOL pure_address = True;
3126 if (strcmp(str,"0.0.0.0") == 0) return(0);
3127 if (strcmp(str,"255.255.255.255") == 0) return(0xFFFFFFFF);
3129 for (i=0; pure_address && str[i]; i++)
3130 if (!(isdigit(str[i]) || str[i] == '.'))
3131 pure_address = False;
3133 /* if it's in the form of an IP address then get the lib to interpret it */
3135 res = inet_addr(str);
3137 /* otherwise assume it's a network name of some sort and use
3139 if ((hp = Get_Hostbyname(str)) == 0) {
3140 DEBUG(3,("Get_Hostbyname: Unknown host. %s\n",str));
3143 putip((char *)&res,(char *)hp->h_addr);
3146 if (res == (uint32)-1) return(0);
3151 /*******************************************************************
3152 a convenient addition to interpret_addr()
3153 ******************************************************************/
3154 struct in_addr *interpret_addr2(char *str)
3156 static struct in_addr ret;
3157 uint32 a = interpret_addr(str);
3162 /*******************************************************************
3163 check if an IP is the 0.0.0.0
3164 ******************************************************************/
3165 BOOL zero_ip(struct in_addr ip)
3168 putip((char *)&a,(char *)&ip);
3173 /*******************************************************************
3174 matchname - determine if host name matches IP address
3175 ******************************************************************/
3176 static BOOL matchname(char *remotehost,struct in_addr addr)
3181 if ((hp = Get_Hostbyname(remotehost)) == 0) {
3182 DEBUG(0,("Get_Hostbyname(%s): lookup failure", remotehost));
3187 * Make sure that gethostbyname() returns the "correct" host name.
3188 * Unfortunately, gethostbyname("localhost") sometimes yields
3189 * "localhost.domain". Since the latter host name comes from the
3190 * local DNS, we just have to trust it (all bets are off if the local
3191 * DNS is perverted). We always check the address list, though.
3194 if (strcasecmp(remotehost, hp->h_name)
3195 && strcasecmp(remotehost, "localhost")) {
3196 DEBUG(0,("host name/name mismatch: %s != %s",
3197 remotehost, hp->h_name));
3201 /* Look up the host address in the address list we just got. */
3202 for (i = 0; hp->h_addr_list[i]; i++) {
3203 if (memcmp(hp->h_addr_list[i], (caddr_t) & addr, sizeof(addr)) == 0)
3208 * The host name does not map to the original host address. Perhaps
3209 * someone has compromised a name server. More likely someone botched
3210 * it, but that could be dangerous, too.
3213 DEBUG(0,("host name/address mismatch: %s != %s",
3214 inet_ntoa(addr), hp->h_name));
3218 /*******************************************************************
3219 Reset the 'done' variables so after a client process is created
3220 from a fork call these calls will be re-done. This should be
3221 expanded if more variables need reseting.
3222 ******************************************************************/
3224 static BOOL global_client_name_done = False;
3225 static BOOL global_client_addr_done = False;
3227 void reset_globals_after_fork()
3229 global_client_name_done = False;
3230 global_client_addr_done = False;
3233 /*******************************************************************
3234 return the DNS name of the client
3235 ******************************************************************/
3236 char *client_name(void)
3240 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
3241 int length = sizeof(sa);
3242 static pstring name_buf;
3245 if (global_client_name_done)
3248 strcpy(name_buf,"UNKNOWN");
3250 if (getpeername(Client, &sa, &length) < 0) {
3251 DEBUG(0,("getpeername failed\n"));
3255 /* Look up the remote host name. */
3256 if ((hp = gethostbyaddr((char *) &sockin->sin_addr,
3257 sizeof(sockin->sin_addr),
3259 DEBUG(1,("Gethostbyaddr failed for %s\n",client_addr()));
3260 StrnCpy(name_buf,client_addr(),sizeof(name_buf) - 1);
3262 StrnCpy(name_buf,(char *)hp->h_name,sizeof(name_buf) - 1);
3263 if (!matchname(name_buf, sockin->sin_addr)) {
3264 DEBUG(0,("Matchname failed on %s %s\n",name_buf,client_addr()));
3265 strcpy(name_buf,"UNKNOWN");
3268 global_client_name_done = True;
3272 /*******************************************************************
3273 return the IP addr of the client as a string
3274 ******************************************************************/
3275 char *client_addr(void)
3279 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
3280 int length = sizeof(sa);
3281 static fstring addr_buf;
3283 if (global_client_addr_done)
3286 strcpy(addr_buf,"0.0.0.0");
3288 if (getpeername(Client, &sa, &length) < 0) {
3289 DEBUG(0,("getpeername failed\n"));
3293 strcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
3295 global_client_addr_done = True;
3299 /*******************************************************************
3300 sub strings with useful parameters
3301 Rewritten by Stefaan A Eeckels <Stefaan.Eeckels@ecc.lu> and
3302 Paul Rippin <pr3245@nopc.eurostat.cec.be>
3303 ********************************************************************/
3304 void standard_sub_basic(char *str)
3308 struct passwd *pass;
3310 for (s = str ; (p = strchr(s,'%')) != NULL ; s = p )
3314 case 'G' : if ((pass = Get_Pwnam(sesssetup_user,False))!=NULL)
3315 string_sub(p,"%G",gidtoname(pass->pw_gid));
3319 case 'I' : string_sub(p,"%I",client_addr()); break;
3320 case 'L' : string_sub(p,"%L",local_machine); break;
3321 case 'M' : string_sub(p,"%M",client_name()); break;
3322 case 'R' : string_sub(p,"%R",remote_proto); break;
3323 case 'T' : string_sub(p,"%T",timestring()); break;
3324 case 'U' : string_sub(p,"%U",sesssetup_user); break;
3325 case 'a' : string_sub(p,"%a",remote_arch); break;
3326 case 'd' : sprintf(pidstr,"%d",(int)getpid());
3327 string_sub(p,"%d",pidstr);
3329 case 'h' : string_sub(p,"%h",myhostname); break;
3330 case 'm' : string_sub(p,"%m",remote_machine); break;
3331 case 'v' : string_sub(p,"%v",VERSION); break;
3332 case '\0' : p++; break; /* don't run off end if last character is % */
3333 default : p+=2; break;
3339 /*******************************************************************
3340 are two IPs on the same subnet?
3341 ********************************************************************/
3342 BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask)
3344 uint32 net1,net2,nmask;
3346 nmask = ntohl(mask.s_addr);
3347 net1 = ntohl(ip1.s_addr);
3348 net2 = ntohl(ip2.s_addr);
3350 return((net1 & nmask) == (net2 & nmask));
3354 /*******************************************************************
3355 write a string in unicoode format
3356 ********************************************************************/
3357 int PutUniCode(char *dst,char *src)
3361 dst[ret++] = src[0];
3370 /****************************************************************************
3371 a wrapper for gethostbyname() that tries with all lower and all upper case
3372 if the initial name fails
3373 ****************************************************************************/
3374 struct hostent *Get_Hostbyname(char *name)
3376 char *name2 = strdup(name);
3377 struct hostent *ret;
3381 DEBUG(0,("Memory allocation error in Get_Hostbyname! panic\n"));
3385 if (!isalnum(*name2))
3391 ret = sys_gethostbyname(name2);
3398 /* try with all lowercase */
3400 ret = sys_gethostbyname(name2);
3407 /* try with all uppercase */
3409 ret = sys_gethostbyname(name2);
3416 /* nothing works :-( */
3422 /****************************************************************************
3423 check if a process exists. Does this work on all unixes?
3424 ****************************************************************************/
3425 BOOL process_exists(int pid)
3429 sprintf(s,"/proc/%d",pid);
3430 return(directory_exist(s,NULL));
3433 static BOOL tested=False;
3434 static BOOL ok=False;
3438 sprintf(s,"/proc/%05d",(int)getpid());
3439 ok = file_exist(s,NULL);
3442 sprintf(s,"/proc/%05d",pid);
3443 return(file_exist(s,NULL));
3447 /* CGH 8/16/96 - added ESRCH test */
3448 return(pid == getpid() || kill(pid,0) == 0 || errno != ESRCH);
3453 /*******************************************************************
3454 turn a uid into a user name
3455 ********************************************************************/
3456 char *uidtoname(int uid)
3458 static char name[40];
3459 struct passwd *pass = getpwuid(uid);
3460 if (pass) return(pass->pw_name);
3461 sprintf(name,"%d",uid);
3465 /*******************************************************************
3466 turn a gid into a group name
3467 ********************************************************************/
3468 char *gidtoname(int gid)
3470 static char name[40];
3471 struct group *grp = getgrgid(gid);
3472 if (grp) return(grp->gr_name);
3473 sprintf(name,"%d",gid);
3477 /*******************************************************************
3479 ********************************************************************/
3480 void BlockSignals(BOOL block,int signum)
3483 int block_mask = sigmask(signum);
3484 static int oldmask = 0;
3486 oldmask = sigblock(block_mask);
3488 sigsetmask(oldmask);
3489 #elif defined(USE_SIGPROCMASK)
3492 sigaddset(&set,signum);
3493 sigprocmask(block?SIG_BLOCK:SIG_UNBLOCK,&set,NULL);
3498 /*******************************************************************
3499 my own panic function - not suitable for general use
3500 ********************************************************************/
3501 void ajt_panic(void)
3503 system("/usr/bin/X11/xedit -display ljus:0 /tmp/ERROR_FAULT");
3508 #define DIRECT direct
3510 #define DIRECT dirent
3513 /*******************************************************************
3514 a readdir wrapper which just returns the file name
3515 also return the inode number if requested
3516 ********************************************************************/
3517 char *readdirname(void *p)
3522 if (!p) return(NULL);
3524 ptr = (struct DIRECT *)readdir(p);
3525 if (!ptr) return(NULL);
3527 dname = ptr->d_name;
3530 if (telldir(p) < 0) return(NULL);
3534 /* this handles a broken compiler setup, causing a mixture
3535 of BSD and SYSV headers and libraries */
3537 static BOOL broken_readdir = False;
3538 if (!broken_readdir && !(*(dname)) && strequal("..",dname-2))
3540 DEBUG(0,("Your readdir() is broken. You have somehow mixed SYSV and BSD headers and libraries\n"));
3541 broken_readdir = True;
3551 unix_to_dos(buf, True);
3559 * Utility function used to decide if the last component
3560 * of a path matches a (possibly wildcarded) entry in a namelist.
3563 BOOL is_in_path(char *name, name_compare_entry *namelist)
3565 pstring last_component;
3568 DEBUG(5, ("is_in_path: %s\n", name));
3570 /* if we have no list it's obviously not in the path */
3571 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL)))
3573 DEBUG(5,("is_in_path: no name list.\n"));
3577 /* Get the last component of the unix name. */
3578 p = strrchr(name, '/');
3579 strncpy(last_component, p ? p : name, sizeof(last_component)-1);
3580 last_component[sizeof(last_component)-1] = '\0';
3582 for(; namelist->name != NULL; namelist++)
3584 if(namelist->is_wild)
3586 /* look for a wildcard match. */
3587 if (mask_match(last_component, namelist->name, case_sensitive, False))
3589 DEBUG(5,("is_in_path: mask match succeeded\n"));
3595 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
3596 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0)))
3598 DEBUG(5,("is_in_path: match succeeded\n"));
3603 DEBUG(5,("is_in_path: match not found\n"));
3609 * Strip a '/' separated list into an array of
3610 * name_compare_enties structures suitable for
3611 * passing to is_in_path(). We do this for
3612 * speed so we can pre-parse all the names in the list
3613 * and don't do it for each call to is_in_path().
3614 * namelist is modified here and is assumed to be
3615 * a copy owned by the caller.
3616 * We also check if the entry contains a wildcard to
3617 * remove a potentially expensive call to mask_match
3621 void set_namearray(name_compare_entry **ppname_array, char *namelist)
3624 char *nameptr = namelist;
3625 int num_entries = 0;
3628 (*ppname_array) = NULL;
3630 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
3633 /* We need to make two passes over the string. The
3634 first to count the number of elements, the second
3639 if ( *nameptr == '/' )
3641 /* cope with multiple (useless) /s) */
3645 /* find the next / */
3646 name_end = strchr(nameptr, '/');
3648 /* oops - the last check for a / didn't find one. */
3649 if (name_end == NULL)
3652 /* next segment please */
3653 nameptr = name_end + 1;
3657 if(num_entries == 0)
3660 if(( (*ppname_array) = (name_compare_entry *)malloc(
3661 (num_entries + 1) * sizeof(name_compare_entry))) == NULL)
3663 DEBUG(0,("set_namearray: malloc fail\n"));
3667 /* Now copy out the names */
3672 if ( *nameptr == '/' )
3674 /* cope with multiple (useless) /s) */
3678 /* find the next / */
3679 if ((name_end = strchr(nameptr, '/')) != NULL)
3684 /* oops - the last check for a / didn't find one. */
3685 if(name_end == NULL)
3688 (*ppname_array)[i].is_wild = ((strchr( nameptr, '?')!=NULL) ||
3689 (strchr( nameptr, '*')!=NULL));
3690 if(((*ppname_array)[i].name = strdup(nameptr)) == NULL)
3692 DEBUG(0,("set_namearray: malloc fail (1)\n"));
3696 /* next segment please */
3697 nameptr = name_end + 1;
3701 (*ppname_array)[i].name = NULL;
3706 /****************************************************************************
3707 routine to free a namearray.
3708 ****************************************************************************/
3710 void free_namearray(name_compare_entry *name_array)
3715 if(name_array->name != NULL)
3716 free(name_array->name);
3718 free((char *)name_array);
3721 /****************************************************************************
3722 routine to do file locking
3723 ****************************************************************************/
3724 BOOL fcntl_lock(int fd,int op,uint32 offset,uint32 count,int type)
3731 uint32 mask = 0xC0000000;
3733 /* make sure the count is reasonable, we might kill the lockd otherwise */
3736 /* the offset is often strange - remove 2 of its bits if either of
3737 the top two bits are set. Shift the top ones by two bits. This
3738 still allows OLE2 apps to operate, but should stop lockd from
3740 if ((offset & mask) != 0)
3741 offset = (offset & ~mask) | ((offset & mask) >> 2);
3743 uint32 mask = ((unsigned)1<<31);
3745 /* interpret negative counts as large numbers */
3749 /* no negative offsets */
3752 /* count + offset must be in range */
3753 while ((offset < 0 || (offset + count < 0)) && mask)
3761 DEBUG(5,("fcntl_lock %d %d %d %d %d\n",fd,op,(int)offset,(int)count,type));
3764 lock.l_whence = SEEK_SET;
3765 lock.l_start = (int)offset;
3766 lock.l_len = (int)count;
3771 ret = fcntl(fd,op,&lock);
3774 DEBUG(3,("fcntl lock gave errno %d (%s)\n",errno,strerror(errno)));
3780 (lock.l_type != F_UNLCK) &&
3781 (lock.l_pid != 0) &&
3782 (lock.l_pid != getpid()))
3784 DEBUG(3,("fd %d is locked by pid %d\n",fd,lock.l_pid));
3788 /* it must be not locked or locked by me */
3792 /* a lock set or unset */
3795 DEBUG(3,("lock failed at offset %d count %d op %d type %d (%s)\n",
3796 offset,count,op,type,strerror(errno)));
3798 /* perhaps it doesn't support this sort of locking?? */
3799 if (errno == EINVAL)
3801 DEBUG(3,("locking not supported? returning True\n"));
3808 /* everything went OK */
3809 DEBUG(5,("Lock call successful\n"));
3817 /*******************************************************************
3818 lock a file - returning a open file descriptor or -1 on failure
3819 The timeout is in seconds. 0 means no timeout
3820 ********************************************************************/
3821 int file_lock(char *name,int timeout)
3823 int fd = open(name,O_RDWR|O_CREAT,0666);
3825 if (fd < 0) return(-1);
3828 if (timeout) t = time(NULL);
3829 while (!timeout || (time(NULL)-t < timeout)) {
3830 if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)) return(fd);
3831 msleep(LOCK_RETRY_TIMEOUT);
3839 /*******************************************************************
3840 unlock a file locked by file_lock
3841 ********************************************************************/
3842 void file_unlock(int fd)
3846 fcntl_lock(fd,F_SETLK,0,1,F_UNLCK);
3851 /*******************************************************************
3852 is the name specified one of my netbios names
3853 returns true is it is equal, false otherwise
3854 ********************************************************************/
3855 BOOL is_myname(const char *s)
3860 for (n=0; my_netbios_names[n]; n++) {
3861 if (strequal(my_netbios_names[n], s))
3864 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));