2 Unix SMB/Netbios implementation.
4 Samba utility functions
5 Copyright (C) Andrew Tridgell 1992-1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #if (defined(NETGROUP) && defined (AUTOMOUNT))
25 #include "rpcsvc/ypclnt.h"
34 int Protocol = PROTOCOL_COREPLUS;
36 /* a default finfo structure to ensure all fields are sensible */
37 file_info def_finfo = {-1,0,0,0,0,0,0,""};
39 /* these are some file handles where debug info will be stored */
42 /* the client file descriptor */
45 /* the last IP received from */
46 struct in_addr lastip;
48 /* the last port received from */
51 /* this is used by the chaining code */
57 case handling on filenames
59 int case_default = CASE_LOWER;
64 /* the following control case operations - they are put here so the
65 client can link easily */
68 BOOL use_mangled_map = False;
69 BOOL short_case_preserve;
72 fstring remote_machine="";
73 fstring local_machine="";
74 fstring remote_arch="UNKNOWN";
75 static enum remote_arch_types ra_type = RA_UNKNOWN;
76 fstring remote_proto="UNKNOWN";
77 pstring myhostname="";
78 pstring user_socket_options="";
80 pstring sesssetup_user="";
81 pstring samlogon_user="";
83 BOOL sam_logon_in_ssb = False;
86 fstring myworkgroup = "";
87 char **my_netbios_names;
89 int smb_read_error = 0;
91 static BOOL stdout_logging = False;
93 static char *filename_dos(char *path,char *buf);
96 /**************************************************************************** **
97 catch a sigusr2 - decrease the debug log level.
98 **************************************************************************** */
101 BlockSignals( True, SIGUSR2);
108 DEBUG( 0, ( "Got SIGUSR2 set debug level to %d.\n", DEBUGLEVEL ) );
110 BlockSignals( False, SIGUSR2);
111 #ifndef DONT_REINSTALL_SIG
112 signal(SIGUSR2, SIGNAL_CAST sig_usr2);
119 /**************************************************************************** **
120 catch a sigusr1 - increase the debug log level.
121 **************************************************************************** */
124 BlockSignals( True, SIGUSR1);
131 DEBUG( 0, ( "Got SIGUSR1 set debug level to %d.\n", DEBUGLEVEL ) );
133 BlockSignals( False, SIGUSR1);
134 #ifndef DONT_REINSTALL_SIG
135 signal(SIGUSR1, SIGNAL_CAST sig_usr1);
142 /*******************************************************************
143 get ready for syslog stuff
144 ******************************************************************/
145 void setup_logging(char *pname,BOOL interactive)
149 char *p = strrchr(pname,'/');
152 openlog(pname, LOG_PID, SYSLOG_FACILITY);
153 #else /* for old systems that have no facility codes. */
154 openlog(pname, LOG_PID);
159 stdout_logging = True;
165 BOOL append_log=False;
168 /****************************************************************************
170 ****************************************************************************/
171 void reopen_logs(void)
177 strcpy(fname,debugf);
178 if (lp_loaded() && (*lp_logfile()))
179 strcpy(fname,lp_logfile());
181 if (!strcsequal(fname,debugf) || !dbf || !file_exist(debugf,NULL))
183 int oldumask = umask(022);
184 strcpy(debugf,fname);
185 if (dbf) fclose(dbf);
187 dbf = fopen(debugf,"a");
189 dbf = fopen(debugf,"w");
190 if (dbf) setbuf(dbf,NULL);
205 /*******************************************************************
206 check if the log has grown too big
207 ********************************************************************/
208 static void check_log_size(void)
210 static int debug_count=0;
214 if (debug_count++ < 100 || getuid() != 0) return;
216 maxlog = lp_max_log_size() * 1024;
217 if (!dbf || maxlog <= 0) return;
219 if (fstat(fileno(dbf),&st) == 0 && st.st_size > maxlog) {
220 fclose(dbf); dbf = NULL;
222 if (dbf && file_size(debugf) > maxlog) {
224 fclose(dbf); dbf = NULL;
225 sprintf(name,"%s.old",debugf);
226 sys_rename(debugf,name);
234 /*******************************************************************
235 write an debug message on the debugfile. This is called by the DEBUG
237 ********************************************************************/
239 int Debug1(char *format_str, ...)
248 int old_errno = errno;
250 if (stdout_logging) {
252 va_start(ap, format_str);
255 format_str = va_arg(ap,char *);
257 vfprintf(dbf,format_str,ap);
264 if (!lp_syslog_only())
268 int oldumask = umask(022);
269 dbf = fopen(debugf,"w");
281 if (syslog_level < lp_syslog())
284 * map debug levels to syslog() priorities
285 * note that not all DEBUG(0, ...) calls are
288 static int priority_map[] = {
297 if (syslog_level >= sizeof(priority_map) / sizeof(priority_map[0]) ||
299 priority = LOG_DEBUG;
301 priority = priority_map[syslog_level];
304 va_start(ap, format_str);
307 format_str = va_arg(ap,char *);
309 vsprintf(msgbuf, format_str, ap);
313 syslog(priority, "%s", msgbuf);
318 if (!lp_syslog_only())
322 va_start(ap, format_str);
325 format_str = va_arg(ap,char *);
327 vfprintf(dbf,format_str,ap);
339 /****************************************************************************
340 find a suitable temporary directory. The result should be copied immediately
341 as it may be overwritten by a subsequent call
342 ****************************************************************************/
346 if ((p = getenv("TMPDIR"))) {
354 /****************************************************************************
355 determine if a file descriptor is in fact a socket
356 ****************************************************************************/
357 BOOL is_a_socket(int fd)
361 return(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&v, &l) == 0);
365 static char *last_ptr=NULL;
367 /****************************************************************************
368 Get the next token from a string, return False if none found
369 handles double-quotes.
370 Based on a routine by GJC@VILLAGE.COM.
371 Extensively modified by Andrew.Tridgell@anu.edu.au
372 ****************************************************************************/
373 BOOL next_token(char **ptr,char *buff,char *sep)
378 if (!ptr) ptr = &last_ptr;
379 if (!ptr) return(False);
383 /* default to simple separators */
384 if (!sep) sep = " \t\n\r";
386 /* find the first non sep char */
387 while(*s && strchr(sep,*s)) s++;
390 if (! *s) return(False);
392 /* copy over the token */
393 for (quoted = False; *s && (quoted || !strchr(sep,*s)); s++)
401 *ptr = (*s) ? s+1 : s;
408 /****************************************************************************
409 Convert list of tokens to array; dependent on above routine.
410 Uses last_ptr from above - bit of a hack.
411 ****************************************************************************/
412 char **toktocliplist(int *ctok, char *sep)
418 if (!sep) sep = " \t\n\r";
420 while(*s && strchr(sep,*s)) s++;
423 if (!*s) return(NULL);
427 while(*s && (!strchr(sep,*s))) s++;
428 while(*s && strchr(sep,*s)) *s++=0;
434 if (!(ret=iret=malloc(ictok*sizeof(char *)))) return NULL;
446 /*******************************************************************
447 safely copies memory, ensuring no overlap problems.
448 this is only used if the machine does not have it's own memmove().
449 this is not the fastest algorithm in town, but it will do for our
451 ********************************************************************/
452 void *MemMove(void *dest,void *src,int size)
456 if (dest==src || !size) return(dest);
458 d = (unsigned long)dest;
459 s = (unsigned long)src;
461 if ((d >= (s+size)) || (s >= (d+size))) {
463 memcpy(dest,src,size);
469 /* we can forward copy */
470 if (s-d >= sizeof(int) &&
471 !(s%sizeof(int)) && !(d%sizeof(int)) && !(size%sizeof(int))) {
472 /* do it all as words */
473 int *idest = (int *)dest;
474 int *isrc = (int *)src;
476 for (i=0;i<size;i++) idest[i] = isrc[i];
479 char *cdest = (char *)dest;
480 char *csrc = (char *)src;
481 for (i=0;i<size;i++) cdest[i] = csrc[i];
486 /* must backward copy */
487 if (d-s >= sizeof(int) &&
488 !(s%sizeof(int)) && !(d%sizeof(int)) && !(size%sizeof(int))) {
489 /* do it all as words */
490 int *idest = (int *)dest;
491 int *isrc = (int *)src;
493 for (i=size-1;i>=0;i--) idest[i] = isrc[i];
496 char *cdest = (char *)dest;
497 char *csrc = (char *)src;
498 for (i=size-1;i>=0;i--) cdest[i] = csrc[i];
506 /****************************************************************************
507 prompte a dptr (to make it recently used)
508 ****************************************************************************/
509 void array_promote(char *array,int elsize,int element)
515 p = (char *)malloc(elsize);
519 DEBUG(5,("Ahh! Can't malloc\n"));
522 memcpy(p,array + element * elsize, elsize);
523 memmove(array + elsize,array,elsize*element);
524 memcpy(array,p,elsize);
528 enum SOCK_OPT_TYPES {OPT_BOOL,OPT_INT,OPT_ON};
537 } socket_options[] = {
538 {"SO_KEEPALIVE", SOL_SOCKET, SO_KEEPALIVE, 0, OPT_BOOL},
539 {"SO_REUSEADDR", SOL_SOCKET, SO_REUSEADDR, 0, OPT_BOOL},
540 {"SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, 0, OPT_BOOL},
542 {"TCP_NODELAY", IPPROTO_TCP, TCP_NODELAY, 0, OPT_BOOL},
544 #ifdef IPTOS_LOWDELAY
545 {"IPTOS_LOWDELAY", IPPROTO_IP, IP_TOS, IPTOS_LOWDELAY, OPT_ON},
547 #ifdef IPTOS_THROUGHPUT
548 {"IPTOS_THROUGHPUT", IPPROTO_IP, IP_TOS, IPTOS_THROUGHPUT, OPT_ON},
551 {"SO_SNDBUF", SOL_SOCKET, SO_SNDBUF, 0, OPT_INT},
554 {"SO_RCVBUF", SOL_SOCKET, SO_RCVBUF, 0, OPT_INT},
557 {"SO_SNDLOWAT", SOL_SOCKET, SO_SNDLOWAT, 0, OPT_INT},
560 {"SO_RCVLOWAT", SOL_SOCKET, SO_RCVLOWAT, 0, OPT_INT},
563 {"SO_SNDTIMEO", SOL_SOCKET, SO_SNDTIMEO, 0, OPT_INT},
566 {"SO_RCVTIMEO", SOL_SOCKET, SO_RCVTIMEO, 0, OPT_INT},
572 /****************************************************************************
573 set user socket options
574 ****************************************************************************/
575 void set_socket_options(int fd, char *options)
579 while (next_token(&options,tok," \t,"))
584 BOOL got_value = False;
586 if ((p = strchr(tok,'=')))
593 for (i=0;socket_options[i].name;i++)
594 if (strequal(socket_options[i].name,tok))
597 if (!socket_options[i].name)
599 DEBUG(0,("Unknown socket option %s\n",tok));
603 switch (socket_options[i].opttype)
607 ret = setsockopt(fd,socket_options[i].level,
608 socket_options[i].option,(char *)&value,sizeof(int));
613 DEBUG(0,("syntax error - %s does not take a value\n",tok));
616 int on = socket_options[i].value;
617 ret = setsockopt(fd,socket_options[i].level,
618 socket_options[i].option,(char *)&on,sizeof(int));
624 DEBUG(0,("Failed to set socket option %s\n",tok));
630 /****************************************************************************
631 close the socket communication
632 ****************************************************************************/
633 void close_sockets(void )
639 /****************************************************************************
640 determine whether we are in the specified group
641 ****************************************************************************/
642 BOOL in_group(gid_t group, int current_gid, int ngroups, int *groups)
646 if (group == current_gid) return(True);
648 for (i=0;i<ngroups;i++)
649 if (group == groups[i])
655 /****************************************************************************
656 this is a safer strcpy(), meant to prevent core dumps when nasty things happen
657 ****************************************************************************/
658 char *StrCpy(char *dest,char *src)
663 /* I don't want to get lazy with these ... */
665 DEBUG(0,("ERROR: NULL StrCpy() called!\n"));
670 if (!dest) return(NULL);
675 while ((*d++ = *src++)) ;
679 /****************************************************************************
680 line strncpy but always null terminates. Make sure there is room!
681 ****************************************************************************/
682 char *StrnCpy(char *dest,char *src,int n)
685 if (!dest) return(NULL);
690 while (n-- && (*d++ = *src++)) ;
696 /*******************************************************************
697 copy an IP address from one buffer to another
698 ********************************************************************/
699 void putip(void *dest,void *src)
705 /****************************************************************************
706 interpret the weird netbios "name". Return the name type
707 ****************************************************************************/
708 static int name_interpret(char *in,char *out)
711 int len = (*in++) / 2;
715 if (len > 30 || len<1) return(0);
719 if (in[0] < 'A' || in[0] > 'P' || in[1] < 'A' || in[1] > 'P') {
723 *out = ((in[0]-'A')<<4) + (in[1]-'A');
731 /* Handle any scope names */
734 *out++ = '.'; /* Scope names are separated by periods */
735 len = *(unsigned char *)in++;
736 StrnCpy(out, in, len);
745 /****************************************************************************
746 mangle a name into netbios format
748 Note: <Out> must be (33 + strlen(scope) + 2) bytes long, at minimum.
749 ****************************************************************************/
750 int name_mangle( char *In, char *Out, char name_type )
758 /* Safely copy the input string, In, into buf[]. */
759 (void)memset( buf, 0, 20 );
763 (void)sprintf( buf, "%-15.15s%c", In, name_type );
765 /* Place the length of the first field into the output buffer. */
769 /* Now convert the name to the rfc1001/1002 format. */
770 for( i = 0; i < 16; i++ )
772 c = toupper( buf[i] );
773 p[i*2] = ( (c >> 4) & 0x000F ) + 'A';
774 p[(i*2)+1] = (c & 0x000F) + 'A';
779 /* Add the scope string. */
780 for( i = 0, len = 0; NULL != scope; i++, len++ )
788 return( name_len(Out) );
800 return( name_len(Out) );
803 /*******************************************************************
804 check if a file exists
805 ********************************************************************/
806 BOOL file_exist(char *fname,struct stat *sbuf)
809 if (!sbuf) sbuf = &st;
811 if (sys_stat(fname,sbuf) != 0)
814 return(S_ISREG(sbuf->st_mode));
817 /*******************************************************************
818 check a files mod time
819 ********************************************************************/
820 time_t file_modtime(char *fname)
824 if (sys_stat(fname,&st) != 0)
830 /*******************************************************************
831 check if a directory exists
832 ********************************************************************/
833 BOOL directory_exist(char *dname,struct stat *st)
840 if (sys_stat(dname,st) != 0)
843 ret = S_ISDIR(st->st_mode);
849 /*******************************************************************
850 returns the size in bytes of the named file
851 ********************************************************************/
852 uint32 file_size(char *file_name)
856 sys_stat(file_name,&buf);
860 /*******************************************************************
861 return a string representing an attribute for a file
862 ********************************************************************/
863 char *attrib_string(int mode)
865 static char attrstr[10];
869 if (mode & aVOLID) strcat(attrstr,"V");
870 if (mode & aDIR) strcat(attrstr,"D");
871 if (mode & aARCH) strcat(attrstr,"A");
872 if (mode & aHIDDEN) strcat(attrstr,"H");
873 if (mode & aSYSTEM) strcat(attrstr,"S");
874 if (mode & aRONLY) strcat(attrstr,"R");
880 /*******************************************************************
881 case insensitive string compararison
882 ********************************************************************/
883 int StrCaseCmp(char *s, char *t)
885 /* compare until we run out of string, either t or s, or find a difference */
886 /* We *must* use toupper rather than tolower here due to the
887 asynchronous upper to lower mapping.
889 #if !defined(KANJI_WIN95_COMPATIBILITY)
890 if(lp_client_code_page() == KANJI_CODEPAGE)
892 /* Win95 treats full width ascii characters as case sensitive. */
897 return toupper (*s) - toupper (*t);
898 else if (is_sj_alph (*s) && is_sj_alph (*t))
900 diff = sj_toupper2 (*(s+1)) - sj_toupper2 (*(t+1));
906 else if (is_shift_jis (*s) && is_shift_jis (*t))
908 diff = ((int) (unsigned char) *s) - ((int) (unsigned char) *t);
911 diff = ((int) (unsigned char) *(s+1)) - ((int) (unsigned char) *(t+1));
917 else if (is_shift_jis (*s))
919 else if (is_shift_jis (*t))
923 diff = toupper (*s) - toupper (*t);
932 #endif /* KANJI_WIN95_COMPATIBILITY */
934 while (*s && *t && toupper(*s) == toupper(*t))
940 return(toupper(*s) - toupper(*t));
944 /*******************************************************************
945 case insensitive string compararison, length limited
946 ********************************************************************/
947 int StrnCaseCmp(char *s, char *t, int n)
949 /* compare until we run out of string, either t or s, or chars */
950 /* We *must* use toupper rather than tolower here due to the
951 asynchronous upper to lower mapping.
953 #if !defined(KANJI_WIN95_COMPATIBILITY)
954 if(lp_client_code_page() == KANJI_CODEPAGE)
956 /* Win95 treats full width ascii characters as case sensitive. */
961 return toupper (*s) - toupper (*t);
962 else if (is_sj_alph (*s) && is_sj_alph (*t))
964 diff = sj_toupper2 (*(s+1)) - sj_toupper2 (*(t+1));
971 else if (is_shift_jis (*s) && is_shift_jis (*t))
973 diff = ((int) (unsigned char) *s) - ((int) (unsigned char) *t);
976 diff = ((int) (unsigned char) *(s+1)) - ((int) (unsigned char) *(t+1));
983 else if (is_shift_jis (*s))
985 else if (is_shift_jis (*t))
989 diff = toupper (*s) - toupper (*t);
1000 #endif /* KANJI_WIN95_COMPATIBILITY */
1002 while (n && *s && *t && toupper(*s) == toupper(*t))
1009 /* not run out of chars - strings are different lengths */
1011 return(toupper(*s) - toupper(*t));
1013 /* identical up to where we run out of chars,
1014 and strings are same length */
1019 /*******************************************************************
1021 ********************************************************************/
1022 BOOL strequal(char *s1, char *s2)
1024 if (s1 == s2) return(True);
1025 if (!s1 || !s2) return(False);
1027 return(StrCaseCmp(s1,s2)==0);
1030 /*******************************************************************
1031 compare 2 strings up to and including the nth char.
1032 ******************************************************************/
1033 BOOL strnequal(char *s1,char *s2,int n)
1035 if (s1 == s2) return(True);
1036 if (!s1 || !s2 || !n) return(False);
1038 return(StrnCaseCmp(s1,s2,n)==0);
1041 /*******************************************************************
1042 compare 2 strings (case sensitive)
1043 ********************************************************************/
1044 BOOL strcsequal(char *s1,char *s2)
1046 if (s1 == s2) return(True);
1047 if (!s1 || !s2) return(False);
1049 return(strcmp(s1,s2)==0);
1053 /*******************************************************************
1054 convert a string to lower case
1055 ********************************************************************/
1056 void strlower(char *s)
1060 #if !defined(KANJI_WIN95_COMPATIBILITY)
1061 if(lp_client_code_page() == KANJI_CODEPAGE)
1063 /* Win95 treats full width ascii characters as case sensitive. */
1064 if (is_shift_jis (*s))
1066 if (is_sj_upper (s[0], s[1]))
1067 s[1] = sj_tolower2 (s[1]);
1070 else if (is_kana (*s))
1082 #endif /* KANJI_WIN95_COMPATIBILITY */
1091 /*******************************************************************
1092 convert a string to upper case
1093 ********************************************************************/
1094 void strupper(char *s)
1098 #if !defined(KANJI_WIN95_COMPATIBILITY)
1099 if(lp_client_code_page() == KANJI_CODEPAGE)
1101 /* Win95 treats full width ascii characters as case sensitive. */
1102 if (is_shift_jis (*s))
1104 if (is_sj_lower (s[0], s[1]))
1105 s[1] = sj_toupper2 (s[1]);
1108 else if (is_kana (*s))
1120 #endif /* KANJI_WIN95_COMPATIBILITY */
1129 /*******************************************************************
1130 convert a string to "normal" form
1131 ********************************************************************/
1132 void strnorm(char *s)
1134 if (case_default == CASE_UPPER)
1140 /*******************************************************************
1141 check if a string is in "normal" case
1142 ********************************************************************/
1143 BOOL strisnormal(char *s)
1145 if (case_default == CASE_UPPER)
1146 return(!strhaslower(s));
1148 return(!strhasupper(s));
1152 /****************************************************************************
1154 ****************************************************************************/
1155 void string_replace(char *s,char oldc,char newc)
1159 #if !defined(KANJI_WIN95_COMPATIBILITY)
1160 if(lp_client_code_page() == KANJI_CODEPAGE)
1162 /* Win95 treats full width ascii characters as case sensitive. */
1163 if (is_shift_jis (*s))
1165 else if (is_kana (*s))
1175 #endif /* KANJI_WIN95_COMPATIBILITY */
1184 /****************************************************************************
1185 make a file into unix format
1186 ****************************************************************************/
1187 void unix_format(char *fname)
1190 string_replace(fname,'\\','/');
1194 pstrcpy(namecopy,fname);
1196 strcat(fname,namecopy);
1200 /****************************************************************************
1201 make a file into dos format
1202 ****************************************************************************/
1203 void dos_format(char *fname)
1205 string_replace(fname,'/','\\');
1209 /*******************************************************************
1210 show a smb message structure
1211 ********************************************************************/
1212 void show_msg(char *buf)
1217 if (DEBUGLEVEL < 5) return;
1219 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
1221 (int)CVAL(buf,smb_com),
1222 (int)CVAL(buf,smb_rcls),
1223 (int)CVAL(buf,smb_reh),
1224 (int)SVAL(buf,smb_err),
1225 (int)CVAL(buf,smb_flg),
1226 (int)SVAL(buf,smb_flg2)));
1227 DEBUG(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\nsmt_wct=%d\n",
1228 (int)SVAL(buf,smb_tid),
1229 (int)SVAL(buf,smb_pid),
1230 (int)SVAL(buf,smb_uid),
1231 (int)SVAL(buf,smb_mid),
1232 (int)CVAL(buf,smb_wct)));
1234 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
1235 DEBUG(5,("smb_vwv[%d]=%d (0x%X)\n",i,
1236 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
1238 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
1239 DEBUG(5,("smb_bcc=%d\n",bcc));
1241 if (DEBUGLEVEL < 10) return;
1243 dump_data(10, smb_buf(buf), MIN(bcc, 512));
1246 /*******************************************************************
1247 return the length of an smb packet
1248 ********************************************************************/
1249 int smb_len(char *buf)
1251 return( PVAL(buf,3) | (PVAL(buf,2)<<8) | ((PVAL(buf,1)&1)<<16) );
1254 /*******************************************************************
1255 set the length of an smb packet
1256 ********************************************************************/
1257 void _smb_setlen(char *buf,int len)
1260 buf[1] = (len&0x10000)>>16;
1261 buf[2] = (len&0xFF00)>>8;
1265 /*******************************************************************
1266 set the length and marker of an smb packet
1267 ********************************************************************/
1268 void smb_setlen(char *buf,int len)
1270 _smb_setlen(buf,len);
1278 /*******************************************************************
1279 setup the word count and byte count for a smb message
1280 ********************************************************************/
1281 int set_message(char *buf,int num_words,int num_bytes,BOOL zero)
1284 bzero(buf + smb_size,num_words*2 + num_bytes);
1285 CVAL(buf,smb_wct) = num_words;
1286 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
1287 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
1288 return (smb_size + num_words*2 + num_bytes);
1291 /*******************************************************************
1292 return the number of smb words
1293 ********************************************************************/
1294 int smb_numwords(char *buf)
1296 return (CVAL(buf,smb_wct));
1299 /*******************************************************************
1300 return the size of the smb_buf region of a message
1301 ********************************************************************/
1302 int smb_buflen(char *buf)
1304 return(SVAL(buf,smb_vwv0 + smb_numwords(buf)*2));
1307 /*******************************************************************
1308 return a pointer to the smb_buf data area
1309 ********************************************************************/
1310 int smb_buf_ofs(char *buf)
1312 return (smb_size + CVAL(buf,smb_wct)*2);
1315 /*******************************************************************
1316 return a pointer to the smb_buf data area
1317 ********************************************************************/
1318 char *smb_buf(char *buf)
1320 return (buf + smb_buf_ofs(buf));
1323 /*******************************************************************
1324 return the SMB offset into an SMB buffer
1325 ********************************************************************/
1326 int smb_offset(char *p,char *buf)
1328 return(PTR_DIFF(p,buf+4) + chain_size);
1332 /*******************************************************************
1333 skip past some strings in a buffer
1334 ********************************************************************/
1335 char *skip_string(char *buf,int n)
1338 buf += strlen(buf) + 1;
1342 /*******************************************************************
1343 trim the specified elements off the front and back of a string
1344 ********************************************************************/
1345 BOOL trim_string(char *s,char *front,char *back)
1348 while (front && *front && strncmp(s,front,strlen(front)) == 0)
1354 if (!(*p = p[strlen(front)]))
1359 while (back && *back && strlen(s) >= strlen(back) &&
1360 (strncmp(s+strlen(s)-strlen(back),back,strlen(back))==0))
1363 s[strlen(s)-strlen(back)] = 0;
1369 /*******************************************************************
1370 reduce a file name, removing .. elements.
1371 ********************************************************************/
1372 void dos_clean_name(char *s)
1376 DEBUG(3,("dos_clean_name [%s]\n",s));
1378 /* remove any double slashes */
1379 string_sub(s, "\\\\", "\\");
1381 while ((p = strstr(s,"\\..\\")) != NULL)
1388 if ((p=strrchr(s,'\\')) != NULL)
1395 trim_string(s,NULL,"\\..");
1397 string_sub(s, "\\.\\", "\\");
1400 /*******************************************************************
1401 reduce a file name, removing .. elements.
1402 ********************************************************************/
1403 void unix_clean_name(char *s)
1407 DEBUG(3,("unix_clean_name [%s]\n",s));
1409 /* remove any double slashes */
1410 string_sub(s, "//","/");
1412 /* Remove leading ./ characters */
1413 if(strncmp(s, "./", 2) == 0) {
1414 trim_string(s, "./", NULL);
1419 while ((p = strstr(s,"/../")) != NULL)
1426 if ((p=strrchr(s,'/')) != NULL)
1433 trim_string(s,NULL,"/..");
1437 /*******************************************************************
1438 a wrapper for the normal chdir() function
1439 ********************************************************************/
1440 int ChDir(char *path)
1443 static pstring LastDir="";
1445 if (strcsequal(path,".")) return(0);
1447 if (*path == '/' && strcsequal(LastDir,path)) return(0);
1448 DEBUG(3,("chdir to %s\n",path));
1449 res = sys_chdir(path);
1451 pstrcpy(LastDir,path);
1455 /* number of list structures for a caching GetWd function. */
1456 #define MAX_GETWDCACHE (50)
1464 } ino_list[MAX_GETWDCACHE];
1466 BOOL use_getwd_cache=True;
1468 /*******************************************************************
1469 return the absolute current directory path
1470 ********************************************************************/
1471 char *GetWd(char *str)
1474 static BOOL getwd_cache_init = False;
1475 struct stat st, st2;
1480 if (!use_getwd_cache)
1481 return(sys_getwd(str));
1483 /* init the cache */
1484 if (!getwd_cache_init)
1486 getwd_cache_init = True;
1487 for (i=0;i<MAX_GETWDCACHE;i++)
1489 string_init(&ino_list[i].text,"");
1490 ino_list[i].valid = False;
1494 /* Get the inode of the current directory, if this doesn't work we're
1497 if (stat(".",&st) == -1)
1499 DEBUG(0,("Very strange, couldn't stat \".\"\n"));
1500 return(sys_getwd(str));
1504 for (i=0; i<MAX_GETWDCACHE; i++)
1505 if (ino_list[i].valid)
1508 /* If we have found an entry with a matching inode and dev number
1509 then find the inode number for the directory in the cached string.
1510 If this agrees with that returned by the stat for the current
1511 directory then all is o.k. (but make sure it is a directory all
1514 if (st.st_ino == ino_list[i].inode &&
1515 st.st_dev == ino_list[i].dev)
1517 if (stat(ino_list[i].text,&st2) == 0)
1519 if (st.st_ino == st2.st_ino &&
1520 st.st_dev == st2.st_dev &&
1521 (st2.st_mode & S_IFMT) == S_IFDIR)
1523 strcpy (str, ino_list[i].text);
1525 /* promote it for future use */
1526 array_promote((char *)&ino_list[0],sizeof(ino_list[0]),i);
1531 /* If the inode is different then something's changed,
1532 scrub the entry and start from scratch. */
1533 ino_list[i].valid = False;
1540 /* We don't have the information to hand so rely on traditional methods.
1541 The very slow getcwd, which spawns a process on some systems, or the
1542 not quite so bad getwd. */
1546 DEBUG(0,("Getwd failed, errno %s\n",strerror(errno)));
1552 DEBUG(5,("GetWd %s, inode %d, dev %x\n",s,(int)st.st_ino,(int)st.st_dev));
1554 /* add it to the cache */
1555 i = MAX_GETWDCACHE - 1;
1556 string_set(&ino_list[i].text,s);
1557 ino_list[i].dev = st.st_dev;
1558 ino_list[i].inode = st.st_ino;
1559 ino_list[i].valid = True;
1561 /* put it at the top of the list */
1562 array_promote((char *)&ino_list[0],sizeof(ino_list[0]),i);
1569 /*******************************************************************
1570 reduce a file name, removing .. elements and checking that
1571 it is below dir in the heirachy. This uses GetWd() and so must be run
1572 on the system that has the referenced file system.
1574 widelinks are allowed if widelinks is true
1575 ********************************************************************/
1576 BOOL reduce_name(char *s,char *dir,BOOL widelinks)
1578 #ifndef REDUCE_PATHS
1586 BOOL relative = (*s != '/');
1588 *dir2 = *wd = *base_name = *newname = 0;
1593 /* can't have a leading .. */
1594 if (strncmp(s,"..",2) == 0 && (s[2]==0 || s[2]=='/'))
1596 DEBUG(3,("Illegal file name? (%s)\n",s));
1606 DEBUG(3,("reduce_name [%s] [%s]\n",s,dir));
1608 /* remove any double slashes */
1609 string_sub(s,"//","/");
1611 pstrcpy(base_name,s);
1612 p = strrchr(base_name,'/');
1619 DEBUG(0,("couldn't getwd for %s %s\n",s,dir));
1623 if (ChDir(dir) != 0)
1625 DEBUG(0,("couldn't chdir to %s\n",dir));
1631 DEBUG(0,("couldn't getwd for %s\n",dir));
1637 if (p && (p != base_name))
1640 if (strcmp(p+1,".")==0)
1642 if (strcmp(p+1,"..")==0)
1646 if (ChDir(base_name) != 0)
1649 DEBUG(3,("couldn't chdir for %s %s basename=%s\n",s,dir,base_name));
1653 if (!GetWd(newname))
1656 DEBUG(2,("couldn't get wd for %s %s\n",s,dir2));
1660 if (p && (p != base_name))
1662 strcat(newname,"/");
1663 strcat(newname,p+1);
1667 int l = strlen(dir2);
1668 if (dir2[l-1] == '/')
1671 if (strncmp(newname,dir2,l) != 0)
1674 DEBUG(2,("Bad access attempt? s=%s dir=%s newname=%s l=%d\n",s,dir2,newname,l));
1680 if (newname[l] == '/')
1681 pstrcpy(s,newname + l + 1);
1683 pstrcpy(s,newname+l);
1694 DEBUG(3,("reduced to %s\n",s));
1699 /****************************************************************************
1701 ****************************************************************************/
1702 static void expand_one(char *Mask,int len)
1705 while ((p1 = strchr(Mask,'*')) != NULL)
1707 int lfill = (len+1) - strlen(Mask);
1708 int l1= (p1 - Mask);
1711 memset(tmp+l1,'?',lfill);
1712 pstrcpy(tmp + l1 + lfill,Mask + l1 + 1);
1717 /****************************************************************************
1718 expand a wildcard expression, replacing *s with ?s
1719 ****************************************************************************/
1720 void expand_mask(char *Mask,BOOL doext)
1725 BOOL hasdot = False;
1727 BOOL absolute = (*Mask == '\\');
1729 *mbeg = *mext = *dirpart = *filepart = 0;
1731 /* parse the directory and filename */
1732 if (strchr(Mask,'\\'))
1733 dirname_dos(Mask,dirpart);
1735 filename_dos(Mask,filepart);
1737 pstrcpy(mbeg,filepart);
1738 if ((p1 = strchr(mbeg,'.')) != NULL)
1748 if (strlen(mbeg) > 8)
1750 pstrcpy(mext,mbeg + 8);
1756 strcpy(mbeg,"????????");
1757 if ((*mext == 0) && doext && !hasdot)
1760 if (strequal(mbeg,"*") && *mext==0)
1768 pstrcpy(Mask,dirpart);
1769 if (*dirpart || absolute) strcat(Mask,"\\");
1774 DEBUG(6,("Mask expanded to [%s]\n",Mask));
1778 /****************************************************************************
1779 does a string have any uppercase chars in it?
1780 ****************************************************************************/
1781 BOOL strhasupper(char *s)
1785 #if !defined(KANJI_WIN95_COMPATIBILITY)
1786 if(lp_client_code_page() == KANJI_CODEPAGE)
1788 /* Win95 treats full width ascii characters as case sensitive. */
1789 if (is_shift_jis (*s))
1791 else if (is_kana (*s))
1801 #endif /* KANJI_WIN95_COMPATIBILITY */
1811 /****************************************************************************
1812 does a string have any lowercase chars in it?
1813 ****************************************************************************/
1814 BOOL strhaslower(char *s)
1818 #if !defined(KANJI_WIN95_COMPATIBILITY)
1819 if(lp_client_code_page() == KANJI_CODEPAGE)
1821 /* Win95 treats full width ascii characters as case sensitive. */
1822 if (is_shift_jis (*s))
1824 if (is_sj_upper (s[0], s[1]))
1826 if (is_sj_lower (s[0], s[1]))
1830 else if (is_kana (*s))
1842 #endif /* KANJI_WIN95_COMPATIBILITY */
1852 /****************************************************************************
1853 find the number of chars in a string
1854 ****************************************************************************/
1855 int count_chars(char *s,char c)
1859 #if !defined(KANJI_WIN95_COMPATIBILITY)
1860 if(lp_client_code_page() == KANJI_CODEPAGE)
1862 /* Win95 treats full width ascii characters as case sensitive. */
1865 if (is_shift_jis (*s))
1876 #endif /* KANJI_WIN95_COMPATIBILITY */
1889 /****************************************************************************
1891 ****************************************************************************/
1892 void make_dir_struct(char *buf,char *mask,char *fname,unsigned int size,int mode,time_t date)
1897 pstrcpy(mask2,mask);
1899 if ((mode & aDIR) != 0)
1902 memset(buf+1,' ',11);
1903 if ((p = strchr(mask2,'.')) != NULL)
1906 memcpy(buf+1,mask2,MIN(strlen(mask2),8));
1907 memcpy(buf+9,p+1,MIN(strlen(p+1),3));
1911 memcpy(buf+1,mask2,MIN(strlen(mask2),11));
1913 bzero(buf+21,DIR_STRUCT_SIZE-21);
1914 CVAL(buf,21) = mode;
1915 put_dos_date(buf,22,date);
1916 SSVAL(buf,26,size & 0xFFFF);
1917 SSVAL(buf,28,size >> 16);
1918 StrnCpy(buf+30,fname,12);
1919 if (!case_sensitive)
1921 DEBUG(8,("put name [%s] into dir struct\n",buf+30));
1925 /*******************************************************************
1926 close the low 3 fd's and open dev/null in their place
1927 ********************************************************************/
1928 void close_low_fds(void)
1932 close(0); close(1); close(2);
1933 /* try and use up these file descriptors, so silly
1934 library routines writing to stdout etc won't cause havoc */
1936 fd = open("/dev/null",O_RDWR,0);
1937 if (fd < 0) fd = open("/dev/null",O_WRONLY,0);
1939 DEBUG(0,("Can't open /dev/null\n"));
1943 DEBUG(0,("Didn't get file descriptor %d\n",i));
1949 /****************************************************************************
1950 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
1952 if SYSV use O_NDELAY
1954 ****************************************************************************/
1955 int set_blocking(int fd, BOOL set)
1959 #define FLAG_TO_SET O_NONBLOCK
1962 #define FLAG_TO_SET O_NDELAY
1964 #define FLAG_TO_SET FNDELAY
1968 if((val = fcntl(fd, F_GETFL, 0)) == -1)
1970 if(set) /* Turn blocking on - ie. clear nonblock flag */
1971 val &= ~FLAG_TO_SET;
1974 return fcntl( fd, F_SETFL, val);
1979 /****************************************************************************
1981 ****************************************************************************/
1982 int write_socket(int fd,char *buf,int len)
1988 DEBUG(6,("write_socket(%d,%d)\n",fd,len));
1989 ret = write_data(fd,buf,len);
1991 DEBUG(6,("write_socket(%d,%d) wrote %d\n",fd,len,ret));
1993 DEBUG(0,("write_socket: Error writing %d bytes to socket %d: ERRNO = %s\n",
1994 len, fd, strerror(errno) ));
1999 /****************************************************************************
2001 ****************************************************************************/
2002 int read_udp_socket(int fd,char *buf,int len)
2005 struct sockaddr_in sock;
2008 socklen = sizeof(sock);
2009 bzero((char *)&sock,socklen);
2010 bzero((char *)&lastip,sizeof(lastip));
2011 ret = recvfrom(fd,buf,len,0,(struct sockaddr *)&sock,&socklen);
2013 DEBUG(2,("read socket failed. ERRNO=%s\n",strerror(errno)));
2017 lastip = sock.sin_addr;
2018 lastport = ntohs(sock.sin_port);
2020 DEBUG(10,("read_udp_socket: lastip %s lastport %d read: %d\n",
2021 inet_ntoa(lastip), lastport, ret));
2026 /****************************************************************************
2027 read data from a device with a timout in msec.
2028 mincount = if timeout, minimum to read before returning
2029 maxcount = number to be read.
2030 ****************************************************************************/
2031 int read_with_timeout(int fd,char *buf,int mincnt,int maxcnt,long time_out)
2037 struct timeval timeout;
2039 /* just checking .... */
2040 if (maxcnt <= 0) return(0);
2045 if (time_out <= 0) {
2046 if (mincnt == 0) mincnt = maxcnt;
2048 while (nread < mincnt) {
2049 readret = read(fd, buf + nread, maxcnt - nread);
2051 smb_read_error = READ_EOF;
2055 if (readret == -1) {
2056 smb_read_error = READ_ERROR;
2064 /* Most difficult - timeout read */
2065 /* If this is ever called on a disk file and
2066 mincnt is greater then the filesize then
2067 system performance will suffer severely as
2068 select always return true on disk files */
2070 /* Set initial timeout */
2071 timeout.tv_sec = time_out / 1000;
2072 timeout.tv_usec = 1000 * (time_out % 1000);
2074 for (nread=0; nread<mincnt; )
2079 selrtn = sys_select(&fds,&timeout);
2081 /* Check if error */
2083 /* something is wrong. Maybe the socket is dead? */
2084 smb_read_error = READ_ERROR;
2088 /* Did we timeout ? */
2090 smb_read_error = READ_TIMEOUT;
2094 readret = read(fd, buf+nread, maxcnt-nread);
2096 /* we got EOF on the file descriptor */
2097 smb_read_error = READ_EOF;
2101 if (readret == -1) {
2102 /* the descriptor is probably dead */
2103 smb_read_error = READ_ERROR;
2110 /* Return the number we got */
2114 /****************************************************************************
2115 read data from the client. Maxtime is in milliseconds
2116 ****************************************************************************/
2117 int read_max_udp(int fd,char *buffer,int bufsize,int maxtime)
2122 struct timeval timeout;
2127 timeout.tv_sec = maxtime / 1000;
2128 timeout.tv_usec = (maxtime % 1000) * 1000;
2130 selrtn = sys_select(&fds,maxtime>0?&timeout:NULL);
2132 if (!FD_ISSET(fd,&fds))
2135 nread = read_udp_socket(fd, buffer, bufsize);
2137 /* return the number got */
2141 /*******************************************************************
2142 find the difference in milliseconds between two struct timeval
2144 ********************************************************************/
2145 int TvalDiff(struct timeval *tvalold,struct timeval *tvalnew)
2147 return((tvalnew->tv_sec - tvalold->tv_sec)*1000 +
2148 ((int)tvalnew->tv_usec - (int)tvalold->tv_usec)/1000);
2151 /****************************************************************************
2152 send a keepalive packet (rfc1002)
2153 ****************************************************************************/
2154 BOOL send_keepalive(int client)
2156 unsigned char buf[4];
2159 buf[1] = buf[2] = buf[3] = 0;
2161 return(write_data(client,(char *)buf,4) == 4);
2166 /****************************************************************************
2167 read data from the client, reading exactly N bytes.
2168 ****************************************************************************/
2169 int read_data(int fd,char *buffer,int N)
2178 ret = read(fd,buffer + total,N - total);
2180 smb_read_error = READ_EOF;
2184 smb_read_error = READ_ERROR;
2193 /****************************************************************************
2195 ****************************************************************************/
2196 int write_data(int fd,char *buffer,int N)
2203 ret = write(fd,buffer + total,N - total);
2205 if (ret == -1) return -1;
2206 if (ret == 0) return total;
2214 /****************************************************************************
2215 transfer some data between two fd's
2216 ****************************************************************************/
2217 int transfer_file(int infd,int outfd,int n,char *header,int headlen,int align)
2219 static char *buf=NULL;
2224 DEBUG(4,("transfer_file %d (head=%d) called\n",n,headlen));
2227 size = lp_readsize();
2228 size = MAX(size,1024);
2231 while (!buf && size>0) {
2232 buf = (char *)Realloc(buf,size+8);
2233 if (!buf) size /= 2;
2237 DEBUG(0,("Can't allocate transfer buffer!\n"));
2241 abuf = buf + (align%8);
2248 int s = MIN(n,size);
2253 if (header && (headlen >= MIN(s,1024))) {
2263 if (header && headlen > 0)
2265 ret = MIN(headlen,size);
2266 memcpy(buf1,header,ret);
2269 if (headlen <= 0) header = NULL;
2273 ret += read(infd,buf1+ret,s-ret);
2277 ret2 = (outfd>=0?write_data(outfd,buf1,ret):ret);
2278 if (ret2 > 0) total += ret2;
2279 /* if we can't write then dump excess data */
2281 transfer_file(infd,-1,n-(ret+headlen),NULL,0,0);
2283 if (ret <= 0 || ret2 != ret)
2291 /****************************************************************************
2292 read 4 bytes of a smb packet and return the smb length of the packet
2293 store the result in the buffer
2294 This version of the function will return a length of zero on receiving
2296 ****************************************************************************/
2297 static int read_smb_length_return_keepalive(int fd,char *inbuf,int timeout)
2299 int len=0, msg_type;
2305 ok = (read_with_timeout(fd,inbuf,4,4,timeout) == 4);
2307 ok = (read_data(fd,inbuf,4) == 4);
2312 len = smb_len(inbuf);
2313 msg_type = CVAL(inbuf,0);
2315 if (msg_type == 0x85)
2316 DEBUG(5,("Got keepalive packet\n"));
2319 DEBUG(10,("got smb length of %d\n",len));
2324 /****************************************************************************
2325 read 4 bytes of a smb packet and return the smb length of the packet
2326 store the result in the buffer. This version of the function will
2327 never return a session keepalive (length of zero).
2328 ****************************************************************************/
2329 int read_smb_length(int fd,char *inbuf,int timeout)
2335 len = read_smb_length_return_keepalive(fd, inbuf, timeout);
2340 /* Ignore session keepalives. */
2341 if(CVAL(inbuf,0) != 0x85)
2348 /****************************************************************************
2349 read an smb from a fd. Note that the buffer *MUST* be of size
2350 BUFFER_SIZE+SAFETY_MARGIN.
2351 The timeout is in milli seconds.
2353 This function will return on a
2354 receipt of a session keepalive packet.
2355 ****************************************************************************/
2356 BOOL receive_smb(int fd,char *buffer, int timeout)
2362 bzero(buffer,smb_size + 100);
2364 len = read_smb_length_return_keepalive(fd,buffer,timeout);
2368 if (len > BUFFER_SIZE) {
2369 DEBUG(0,("Invalid packet length! (%d bytes).\n",len));
2370 if (len > BUFFER_SIZE + (SAFETY_MARGIN/2))
2375 ret = read_data(fd,buffer+4,len);
2377 smb_read_error = READ_ERROR;
2384 /****************************************************************************
2385 read an smb from a fd ignoring all keepalive packets. Note that the buffer
2386 *MUST* be of size BUFFER_SIZE+SAFETY_MARGIN.
2387 The timeout is in milli seconds
2389 This is exactly the same as receive_smb except that it never returns
2390 a session keepalive packet (just as receive_smb used to do).
2391 receive_smb was changed to return keepalives as the oplock processing means this call
2392 should never go into a blocking read.
2393 ****************************************************************************/
2395 BOOL client_receive_smb(int fd,char *buffer, int timeout)
2401 ret = receive_smb(fd, buffer, timeout);
2406 /* Ignore session keepalive packets. */
2407 if(CVAL(buffer,0) != 0x85)
2413 /****************************************************************************
2414 read a message from a udp fd.
2415 The timeout is in milli seconds
2416 ****************************************************************************/
2417 BOOL receive_local_message(int fd, char *buffer, int buffer_len, int timeout)
2419 struct sockaddr_in from;
2420 int fromlen = sizeof(from);
2432 to.tv_sec = timeout / 1000;
2433 to.tv_usec = (timeout % 1000) * 1000;
2435 selrtn = sys_select(&fds,&to);
2437 /* Check if error */
2440 /* something is wrong. Maybe the socket is dead? */
2441 smb_read_error = READ_ERROR;
2445 /* Did we timeout ? */
2448 smb_read_error = READ_TIMEOUT;
2454 * Read a loopback udp message.
2456 msg_len = recvfrom(fd, &buffer[UDP_CMD_HEADER_LEN],
2457 buffer_len - UDP_CMD_HEADER_LEN, 0,
2458 (struct sockaddr *)&from, &fromlen);
2462 DEBUG(0,("receive_local_message. Error in recvfrom. (%s).\n",strerror(errno)));
2466 /* Validate message length. */
2467 if(msg_len > (buffer_len - UDP_CMD_HEADER_LEN))
2469 DEBUG(0,("receive_local_message: invalid msg_len (%d) max can be %d\n",
2471 buffer_len - UDP_CMD_HEADER_LEN));
2475 /* Validate message from address (must be localhost). */
2476 if(from.sin_addr.s_addr != htonl(INADDR_LOOPBACK))
2478 DEBUG(0,("receive_local_message: invalid 'from' address \
2479 (was %x should be 127.0.0.1\n", from.sin_addr.s_addr));
2483 /* Setup the message header */
2484 SIVAL(buffer,UDP_CMD_LEN_OFFSET,msg_len);
2485 SSVAL(buffer,UDP_CMD_PORT_OFFSET,ntohs(from.sin_port));
2490 /****************************************************************************
2491 structure to hold a linked list of local messages.
2493 ****************************************************************************/
2495 typedef struct _message_list {
2496 struct _message_list *msg_next;
2499 } pending_message_list;
2501 static pending_message_list *smb_msg_head = NULL;
2503 /****************************************************************************
2504 Function to push a linked list of local messages ready
2506 ****************************************************************************/
2508 static BOOL push_local_message(pending_message_list **pml, char *buf, int msg_len)
2510 pending_message_list *msg = (pending_message_list *)
2511 malloc(sizeof(pending_message_list));
2515 DEBUG(0,("push_message: malloc fail (1)\n"));
2519 msg->msg_buf = (char *)malloc(msg_len);
2520 if(msg->msg_buf == NULL)
2522 DEBUG(0,("push_local_message: malloc fail (2)\n"));
2527 memcpy(msg->msg_buf, buf, msg_len);
2528 msg->msg_len = msg_len;
2530 msg->msg_next = *pml;
2536 /****************************************************************************
2537 Function to push a linked list of local smb messages ready
2539 ****************************************************************************/
2541 BOOL push_smb_message(char *buf, int msg_len)
2543 return push_local_message(&smb_msg_head, buf, msg_len);
2546 /****************************************************************************
2547 Do a select on an two fd's - with timeout.
2549 If a local udp message has been pushed onto the
2550 queue (this can only happen during oplock break
2551 processing) return this first.
2553 If a pending smb message has been pushed onto the
2554 queue (this can only happen during oplock break
2555 processing) return this next.
2557 If the first smbfd is ready then read an smb from it.
2558 if the second (loopback UDP) fd is ready then read a message
2559 from it and setup the buffer header to identify the length
2561 Returns False on timeout or error.
2564 The timeout is in milli seconds
2565 ****************************************************************************/
2566 BOOL receive_message_or_smb(int smbfd, int oplock_fd,
2567 char *buffer, int buffer_len,
2568 int timeout, BOOL *got_smb)
2577 * Check to see if we already have a message on the smb queue.
2578 * If so - copy and return it.
2583 pending_message_list *msg = smb_msg_head;
2584 memcpy(buffer, msg->msg_buf, MIN(buffer_len, msg->msg_len));
2585 smb_msg_head = msg->msg_next;
2587 /* Free the message we just copied. */
2588 free((char *)msg->msg_buf);
2592 DEBUG(5,("receive_message_or_smb: returning queued smb message.\n"));
2598 FD_SET(oplock_fd,&fds);
2600 to.tv_sec = timeout / 1000;
2601 to.tv_usec = (timeout % 1000) * 1000;
2603 selrtn = sys_select(&fds,timeout>0?&to:NULL);
2605 /* Check if error */
2607 /* something is wrong. Maybe the socket is dead? */
2608 smb_read_error = READ_ERROR;
2612 /* Did we timeout ? */
2614 smb_read_error = READ_TIMEOUT;
2618 if (FD_ISSET(smbfd,&fds))
2621 return receive_smb(smbfd, buffer, 0);
2625 return receive_local_message(oplock_fd, buffer, buffer_len, 0);
2629 /****************************************************************************
2631 ****************************************************************************/
2632 BOOL send_smb(int fd,char *buffer)
2636 len = smb_len(buffer) + 4;
2638 while (nwritten < len)
2640 ret = write_socket(fd,buffer+nwritten,len - nwritten);
2643 DEBUG(0,("Error writing %d bytes to client. %d. Exiting\n",len,ret));
2655 /****************************************************************************
2656 find a pointer to a netbios name
2657 ****************************************************************************/
2658 char *name_ptr(char *buf,int ofs)
2660 unsigned char c = *(unsigned char *)(buf+ofs);
2662 if ((c & 0xC0) == 0xC0)
2666 memcpy(p,buf+ofs,2);
2669 DEBUG(5,("name ptr to pos %d from %d is %s\n",l,ofs,buf+l));
2676 /****************************************************************************
2677 extract a netbios name from a buf
2678 ****************************************************************************/
2679 int name_extract(char *buf,int ofs,char *name)
2681 char *p = name_ptr(buf,ofs);
2682 int d = PTR_DIFF(p,buf+ofs);
2684 if (d < -50 || d > 50) return(0);
2685 return(name_interpret(p,name));
2688 /****************************************************************************
2689 return the total storage length of a mangled name
2690 ****************************************************************************/
2691 int name_len( char *s )
2695 /* If the two high bits of the byte are set, return 2. */
2696 if( 0xC0 == (*(unsigned char *)s & 0xC0) )
2699 /* Add up the length bytes. */
2700 for( len = 1; (*s); s += (*s) + 1 )
2708 /****************************************************************************
2709 send a single packet to a port on another machine
2710 ****************************************************************************/
2711 BOOL send_one_packet(char *buf,int len,struct in_addr ip,int port,int type)
2715 struct sockaddr_in sock_out;
2720 /* create a socket to write to */
2721 out_fd = socket(AF_INET, type, 0);
2724 DEBUG(0,("socket failed"));
2728 /* set the address and port */
2729 bzero((char *)&sock_out,sizeof(sock_out));
2730 putip((char *)&sock_out.sin_addr,(char *)&ip);
2731 sock_out.sin_port = htons( port );
2732 sock_out.sin_family = AF_INET;
2735 DEBUG(3,("sending a packet of len %d to (%s) on port %d of type %s\n",
2736 len,inet_ntoa(ip),port,type==SOCK_DGRAM?"DGRAM":"STREAM"));
2739 ret = (sendto(out_fd,buf,len,0,(struct sockaddr *)&sock_out,sizeof(sock_out)) >= 0);
2742 DEBUG(0,("Packet send to %s(%d) failed ERRNO=%s\n",
2743 inet_ntoa(ip),port,strerror(errno)));
2749 /*******************************************************************
2750 sleep for a specified number of milliseconds
2751 ********************************************************************/
2755 struct timeval tval,t1,t2;
2762 tval.tv_sec = (t-tdiff)/1000;
2763 tval.tv_usec = 1000*((t-tdiff)%1000);
2767 sys_select(&fds,&tval);
2770 tdiff = TvalDiff(&t1,&t2);
2774 /****************************************************************************
2775 check if a string is part of a list
2776 ****************************************************************************/
2777 BOOL in_list(char *s,char *list,BOOL casesensitive)
2782 if (!list) return(False);
2784 while (next_token(&p,tok,LIST_SEP))
2786 if (casesensitive) {
2787 if (strcmp(tok,s) == 0)
2790 if (StrCaseCmp(tok,s) == 0)
2797 /* this is used to prevent lots of mallocs of size 1 */
2798 static char *null_string = NULL;
2800 /****************************************************************************
2801 set a string value, allocing the space for the string
2802 ****************************************************************************/
2803 BOOL string_init(char **dest,char *src)
2814 null_string = (char *)malloc(1);
2817 *dest = null_string;
2821 (*dest) = (char *)malloc(l+1);
2822 if ((*dest) == NULL) {
2823 DEBUG(0,("Out of memory in string_init\n"));
2832 /****************************************************************************
2834 ****************************************************************************/
2835 void string_free(char **s)
2837 if (!s || !(*s)) return;
2838 if (*s == null_string)
2844 /****************************************************************************
2845 set a string value, allocing the space for the string, and deallocating any
2847 ****************************************************************************/
2848 BOOL string_set(char **dest,char *src)
2852 return(string_init(dest,src));
2855 /****************************************************************************
2856 substitute a string for a pattern in another string. Make sure there is
2859 This routine looks for pattern in s and replaces it with
2860 insert. It may do multiple replacements.
2862 return True if a substitution was done.
2863 ****************************************************************************/
2864 BOOL string_sub(char *s,char *pattern,char *insert)
2870 if (!insert || !pattern || !s) return(False);
2873 lp = strlen(pattern);
2874 li = strlen(insert);
2876 if (!*pattern) return(False);
2878 while (lp <= ls && (p = strstr(s,pattern)))
2881 memmove(p+li,p+lp,ls + 1 - (PTR_DIFF(p,s) + lp));
2882 memcpy(p,insert,li);
2891 /*********************************************************
2892 * Recursive routine that is called by mask_match.
2893 * Does the actual matching.
2894 *********************************************************/
2895 BOOL do_match(char *str, char *regexp, int case_sig)
2899 for( p = regexp; *p && *str; ) {
2906 /* Look for a character matching
2907 the one after the '*' */
2910 return True; /* Automatic match */
2912 while(*str && (case_sig ? (*p != *str) : (toupper(*p)!=toupper(*str))))
2914 if(do_match(str,p,case_sig))
2928 if(toupper(*str) != toupper(*p))
2938 if (!*p && str[0] == '.' && str[1] == 0)
2941 if (!*str && *p == '?')
2943 while (*p == '?') p++;
2947 if(!*str && (*p == '*' && p[1] == '\0'))
2953 /*********************************************************
2954 * Routine to match a given string with a regexp - uses
2955 * simplified regexp that takes * and ? only. Case can be
2956 * significant or not.
2957 *********************************************************/
2958 BOOL mask_match(char *str, char *regexp, int case_sig,BOOL trans2)
2962 fstring ebase,eext,sbase,sext;
2966 /* Make local copies of str and regexp */
2967 StrnCpy(p1,regexp,sizeof(pstring)-1);
2968 StrnCpy(p2,str,sizeof(pstring)-1);
2970 if (!strchr(p2,'.')) {
2975 if (!strchr(p1,'.')) {
2983 string_sub(p1,"*.*","*");
2984 string_sub(p1,".*","*");
2988 /* Remove any *? and ** as they are meaningless */
2989 for(p = p1; *p; p++)
2990 while( *p == '*' && (p[1] == '?' ||p[1] == '*'))
2991 (void)strcpy( &p[1], &p[2]);
2993 if (strequal(p1,"*")) return(True);
2995 DEBUG(8,("mask_match str=<%s> regexp=<%s>, case_sig = %d\n", p2, p1, case_sig));
3001 if ((p=strrchr(p1,'.'))) {
3010 if (!strequal(p2,".") && !strequal(p2,"..") && (p=strrchr(p2,'.'))) {
3020 matched = do_match(sbase,ebase,case_sig) &&
3021 (trans2 || do_match(sext,eext,case_sig));
3023 DEBUG(8,("mask_match returning %d\n", matched));
3030 /****************************************************************************
3031 become a daemon, discarding the controlling terminal
3032 ****************************************************************************/
3033 void become_daemon(void)
3035 #ifndef NO_FORK_DEBUG
3039 /* detach from the terminal */
3042 #else /* USE_SETSID */
3045 int i = open("/dev/tty", O_RDWR);
3048 ioctl(i, (int) TIOCNOTTY, (char *)0);
3052 #endif /* TIOCNOTTY */
3053 #endif /* USE_SETSID */
3054 /* Close fd's 0,1,2. Needed if started by rsh */
3056 #endif /* NO_FORK_DEBUG */
3060 /****************************************************************************
3061 put up a yes/no prompt
3062 ****************************************************************************/
3068 if (!fgets(ans,sizeof(ans)-1,stdin))
3071 if (*ans == 'y' || *ans == 'Y')
3077 /****************************************************************************
3078 read a line from a file with possible \ continuation chars.
3079 Blanks at the start or end of a line are stripped.
3080 The string will be allocated if s2 is NULL
3081 ****************************************************************************/
3082 char *fgets_slash(char *s2,int maxlen,FILE *f)
3087 BOOL start_of_line = True;
3094 maxlen = MIN(maxlen,8);
3095 s = (char *)Realloc(s,maxlen);
3098 if (!s || maxlen < 2) return(NULL);
3102 while (len < maxlen-1)
3110 while (len > 0 && s[len-1] == ' ')
3114 if (len > 0 && s[len-1] == '\\')
3117 start_of_line = True;
3122 if (len <= 0 && !s2)
3124 return(len>0?s:NULL);
3129 start_of_line = False;
3133 if (!s2 && len > maxlen-3)
3136 s = (char *)Realloc(s,maxlen);
3137 if (!s) return(NULL);
3145 /****************************************************************************
3146 set the length of a file from a filedescriptor.
3147 Returns 0 on success, -1 on failure.
3148 ****************************************************************************/
3149 int set_filelen(int fd, long len)
3151 /* According to W. R. Stevens advanced UNIX prog. Pure 4.3 BSD cannot
3152 extend a file with ftruncate. Provide alternate implementation
3155 #if FTRUNCATE_CAN_EXTEND
3156 return ftruncate(fd, len);
3160 long currpos = lseek(fd, 0L, SEEK_CUR);
3164 /* Do an fstat to see if the file is longer than
3165 the requested size (call ftruncate),
3166 or shorter, in which case seek to len - 1 and write 1
3168 if(fstat(fd, &st)<0)
3172 if (S_ISFIFO(st.st_mode)) return 0;
3175 if(st.st_size == len)
3177 if(st.st_size > len)
3178 return ftruncate(fd, len);
3180 if(lseek(fd, len-1, SEEK_SET) != len -1)
3182 if(write(fd, &c, 1)!=1)
3184 /* Seek to where we were */
3185 lseek(fd, currpos, SEEK_SET);
3191 /****************************************************************************
3192 return the byte checksum of some data
3193 ****************************************************************************/
3194 int byte_checksum(char *buf,int len)
3196 unsigned char *p = (unsigned char *)buf;
3206 /****************************************************************************
3207 this is a version of setbuffer() for those machines that only have setvbuf
3208 ****************************************************************************/
3209 void setbuffer(FILE *f,char *buf,int bufsize)
3211 setvbuf(f,buf,_IOFBF,bufsize);
3216 /****************************************************************************
3217 parse out a directory name from a path name. Assumes dos style filenames.
3218 ****************************************************************************/
3219 char *dirname_dos(char *path,char *buf)
3221 char *p = strrchr(path,'\\');
3236 /****************************************************************************
3237 parse out a filename from a path name. Assumes dos style filenames.
3238 ****************************************************************************/
3239 static char *filename_dos(char *path,char *buf)
3241 char *p = strrchr(path,'\\');
3253 /****************************************************************************
3254 expand a pointer to be a particular size
3255 ****************************************************************************/
3256 void *Realloc(void *p,int size)
3262 DEBUG(5,("Realloc asked for 0 bytes\n"));
3267 ret = (void *)malloc(size);
3269 ret = (void *)realloc(p,size);
3272 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",size));
3278 /****************************************************************************
3280 ****************************************************************************/
3281 char *strdup(char *s)
3284 if (!s) return(NULL);
3285 ret = (char *)malloc(strlen(s)+1);
3286 if (!ret) return(NULL);
3293 /****************************************************************************
3294 Signal handler for SIGPIPE (write on a disconnected socket)
3295 ****************************************************************************/
3298 DEBUG(0,("Probably got SIGPIPE\nExiting\n"));
3302 /****************************************************************************
3303 get my own name and IP
3304 ****************************************************************************/
3305 BOOL get_myname(char *my_name,struct in_addr *ip)
3312 /* get my host name */
3313 if (gethostname(hostname, MAXHOSTNAMELEN) == -1)
3315 DEBUG(0,("gethostname failed\n"));
3320 if ((hp = Get_Hostbyname(hostname)) == 0)
3322 DEBUG(0,( "Get_Hostbyname: Unknown host %s.\n",hostname));
3328 /* split off any parts after an initial . */
3329 char *p = strchr(hostname,'.');
3332 fstrcpy(my_name,hostname);
3336 putip((char *)ip,(char *)hp->h_addr);
3342 /****************************************************************************
3343 true if two IP addresses are equal
3344 ****************************************************************************/
3345 BOOL ip_equal(struct in_addr ip1,struct in_addr ip2)
3348 a1 = ntohl(ip1.s_addr);
3349 a2 = ntohl(ip2.s_addr);
3354 /****************************************************************************
3355 open a socket of the specified type, port and address for incoming data
3356 ****************************************************************************/
3357 int open_socket_in(int type, int port, int dlevel,uint32 socket_addr)
3360 struct sockaddr_in sock;
3364 /* get my host name */
3365 if (gethostname(host_name, MAXHOSTNAMELEN) == -1)
3366 { DEBUG(0,("gethostname failed\n")); return -1; }
3369 if ((hp = Get_Hostbyname(host_name)) == 0)
3371 DEBUG(0,( "Get_Hostbyname: Unknown host. %s\n",host_name));
3375 bzero((char *)&sock,sizeof(sock));
3376 memcpy((char *)&sock.sin_addr,(char *)hp->h_addr, hp->h_length);
3377 #if defined(__FreeBSD__) || defined(NETBSD) || defined(__OpenBSD__) /* XXX not the right ifdef */
3378 sock.sin_len = sizeof(sock);
3380 sock.sin_port = htons( port );
3381 sock.sin_family = hp->h_addrtype;
3382 sock.sin_addr.s_addr = socket_addr;
3383 res = socket(hp->h_addrtype, type, 0);
3385 { DEBUG(0,("socket failed\n")); return -1; }
3389 setsockopt(res,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(one));
3392 /* now we've got a socket - we need to bind it */
3393 if (bind(res, (struct sockaddr * ) &sock,sizeof(sock)) < 0)
3396 if (port == SMB_PORT || port == NMB_PORT)
3397 DEBUG(dlevel,("bind failed on port %d socket_addr=%s (%s)\n",
3398 port,inet_ntoa(sock.sin_addr),strerror(errno)));
3401 if (dlevel > 0 && port < 1000)
3404 if (port >= 1000 && port < 9000)
3405 return(open_socket_in(type,port+1,dlevel,socket_addr));
3410 DEBUG(3,("bind succeeded on port %d\n",port));
3416 /****************************************************************************
3417 create an outgoing socket
3418 **************************************************************************/
3419 int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
3421 struct sockaddr_in sock_out;
3423 int connect_loop = 250; /* 250 milliseconds */
3424 int loops = (timeout * 1000) / connect_loop;
3426 /* create a socket to write to */
3427 res = socket(PF_INET, type, 0);
3429 { DEBUG(0,("socket error\n")); return -1; }
3431 if (type != SOCK_STREAM) return(res);
3433 bzero((char *)&sock_out,sizeof(sock_out));
3434 putip((char *)&sock_out.sin_addr,(char *)addr);
3436 sock_out.sin_port = htons( port );
3437 sock_out.sin_family = PF_INET;
3439 /* set it non-blocking */
3440 set_blocking(res,False);
3442 DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
3444 /* and connect it to the destination */
3446 ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
3448 /* Some systems return EAGAIN when they mean EINPROGRESS */
3449 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
3450 errno == EAGAIN) && loops--) {
3451 msleep(connect_loop);
3455 if (ret < 0 && (errno == EINPROGRESS || errno == EALREADY ||
3457 DEBUG(1,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
3463 if (ret < 0 && errno == EISCONN) {
3470 DEBUG(1,("error connecting to %s:%d (%s)\n",
3471 inet_ntoa(*addr),port,strerror(errno)));
3475 /* set it blocking again */
3476 set_blocking(res,True);
3482 /****************************************************************************
3483 interpret a protocol description string, with a default
3484 ****************************************************************************/
3485 int interpret_protocol(char *str,int def)
3487 if (strequal(str,"NT1"))
3488 return(PROTOCOL_NT1);
3489 if (strequal(str,"LANMAN2"))
3490 return(PROTOCOL_LANMAN2);
3491 if (strequal(str,"LANMAN1"))
3492 return(PROTOCOL_LANMAN1);
3493 if (strequal(str,"CORE"))
3494 return(PROTOCOL_CORE);
3495 if (strequal(str,"COREPLUS"))
3496 return(PROTOCOL_COREPLUS);
3497 if (strequal(str,"CORE+"))
3498 return(PROTOCOL_COREPLUS);
3500 DEBUG(0,("Unrecognised protocol level %s\n",str));
3505 /****************************************************************************
3506 interpret a security level
3507 ****************************************************************************/
3508 int interpret_security(char *str,int def)
3510 if (strequal(str,"SERVER"))
3512 if (strequal(str,"USER"))
3514 if (strequal(str,"SHARE"))
3517 DEBUG(0,("Unrecognised security level %s\n",str));
3523 /****************************************************************************
3524 interpret an internet address or name into an IP address in 4 byte form
3525 ****************************************************************************/
3526 uint32 interpret_addr(char *str)
3531 BOOL pure_address = True;
3533 if (strcmp(str,"0.0.0.0") == 0) return(0);
3534 if (strcmp(str,"255.255.255.255") == 0) return(0xFFFFFFFF);
3536 for (i=0; pure_address && str[i]; i++)
3537 if (!(isdigit(str[i]) || str[i] == '.'))
3538 pure_address = False;
3540 /* if it's in the form of an IP address then get the lib to interpret it */
3542 res = inet_addr(str);
3544 /* otherwise assume it's a network name of some sort and use
3546 if ((hp = Get_Hostbyname(str)) == 0) {
3547 DEBUG(3,("Get_Hostbyname: Unknown host. %s\n",str));
3550 if(hp->h_addr == NULL) {
3551 DEBUG(3,("Get_Hostbyname: host address is invalid for host %s.\n",str));
3554 putip((char *)&res,(char *)hp->h_addr);
3557 if (res == (uint32)-1) return(0);
3562 /*******************************************************************
3563 a convenient addition to interpret_addr()
3564 ******************************************************************/
3565 struct in_addr *interpret_addr2(char *str)
3567 static struct in_addr ret;
3568 uint32 a = interpret_addr(str);
3573 /*******************************************************************
3574 check if an IP is the 0.0.0.0
3575 ******************************************************************/
3576 BOOL zero_ip(struct in_addr ip)
3579 putip((char *)&a,(char *)&ip);
3584 /*******************************************************************
3585 matchname - determine if host name matches IP address
3586 ******************************************************************/
3587 static BOOL matchname(char *remotehost,struct in_addr addr)
3592 if ((hp = Get_Hostbyname(remotehost)) == 0) {
3593 DEBUG(0,("Get_Hostbyname(%s): lookup failure", remotehost));
3598 * Make sure that gethostbyname() returns the "correct" host name.
3599 * Unfortunately, gethostbyname("localhost") sometimes yields
3600 * "localhost.domain". Since the latter host name comes from the
3601 * local DNS, we just have to trust it (all bets are off if the local
3602 * DNS is perverted). We always check the address list, though.
3605 if (strcasecmp(remotehost, hp->h_name)
3606 && strcasecmp(remotehost, "localhost")) {
3607 DEBUG(0,("host name/name mismatch: %s != %s",
3608 remotehost, hp->h_name));
3612 /* Look up the host address in the address list we just got. */
3613 for (i = 0; hp->h_addr_list[i]; i++) {
3614 if (memcmp(hp->h_addr_list[i], (caddr_t) & addr, sizeof(addr)) == 0)
3619 * The host name does not map to the original host address. Perhaps
3620 * someone has compromised a name server. More likely someone botched
3621 * it, but that could be dangerous, too.
3624 DEBUG(0,("host name/address mismatch: %s != %s",
3625 inet_ntoa(addr), hp->h_name));
3629 /*******************************************************************
3630 Reset the 'done' variables so after a client process is created
3631 from a fork call these calls will be re-done. This should be
3632 expanded if more variables need reseting.
3633 ******************************************************************/
3635 static BOOL global_client_name_done = False;
3636 static BOOL global_client_addr_done = False;
3638 void reset_globals_after_fork()
3640 global_client_name_done = False;
3641 global_client_addr_done = False;
3644 /*******************************************************************
3645 return the DNS name of the client
3646 ******************************************************************/
3647 char *client_name(void)
3650 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
3651 int length = sizeof(sa);
3652 static pstring name_buf;
3655 if (global_client_name_done)
3658 strcpy(name_buf,"UNKNOWN");
3664 if (getpeername(Client, &sa, &length) < 0) {
3665 DEBUG(0,("getpeername failed\n"));
3669 /* Look up the remote host name. */
3670 if ((hp = gethostbyaddr((char *) &sockin->sin_addr,
3671 sizeof(sockin->sin_addr),
3673 DEBUG(1,("Gethostbyaddr failed for %s\n",client_addr()));
3674 StrnCpy(name_buf,client_addr(),sizeof(name_buf) - 1);
3676 StrnCpy(name_buf,(char *)hp->h_name,sizeof(name_buf) - 1);
3677 if (!matchname(name_buf, sockin->sin_addr)) {
3678 DEBUG(0,("Matchname failed on %s %s\n",name_buf,client_addr()));
3679 strcpy(name_buf,"UNKNOWN");
3682 global_client_name_done = True;
3686 /*******************************************************************
3687 return the IP addr of the client as a string
3688 ******************************************************************/
3689 char *client_addr(void)
3692 struct sockaddr_in *sockin = (struct sockaddr_in *) (&sa);
3693 int length = sizeof(sa);
3694 static fstring addr_buf;
3696 if (global_client_addr_done)
3699 strcpy(addr_buf,"0.0.0.0");
3705 if (getpeername(Client, &sa, &length) < 0) {
3706 DEBUG(0,("getpeername failed\n"));
3710 fstrcpy(addr_buf,(char *)inet_ntoa(sockin->sin_addr));
3712 global_client_addr_done = True;
3716 /*******************************************************************
3717 Patch from jkf@soton.ac.uk
3718 Split Luke's automount_server into YP lookup and string splitter
3719 so can easily implement automount_path().
3720 As we may end up doing both, cache the last YP result.
3721 *******************************************************************/
3723 #if (defined(NETGROUP) && defined(AUTOMOUNT))
3724 static char *automount_lookup(char *user_name)
3726 static fstring last_key = "";
3727 static pstring last_value = "";
3729 int nis_error; /* returned by yp all functions */
3730 char *nis_result; /* yp_match inits this */
3731 int nis_result_len; /* and set this */
3732 char *nis_domain; /* yp_get_default_domain inits this */
3733 char *nis_map = (char *)lp_nis_home_map_name();
3735 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0)
3737 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
3741 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
3743 if (!strcmp(user_name, last_key))
3745 nis_result = last_value;
3746 nis_result_len = strlen(last_value);
3751 if ((nis_error = yp_match(nis_domain, nis_map,
3752 user_name, strlen(user_name),
3753 &nis_result, &nis_result_len)) != 0)
3755 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
3756 yperr_string(nis_error), user_name, nis_map));
3758 if (!nis_error && nis_result_len >= sizeof(pstring))
3760 nis_result_len = sizeof(pstring)-1;
3762 fstrcpy(last_key, user_name);
3763 strncpy(last_value, nis_result, nis_result_len);
3764 last_value[nis_result_len] = '\0';
3767 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, last_value));
3772 /*******************************************************************
3773 Patch from jkf@soton.ac.uk
3774 This is Luke's original function with the NIS lookup code
3775 moved out to a separate function.
3776 *******************************************************************/
3778 char *automount_server(char *user_name)
3780 static pstring server_name;
3782 #if (defined(NETGROUP) && defined (AUTOMOUNT))
3783 int home_server_len;
3785 /* set to default of local machine */
3786 pstrcpy(server_name, local_machine);
3788 if (lp_nis_home_map())
3790 char *automount_value = automount_lookup(user_name);
3791 home_server_len = strcspn(automount_value,":");
3792 DEBUG(5, ("NIS lookup succeeded. Home server length: %d\n",home_server_len));
3793 if (home_server_len > sizeof(pstring))
3795 home_server_len = sizeof(pstring);
3797 strncpy(server_name, automount_value, home_server_len);
3798 server_name[home_server_len] = '\0';
3801 /* use the local machine name instead of the auto-map server */
3802 pstrcpy(server_name, local_machine);
3805 DEBUG(4,("Home server: %s\n", server_name));
3810 /*******************************************************************
3811 Patch from jkf@soton.ac.uk
3812 Added this to implement %p (NIS auto-map version of %H)
3813 *******************************************************************/
3815 char *automount_path(char *user_name)
3817 static pstring server_path;
3819 #if (defined(NETGROUP) && defined (AUTOMOUNT))
3820 char *home_path_start;
3822 /* set to default of no string */
3825 if (lp_nis_home_map())
3827 char *automount_value = automount_lookup(user_name);
3828 home_path_start = strchr(automount_value,':');
3829 if (home_path_start != NULL)
3831 DEBUG(5, ("NIS lookup succeeded. Home path is: %s\n",
3832 home_path_start?(home_path_start+1):""));
3833 strcpy(server_path, home_path_start+1);
3837 /* use the passwd entry instead of the auto-map server entry */
3838 /* pstrcpy() copes with get_home_dir() returning NULL */
3839 pstrcpy(server_path, get_home_dir(user_name));
3842 DEBUG(4,("Home server path: %s\n", server_path));
3848 /*******************************************************************
3849 sub strings with useful parameters
3850 Rewritten by Stefaan A Eeckels <Stefaan.Eeckels@ecc.lu> and
3851 Paul Rippin <pr3245@nopc.eurostat.cec.be>
3852 ********************************************************************/
3853 void standard_sub_basic(char *str)
3857 struct passwd *pass;
3858 char *username = sam_logon_in_ssb ? samlogon_user : sesssetup_user;
3860 for (s = str ; s && *s && (p = strchr(s,'%')); s = p )
3866 if ((pass = Get_Pwnam(sesssetup_user,False))!=NULL)
3868 string_sub(p,"%G",gidtoname(pass->pw_gid));
3876 case 'N' : string_sub(p,"%N", automount_server(username)); break;
3877 case 'I' : string_sub(p,"%I", client_addr()); break;
3878 case 'L' : string_sub(p,"%L", local_machine); break;
3879 case 'M' : string_sub(p,"%M", client_name()); break;
3880 case 'R' : string_sub(p,"%R", remote_proto); break;
3881 case 'T' : string_sub(p,"%T", timestring()); break;
3882 case 'U' : string_sub(p,"%U", username); break;
3883 case 'a' : string_sub(p,"%a", remote_arch); break;
3886 sprintf(pidstr,"%d",(int)getpid());
3887 string_sub(p,"%d", pidstr);
3890 case 'h' : string_sub(p,"%h", myhostname); break;
3891 case 'm' : string_sub(p,"%m", remote_machine); break;
3892 case 'v' : string_sub(p,"%v", VERSION); break;
3893 case '$' : /* Expand environment variables */
3895 /* Contributed by Branko Cibej <branko.cibej@hermes.si> */
3901 if (*(p+2) != '(') { p+=2; break; }
3902 if ((q = strchr(p,')')) == NULL)
3904 DEBUG(0,("standard_sub_basic: Unterminated environment \
3905 variable [%s]\n", p));
3910 copylen = MIN((q-r),(sizeof(envname)-1));
3911 strncpy(envname,r,copylen);
3912 envname[copylen] = '\0';
3913 if ((envval = getenv(envname)) == NULL)
3915 DEBUG(0,("standard_sub_basic: Environment variable [%s] not set\n",
3919 copylen = MIN((q+1-p),(sizeof(envname)-1));
3920 strncpy(envname,p,copylen);
3921 envname[copylen] = '\0';
3922 string_sub(p,envname,envval);
3925 case '\0': p++; break; /* don't run off end if last character is % */
3926 default : p+=2; break;
3932 /*******************************************************************
3933 are two IPs on the same subnet?
3934 ********************************************************************/
3935 BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask)
3937 uint32 net1,net2,nmask;
3939 nmask = ntohl(mask.s_addr);
3940 net1 = ntohl(ip1.s_addr);
3941 net2 = ntohl(ip2.s_addr);
3943 return((net1 & nmask) == (net2 & nmask));
3947 /*******************************************************************
3948 write a string in unicoode format
3949 ********************************************************************/
3950 int PutUniCode(char *dst,char *src)
3954 dst[ret++] = src[0];
3963 /****************************************************************************
3964 a wrapper for gethostbyname() that tries with all lower and all upper case
3965 if the initial name fails
3966 ****************************************************************************/
3967 struct hostent *Get_Hostbyname(char *name)
3969 char *name2 = strdup(name);
3970 struct hostent *ret;
3974 DEBUG(0,("Memory allocation error in Get_Hostbyname! panic\n"));
3978 if (!isalnum(*name2))
3984 ret = sys_gethostbyname(name2);
3991 /* try with all lowercase */
3993 ret = sys_gethostbyname(name2);
4000 /* try with all uppercase */
4002 ret = sys_gethostbyname(name2);
4009 /* nothing works :-( */
4015 /****************************************************************************
4016 check if a process exists. Does this work on all unixes?
4017 ****************************************************************************/
4018 BOOL process_exists(int pid)
4020 return(kill(pid,0) == 0 || errno != ESRCH);
4024 /*******************************************************************
4025 turn a uid into a user name
4026 ********************************************************************/
4027 char *uidtoname(int uid)
4029 static char name[40];
4030 struct passwd *pass = getpwuid(uid);
4031 if (pass) return(pass->pw_name);
4032 sprintf(name,"%d",uid);
4036 /*******************************************************************
4037 turn a gid into a group name
4038 ********************************************************************/
4039 char *gidtoname(int gid)
4041 static char name[40];
4042 struct group *grp = getgrgid(gid);
4043 if (grp) return(grp->gr_name);
4044 sprintf(name,"%d",gid);
4048 /*******************************************************************
4050 ********************************************************************/
4051 void BlockSignals(BOOL block,int signum)
4054 int block_mask = sigmask(signum);
4055 static int oldmask = 0;
4057 oldmask = sigblock(block_mask);
4059 sigsetmask(oldmask);
4060 #elif defined(USE_SIGPROCMASK)
4063 sigaddset(&set,signum);
4064 sigprocmask(block?SIG_BLOCK:SIG_UNBLOCK,&set,NULL);
4069 /*******************************************************************
4070 my own panic function - not suitable for general use
4071 ********************************************************************/
4072 void ajt_panic(void)
4074 system("/usr/bin/X11/xedit -display solen:0 /tmp/ERROR_FAULT");
4079 #define DIRECT direct
4081 #define DIRECT dirent
4084 /*******************************************************************
4085 a readdir wrapper which just returns the file name
4086 also return the inode number if requested
4087 ********************************************************************/
4088 char *readdirname(void *p)
4093 if (!p) return(NULL);
4095 ptr = (struct DIRECT *)readdir(p);
4096 if (!ptr) return(NULL);
4098 dname = ptr->d_name;
4101 if (telldir(p) < 0) return(NULL);
4105 /* this handles a broken compiler setup, causing a mixture
4106 of BSD and SYSV headers and libraries */
4108 static BOOL broken_readdir = False;
4109 if (!broken_readdir && !(*(dname)) && strequal("..",dname-2))
4111 DEBUG(0,("Your readdir() is broken. You have somehow mixed SYSV and BSD headers and libraries\n"));
4112 broken_readdir = True;
4121 pstrcpy(buf, dname);
4122 unix_to_dos(buf, True);
4129 /*******************************************************************
4130 Utility function used to decide if the last component
4131 of a path matches a (possibly wildcarded) entry in a namelist.
4132 ********************************************************************/
4134 BOOL is_in_path(char *name, name_compare_entry *namelist)
4136 pstring last_component;
4139 DEBUG(8, ("is_in_path: %s\n", name));
4141 /* if we have no list it's obviously not in the path */
4142 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL)))
4144 DEBUG(8,("is_in_path: no name list.\n"));
4148 /* Get the last component of the unix name. */
4149 p = strrchr(name, '/');
4150 strncpy(last_component, p ? p : name, sizeof(last_component)-1);
4151 last_component[sizeof(last_component)-1] = '\0';
4153 for(; namelist->name != NULL; namelist++)
4155 if(namelist->is_wild)
4157 /* look for a wildcard match. */
4158 if (mask_match(last_component, namelist->name, case_sensitive, False))
4160 DEBUG(8,("is_in_path: mask match succeeded\n"));
4166 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
4167 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0)))
4169 DEBUG(8,("is_in_path: match succeeded\n"));
4174 DEBUG(8,("is_in_path: match not found\n"));
4179 /*******************************************************************
4180 Strip a '/' separated list into an array of
4181 name_compare_enties structures suitable for
4182 passing to is_in_path(). We do this for
4183 speed so we can pre-parse all the names in the list
4184 and don't do it for each call to is_in_path().
4185 namelist is modified here and is assumed to be
4186 a copy owned by the caller.
4187 We also check if the entry contains a wildcard to
4188 remove a potentially expensive call to mask_match
4190 ********************************************************************/
4192 void set_namearray(name_compare_entry **ppname_array, char *namelist)
4195 char *nameptr = namelist;
4196 int num_entries = 0;
4199 (*ppname_array) = NULL;
4201 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
4204 /* We need to make two passes over the string. The
4205 first to count the number of elements, the second
4210 if ( *nameptr == '/' )
4212 /* cope with multiple (useless) /s) */
4216 /* find the next / */
4217 name_end = strchr(nameptr, '/');
4219 /* oops - the last check for a / didn't find one. */
4220 if (name_end == NULL)
4223 /* next segment please */
4224 nameptr = name_end + 1;
4228 if(num_entries == 0)
4231 if(( (*ppname_array) = (name_compare_entry *)malloc(
4232 (num_entries + 1) * sizeof(name_compare_entry))) == NULL)
4234 DEBUG(0,("set_namearray: malloc fail\n"));
4238 /* Now copy out the names */
4243 if ( *nameptr == '/' )
4245 /* cope with multiple (useless) /s) */
4249 /* find the next / */
4250 if ((name_end = strchr(nameptr, '/')) != NULL)
4255 /* oops - the last check for a / didn't find one. */
4256 if(name_end == NULL)
4259 (*ppname_array)[i].is_wild = ((strchr( nameptr, '?')!=NULL) ||
4260 (strchr( nameptr, '*')!=NULL));
4261 if(((*ppname_array)[i].name = strdup(nameptr)) == NULL)
4263 DEBUG(0,("set_namearray: malloc fail (1)\n"));
4267 /* next segment please */
4268 nameptr = name_end + 1;
4272 (*ppname_array)[i].name = NULL;
4277 /****************************************************************************
4278 routine to free a namearray.
4279 ****************************************************************************/
4281 void free_namearray(name_compare_entry *name_array)
4286 if(name_array->name != NULL)
4287 free(name_array->name);
4289 free((char *)name_array);
4292 /****************************************************************************
4293 routine to do file locking
4294 ****************************************************************************/
4295 BOOL fcntl_lock(int fd,int op,uint32 offset,uint32 count,int type)
4302 uint32 mask = 0xC0000000;
4304 /* make sure the count is reasonable, we might kill the lockd otherwise */
4307 /* the offset is often strange - remove 2 of its bits if either of
4308 the top two bits are set. Shift the top ones by two bits. This
4309 still allows OLE2 apps to operate, but should stop lockd from
4311 if ((offset & mask) != 0)
4312 offset = (offset & ~mask) | ((offset & mask) >> 2);
4314 uint32 mask = ((unsigned)1<<31);
4316 /* interpret negative counts as large numbers */
4320 /* no negative offsets */
4323 /* count + offset must be in range */
4324 while ((offset < 0 || (offset + count < 0)) && mask)
4332 DEBUG(8,("fcntl_lock %d %d %d %d %d\n",fd,op,(int)offset,(int)count,type));
4335 lock.l_whence = SEEK_SET;
4336 lock.l_start = (int)offset;
4337 lock.l_len = (int)count;
4342 ret = fcntl(fd,op,&lock);
4345 DEBUG(3,("fcntl lock gave errno %d (%s)\n",errno,strerror(errno)));
4351 (lock.l_type != F_UNLCK) &&
4352 (lock.l_pid != 0) &&
4353 (lock.l_pid != getpid()))
4355 DEBUG(3,("fd %d is locked by pid %d\n",fd,lock.l_pid));
4359 /* it must be not locked or locked by me */
4363 /* a lock set or unset */
4366 DEBUG(3,("lock failed at offset %d count %d op %d type %d (%s)\n",
4367 offset,count,op,type,strerror(errno)));
4369 /* perhaps it doesn't support this sort of locking?? */
4370 if (errno == EINVAL)
4372 DEBUG(3,("locking not supported? returning True\n"));
4379 /* everything went OK */
4380 DEBUG(8,("Lock call successful\n"));
4388 /*******************************************************************
4389 lock a file - returning a open file descriptor or -1 on failure
4390 The timeout is in seconds. 0 means no timeout
4391 ********************************************************************/
4392 int file_lock(char *name,int timeout)
4394 int fd = open(name,O_RDWR|O_CREAT,0666);
4396 if (fd < 0) return(-1);
4399 if (timeout) t = time(NULL);
4400 while (!timeout || (time(NULL)-t < timeout)) {
4401 if (fcntl_lock(fd,F_SETLK,0,1,F_WRLCK)) return(fd);
4402 msleep(LOCK_RETRY_TIMEOUT);
4410 /*******************************************************************
4411 unlock a file locked by file_lock
4412 ********************************************************************/
4413 void file_unlock(int fd)
4417 fcntl_lock(fd,F_SETLK,0,1,F_UNLCK);
4422 /*******************************************************************
4423 is the name specified one of my netbios names
4424 returns true is it is equal, false otherwise
4425 ********************************************************************/
4426 BOOL is_myname(char *s)
4431 for (n=0; my_netbios_names[n]; n++) {
4432 if (strequal(my_netbios_names[n], s))
4435 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
4439 /*******************************************************************
4440 set the horrid remote_arch string based on an enum.
4441 ********************************************************************/
4442 void set_remote_arch(enum remote_arch_types type)
4448 strcpy(remote_arch, "WfWg");
4451 strcpy(remote_arch, "OS2");
4454 strcpy(remote_arch, "Win95");
4457 strcpy(remote_arch, "WinNT");
4460 strcpy(remote_arch,"Samba");
4463 ra_type = RA_UNKNOWN;
4464 strcpy(remote_arch, "UNKNOWN");
4469 /*******************************************************************
4470 Get the remote_arch type.
4471 ********************************************************************/
4472 enum remote_arch_types get_remote_arch()
4478 /*******************************************************************
4479 skip past some unicode strings in a buffer
4480 ********************************************************************/
4481 char *skip_unicode_string(char *buf,int n)
4492 /*******************************************************************
4493 Return a ascii version of a unicode string
4494 Hack alert: uses fixed buffer(s) and only handles ascii strings
4495 ********************************************************************/
4497 char *unistrn2(uint16 *buf, int len)
4499 static char lbufs[8][MAXUNI];
4501 char *lbuf = lbufs[nexti];
4504 nexti = (nexti+1)%8;
4506 DEBUG(10, ("unistrn2: "));
4508 for (p = lbuf; *buf && p-lbuf < MAXUNI-2 && len > 0; len--, p++, buf++)
4510 DEBUG(10, ("%4x ", *buf));
4520 /*******************************************************************
4521 Return a ascii version of a unicode string
4522 Hack alert: uses fixed buffer(s) and only handles ascii strings
4523 ********************************************************************/
4525 char *unistr2(uint16 *buf)
4527 static char lbufs[8][MAXUNI];
4529 char *lbuf = lbufs[nexti];
4532 nexti = (nexti+1)%8;
4534 DEBUG(10, ("unistr2: "));
4536 for (p = lbuf; *buf && p-lbuf < MAXUNI-2; p++, buf++)
4538 DEBUG(10, ("%4x ", *buf));
4548 /*******************************************************************
4549 create a null-terminated unicode string from a null-terminated ascii string.
4550 return number of unicode chars copied, excluding the null character.
4552 only handles ascii strings
4553 ********************************************************************/
4555 int struni2(uint16 *p, char *buf)
4559 if (p == NULL) return 0;
4561 DEBUG(10, ("struni2: "));
4565 for (; *buf && len < MAXUNI-2; len++, p++, buf++)
4567 DEBUG(10, ("%2x ", *buf));
4579 /*******************************************************************
4580 Return a ascii version of a unicode string
4581 Hack alert: uses fixed buffer(s) and only handles ascii strings
4582 ********************************************************************/
4584 char *unistr(char *buf)
4586 static char lbufs[8][MAXUNI];
4588 char *lbuf = lbufs[nexti];
4591 nexti = (nexti+1)%8;
4593 for (p = lbuf; *buf && p-lbuf < MAXUNI-2; p++, buf += 2)
4601 /*******************************************************************
4602 strncpy for unicode strings
4603 ********************************************************************/
4604 int unistrncpy(char *dst, char *src, int len)
4608 while (*src && len > 0)
4622 /*******************************************************************
4623 strcpy for unicode strings. returns length (in num of wide chars)
4624 ********************************************************************/
4625 int unistrcpy(char *dst, char *src)
4642 /*******************************************************************
4643 safe string copy into a fstring
4644 ********************************************************************/
4645 void fstrcpy(char *dest, char *src)
4647 int maxlength = sizeof(fstring) - 1;
4649 DEBUG(0,("ERROR: NULL dest in fstrcpy\n"));
4658 while (maxlength-- && *src)
4662 DEBUG(0,("ERROR: string overflow by %d in fstrcpy\n",
4667 /*******************************************************************
4668 safe string copy into a pstring
4669 ********************************************************************/
4670 void pstrcpy(char *dest, char *src)
4672 int maxlength = sizeof(pstring) - 1;
4674 DEBUG(0,("ERROR: NULL dest in pstrcpy\n"));
4683 while (maxlength-- && *src)
4687 DEBUG(0,("ERROR: string overflow by %d in pstrcpy\n",
4693 /*******************************************************************
4694 align a pointer to a multiple of 4 bytes
4695 ********************************************************************/
4696 char *align4(char *q, char *base)
4700 q += 4 - ((q - base) & 3);
4705 /*******************************************************************
4706 align a pointer to a multiple of 2 bytes
4707 ********************************************************************/
4708 char *align2(char *q, char *base)
4717 /*******************************************************************
4718 align a pointer to a multiple of align_offset bytes. looks like it
4719 will work for offsets of 0, 2 and 4...
4720 ********************************************************************/
4721 char *align_offset(char *q, char *base, int align_offset_len)
4723 int mod = ((q - base) & (align_offset_len-1));
4724 if (align_offset_len != 0 && mod != 0)
4726 q += align_offset_len - mod;
4731 void print_asc(int level, unsigned char *buf,int len)
4735 DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
4738 void dump_data(int level,char *buf1,int len)
4740 unsigned char *buf = (unsigned char *)buf1;
4744 DEBUG(level,("[%03X] ",i));
4746 DEBUG(level,("%02X ",(int)buf[i]));
4748 if (i%8 == 0) DEBUG(level,(" "));
4750 print_asc(level,&buf[i-16],8); DEBUG(level,(" "));
4751 print_asc(level,&buf[i-8],8); DEBUG(level,("\n"));
4752 if (i<len) DEBUG(level,("[%03X] ",i));
4760 if (n>8) DEBUG(level,(" "));
4761 while (n--) DEBUG(level,(" "));
4764 print_asc(level,&buf[i-(i%16)],n); DEBUG(level,(" "));
4766 if (n>0) print_asc(level,&buf[i-n],n);
4767 DEBUG(level,("\n"));
4771 char *tab_depth(int depth)
4773 static pstring spaces;
4774 memset(spaces, ' ', depth * 4);
4775 spaces[depth * 4] = 0;