2 Unix SMB/CIFS implementation.
3 Samba utility functions
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 2001-2002
6 Copyright (C) Simo Sorce 2001
7 Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 extern fstring local_machine;
27 extern char *global_clobber_region_function;
28 extern unsigned int global_clobber_region_line;
29 extern fstring remote_arch;
31 /* Max allowable allococation - 256mb - 0x10000000 */
32 #define MAX_ALLOC_SIZE (1024*1024*256)
34 #if (defined(HAVE_NETGROUP) && defined (WITH_AUTOMOUNT))
35 #ifdef WITH_NISPLUS_HOME
36 #ifdef BROKEN_NISPLUS_INCLUDE_FILES
38 * The following lines are needed due to buggy include files
39 * in Solaris 2.6 which define GROUP in both /usr/include/sys/acl.h and
40 * also in /usr/include/rpcsvc/nis.h. The definitions conflict. JRA.
41 * Also GROUP_OBJ is defined as 0x4 in /usr/include/sys/acl.h and as
42 * an enum in /usr/include/rpcsvc/nis.h.
49 #if defined(GROUP_OBJ)
53 #endif /* BROKEN_NISPLUS_INCLUDE_FILES */
55 #include <rpcsvc/nis.h>
57 #endif /* WITH_NISPLUS_HOME */
58 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
60 enum protocol_types Protocol = PROTOCOL_COREPLUS;
62 /* a default finfo structure to ensure all fields are sensible */
63 file_info def_finfo = {-1,0,0,0,0,0,0,"",""};
65 /* this is used by the chaining code */
70 static enum remote_arch_types ra_type = RA_UNKNOWN;
71 pstring user_socket_options=DEFAULT_SOCKET_OPTIONS;
73 /***********************************************************************
74 Definitions for all names.
75 ***********************************************************************/
77 static char *smb_myname;
78 static char *smb_myworkgroup;
79 static char *smb_scope;
80 static int smb_num_netbios_names;
81 static char **smb_my_netbios_names;
83 /***********************************************************************
84 Allocate and set myname. Ensure upper case.
85 ***********************************************************************/
87 BOOL set_global_myname(const char *myname)
89 SAFE_FREE(smb_myname);
90 smb_myname = SMB_STRDUP(myname);
93 strupper_m(smb_myname);
97 const char *global_myname(void)
102 /***********************************************************************
103 Allocate and set myworkgroup. Ensure upper case.
104 ***********************************************************************/
106 BOOL set_global_myworkgroup(const char *myworkgroup)
108 SAFE_FREE(smb_myworkgroup);
109 smb_myworkgroup = SMB_STRDUP(myworkgroup);
110 if (!smb_myworkgroup)
112 strupper_m(smb_myworkgroup);
116 const char *lp_workgroup(void)
118 return smb_myworkgroup;
121 /***********************************************************************
122 Allocate and set scope. Ensure upper case.
123 ***********************************************************************/
125 BOOL set_global_scope(const char *scope)
127 SAFE_FREE(smb_scope);
128 smb_scope = SMB_STRDUP(scope);
131 strupper_m(smb_scope);
135 /*********************************************************************
136 Ensure scope is never null string.
137 *********************************************************************/
139 const char *global_scope(void)
142 set_global_scope("");
146 static void free_netbios_names_array(void)
150 for (i = 0; i < smb_num_netbios_names; i++)
151 SAFE_FREE(smb_my_netbios_names[i]);
153 SAFE_FREE(smb_my_netbios_names);
154 smb_num_netbios_names = 0;
157 static BOOL allocate_my_netbios_names_array(size_t number)
159 free_netbios_names_array();
161 smb_num_netbios_names = number + 1;
162 smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
164 if (!smb_my_netbios_names)
167 memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
171 static BOOL set_my_netbios_names(const char *name, int i)
173 SAFE_FREE(smb_my_netbios_names[i]);
175 smb_my_netbios_names[i] = SMB_STRDUP(name);
176 if (!smb_my_netbios_names[i])
178 strupper_m(smb_my_netbios_names[i]);
182 /***********************************************************************
183 Free memory allocated to global objects
184 ***********************************************************************/
186 void gfree_names(void)
188 SAFE_FREE( smb_myname );
189 SAFE_FREE( smb_myworkgroup );
190 SAFE_FREE( smb_scope );
191 free_netbios_names_array();
194 void gfree_all( void )
203 /* release the talloc null_context memory last */
207 const char *my_netbios_names(int i)
209 return smb_my_netbios_names[i];
212 BOOL set_netbios_aliases(const char **str_array)
216 /* Work out the max number of netbios aliases that we have */
217 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
220 if ( global_myname() && *global_myname())
223 /* Allocate space for the netbios aliases */
224 if (!allocate_my_netbios_names_array(namecount))
227 /* Use the global_myname string first */
229 if ( global_myname() && *global_myname()) {
230 set_my_netbios_names( global_myname(), namecount );
236 for ( i = 0; str_array[i] != NULL; i++) {
238 BOOL duplicate = False;
240 /* Look for duplicates */
241 for( n=0; n<namecount; n++ ) {
242 if( strequal( str_array[i], my_netbios_names(n) ) ) {
248 if (!set_my_netbios_names(str_array[i], namecount))
257 /****************************************************************************
258 Common name initialization code.
259 ****************************************************************************/
261 BOOL init_names(void)
266 if (global_myname() == NULL || *global_myname() == '\0') {
267 if (!set_global_myname(myhostname())) {
268 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
273 if (!set_netbios_aliases(lp_netbios_aliases())) {
274 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
278 fstrcpy( local_machine, global_myname() );
279 trim_char( local_machine, ' ', ' ' );
280 p = strchr( local_machine, ' ' );
283 strlower_m( local_machine );
285 DEBUG( 5, ("Netbios name list:-\n") );
286 for( n=0; my_netbios_names(n); n++ )
287 DEBUGADD( 5, ( "my_netbios_names[%d]=\"%s\"\n", n, my_netbios_names(n) ) );
292 /**************************************************************************n
293 Find a suitable temporary directory. The result should be copied immediately
294 as it may be overwritten by a subsequent call.
295 ****************************************************************************/
297 const char *tmpdir(void)
300 if ((p = getenv("TMPDIR")))
305 /****************************************************************************
306 Add a gid to an array of gids if it's not already there.
307 ****************************************************************************/
309 void add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
310 gid_t **gids, size_t *num_gids)
314 for (i=0; i<*num_gids; i++) {
315 if ((*gids)[i] == gid)
319 if (mem_ctx != NULL) {
320 *gids = TALLOC_REALLOC_ARRAY(mem_ctx, *gids, gid_t, *num_gids+1);
322 *gids = SMB_REALLOC_ARRAY(*gids, gid_t, *num_gids+1);
329 (*gids)[*num_gids] = gid;
333 /****************************************************************************
334 Like atoi but gets the value up to the separator character.
335 ****************************************************************************/
337 static const char *Atoic(const char *p, int *n, const char *c)
339 if (!isdigit((int)*p)) {
340 DEBUG(5, ("Atoic: malformed number\n"));
346 while ((*p) && isdigit((int)*p))
349 if (strchr_m(c, *p) == NULL) {
350 DEBUG(5, ("Atoic: no separator characters (%s) not found\n", c));
357 /*************************************************************************
358 Reads a list of numbers.
359 *************************************************************************/
361 const char *get_numlist(const char *p, uint32 **num, int *count)
365 if (num == NULL || count == NULL)
371 while ((p = Atoic(p, &val, ":,")) != NULL && (*p) != ':') {
372 *num = SMB_REALLOC_ARRAY((*num), uint32, (*count)+1);
376 (*num)[(*count)] = val;
384 /*******************************************************************
385 Check if a file exists - call vfs_file_exist for samba files.
386 ********************************************************************/
388 BOOL file_exist(const char *fname,SMB_STRUCT_STAT *sbuf)
394 if (sys_stat(fname,sbuf) != 0)
397 return((S_ISREG(sbuf->st_mode)) || (S_ISFIFO(sbuf->st_mode)));
400 /*******************************************************************
401 Check a files mod time.
402 ********************************************************************/
404 time_t file_modtime(const char *fname)
408 if (sys_stat(fname,&st) != 0)
414 /*******************************************************************
415 Check if a directory exists.
416 ********************************************************************/
418 BOOL directory_exist(char *dname,SMB_STRUCT_STAT *st)
426 if (sys_stat(dname,st) != 0)
429 ret = S_ISDIR(st->st_mode);
435 /*******************************************************************
436 Returns the size in bytes of the named file.
437 ********************************************************************/
439 SMB_OFF_T get_file_size(char *file_name)
443 if(sys_stat(file_name,&buf) != 0)
444 return (SMB_OFF_T)-1;
448 /*******************************************************************
449 Return a string representing an attribute for a file.
450 ********************************************************************/
452 char *attrib_string(uint16 mode)
454 static fstring attrstr;
458 if (mode & aVOLID) fstrcat(attrstr,"V");
459 if (mode & aDIR) fstrcat(attrstr,"D");
460 if (mode & aARCH) fstrcat(attrstr,"A");
461 if (mode & aHIDDEN) fstrcat(attrstr,"H");
462 if (mode & aSYSTEM) fstrcat(attrstr,"S");
463 if (mode & aRONLY) fstrcat(attrstr,"R");
468 /*******************************************************************
469 Show a smb message structure.
470 ********************************************************************/
472 void show_msg(char *buf)
480 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
482 (int)CVAL(buf,smb_com),
483 (int)CVAL(buf,smb_rcls),
484 (int)CVAL(buf,smb_reh),
485 (int)SVAL(buf,smb_err),
486 (int)CVAL(buf,smb_flg),
487 (int)SVAL(buf,smb_flg2)));
488 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
489 (int)SVAL(buf,smb_tid),
490 (int)SVAL(buf,smb_pid),
491 (int)SVAL(buf,smb_uid),
492 (int)SVAL(buf,smb_mid)));
493 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
495 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
496 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
497 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
499 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
501 DEBUGADD(5,("smb_bcc=%d\n",bcc));
509 dump_data(10, smb_buf(buf), bcc);
512 /*******************************************************************
513 Set the length and marker of an smb packet.
514 ********************************************************************/
516 void smb_setlen(char *buf,int len)
518 _smb_setlen(buf,len);
526 /*******************************************************************
527 Setup the word count and byte count for a smb message.
528 ********************************************************************/
530 int set_message(char *buf,int num_words,int num_bytes,BOOL zero)
533 memset(buf + smb_size,'\0',num_words*2 + num_bytes);
534 SCVAL(buf,smb_wct,num_words);
535 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
536 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
537 return (smb_size + num_words*2 + num_bytes);
540 /*******************************************************************
541 Setup only the byte count for a smb message.
542 ********************************************************************/
544 int set_message_bcc(char *buf,int num_bytes)
546 int num_words = CVAL(buf,smb_wct);
547 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
548 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
549 return (smb_size + num_words*2 + num_bytes);
552 /*******************************************************************
553 Setup only the byte count for a smb message, using the end of the
555 ********************************************************************/
557 int set_message_end(void *outbuf,void *end_ptr)
559 return set_message_bcc((char *)outbuf,PTR_DIFF(end_ptr,smb_buf((char *)outbuf)));
562 /*******************************************************************
563 Reduce a file name, removing .. elements.
564 ********************************************************************/
566 void dos_clean_name(char *s)
570 DEBUG(3,("dos_clean_name [%s]\n",s));
572 /* remove any double slashes */
573 all_string_sub(s, "\\\\", "\\", 0);
575 while ((p = strstr_m(s,"\\..\\")) != NULL) {
581 if ((p=strrchr_m(s,'\\')) != NULL)
588 trim_string(s,NULL,"\\..");
590 all_string_sub(s, "\\.\\", "\\", 0);
593 /*******************************************************************
594 Reduce a file name, removing .. elements.
595 ********************************************************************/
597 void unix_clean_name(char *s)
601 DEBUG(3,("unix_clean_name [%s]\n",s));
603 /* remove any double slashes */
604 all_string_sub(s, "//","/", 0);
606 /* Remove leading ./ characters */
607 if(strncmp(s, "./", 2) == 0) {
608 trim_string(s, "./", NULL);
613 while ((p = strstr_m(s,"/../")) != NULL) {
619 if ((p=strrchr_m(s,'/')) != NULL)
626 trim_string(s,NULL,"/..");
629 /*******************************************************************
630 Close the low 3 fd's and open dev/null in their place.
631 ********************************************************************/
633 void close_low_fds(BOOL stderr_too)
645 /* try and use up these file descriptors, so silly
646 library routines writing to stdout etc won't cause havoc */
648 if (i == 2 && !stderr_too)
651 fd = sys_open("/dev/null",O_RDWR,0);
653 fd = sys_open("/dev/null",O_WRONLY,0);
655 DEBUG(0,("Can't open /dev/null\n"));
659 DEBUG(0,("Didn't get file descriptor %d\n",i));
666 /*******************************************************************
667 Write data into an fd at a given offset. Ignore seek errors.
668 ********************************************************************/
670 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
675 if (pos == (SMB_OFF_T)-1) {
676 return write_data(fd, buffer, N);
678 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
680 ret = sys_pwrite(fd,buffer + total,N - total, pos);
681 if (ret == -1 && errno == ESPIPE) {
682 return write_data(fd, buffer + total,N - total);
685 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
694 return (ssize_t)total;
696 /* Use lseek and write_data. */
697 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
698 if (errno != ESPIPE) {
702 return write_data(fd, buffer, N);
706 /****************************************************************************
707 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
711 ****************************************************************************/
713 int set_blocking(int fd, BOOL set)
717 #define FLAG_TO_SET O_NONBLOCK
720 #define FLAG_TO_SET O_NDELAY
722 #define FLAG_TO_SET FNDELAY
726 if((val = sys_fcntl_long(fd, F_GETFL, 0)) == -1)
728 if(set) /* Turn blocking on - ie. clear nonblock flag */
732 return sys_fcntl_long( fd, F_SETFL, val);
736 /****************************************************************************
737 Transfer some data between two fd's.
738 ****************************************************************************/
740 #ifndef TRANSFER_BUF_SIZE
741 #define TRANSFER_BUF_SIZE 65536
744 ssize_t transfer_file_internal(int infd, int outfd, size_t n, ssize_t (*read_fn)(int, void *, size_t),
745 ssize_t (*write_fn)(int, const void *, size_t))
751 size_t num_to_read_thistime;
752 size_t num_written = 0;
754 if ((buf = SMB_MALLOC(TRANSFER_BUF_SIZE)) == NULL)
758 num_to_read_thistime = MIN((n - total), TRANSFER_BUF_SIZE);
760 read_ret = (*read_fn)(infd, buf, num_to_read_thistime);
761 if (read_ret == -1) {
762 DEBUG(0,("transfer_file_internal: read failure. Error = %s\n", strerror(errno) ));
771 while (num_written < read_ret) {
772 write_ret = (*write_fn)(outfd,buf + num_written, read_ret - num_written);
774 if (write_ret == -1) {
775 DEBUG(0,("transfer_file_internal: write failure. Error = %s\n", strerror(errno) ));
780 return (ssize_t)total;
782 num_written += (size_t)write_ret;
785 total += (size_t)read_ret;
789 return (ssize_t)total;
792 SMB_OFF_T transfer_file(int infd,int outfd,SMB_OFF_T n)
794 return (SMB_OFF_T)transfer_file_internal(infd, outfd, (size_t)n, sys_read, sys_write);
797 /*******************************************************************
798 Sleep for a specified number of milliseconds.
799 ********************************************************************/
801 void smb_msleep(unsigned int t)
803 #if defined(HAVE_NANOSLEEP)
804 struct timespec tval;
807 tval.tv_sec = t/1000;
808 tval.tv_nsec = 1000000*(t%1000);
812 ret = nanosleep(&tval, &tval);
813 } while (ret < 0 && errno == EINTR && (tval.tv_sec > 0 || tval.tv_nsec > 0));
815 unsigned int tdiff=0;
816 struct timeval tval,t1,t2;
823 tval.tv_sec = (t-tdiff)/1000;
824 tval.tv_usec = 1000*((t-tdiff)%1000);
826 /* Never wait for more than 1 sec. */
827 if (tval.tv_sec > 1) {
834 sys_select_intr(0,&fds,NULL,NULL,&tval);
837 if (t2.tv_sec < t1.tv_sec) {
838 /* Someone adjusted time... */
842 tdiff = TvalDiff(&t1,&t2);
847 /****************************************************************************
848 Become a daemon, discarding the controlling terminal.
849 ****************************************************************************/
851 void become_daemon(BOOL Fork, BOOL no_process_group)
859 /* detach from the terminal */
861 if (!no_process_group) setsid();
862 #elif defined(TIOCNOTTY)
863 if (!no_process_group) {
864 int i = sys_open("/dev/tty", O_RDWR, 0);
866 ioctl(i, (int) TIOCNOTTY, (char *)0);
870 #endif /* HAVE_SETSID */
872 /* Close fd's 0,1,2. Needed if started by rsh */
873 close_low_fds(False); /* Don't close stderr, let the debug system
874 attach it to the logfile */
877 /****************************************************************************
878 Put up a yes/no prompt.
879 ****************************************************************************/
886 if (!fgets(ans,sizeof(ans)-1,stdin))
889 if (*ans == 'y' || *ans == 'Y')
895 #if defined(PARANOID_MALLOC_CHECKER)
897 /****************************************************************************
898 Internal malloc wrapper. Externally visible.
899 ****************************************************************************/
901 void *malloc_(size_t size)
905 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
908 /****************************************************************************
909 Internal calloc wrapper. Not externally visible.
910 ****************************************************************************/
912 static void *calloc_(size_t count, size_t size)
915 return calloc(count, size);
916 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
919 /****************************************************************************
920 Internal realloc wrapper. Not externally visible.
921 ****************************************************************************/
923 static void *realloc_(void *ptr, size_t size)
926 return realloc(ptr, size);
927 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
930 #endif /* PARANOID_MALLOC_CHECKER */
932 /****************************************************************************
934 ****************************************************************************/
936 void *malloc_array(size_t el_size, unsigned int count)
938 if (count >= MAX_ALLOC_SIZE/el_size) {
942 #if defined(PARANOID_MALLOC_CHECKER)
943 return malloc_(el_size*count);
945 return malloc(el_size*count);
949 /****************************************************************************
951 ****************************************************************************/
953 void *calloc_array(size_t size, size_t nmemb)
955 if (nmemb >= MAX_ALLOC_SIZE/size) {
958 #if defined(PARANOID_MALLOC_CHECKER)
959 return calloc_(nmemb, size);
961 return calloc(nmemb, size);
965 /****************************************************************************
966 Expand a pointer to be a particular size.
967 Note that this version of Realloc has an extra parameter that decides
968 whether to free the passed in storage on allocation failure or if the
971 This is designed for use in the typical idiom of :
973 p = SMB_REALLOC(p, size)
978 and not to have to keep track of the old 'p' contents to free later, nor
979 to worry if the size parameter was zero. In the case where NULL is returned
980 we guarentee that p has been freed.
982 If free later semantics are desired, then pass 'free_old_on_error' as False which
983 guarentees that the old contents are not freed on error, even if size == 0. To use
986 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
994 Changes were instigated by Coverity error checking. JRA.
995 ****************************************************************************/
997 void *Realloc(void *p, size_t size, BOOL free_old_on_error)
1002 if (free_old_on_error) {
1005 DEBUG(2,("Realloc asked for 0 bytes\n"));
1009 #if defined(PARANOID_MALLOC_CHECKER)
1011 ret = (void *)malloc_(size);
1013 ret = (void *)realloc_(p,size);
1017 ret = (void *)malloc(size);
1019 ret = (void *)realloc(p,size);
1024 if (free_old_on_error && p) {
1027 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
1033 /****************************************************************************
1035 ****************************************************************************/
1037 void *realloc_array(void *p, size_t el_size, unsigned int count, BOOL free_old_on_error)
1039 if (count >= MAX_ALLOC_SIZE/el_size) {
1040 if (free_old_on_error) {
1045 return Realloc(p, el_size*count, free_old_on_error);
1048 /****************************************************************************
1049 (Hopefully) efficient array append.
1050 ****************************************************************************/
1052 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
1053 void *element, void **array, uint32 *num_elements,
1054 ssize_t *array_size)
1056 if (*array_size < 0) {
1060 if (*array == NULL) {
1061 if (*array_size == 0) {
1065 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1069 if (mem_ctx != NULL) {
1070 *array = TALLOC(mem_ctx, element_size * (*array_size));
1072 *array = SMB_MALLOC(element_size * (*array_size));
1075 if (*array == NULL) {
1080 if (*num_elements == *array_size) {
1083 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1087 if (mem_ctx != NULL) {
1088 *array = TALLOC_REALLOC(mem_ctx, *array,
1089 element_size * (*array_size));
1091 *array = SMB_REALLOC(*array,
1092 element_size * (*array_size));
1095 if (*array == NULL) {
1100 memcpy((char *)(*array) + element_size*(*num_elements),
1101 element, element_size);
1111 /****************************************************************************
1112 Free memory, checks for NULL.
1113 Use directly SAFE_FREE()
1114 Exists only because we need to pass a function pointer somewhere --SSS
1115 ****************************************************************************/
1117 void safe_free(void *p)
1122 /****************************************************************************
1123 Get my own name and IP.
1124 ****************************************************************************/
1126 BOOL get_myname(char *my_name)
1132 /* get my host name */
1133 if (gethostname(hostname, sizeof(hostname)) == -1) {
1134 DEBUG(0,("gethostname failed\n"));
1138 /* Ensure null termination. */
1139 hostname[sizeof(hostname)-1] = '\0';
1142 /* split off any parts after an initial . */
1143 char *p = strchr_m(hostname,'.');
1148 fstrcpy(my_name,hostname);
1154 /****************************************************************************
1155 Get my own canonical name, including domain.
1156 ****************************************************************************/
1158 BOOL get_mydnsfullname(fstring my_dnsname)
1160 static fstring dnshostname;
1163 if (!*dnshostname) {
1164 /* get my host name */
1165 if (gethostname(dnshostname, sizeof(dnshostname)) == -1) {
1166 *dnshostname = '\0';
1167 DEBUG(0,("gethostname failed\n"));
1171 /* Ensure null termination. */
1172 dnshostname[sizeof(dnshostname)-1] = '\0';
1174 /* Ensure we get the cannonical name. */
1175 if (!(hp = sys_gethostbyname(dnshostname))) {
1176 *dnshostname = '\0';
1179 fstrcpy(dnshostname, hp->h_name);
1181 fstrcpy(my_dnsname, dnshostname);
1185 /****************************************************************************
1186 Get my own domain name.
1187 ****************************************************************************/
1189 BOOL get_mydnsdomname(fstring my_domname)
1195 if (!get_mydnsfullname(domname)) {
1198 p = strchr_m(domname, '.');
1201 fstrcpy(my_domname, p);
1207 /****************************************************************************
1208 Interpret a protocol description string, with a default.
1209 ****************************************************************************/
1211 int interpret_protocol(const char *str,int def)
1213 if (strequal(str,"NT1"))
1214 return(PROTOCOL_NT1);
1215 if (strequal(str,"LANMAN2"))
1216 return(PROTOCOL_LANMAN2);
1217 if (strequal(str,"LANMAN1"))
1218 return(PROTOCOL_LANMAN1);
1219 if (strequal(str,"CORE"))
1220 return(PROTOCOL_CORE);
1221 if (strequal(str,"COREPLUS"))
1222 return(PROTOCOL_COREPLUS);
1223 if (strequal(str,"CORE+"))
1224 return(PROTOCOL_COREPLUS);
1226 DEBUG(0,("Unrecognised protocol level %s\n",str));
1231 /****************************************************************************
1232 Return true if a string could be a pure IP address.
1233 ****************************************************************************/
1235 BOOL is_ipaddress(const char *str)
1237 BOOL pure_address = True;
1240 for (i=0; pure_address && str[i]; i++)
1241 if (!(isdigit((int)str[i]) || str[i] == '.'))
1242 pure_address = False;
1244 /* Check that a pure number is not misinterpreted as an IP */
1245 pure_address = pure_address && (strchr_m(str, '.') != NULL);
1247 return pure_address;
1250 /****************************************************************************
1251 Interpret an internet address or name into an IP address in 4 byte form.
1252 ****************************************************************************/
1254 uint32 interpret_addr(const char *str)
1259 if (strcmp(str,"0.0.0.0") == 0)
1261 if (strcmp(str,"255.255.255.255") == 0)
1264 /* if it's in the form of an IP address then get the lib to interpret it */
1265 if (is_ipaddress(str)) {
1266 res = inet_addr(str);
1268 /* otherwise assume it's a network name of some sort and use
1269 sys_gethostbyname */
1270 if ((hp = sys_gethostbyname(str)) == 0) {
1271 DEBUG(3,("sys_gethostbyname: Unknown host. %s\n",str));
1275 if(hp->h_addr == NULL) {
1276 DEBUG(3,("sys_gethostbyname: host address is invalid for host %s\n",str));
1279 putip((char *)&res,(char *)hp->h_addr);
1282 if (res == (uint32)-1)
1288 /*******************************************************************
1289 A convenient addition to interpret_addr().
1290 ******************************************************************/
1292 struct in_addr *interpret_addr2(const char *str)
1294 static struct in_addr ret;
1295 uint32 a = interpret_addr(str);
1300 /*******************************************************************
1301 Check if an IP is the 0.0.0.0.
1302 ******************************************************************/
1304 BOOL is_zero_ip(struct in_addr ip)
1307 putip((char *)&a,(char *)&ip);
1311 /*******************************************************************
1312 Set an IP to 0.0.0.0.
1313 ******************************************************************/
1315 void zero_ip(struct in_addr *ip)
1318 static struct in_addr ipzero;
1321 ipzero = *interpret_addr2("0.0.0.0");
1328 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1329 /******************************************************************
1330 Remove any mount options such as -rsize=2048,wsize=2048 etc.
1331 Based on a fix from <Thomas.Hepper@icem.de>.
1332 *******************************************************************/
1334 static void strip_mount_options( pstring *str)
1338 while(*p && !isspace(*p))
1340 while(*p && isspace(*p))
1345 pstrcpy(tmp_str, p);
1346 pstrcpy(*str, tmp_str);
1351 /*******************************************************************
1352 Patch from jkf@soton.ac.uk
1353 Split Luke's automount_server into YP lookup and string splitter
1354 so can easily implement automount_path().
1355 As we may end up doing both, cache the last YP result.
1356 *******************************************************************/
1358 #ifdef WITH_NISPLUS_HOME
1359 char *automount_lookup(const char *user_name)
1361 static fstring last_key = "";
1362 static pstring last_value = "";
1364 char *nis_map = (char *)lp_nis_home_map_name();
1366 char buffer[NIS_MAXATTRVAL + 1];
1371 if (strcmp(user_name, last_key)) {
1372 slprintf(buffer, sizeof(buffer)-1, "[key=%s],%s", user_name, nis_map);
1373 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
1375 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
1376 if (result->status != NIS_SUCCESS) {
1377 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
1378 fstrcpy(last_key, ""); pstrcpy(last_value, "");
1380 object = result->objects.objects_val;
1381 if (object->zo_data.zo_type == ENTRY_OBJ) {
1382 entry = &object->zo_data.objdata_u.en_data;
1383 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
1384 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
1386 pstrcpy(last_value, entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
1387 pstring_sub(last_value, "&", user_name);
1388 fstrcpy(last_key, user_name);
1392 nis_freeresult(result);
1395 strip_mount_options(&last_value);
1397 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n", user_name, last_value));
1400 #else /* WITH_NISPLUS_HOME */
1402 char *automount_lookup(const char *user_name)
1404 static fstring last_key = "";
1405 static pstring last_value = "";
1407 int nis_error; /* returned by yp all functions */
1408 char *nis_result; /* yp_match inits this */
1409 int nis_result_len; /* and set this */
1410 char *nis_domain; /* yp_get_default_domain inits this */
1411 char *nis_map = (char *)lp_nis_home_map_name();
1413 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
1414 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
1418 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
1420 if (!strcmp(user_name, last_key)) {
1421 nis_result = last_value;
1422 nis_result_len = strlen(last_value);
1425 if ((nis_error = yp_match(nis_domain, nis_map, user_name, strlen(user_name),
1426 &nis_result, &nis_result_len)) == 0) {
1427 fstrcpy(last_key, user_name);
1428 pstrcpy(last_value, nis_result);
1429 strip_mount_options(&last_value);
1431 } else if(nis_error == YPERR_KEY) {
1433 /* If Key lookup fails user home server is not in nis_map
1434 use default information for server, and home directory */
1436 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
1437 user_name, nis_map));
1438 DEBUG(3, ("using defaults for server and home directory\n"));
1440 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
1441 yperr_string(nis_error), user_name, nis_map));
1445 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, last_value));
1448 #endif /* WITH_NISPLUS_HOME */
1451 /*******************************************************************
1452 Are two IPs on the same subnet?
1453 ********************************************************************/
1455 BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask)
1457 uint32 net1,net2,nmask;
1459 nmask = ntohl(mask.s_addr);
1460 net1 = ntohl(ip1.s_addr);
1461 net2 = ntohl(ip2.s_addr);
1463 return((net1 & nmask) == (net2 & nmask));
1467 /****************************************************************************
1468 Check if a process exists. Does this work on all unixes?
1469 ****************************************************************************/
1471 BOOL process_exists(const struct process_id pid)
1473 if (!procid_is_local(&pid)) {
1474 /* This *SEVERELY* needs fixing. */
1478 /* Doing kill with a non-positive pid causes messages to be
1479 * sent to places we don't want. */
1480 SMB_ASSERT(pid.pid > 0);
1481 return(kill(pid.pid,0) == 0 || errno != ESRCH);
1484 BOOL process_exists_by_pid(pid_t pid)
1486 return process_exists(pid_to_procid(pid));
1489 /*******************************************************************
1490 Convert a uid into a user name.
1491 ********************************************************************/
1493 const char *uidtoname(uid_t uid)
1495 static fstring name;
1496 struct passwd *pass;
1498 pass = getpwuid_alloc(NULL, uid);
1500 fstrcpy(name, pass->pw_name);
1503 slprintf(name, sizeof(name) - 1, "%ld",(long int)uid);
1509 /*******************************************************************
1510 Convert a gid into a group name.
1511 ********************************************************************/
1513 char *gidtoname(gid_t gid)
1515 static fstring name;
1518 grp = getgrgid(gid);
1520 return(grp->gr_name);
1521 slprintf(name,sizeof(name) - 1, "%d",(int)gid);
1525 /*******************************************************************
1526 Convert a user name into a uid.
1527 ********************************************************************/
1529 uid_t nametouid(const char *name)
1531 struct passwd *pass;
1535 pass = getpwnam_alloc(NULL, name);
1542 u = (uid_t)strtol(name, &p, 0);
1543 if ((p != name) && (*p == '\0'))
1549 /*******************************************************************
1550 Convert a name to a gid_t if possible. Return -1 if not a group.
1551 ********************************************************************/
1553 gid_t nametogid(const char *name)
1559 g = (gid_t)strtol(name, &p, 0);
1560 if ((p != name) && (*p == '\0'))
1563 grp = sys_getgrnam(name);
1565 return(grp->gr_gid);
1569 /*******************************************************************
1570 Something really nasty happened - panic !
1571 ********************************************************************/
1573 void smb_panic(const char *const why)
1581 if (global_clobber_region_function) {
1582 DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1583 global_clobber_region_function,
1584 global_clobber_region_line));
1589 DEBUG(0,("PANIC (pid %llu): %s\n",
1590 (unsigned long long)sys_getpid(), why));
1593 /* only smbd needs to decrement the smbd counter in connections.tdb */
1594 decrement_smbd_process_count();
1596 cmd = lp_panic_action();
1598 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1599 result = system(cmd);
1602 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1605 DEBUG(0, ("smb_panic(): action returned status %d\n",
1606 WEXITSTATUS(result)));
1612 /*******************************************************************
1613 Print a backtrace of the stack to the debug log. This function
1614 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1615 exit shortly after calling it.
1616 ********************************************************************/
1618 #ifdef HAVE_LIBEXC_H
1622 void log_stack_trace(void)
1624 #ifdef HAVE_BACKTRACE_SYMBOLS
1625 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1626 size_t backtrace_size;
1627 char **backtrace_strings;
1629 /* get the backtrace (stack frames) */
1630 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1631 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1633 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1634 (unsigned long)backtrace_size));
1636 if (backtrace_strings) {
1639 for (i = 0; i < backtrace_size; i++)
1640 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1642 /* Leak the backtrace_strings, rather than risk what free() might do */
1647 /* The IRIX libexc library provides an API for unwinding the stack. See
1648 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1649 * since we are about to abort anyway, it hardly matters.
1653 #define NAMESIZE 32 /* Arbitrary */
1655 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1656 char * names[BACKTRACE_STACK_SIZE];
1657 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1664 ZERO_ARRAY(namebuf);
1666 /* We need to be root so we can open our /proc entry to walk
1667 * our stack. It also helps when we want to dump core.
1671 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1672 names[i] = namebuf + (i * NAMESIZE);
1675 levels = trace_back_stack(0, addrs, names,
1676 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1678 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1679 for (i = 0; i < levels; i++) {
1680 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1685 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1689 /*******************************************************************
1690 A readdir wrapper which just returns the file name.
1691 ********************************************************************/
1693 const char *readdirname(SMB_STRUCT_DIR *p)
1695 SMB_STRUCT_DIRENT *ptr;
1701 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1705 dname = ptr->d_name;
1712 #ifdef HAVE_BROKEN_READDIR_NAME
1713 /* using /usr/ucb/cc is BAD */
1719 int len = NAMLEN(ptr);
1720 memcpy(buf, dname, len);
1728 /*******************************************************************
1729 Utility function used to decide if the last component
1730 of a path matches a (possibly wildcarded) entry in a namelist.
1731 ********************************************************************/
1733 BOOL is_in_path(const char *name, name_compare_entry *namelist, BOOL case_sensitive)
1735 pstring last_component;
1738 /* if we have no list it's obviously not in the path */
1739 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1743 DEBUG(8, ("is_in_path: %s\n", name));
1745 /* Get the last component of the unix name. */
1746 p = strrchr_m(name, '/');
1747 pstrcpy(last_component, p ? ++p : name);
1749 for(; namelist->name != NULL; namelist++) {
1750 if(namelist->is_wild) {
1751 if (mask_match(last_component, namelist->name, case_sensitive)) {
1752 DEBUG(8,("is_in_path: mask match succeeded\n"));
1756 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1757 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1758 DEBUG(8,("is_in_path: match succeeded\n"));
1763 DEBUG(8,("is_in_path: match not found\n"));
1768 /*******************************************************************
1769 Strip a '/' separated list into an array of
1770 name_compare_enties structures suitable for
1771 passing to is_in_path(). We do this for
1772 speed so we can pre-parse all the names in the list
1773 and don't do it for each call to is_in_path().
1774 namelist is modified here and is assumed to be
1775 a copy owned by the caller.
1776 We also check if the entry contains a wildcard to
1777 remove a potentially expensive call to mask_match
1779 ********************************************************************/
1781 void set_namearray(name_compare_entry **ppname_array, char *namelist)
1784 char *nameptr = namelist;
1785 int num_entries = 0;
1788 (*ppname_array) = NULL;
1790 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
1793 /* We need to make two passes over the string. The
1794 first to count the number of elements, the second
1799 if ( *nameptr == '/' ) {
1800 /* cope with multiple (useless) /s) */
1804 /* find the next / */
1805 name_end = strchr_m(nameptr, '/');
1807 /* oops - the last check for a / didn't find one. */
1808 if (name_end == NULL)
1811 /* next segment please */
1812 nameptr = name_end + 1;
1816 if(num_entries == 0)
1819 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1820 DEBUG(0,("set_namearray: malloc fail\n"));
1824 /* Now copy out the names */
1828 if ( *nameptr == '/' ) {
1829 /* cope with multiple (useless) /s) */
1833 /* find the next / */
1834 if ((name_end = strchr_m(nameptr, '/')) != NULL)
1837 /* oops - the last check for a / didn't find one. */
1838 if(name_end == NULL)
1841 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1842 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1843 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1847 /* next segment please */
1848 nameptr = name_end + 1;
1852 (*ppname_array)[i].name = NULL;
1857 /****************************************************************************
1858 Routine to free a namearray.
1859 ****************************************************************************/
1861 void free_namearray(name_compare_entry *name_array)
1865 if(name_array == NULL)
1868 for(i=0; name_array[i].name!=NULL; i++)
1869 SAFE_FREE(name_array[i].name);
1870 SAFE_FREE(name_array);
1874 #define DBGC_CLASS DBGC_LOCKING
1876 /****************************************************************************
1877 Simple routine to do POSIX file locking. Cruft in NFS and 64->32 bit mapping
1878 is dealt with in posix.c
1879 Returns True if the lock was granted, False otherwise.
1880 ****************************************************************************/
1882 BOOL fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
1884 SMB_STRUCT_FLOCK lock;
1887 DEBUG(8,("fcntl_lock %d %d %.0f %.0f %d\n",fd,op,(double)offset,(double)count,type));
1890 lock.l_whence = SEEK_SET;
1891 lock.l_start = offset;
1895 ret = sys_fcntl_ptr(fd,op,&lock);
1898 DEBUG(3,("fcntl_lock: lock failed at offset %.0f count %.0f op %d type %d (%s)\n",
1899 (double)offset,(double)count,op,type,strerror(errno)));
1903 /* everything went OK */
1904 DEBUG(8,("fcntl_lock: Lock call successful\n"));
1909 /****************************************************************************
1910 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1911 is dealt with in posix.c
1912 Returns True if we have information regarding this lock region (and returns
1913 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1914 ****************************************************************************/
1916 BOOL fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1918 SMB_STRUCT_FLOCK lock;
1921 DEBUG(8,("fcntl_getlock %d %.0f %.0f %d\n",fd,(double)*poffset,(double)*pcount,*ptype));
1923 lock.l_type = *ptype;
1924 lock.l_whence = SEEK_SET;
1925 lock.l_start = *poffset;
1926 lock.l_len = *pcount;
1929 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
1932 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
1933 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
1937 *ptype = lock.l_type;
1938 *poffset = lock.l_start;
1939 *pcount = lock.l_len;
1942 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
1943 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
1948 #define DBGC_CLASS DBGC_ALL
1950 /*******************************************************************
1951 Is the name specified one of my netbios names.
1952 Returns true if it is equal, false otherwise.
1953 ********************************************************************/
1955 BOOL is_myname(const char *s)
1960 for (n=0; my_netbios_names(n); n++) {
1961 if (strequal(my_netbios_names(n), s)) {
1966 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
1970 BOOL is_myname_or_ipaddr(const char *s)
1972 fstring name, dnsname;
1978 /* santize the string from '\\name' */
1982 servername = strrchr_m( name, '\\' );
1988 /* optimize for the common case */
1990 if (strequal(servername, global_myname()))
1993 /* check for an alias */
1995 if (is_myname(servername))
1998 /* check for loopback */
2000 if (strequal(servername, "localhost"))
2003 /* maybe it's my dns name */
2005 if ( get_mydnsfullname( dnsname ) )
2006 if ( strequal( servername, dnsname ) )
2009 /* handle possible CNAME records */
2011 if ( !is_ipaddress( servername ) ) {
2012 /* use DNS to resolve the name, but only the first address */
2015 if (((hp = sys_gethostbyname(name)) != NULL) && (hp->h_addr != NULL)) {
2016 struct in_addr return_ip;
2017 putip( (char*)&return_ip, (char*)hp->h_addr );
2018 fstrcpy( name, inet_ntoa( return_ip ) );
2023 /* maybe its an IP address? */
2024 if (is_ipaddress(servername)) {
2025 struct iface_struct nics[MAX_INTERFACES];
2029 ip = interpret_addr(servername);
2030 if ((ip==0) || (ip==0xffffffff))
2033 n = get_interfaces(nics, MAX_INTERFACES);
2034 for (i=0; i<n; i++) {
2035 if (ip == nics[i].ip.s_addr)
2044 /*******************************************************************
2045 Is the name specified our workgroup/domain.
2046 Returns true if it is equal, false otherwise.
2047 ********************************************************************/
2049 BOOL is_myworkgroup(const char *s)
2053 if (strequal(s, lp_workgroup())) {
2057 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
2061 /*******************************************************************
2062 we distinguish between 2K and XP by the "Native Lan Manager" string
2063 WinXP => "Windows 2002 5.1"
2064 Win2k => "Windows 2000 5.0"
2065 NT4 => "Windows NT 4.0"
2066 Win9x => "Windows 4.0"
2067 Windows 2003 doesn't set the native lan manager string but
2068 they do set the domain to "Windows 2003 5.2" (probably a bug).
2069 ********************************************************************/
2071 void ra_lanman_string( const char *native_lanman )
2073 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
2074 set_remote_arch( RA_WINXP );
2075 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
2076 set_remote_arch( RA_WIN2K3 );
2079 /*******************************************************************
2080 Set the horrid remote_arch string based on an enum.
2081 ********************************************************************/
2083 void set_remote_arch(enum remote_arch_types type)
2088 fstrcpy(remote_arch, "WfWg");
2091 fstrcpy(remote_arch, "OS2");
2094 fstrcpy(remote_arch, "Win95");
2097 fstrcpy(remote_arch, "WinNT");
2100 fstrcpy(remote_arch, "Win2K");
2103 fstrcpy(remote_arch, "WinXP");
2106 fstrcpy(remote_arch, "Win2K3");
2109 fstrcpy(remote_arch,"Samba");
2112 fstrcpy(remote_arch,"CIFSFS");
2115 ra_type = RA_UNKNOWN;
2116 fstrcpy(remote_arch, "UNKNOWN");
2120 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n", remote_arch));
2123 /*******************************************************************
2124 Get the remote_arch type.
2125 ********************************************************************/
2127 enum remote_arch_types get_remote_arch(void)
2132 void print_asc(int level, const unsigned char *buf,int len)
2136 DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
2139 void dump_data(int level, const char *buf1,int len)
2141 const unsigned char *buf = (const unsigned char *)buf1;
2145 if (!DEBUGLVL(level)) return;
2147 DEBUGADD(level,("[%03X] ",i));
2149 DEBUGADD(level,("%02X ",(int)buf[i]));
2151 if (i%8 == 0) DEBUGADD(level,(" "));
2153 print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
2154 print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
2155 if (i<len) DEBUGADD(level,("[%03X] ",i));
2161 DEBUGADD(level,(" "));
2162 if (n>8) DEBUGADD(level,(" "));
2163 while (n--) DEBUGADD(level,(" "));
2165 print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " ));
2167 if (n>0) print_asc(level,&buf[i-n],n);
2168 DEBUGADD(level,("\n"));
2172 void dump_data_pw(const char *msg, const uchar * data, size_t len)
2174 #ifdef DEBUG_PASSWORD
2175 DEBUG(11, ("%s", msg));
2176 if (data != NULL && len > 0)
2178 dump_data(11, (const char *)data, len);
2183 char *tab_depth(int depth)
2185 static pstring spaces;
2186 memset(spaces, ' ', depth * 4);
2187 spaces[depth * 4] = 0;
2191 /*****************************************************************************
2192 Provide a checksum on a string
2194 Input: s - the null-terminated character string for which the checksum
2197 Output: The checksum value calculated for s.
2198 *****************************************************************************/
2200 int str_checksum(const char *s)
2208 res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
2215 /*****************************************************************
2216 Zero a memory area then free it. Used to catch bugs faster.
2217 *****************************************************************/
2219 void zero_free(void *p, size_t size)
2225 /*****************************************************************
2226 Set our open file limit to a requested max and return the limit.
2227 *****************************************************************/
2229 int set_maxfiles(int requested_max)
2231 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
2233 int saved_current_limit;
2235 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2236 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
2239 return requested_max;
2243 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
2244 * account for the extra fd we need
2245 * as well as the log files and standard
2246 * handles etc. Save the limit we want to set in case
2247 * we are running on an OS that doesn't support this limit (AIX)
2248 * which always returns RLIM_INFINITY for rlp.rlim_max.
2251 /* Try raising the hard (max) limit to the requested amount. */
2253 #if defined(RLIM_INFINITY)
2254 if (rlp.rlim_max != RLIM_INFINITY) {
2255 int orig_max = rlp.rlim_max;
2257 if ( rlp.rlim_max < requested_max )
2258 rlp.rlim_max = requested_max;
2260 /* This failing is not an error - many systems (Linux) don't
2261 support our default request of 10,000 open files. JRA. */
2263 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2264 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
2265 (int)rlp.rlim_max, strerror(errno) ));
2267 /* Set failed - restore original value from get. */
2268 rlp.rlim_max = orig_max;
2273 /* Now try setting the soft (current) limit. */
2275 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
2277 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2278 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
2279 (int)rlp.rlim_cur, strerror(errno) ));
2281 return saved_current_limit;
2284 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2285 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2288 return saved_current_limit;
2291 #if defined(RLIM_INFINITY)
2292 if(rlp.rlim_cur == RLIM_INFINITY)
2293 return saved_current_limit;
2296 if((int)rlp.rlim_cur > saved_current_limit)
2297 return saved_current_limit;
2299 return rlp.rlim_cur;
2300 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2302 * No way to know - just guess...
2304 return requested_max;
2308 /*****************************************************************
2309 Possibly replace mkstemp if it is broken.
2310 *****************************************************************/
2312 int smb_mkstemp(char *name_template)
2314 #if HAVE_SECURE_MKSTEMP
2315 return mkstemp(name_template);
2317 /* have a reasonable go at emulating it. Hope that
2318 the system mktemp() isn't completly hopeless */
2319 char *p = mktemp(name_template);
2322 return open(p, O_CREAT|O_EXCL|O_RDWR, 0600);
2326 /*****************************************************************
2327 malloc that aborts with smb_panic on fail or zero size.
2328 *****************************************************************/
2330 void *smb_xmalloc_array(size_t size, unsigned int count)
2334 smb_panic("smb_xmalloc_array: called with zero size.\n");
2335 if (count >= MAX_ALLOC_SIZE/size) {
2336 smb_panic("smb_xmalloc: alloc size too large.\n");
2338 if ((p = SMB_MALLOC(size*count)) == NULL) {
2339 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2340 (unsigned long)size, (unsigned long)count));
2341 smb_panic("smb_xmalloc_array: malloc fail.\n");
2347 Memdup with smb_panic on fail.
2350 void *smb_xmemdup(const void *p, size_t size)
2353 p2 = SMB_XMALLOC_ARRAY(unsigned char,size);
2354 memcpy(p2, p, size);
2359 strdup that aborts on malloc fail.
2362 char *smb_xstrdup(const char *s)
2364 #if defined(PARANOID_MALLOC_CHECKER)
2369 char *s1 = strdup(s);
2370 #if defined(PARANOID_MALLOC_CHECKER)
2371 #define strdup(s) __ERROR_DONT_USE_STRDUP_DIRECTLY
2374 smb_panic("smb_xstrdup: malloc fail\n");
2380 strndup that aborts on malloc fail.
2383 char *smb_xstrndup(const char *s, size_t n)
2385 #if defined(PARANOID_MALLOC_CHECKER)
2390 char *s1 = strndup(s, n);
2391 #if defined(PARANOID_MALLOC_CHECKER)
2392 #define strndup(s,n) __ERROR_DONT_USE_STRNDUP_DIRECTLY
2395 smb_panic("smb_xstrndup: malloc fail\n");
2400 vasprintf that aborts on malloc fail
2403 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
2410 n = vasprintf(ptr, format, ap2);
2411 if (n == -1 || ! *ptr)
2412 smb_panic("smb_xvasprintf: out of memory");
2416 /*****************************************************************
2417 Like strdup but for memory.
2418 *****************************************************************/
2420 void *memdup(const void *p, size_t size)
2425 p2 = SMB_MALLOC(size);
2428 memcpy(p2, p, size);
2432 /*****************************************************************
2433 Get local hostname and cache result.
2434 *****************************************************************/
2436 char *myhostname(void)
2444 /*****************************************************************
2445 A useful function for returning a path in the Samba lock directory.
2446 *****************************************************************/
2448 char *lock_path(const char *name)
2450 static pstring fname;
2452 pstrcpy(fname,lp_lockdir());
2453 trim_char(fname,'\0','/');
2455 if (!directory_exist(fname,NULL))
2459 pstrcat(fname,name);
2464 /*****************************************************************
2465 A useful function for returning a path in the Samba pid directory.
2466 *****************************************************************/
2468 char *pid_path(const char *name)
2470 static pstring fname;
2472 pstrcpy(fname,lp_piddir());
2473 trim_char(fname,'\0','/');
2475 if (!directory_exist(fname,NULL))
2479 pstrcat(fname,name);
2485 * @brief Returns an absolute path to a file in the Samba lib directory.
2487 * @param name File to find, relative to LIBDIR.
2489 * @retval Pointer to a static #pstring containing the full path.
2492 char *lib_path(const char *name)
2494 static pstring fname;
2495 fstr_sprintf(fname, "%s/%s", dyn_LIBDIR, name);
2500 * @brief Returns the platform specific shared library extension.
2502 * @retval Pointer to a static #fstring containing the extension.
2505 const char *shlib_ext(void)
2507 return dyn_SHLIBEXT;
2510 /*******************************************************************
2511 Given a filename - get its directory name
2512 NB: Returned in static storage. Caveats:
2513 o Not safe in thread environment.
2514 o Caller must not free.
2515 o If caller wishes to preserve, they should copy.
2516 ********************************************************************/
2518 char *parent_dirname(const char *path)
2520 static pstring dirpath;
2526 pstrcpy(dirpath, path);
2527 p = strrchr_m(dirpath, '/'); /* Find final '/', if any */
2529 pstrcpy(dirpath, "."); /* No final "/", so dir is "." */
2532 ++p; /* For root "/", leave "/" in place */
2539 /*******************************************************************
2540 Determine if a pattern contains any Microsoft wildcard characters.
2541 *******************************************************************/
2543 BOOL ms_has_wild(const char *s)
2547 if (lp_posix_pathnames()) {
2548 /* With posix pathnames no characters are wild. */
2552 while ((c = *s++)) {
2565 BOOL ms_has_wild_w(const smb_ucs2_t *s)
2568 if (!s) return False;
2569 while ((c = *s++)) {
2571 case UCS2_CHAR('*'):
2572 case UCS2_CHAR('?'):
2573 case UCS2_CHAR('<'):
2574 case UCS2_CHAR('>'):
2575 case UCS2_CHAR('"'):
2582 /*******************************************************************
2583 A wrapper that handles case sensitivity and the special handling
2585 *******************************************************************/
2587 BOOL mask_match(const char *string, char *pattern, BOOL is_case_sensitive)
2589 if (strcmp(string,"..") == 0)
2591 if (strcmp(pattern,".") == 0)
2594 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2597 /*******************************************************************
2598 A wrapper that handles case sensitivity and the special handling
2599 of the ".." name. Varient that is only called by old search code which requires
2600 pattern translation.
2601 *******************************************************************/
2603 BOOL mask_match_search(const char *string, char *pattern, BOOL is_case_sensitive)
2605 if (strcmp(string,"..") == 0)
2607 if (strcmp(pattern,".") == 0)
2610 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2613 /*******************************************************************
2614 A wrapper that handles a list of patters and calls mask_match()
2615 on each. Returns True if any of the patterns match.
2616 *******************************************************************/
2618 BOOL mask_match_list(const char *string, char **list, int listLen, BOOL is_case_sensitive)
2620 while (listLen-- > 0) {
2621 if (mask_match(string, *list++, is_case_sensitive))
2627 /*********************************************************
2628 Recursive routine that is called by unix_wild_match.
2629 *********************************************************/
2631 static BOOL unix_do_match(const char *regexp, const char *str)
2635 for( p = regexp; *p && *str; ) {
2646 * Look for a character matching
2647 * the one after the '*'.
2651 return True; /* Automatic match */
2654 while(*str && (*p != *str))
2658 * Patch from weidel@multichart.de. In the case of the regexp
2659 * '*XX*' we want to ensure there are at least 2 'X' characters
2660 * in the string after the '*' for a match to be made.
2667 * Eat all the characters that match, but count how many there were.
2670 while(*str && (*p == *str)) {
2676 * Now check that if the regexp had n identical characters that
2677 * matchcount had at least that many matches.
2680 while ( *(p+1) && (*(p+1) == *p)) {
2685 if ( matchcount <= 0 )
2689 str--; /* We've eaten the match char after the '*' */
2691 if(unix_do_match(p, str))
2713 if (!*p && str[0] == '.' && str[1] == 0)
2716 if (!*str && *p == '?') {
2722 if(!*str && (*p == '*' && p[1] == '\0'))
2728 /*******************************************************************
2729 Simple case insensitive interface to a UNIX wildcard matcher.
2730 Returns True if match, False if not.
2731 *******************************************************************/
2733 BOOL unix_wild_match(const char *pattern, const char *string)
2738 pstrcpy(p2, pattern);
2739 pstrcpy(s2, string);
2743 /* Remove any *? and ** from the pattern as they are meaningless */
2744 for(p = p2; *p; p++)
2745 while( *p == '*' && (p[1] == '?' ||p[1] == '*'))
2746 pstrcpy( &p[1], &p[2]);
2748 if (strequal(p2,"*"))
2751 return unix_do_match(p2, s2);
2754 /**********************************************************************
2755 Converts a name to a fully qalified domain name.
2756 ***********************************************************************/
2758 void name_to_fqdn(fstring fqdn, const char *name)
2760 struct hostent *hp = sys_gethostbyname(name);
2761 if ( hp && hp->h_name && *hp->h_name ) {
2762 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, hp->h_name));
2763 fstrcpy(fqdn,hp->h_name);
2765 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2766 fstrcpy(fqdn, name);
2770 /**********************************************************************
2771 Extension to talloc_get_type: Abort on type mismatch
2772 ***********************************************************************/
2774 void *talloc_check_name_abort(const void *ptr, const char *name)
2781 result = talloc_check_name(ptr, name);
2785 DEBUG(0, ("Talloc type mismatch, expected %s, got %s\n",
2786 name, talloc_get_name(ptr)));
2787 smb_panic("aborting");
2788 /* Keep the compiler happy */
2795 /*******************************************************************
2796 This routine is a trick to immediately catch errors when debugging
2797 with insure. A xterm with a gdb is popped up when insure catches
2798 a error. It is Linux specific.
2799 ********************************************************************/
2801 int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6)
2806 /* you can get /usr/bin/backtrace from
2807 http://samba.org/ftp/unpacked/junkcode/backtrace */
2808 pstring cmd = "/usr/bin/backtrace %d";
2810 slprintf(pidstr, sizeof(pidstr)-1, "%d", sys_getpid());
2811 pstring_sub(cmd, "%d", pidstr);
2815 h = dlopen("/usr/local/parasoft/insure++lite/lib.linux2/libinsure.so", RTLD_LAZY);
2816 fn = dlsym(h, "_Insure_trap_error");
2818 if (!h || h == _Insure_trap_error) {
2819 h = dlopen("/usr/local/parasoft/lib.linux2/libinsure.so", RTLD_LAZY);
2820 fn = dlsym(h, "_Insure_trap_error");
2824 ret = fn(a1, a2, a3, a4, a5, a6);
2832 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2834 switch (share_access & ~FILE_SHARE_DELETE) {
2835 case FILE_SHARE_NONE:
2837 case FILE_SHARE_READ:
2839 case FILE_SHARE_WRITE:
2841 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2844 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2846 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2853 pid_t procid_to_pid(const struct process_id *proc)
2858 struct process_id pid_to_procid(pid_t pid)
2860 struct process_id result;
2865 struct process_id procid_self(void)
2867 return pid_to_procid(sys_getpid());
2870 BOOL procid_equal(const struct process_id *p1, const struct process_id *p2)
2872 return (p1->pid == p2->pid);
2875 BOOL procid_is_me(const struct process_id *pid)
2877 return (pid->pid == sys_getpid());
2880 struct process_id interpret_pid(const char *pid_string)
2882 return pid_to_procid(atoi(pid_string));
2885 char *procid_str_static(const struct process_id *pid)
2888 fstr_sprintf(str, "%d", pid->pid);
2892 char *procid_str(TALLOC_CTX *mem_ctx, const struct process_id *pid)
2894 return talloc_strdup(mem_ctx, procid_str_static(pid));
2897 BOOL procid_valid(const struct process_id *pid)
2899 return (pid->pid != -1);
2902 BOOL procid_is_local(const struct process_id *pid)