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
8 Copyright (C) James Peach 2006
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 extern fstring local_machine;
28 extern char *global_clobber_region_function;
29 extern unsigned int global_clobber_region_line;
30 extern fstring remote_arch;
32 /* Max allowable allococation - 256mb - 0x10000000 */
33 #define MAX_ALLOC_SIZE (1024*1024*256)
35 #if (defined(HAVE_NETGROUP) && defined (WITH_AUTOMOUNT))
36 #ifdef WITH_NISPLUS_HOME
37 #ifdef BROKEN_NISPLUS_INCLUDE_FILES
39 * The following lines are needed due to buggy include files
40 * in Solaris 2.6 which define GROUP in both /usr/include/sys/acl.h and
41 * also in /usr/include/rpcsvc/nis.h. The definitions conflict. JRA.
42 * Also GROUP_OBJ is defined as 0x4 in /usr/include/sys/acl.h and as
43 * an enum in /usr/include/rpcsvc/nis.h.
50 #if defined(GROUP_OBJ)
54 #endif /* BROKEN_NISPLUS_INCLUDE_FILES */
56 #include <rpcsvc/nis.h>
58 #endif /* WITH_NISPLUS_HOME */
59 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
61 enum protocol_types Protocol = PROTOCOL_COREPLUS;
63 /* a default finfo structure to ensure all fields are sensible */
66 /* this is used by the chaining code */
71 static enum remote_arch_types ra_type = RA_UNKNOWN;
72 pstring user_socket_options=DEFAULT_SOCKET_OPTIONS;
74 /***********************************************************************
75 Definitions for all names.
76 ***********************************************************************/
78 static char *smb_myname;
79 static char *smb_myworkgroup;
80 static char *smb_scope;
81 static int smb_num_netbios_names;
82 static char **smb_my_netbios_names;
84 /***********************************************************************
85 Allocate and set myname. Ensure upper case.
86 ***********************************************************************/
88 BOOL set_global_myname(const char *myname)
90 SAFE_FREE(smb_myname);
91 smb_myname = SMB_STRDUP(myname);
94 strupper_m(smb_myname);
98 const char *global_myname(void)
103 /***********************************************************************
104 Allocate and set myworkgroup. Ensure upper case.
105 ***********************************************************************/
107 BOOL set_global_myworkgroup(const char *myworkgroup)
109 SAFE_FREE(smb_myworkgroup);
110 smb_myworkgroup = SMB_STRDUP(myworkgroup);
111 if (!smb_myworkgroup)
113 strupper_m(smb_myworkgroup);
117 const char *lp_workgroup(void)
119 return smb_myworkgroup;
122 /***********************************************************************
123 Allocate and set scope. Ensure upper case.
124 ***********************************************************************/
126 BOOL set_global_scope(const char *scope)
128 SAFE_FREE(smb_scope);
129 smb_scope = SMB_STRDUP(scope);
132 strupper_m(smb_scope);
136 /*********************************************************************
137 Ensure scope is never null string.
138 *********************************************************************/
140 const char *global_scope(void)
143 set_global_scope("");
147 static void free_netbios_names_array(void)
151 for (i = 0; i < smb_num_netbios_names; i++)
152 SAFE_FREE(smb_my_netbios_names[i]);
154 SAFE_FREE(smb_my_netbios_names);
155 smb_num_netbios_names = 0;
158 static BOOL allocate_my_netbios_names_array(size_t number)
160 free_netbios_names_array();
162 smb_num_netbios_names = number + 1;
163 smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
165 if (!smb_my_netbios_names)
168 memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
172 static BOOL set_my_netbios_names(const char *name, int i)
174 SAFE_FREE(smb_my_netbios_names[i]);
176 smb_my_netbios_names[i] = SMB_STRDUP(name);
177 if (!smb_my_netbios_names[i])
179 strupper_m(smb_my_netbios_names[i]);
183 /***********************************************************************
184 Free memory allocated to global objects
185 ***********************************************************************/
187 void gfree_names(void)
189 SAFE_FREE( smb_myname );
190 SAFE_FREE( smb_myworkgroup );
191 SAFE_FREE( smb_scope );
192 free_netbios_names_array();
195 void gfree_all( void )
204 /* release the talloc null_context memory last */
205 talloc_disable_null_tracking();
208 const char *my_netbios_names(int i)
210 return smb_my_netbios_names[i];
213 BOOL set_netbios_aliases(const char **str_array)
217 /* Work out the max number of netbios aliases that we have */
218 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
221 if ( global_myname() && *global_myname())
224 /* Allocate space for the netbios aliases */
225 if (!allocate_my_netbios_names_array(namecount))
228 /* Use the global_myname string first */
230 if ( global_myname() && *global_myname()) {
231 set_my_netbios_names( global_myname(), namecount );
237 for ( i = 0; str_array[i] != NULL; i++) {
239 BOOL duplicate = False;
241 /* Look for duplicates */
242 for( n=0; n<namecount; n++ ) {
243 if( strequal( str_array[i], my_netbios_names(n) ) ) {
249 if (!set_my_netbios_names(str_array[i], namecount))
258 /****************************************************************************
259 Common name initialization code.
260 ****************************************************************************/
262 BOOL init_names(void)
267 if (global_myname() == NULL || *global_myname() == '\0') {
268 if (!set_global_myname(myhostname())) {
269 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
274 if (!set_netbios_aliases(lp_netbios_aliases())) {
275 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
279 fstrcpy( local_machine, global_myname() );
280 trim_char( local_machine, ' ', ' ' );
281 p = strchr( local_machine, ' ' );
284 strlower_m( local_machine );
286 DEBUG( 5, ("Netbios name list:-\n") );
287 for( n=0; my_netbios_names(n); n++ )
288 DEBUGADD( 5, ( "my_netbios_names[%d]=\"%s\"\n", n, my_netbios_names(n) ) );
293 /**************************************************************************n
294 Find a suitable temporary directory. The result should be copied immediately
295 as it may be overwritten by a subsequent call.
296 ****************************************************************************/
298 const char *tmpdir(void)
301 if ((p = getenv("TMPDIR")))
306 /****************************************************************************
307 Add a gid to an array of gids if it's not already there.
308 ****************************************************************************/
310 BOOL add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
311 gid_t **gids, size_t *num_gids)
315 if ((*num_gids != 0) && (*gids == NULL)) {
317 * A former call to this routine has failed to allocate memory
322 for (i=0; i<*num_gids; i++) {
323 if ((*gids)[i] == gid) {
328 *gids = TALLOC_REALLOC_ARRAY(mem_ctx, *gids, gid_t, *num_gids+1);
334 (*gids)[*num_gids] = gid;
339 /****************************************************************************
340 Like atoi but gets the value up to the separator character.
341 ****************************************************************************/
343 static const char *Atoic(const char *p, int *n, const char *c)
345 if (!isdigit((int)*p)) {
346 DEBUG(5, ("Atoic: malformed number\n"));
352 while ((*p) && isdigit((int)*p))
355 if (strchr_m(c, *p) == NULL) {
356 DEBUG(5, ("Atoic: no separator characters (%s) not found\n", c));
363 /*************************************************************************
364 Reads a list of numbers.
365 *************************************************************************/
367 const char *get_numlist(const char *p, uint32 **num, int *count)
371 if (num == NULL || count == NULL)
377 while ((p = Atoic(p, &val, ":,")) != NULL && (*p) != ':') {
378 *num = SMB_REALLOC_ARRAY((*num), uint32, (*count)+1);
382 (*num)[(*count)] = val;
390 /*******************************************************************
391 Check if a file exists - call vfs_file_exist for samba files.
392 ********************************************************************/
394 BOOL file_exist(const char *fname,SMB_STRUCT_STAT *sbuf)
400 if (sys_stat(fname,sbuf) != 0)
403 return((S_ISREG(sbuf->st_mode)) || (S_ISFIFO(sbuf->st_mode)));
406 /*******************************************************************
407 Check a files mod time.
408 ********************************************************************/
410 time_t file_modtime(const char *fname)
414 if (sys_stat(fname,&st) != 0)
420 /*******************************************************************
421 Check if a directory exists.
422 ********************************************************************/
424 BOOL directory_exist(char *dname,SMB_STRUCT_STAT *st)
432 if (sys_stat(dname,st) != 0)
435 ret = S_ISDIR(st->st_mode);
441 /*******************************************************************
442 Returns the size in bytes of the named file.
443 ********************************************************************/
445 SMB_OFF_T get_file_size(char *file_name)
449 if(sys_stat(file_name,&buf) != 0)
450 return (SMB_OFF_T)-1;
454 /*******************************************************************
455 Return a string representing an attribute for a file.
456 ********************************************************************/
458 char *attrib_string(uint16 mode)
460 static fstring attrstr;
464 if (mode & aVOLID) fstrcat(attrstr,"V");
465 if (mode & aDIR) fstrcat(attrstr,"D");
466 if (mode & aARCH) fstrcat(attrstr,"A");
467 if (mode & aHIDDEN) fstrcat(attrstr,"H");
468 if (mode & aSYSTEM) fstrcat(attrstr,"S");
469 if (mode & aRONLY) fstrcat(attrstr,"R");
474 /*******************************************************************
475 Show a smb message structure.
476 ********************************************************************/
478 void show_msg(char *buf)
486 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
488 (int)CVAL(buf,smb_com),
489 (int)CVAL(buf,smb_rcls),
490 (int)CVAL(buf,smb_reh),
491 (int)SVAL(buf,smb_err),
492 (int)CVAL(buf,smb_flg),
493 (int)SVAL(buf,smb_flg2)));
494 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
495 (int)SVAL(buf,smb_tid),
496 (int)SVAL(buf,smb_pid),
497 (int)SVAL(buf,smb_uid),
498 (int)SVAL(buf,smb_mid)));
499 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
501 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
502 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
503 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
505 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
507 DEBUGADD(5,("smb_bcc=%d\n",bcc));
515 dump_data(10, smb_buf(buf), bcc);
518 /*******************************************************************
519 Set the length and marker of an smb packet.
520 ********************************************************************/
522 void smb_setlen(char *buf,int len)
524 _smb_setlen(buf,len);
532 /*******************************************************************
533 Setup the word count and byte count for a smb message.
534 ********************************************************************/
536 int set_message(char *buf,int num_words,int num_bytes,BOOL zero)
538 if (zero && (num_words || num_bytes)) {
539 memset(buf + smb_size,'\0',num_words*2 + num_bytes);
541 SCVAL(buf,smb_wct,num_words);
542 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
543 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
544 return (smb_size + num_words*2 + num_bytes);
547 /*******************************************************************
548 Setup only the byte count for a smb message.
549 ********************************************************************/
551 int set_message_bcc(char *buf,int num_bytes)
553 int num_words = CVAL(buf,smb_wct);
554 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
555 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
556 return (smb_size + num_words*2 + num_bytes);
559 /*******************************************************************
560 Setup only the byte count for a smb message, using the end of the
562 ********************************************************************/
564 int set_message_end(void *outbuf,void *end_ptr)
566 return set_message_bcc((char *)outbuf,PTR_DIFF(end_ptr,smb_buf((char *)outbuf)));
569 /*******************************************************************
570 Reduce a file name, removing .. elements.
571 ********************************************************************/
573 void dos_clean_name(char *s)
577 DEBUG(3,("dos_clean_name [%s]\n",s));
579 /* remove any double slashes */
580 all_string_sub(s, "\\\\", "\\", 0);
582 while ((p = strstr_m(s,"\\..\\")) != NULL) {
588 if ((p=strrchr_m(s,'\\')) != NULL)
595 trim_string(s,NULL,"\\..");
597 all_string_sub(s, "\\.\\", "\\", 0);
600 /*******************************************************************
601 Reduce a file name, removing .. elements.
602 ********************************************************************/
604 void unix_clean_name(char *s)
608 DEBUG(3,("unix_clean_name [%s]\n",s));
610 /* remove any double slashes */
611 all_string_sub(s, "//","/", 0);
613 /* Remove leading ./ characters */
614 if(strncmp(s, "./", 2) == 0) {
615 trim_string(s, "./", NULL);
620 while ((p = strstr_m(s,"/../")) != NULL) {
626 if ((p=strrchr_m(s,'/')) != NULL)
633 trim_string(s,NULL,"/..");
636 /*******************************************************************
637 Close the low 3 fd's and open dev/null in their place.
638 ********************************************************************/
640 void close_low_fds(BOOL stderr_too)
652 /* try and use up these file descriptors, so silly
653 library routines writing to stdout etc won't cause havoc */
655 if (i == 2 && !stderr_too)
658 fd = sys_open("/dev/null",O_RDWR,0);
660 fd = sys_open("/dev/null",O_WRONLY,0);
662 DEBUG(0,("Can't open /dev/null\n"));
666 DEBUG(0,("Didn't get file descriptor %d\n",i));
673 /*******************************************************************
674 Write data into an fd at a given offset. Ignore seek errors.
675 ********************************************************************/
677 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
682 if (pos == (SMB_OFF_T)-1) {
683 return write_data(fd, buffer, N);
685 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
687 ret = sys_pwrite(fd,buffer + total,N - total, pos);
688 if (ret == -1 && errno == ESPIPE) {
689 return write_data(fd, buffer + total,N - total);
692 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
701 return (ssize_t)total;
703 /* Use lseek and write_data. */
704 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
705 if (errno != ESPIPE) {
709 return write_data(fd, buffer, N);
713 /****************************************************************************
714 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
718 ****************************************************************************/
720 int set_blocking(int fd, BOOL set)
724 #define FLAG_TO_SET O_NONBLOCK
727 #define FLAG_TO_SET O_NDELAY
729 #define FLAG_TO_SET FNDELAY
733 if((val = sys_fcntl_long(fd, F_GETFL, 0)) == -1)
735 if(set) /* Turn blocking on - ie. clear nonblock flag */
739 return sys_fcntl_long( fd, F_SETFL, val);
743 /****************************************************************************
744 Transfer some data between two fd's.
745 ****************************************************************************/
747 #ifndef TRANSFER_BUF_SIZE
748 #define TRANSFER_BUF_SIZE 65536
751 ssize_t transfer_file_internal(int infd, int outfd, size_t n, ssize_t (*read_fn)(int, void *, size_t),
752 ssize_t (*write_fn)(int, const void *, size_t))
758 size_t num_to_read_thistime;
759 size_t num_written = 0;
761 if ((buf = SMB_MALLOC_ARRAY(char, TRANSFER_BUF_SIZE)) == NULL)
765 num_to_read_thistime = MIN((n - total), TRANSFER_BUF_SIZE);
767 read_ret = (*read_fn)(infd, buf, num_to_read_thistime);
768 if (read_ret == -1) {
769 DEBUG(0,("transfer_file_internal: read failure. Error = %s\n", strerror(errno) ));
778 while (num_written < read_ret) {
779 write_ret = (*write_fn)(outfd,buf + num_written, read_ret - num_written);
781 if (write_ret == -1) {
782 DEBUG(0,("transfer_file_internal: write failure. Error = %s\n", strerror(errno) ));
787 return (ssize_t)total;
789 num_written += (size_t)write_ret;
792 total += (size_t)read_ret;
796 return (ssize_t)total;
799 SMB_OFF_T transfer_file(int infd,int outfd,SMB_OFF_T n)
801 return (SMB_OFF_T)transfer_file_internal(infd, outfd, (size_t)n, sys_read, sys_write);
804 /*******************************************************************
805 Sleep for a specified number of milliseconds.
806 ********************************************************************/
808 void smb_msleep(unsigned int t)
810 #if defined(HAVE_NANOSLEEP)
811 struct timespec tval;
814 tval.tv_sec = t/1000;
815 tval.tv_nsec = 1000000*(t%1000);
819 ret = nanosleep(&tval, &tval);
820 } while (ret < 0 && errno == EINTR && (tval.tv_sec > 0 || tval.tv_nsec > 0));
822 unsigned int tdiff=0;
823 struct timeval tval,t1,t2;
830 tval.tv_sec = (t-tdiff)/1000;
831 tval.tv_usec = 1000*((t-tdiff)%1000);
833 /* Never wait for more than 1 sec. */
834 if (tval.tv_sec > 1) {
841 sys_select_intr(0,&fds,NULL,NULL,&tval);
844 if (t2.tv_sec < t1.tv_sec) {
845 /* Someone adjusted time... */
849 tdiff = TvalDiff(&t1,&t2);
854 /****************************************************************************
855 Become a daemon, discarding the controlling terminal.
856 ****************************************************************************/
858 void become_daemon(BOOL Fork, BOOL no_process_group)
866 /* detach from the terminal */
868 if (!no_process_group) setsid();
869 #elif defined(TIOCNOTTY)
870 if (!no_process_group) {
871 int i = sys_open("/dev/tty", O_RDWR, 0);
873 ioctl(i, (int) TIOCNOTTY, (char *)0);
877 #endif /* HAVE_SETSID */
879 /* Close fd's 0,1,2. Needed if started by rsh */
880 close_low_fds(False); /* Don't close stderr, let the debug system
881 attach it to the logfile */
884 /****************************************************************************
885 Put up a yes/no prompt.
886 ****************************************************************************/
893 if (!fgets(ans,sizeof(ans)-1,stdin))
896 if (*ans == 'y' || *ans == 'Y')
902 #if defined(PARANOID_MALLOC_CHECKER)
904 /****************************************************************************
905 Internal malloc wrapper. Externally visible.
906 ****************************************************************************/
908 void *malloc_(size_t size)
912 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
915 /****************************************************************************
916 Internal calloc wrapper. Not externally visible.
917 ****************************************************************************/
919 static void *calloc_(size_t count, size_t size)
922 return calloc(count, size);
923 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
926 /****************************************************************************
927 Internal realloc wrapper. Not externally visible.
928 ****************************************************************************/
930 static void *realloc_(void *ptr, size_t size)
933 return realloc(ptr, size);
934 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
937 #endif /* PARANOID_MALLOC_CHECKER */
939 /****************************************************************************
941 ****************************************************************************/
943 void *malloc_array(size_t el_size, unsigned int count)
945 if (count >= MAX_ALLOC_SIZE/el_size) {
949 #if defined(PARANOID_MALLOC_CHECKER)
950 return malloc_(el_size*count);
952 return malloc(el_size*count);
956 /****************************************************************************
958 ****************************************************************************/
960 void *calloc_array(size_t size, size_t nmemb)
962 if (nmemb >= MAX_ALLOC_SIZE/size) {
965 #if defined(PARANOID_MALLOC_CHECKER)
966 return calloc_(nmemb, size);
968 return calloc(nmemb, size);
972 /****************************************************************************
973 Expand a pointer to be a particular size.
974 Note that this version of Realloc has an extra parameter that decides
975 whether to free the passed in storage on allocation failure or if the
978 This is designed for use in the typical idiom of :
980 p = SMB_REALLOC(p, size)
985 and not to have to keep track of the old 'p' contents to free later, nor
986 to worry if the size parameter was zero. In the case where NULL is returned
987 we guarentee that p has been freed.
989 If free later semantics are desired, then pass 'free_old_on_error' as False which
990 guarentees that the old contents are not freed on error, even if size == 0. To use
993 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
1001 Changes were instigated by Coverity error checking. JRA.
1002 ****************************************************************************/
1004 void *Realloc(void *p, size_t size, BOOL free_old_on_error)
1009 if (free_old_on_error) {
1012 DEBUG(2,("Realloc asked for 0 bytes\n"));
1016 #if defined(PARANOID_MALLOC_CHECKER)
1018 ret = (void *)malloc_(size);
1020 ret = (void *)realloc_(p,size);
1024 ret = (void *)malloc(size);
1026 ret = (void *)realloc(p,size);
1031 if (free_old_on_error && p) {
1034 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
1040 /****************************************************************************
1042 ****************************************************************************/
1044 void *realloc_array(void *p, size_t el_size, unsigned int count, BOOL free_old_on_error)
1046 if (count >= MAX_ALLOC_SIZE/el_size) {
1047 if (free_old_on_error) {
1052 return Realloc(p, el_size*count, free_old_on_error);
1055 /****************************************************************************
1056 (Hopefully) efficient array append.
1057 ****************************************************************************/
1059 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
1060 void *element, void *_array, uint32 *num_elements,
1061 ssize_t *array_size)
1063 void **array = (void **)_array;
1065 if (*array_size < 0) {
1069 if (*array == NULL) {
1070 if (*array_size == 0) {
1074 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1078 *array = TALLOC(mem_ctx, element_size * (*array_size));
1079 if (*array == NULL) {
1084 if (*num_elements == *array_size) {
1087 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1091 *array = TALLOC_REALLOC(mem_ctx, *array,
1092 element_size * (*array_size));
1094 if (*array == NULL) {
1099 memcpy((char *)(*array) + element_size*(*num_elements),
1100 element, element_size);
1110 /****************************************************************************
1111 Free memory, checks for NULL.
1112 Use directly SAFE_FREE()
1113 Exists only because we need to pass a function pointer somewhere --SSS
1114 ****************************************************************************/
1116 void safe_free(void *p)
1121 /****************************************************************************
1122 Get my own name and IP.
1123 ****************************************************************************/
1125 BOOL get_myname(char *my_name)
1131 /* get my host name */
1132 if (gethostname(hostname, sizeof(hostname)) == -1) {
1133 DEBUG(0,("gethostname failed\n"));
1137 /* Ensure null termination. */
1138 hostname[sizeof(hostname)-1] = '\0';
1141 /* split off any parts after an initial . */
1142 char *p = strchr_m(hostname,'.');
1147 fstrcpy(my_name,hostname);
1153 /****************************************************************************
1154 Get my own canonical name, including domain.
1155 ****************************************************************************/
1157 BOOL get_mydnsfullname(fstring my_dnsname)
1159 static fstring dnshostname;
1162 if (!*dnshostname) {
1163 /* get my host name */
1164 if (gethostname(dnshostname, sizeof(dnshostname)) == -1) {
1165 *dnshostname = '\0';
1166 DEBUG(0,("gethostname failed\n"));
1170 /* Ensure null termination. */
1171 dnshostname[sizeof(dnshostname)-1] = '\0';
1173 /* Ensure we get the cannonical name. */
1174 if (!(hp = sys_gethostbyname(dnshostname))) {
1175 *dnshostname = '\0';
1178 fstrcpy(dnshostname, hp->h_name);
1180 fstrcpy(my_dnsname, dnshostname);
1184 /****************************************************************************
1185 Get my own domain name.
1186 ****************************************************************************/
1188 BOOL get_mydnsdomname(fstring my_domname)
1194 if (!get_mydnsfullname(domname)) {
1197 p = strchr_m(domname, '.');
1200 fstrcpy(my_domname, p);
1206 /****************************************************************************
1207 Interpret a protocol description string, with a default.
1208 ****************************************************************************/
1210 int interpret_protocol(const char *str,int def)
1212 if (strequal(str,"NT1"))
1213 return(PROTOCOL_NT1);
1214 if (strequal(str,"LANMAN2"))
1215 return(PROTOCOL_LANMAN2);
1216 if (strequal(str,"LANMAN1"))
1217 return(PROTOCOL_LANMAN1);
1218 if (strequal(str,"CORE"))
1219 return(PROTOCOL_CORE);
1220 if (strequal(str,"COREPLUS"))
1221 return(PROTOCOL_COREPLUS);
1222 if (strequal(str,"CORE+"))
1223 return(PROTOCOL_COREPLUS);
1225 DEBUG(0,("Unrecognised protocol level %s\n",str));
1230 /****************************************************************************
1231 Return true if a string could be a pure IP address.
1232 ****************************************************************************/
1234 BOOL is_ipaddress(const char *str)
1236 BOOL pure_address = True;
1239 for (i=0; pure_address && str[i]; i++)
1240 if (!(isdigit((int)str[i]) || str[i] == '.'))
1241 pure_address = False;
1243 /* Check that a pure number is not misinterpreted as an IP */
1244 pure_address = pure_address && (strchr_m(str, '.') != NULL);
1246 return pure_address;
1249 /****************************************************************************
1250 Interpret an internet address or name into an IP address in 4 byte form.
1251 ****************************************************************************/
1253 uint32 interpret_addr(const char *str)
1258 if (strcmp(str,"0.0.0.0") == 0)
1260 if (strcmp(str,"255.255.255.255") == 0)
1263 /* if it's in the form of an IP address then get the lib to interpret it */
1264 if (is_ipaddress(str)) {
1265 res = inet_addr(str);
1267 /* otherwise assume it's a network name of some sort and use
1268 sys_gethostbyname */
1269 if ((hp = sys_gethostbyname(str)) == 0) {
1270 DEBUG(3,("sys_gethostbyname: Unknown host. %s\n",str));
1274 if(hp->h_addr == NULL) {
1275 DEBUG(3,("sys_gethostbyname: host address is invalid for host %s\n",str));
1278 putip((char *)&res,(char *)hp->h_addr);
1281 if (res == (uint32)-1)
1287 /*******************************************************************
1288 A convenient addition to interpret_addr().
1289 ******************************************************************/
1291 struct in_addr *interpret_addr2(const char *str)
1293 static struct in_addr ret;
1294 uint32 a = interpret_addr(str);
1299 /*******************************************************************
1300 Check if an IP is the 0.0.0.0.
1301 ******************************************************************/
1303 BOOL is_zero_ip(struct in_addr ip)
1306 putip((char *)&a,(char *)&ip);
1310 /*******************************************************************
1311 Set an IP to 0.0.0.0.
1312 ******************************************************************/
1314 void zero_ip(struct in_addr *ip)
1317 static struct in_addr ipzero;
1320 ipzero = *interpret_addr2("0.0.0.0");
1327 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1328 /******************************************************************
1329 Remove any mount options such as -rsize=2048,wsize=2048 etc.
1330 Based on a fix from <Thomas.Hepper@icem.de>.
1331 *******************************************************************/
1333 static void strip_mount_options( pstring *str)
1337 while(*p && !isspace(*p))
1339 while(*p && isspace(*p))
1344 pstrcpy(tmp_str, p);
1345 pstrcpy(*str, tmp_str);
1350 /*******************************************************************
1351 Patch from jkf@soton.ac.uk
1352 Split Luke's automount_server into YP lookup and string splitter
1353 so can easily implement automount_path().
1354 As we may end up doing both, cache the last YP result.
1355 *******************************************************************/
1357 #ifdef WITH_NISPLUS_HOME
1358 char *automount_lookup(const char *user_name)
1360 static fstring last_key = "";
1361 static pstring last_value = "";
1363 char *nis_map = (char *)lp_nis_home_map_name();
1365 char buffer[NIS_MAXATTRVAL + 1];
1370 if (strcmp(user_name, last_key)) {
1371 slprintf(buffer, sizeof(buffer)-1, "[key=%s],%s", user_name, nis_map);
1372 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
1374 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
1375 if (result->status != NIS_SUCCESS) {
1376 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
1377 fstrcpy(last_key, ""); pstrcpy(last_value, "");
1379 object = result->objects.objects_val;
1380 if (object->zo_data.zo_type == ENTRY_OBJ) {
1381 entry = &object->zo_data.objdata_u.en_data;
1382 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
1383 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
1385 pstrcpy(last_value, entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
1386 pstring_sub(last_value, "&", user_name);
1387 fstrcpy(last_key, user_name);
1391 nis_freeresult(result);
1394 strip_mount_options(&last_value);
1396 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n", user_name, last_value));
1399 #else /* WITH_NISPLUS_HOME */
1401 char *automount_lookup(const char *user_name)
1403 static fstring last_key = "";
1404 static pstring last_value = "";
1406 int nis_error; /* returned by yp all functions */
1407 char *nis_result; /* yp_match inits this */
1408 int nis_result_len; /* and set this */
1409 char *nis_domain; /* yp_get_default_domain inits this */
1410 char *nis_map = (char *)lp_nis_home_map_name();
1412 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
1413 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
1417 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
1419 if (!strcmp(user_name, last_key)) {
1420 nis_result = last_value;
1421 nis_result_len = strlen(last_value);
1424 if ((nis_error = yp_match(nis_domain, nis_map, user_name, strlen(user_name),
1425 &nis_result, &nis_result_len)) == 0) {
1426 fstrcpy(last_key, user_name);
1427 pstrcpy(last_value, nis_result);
1428 strip_mount_options(&last_value);
1430 } else if(nis_error == YPERR_KEY) {
1432 /* If Key lookup fails user home server is not in nis_map
1433 use default information for server, and home directory */
1435 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
1436 user_name, nis_map));
1437 DEBUG(3, ("using defaults for server and home directory\n"));
1439 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
1440 yperr_string(nis_error), user_name, nis_map));
1444 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, last_value));
1447 #endif /* WITH_NISPLUS_HOME */
1450 /*******************************************************************
1451 Are two IPs on the same subnet?
1452 ********************************************************************/
1454 BOOL same_net(struct in_addr ip1,struct in_addr ip2,struct in_addr mask)
1456 uint32 net1,net2,nmask;
1458 nmask = ntohl(mask.s_addr);
1459 net1 = ntohl(ip1.s_addr);
1460 net2 = ntohl(ip2.s_addr);
1462 return((net1 & nmask) == (net2 & nmask));
1466 /****************************************************************************
1467 Check if a process exists. Does this work on all unixes?
1468 ****************************************************************************/
1470 BOOL process_exists(const struct process_id pid)
1472 if (procid_is_me(&pid)) {
1476 if (!procid_is_local(&pid)) {
1477 /* This *SEVERELY* needs fixing. */
1481 /* Doing kill with a non-positive pid causes messages to be
1482 * sent to places we don't want. */
1483 SMB_ASSERT(pid.pid > 0);
1484 return(kill(pid.pid,0) == 0 || errno != ESRCH);
1487 BOOL process_exists_by_pid(pid_t pid)
1489 return process_exists(pid_to_procid(pid));
1492 /*******************************************************************
1493 Convert a uid into a user name.
1494 ********************************************************************/
1496 const char *uidtoname(uid_t uid)
1498 static fstring name;
1499 struct passwd *pass;
1501 pass = getpwuid_alloc(NULL, uid);
1503 fstrcpy(name, pass->pw_name);
1506 slprintf(name, sizeof(name) - 1, "%ld",(long int)uid);
1512 /*******************************************************************
1513 Convert a gid into a group name.
1514 ********************************************************************/
1516 char *gidtoname(gid_t gid)
1518 static fstring name;
1521 grp = getgrgid(gid);
1523 return(grp->gr_name);
1524 slprintf(name,sizeof(name) - 1, "%d",(int)gid);
1528 /*******************************************************************
1529 Convert a user name into a uid.
1530 ********************************************************************/
1532 uid_t nametouid(const char *name)
1534 struct passwd *pass;
1538 pass = getpwnam_alloc(NULL, name);
1545 u = (uid_t)strtol(name, &p, 0);
1546 if ((p != name) && (*p == '\0'))
1552 /*******************************************************************
1553 Convert a name to a gid_t if possible. Return -1 if not a group.
1554 ********************************************************************/
1556 gid_t nametogid(const char *name)
1562 g = (gid_t)strtol(name, &p, 0);
1563 if ((p != name) && (*p == '\0'))
1566 grp = sys_getgrnam(name);
1568 return(grp->gr_gid);
1572 /*******************************************************************
1573 Something really nasty happened - panic !
1574 ********************************************************************/
1576 void smb_panic(const char *const why)
1584 if (global_clobber_region_function) {
1585 DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1586 global_clobber_region_function,
1587 global_clobber_region_line));
1592 DEBUG(0,("PANIC (pid %llu): %s\n",
1593 (unsigned long long)sys_getpid(), why));
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_LIBUNWIND_H
1619 #include <libunwind.h>
1622 #ifdef HAVE_EXECINFO_H
1623 #include <execinfo.h>
1626 #ifdef HAVE_LIBEXC_H
1630 void log_stack_trace(void)
1632 #ifdef HAVE_LIBUNWIND
1633 /* Try to use libunwind before any other technique since on ia64
1634 * libunwind correctly walks the stack in more circumstances than
1637 unw_cursor_t cursor;
1642 unw_word_t ip, sp, off;
1644 procname[sizeof(procname) - 1] = '\0';
1646 if (unw_getcontext(&uc) != 0) {
1647 goto libunwind_failed;
1650 if (unw_init_local(&cursor, &uc) != 0) {
1651 goto libunwind_failed;
1654 DEBUG(0, ("BACKTRACE:\n"));
1658 unw_get_reg(&cursor, UNW_REG_IP, &ip);
1659 unw_get_reg(&cursor, UNW_REG_SP, &sp);
1661 switch (unw_get_proc_name(&cursor,
1662 procname, sizeof(procname) - 1, &off) ) {
1666 /* Name truncated. */
1667 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1668 i, procname, (long long)off,
1669 (long long)ip, (long long) sp));
1672 /* case -UNW_ENOINFO: */
1673 /* case -UNW_EUNSPEC: */
1674 /* No symbol name found. */
1675 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1676 i, "<unknown symbol>",
1677 (long long)ip, (long long) sp));
1680 } while (unw_step(&cursor) > 0);
1685 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1687 #elif HAVE_BACKTRACE_SYMBOLS
1688 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1689 size_t backtrace_size;
1690 char **backtrace_strings;
1692 /* get the backtrace (stack frames) */
1693 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1694 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1696 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1697 (unsigned long)backtrace_size));
1699 if (backtrace_strings) {
1702 for (i = 0; i < backtrace_size; i++)
1703 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1705 /* Leak the backtrace_strings, rather than risk what free() might do */
1710 /* The IRIX libexc library provides an API for unwinding the stack. See
1711 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1712 * since we are about to abort anyway, it hardly matters.
1715 #define NAMESIZE 32 /* Arbitrary */
1717 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1718 char * names[BACKTRACE_STACK_SIZE];
1719 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1726 ZERO_ARRAY(namebuf);
1728 /* We need to be root so we can open our /proc entry to walk
1729 * our stack. It also helps when we want to dump core.
1733 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1734 names[i] = namebuf + (i * NAMESIZE);
1737 levels = trace_back_stack(0, addrs, names,
1738 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1740 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1741 for (i = 0; i < levels; i++) {
1742 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1747 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1751 /*******************************************************************
1752 A readdir wrapper which just returns the file name.
1753 ********************************************************************/
1755 const char *readdirname(SMB_STRUCT_DIR *p)
1757 SMB_STRUCT_DIRENT *ptr;
1763 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1767 dname = ptr->d_name;
1774 #ifdef HAVE_BROKEN_READDIR_NAME
1775 /* using /usr/ucb/cc is BAD */
1781 int len = NAMLEN(ptr);
1782 memcpy(buf, dname, len);
1790 /*******************************************************************
1791 Utility function used to decide if the last component
1792 of a path matches a (possibly wildcarded) entry in a namelist.
1793 ********************************************************************/
1795 BOOL is_in_path(const char *name, name_compare_entry *namelist, BOOL case_sensitive)
1797 pstring last_component;
1800 /* if we have no list it's obviously not in the path */
1801 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1805 DEBUG(8, ("is_in_path: %s\n", name));
1807 /* Get the last component of the unix name. */
1808 p = strrchr_m(name, '/');
1809 pstrcpy(last_component, p ? ++p : name);
1811 for(; namelist->name != NULL; namelist++) {
1812 if(namelist->is_wild) {
1813 if (mask_match(last_component, namelist->name, case_sensitive)) {
1814 DEBUG(8,("is_in_path: mask match succeeded\n"));
1818 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1819 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1820 DEBUG(8,("is_in_path: match succeeded\n"));
1825 DEBUG(8,("is_in_path: match not found\n"));
1830 /*******************************************************************
1831 Strip a '/' separated list into an array of
1832 name_compare_enties structures suitable for
1833 passing to is_in_path(). We do this for
1834 speed so we can pre-parse all the names in the list
1835 and don't do it for each call to is_in_path().
1836 namelist is modified here and is assumed to be
1837 a copy owned by the caller.
1838 We also check if the entry contains a wildcard to
1839 remove a potentially expensive call to mask_match
1841 ********************************************************************/
1843 void set_namearray(name_compare_entry **ppname_array, char *namelist)
1846 char *nameptr = namelist;
1847 int num_entries = 0;
1850 (*ppname_array) = NULL;
1852 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
1855 /* We need to make two passes over the string. The
1856 first to count the number of elements, the second
1861 if ( *nameptr == '/' ) {
1862 /* cope with multiple (useless) /s) */
1866 /* find the next / */
1867 name_end = strchr_m(nameptr, '/');
1869 /* oops - the last check for a / didn't find one. */
1870 if (name_end == NULL)
1873 /* next segment please */
1874 nameptr = name_end + 1;
1878 if(num_entries == 0)
1881 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1882 DEBUG(0,("set_namearray: malloc fail\n"));
1886 /* Now copy out the names */
1890 if ( *nameptr == '/' ) {
1891 /* cope with multiple (useless) /s) */
1895 /* find the next / */
1896 if ((name_end = strchr_m(nameptr, '/')) != NULL)
1899 /* oops - the last check for a / didn't find one. */
1900 if(name_end == NULL)
1903 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1904 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1905 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1909 /* next segment please */
1910 nameptr = name_end + 1;
1914 (*ppname_array)[i].name = NULL;
1919 /****************************************************************************
1920 Routine to free a namearray.
1921 ****************************************************************************/
1923 void free_namearray(name_compare_entry *name_array)
1927 if(name_array == NULL)
1930 for(i=0; name_array[i].name!=NULL; i++)
1931 SAFE_FREE(name_array[i].name);
1932 SAFE_FREE(name_array);
1936 #define DBGC_CLASS DBGC_LOCKING
1938 /****************************************************************************
1939 Simple routine to do POSIX file locking. Cruft in NFS and 64->32 bit mapping
1940 is dealt with in posix.c
1941 Returns True if the lock was granted, False otherwise.
1942 ****************************************************************************/
1944 BOOL fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
1946 SMB_STRUCT_FLOCK lock;
1949 DEBUG(8,("fcntl_lock fd=%d op=%d offset=%.0f count=%.0f type=%d\n",
1950 fd,op,(double)offset,(double)count,type));
1953 lock.l_whence = SEEK_SET;
1954 lock.l_start = offset;
1958 ret = sys_fcntl_ptr(fd,op,&lock);
1962 DEBUG(3,("fcntl_lock: lock failed at offset %.0f count %.0f op %d type %d (%s)\n",
1963 (double)offset,(double)count,op,type,strerror(errno)));
1968 /* everything went OK */
1969 DEBUG(8,("fcntl_lock: Lock call successful\n"));
1974 /****************************************************************************
1975 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1976 is dealt with in posix.c
1977 Returns True if we have information regarding this lock region (and returns
1978 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1979 ****************************************************************************/
1981 BOOL fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1983 SMB_STRUCT_FLOCK lock;
1986 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
1987 fd,(double)*poffset,(double)*pcount,*ptype));
1989 lock.l_type = *ptype;
1990 lock.l_whence = SEEK_SET;
1991 lock.l_start = *poffset;
1992 lock.l_len = *pcount;
1995 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
1999 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
2000 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
2005 *ptype = lock.l_type;
2006 *poffset = lock.l_start;
2007 *pcount = lock.l_len;
2010 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
2011 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
2016 #define DBGC_CLASS DBGC_ALL
2018 /*******************************************************************
2019 Is the name specified one of my netbios names.
2020 Returns true if it is equal, false otherwise.
2021 ********************************************************************/
2023 BOOL is_myname(const char *s)
2028 for (n=0; my_netbios_names(n); n++) {
2029 if (strequal(my_netbios_names(n), s)) {
2034 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
2038 BOOL is_myname_or_ipaddr(const char *s)
2040 fstring name, dnsname;
2046 /* santize the string from '\\name' */
2050 servername = strrchr_m( name, '\\' );
2056 /* optimize for the common case */
2058 if (strequal(servername, global_myname()))
2061 /* check for an alias */
2063 if (is_myname(servername))
2066 /* check for loopback */
2068 if (strequal(servername, "localhost"))
2071 /* maybe it's my dns name */
2073 if ( get_mydnsfullname( dnsname ) )
2074 if ( strequal( servername, dnsname ) )
2077 /* handle possible CNAME records */
2079 if ( !is_ipaddress( servername ) ) {
2080 /* use DNS to resolve the name, but only the first address */
2083 if (((hp = sys_gethostbyname(name)) != NULL) && (hp->h_addr != NULL)) {
2084 struct in_addr return_ip;
2085 putip( (char*)&return_ip, (char*)hp->h_addr );
2086 fstrcpy( name, inet_ntoa( return_ip ) );
2091 /* maybe its an IP address? */
2092 if (is_ipaddress(servername)) {
2093 struct iface_struct nics[MAX_INTERFACES];
2097 ip = interpret_addr(servername);
2098 if ((ip==0) || (ip==0xffffffff))
2101 n = get_interfaces(nics, MAX_INTERFACES);
2102 for (i=0; i<n; i++) {
2103 if (ip == nics[i].ip.s_addr)
2112 /*******************************************************************
2113 Is the name specified our workgroup/domain.
2114 Returns true if it is equal, false otherwise.
2115 ********************************************************************/
2117 BOOL is_myworkgroup(const char *s)
2121 if (strequal(s, lp_workgroup())) {
2125 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
2129 /*******************************************************************
2130 we distinguish between 2K and XP by the "Native Lan Manager" string
2131 WinXP => "Windows 2002 5.1"
2132 Win2k => "Windows 2000 5.0"
2133 NT4 => "Windows NT 4.0"
2134 Win9x => "Windows 4.0"
2135 Windows 2003 doesn't set the native lan manager string but
2136 they do set the domain to "Windows 2003 5.2" (probably a bug).
2137 ********************************************************************/
2139 void ra_lanman_string( const char *native_lanman )
2141 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
2142 set_remote_arch( RA_WINXP );
2143 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
2144 set_remote_arch( RA_WIN2K3 );
2147 /*******************************************************************
2148 Set the horrid remote_arch string based on an enum.
2149 ********************************************************************/
2151 void set_remote_arch(enum remote_arch_types type)
2156 fstrcpy(remote_arch, "WfWg");
2159 fstrcpy(remote_arch, "OS2");
2162 fstrcpy(remote_arch, "Win95");
2165 fstrcpy(remote_arch, "WinNT");
2168 fstrcpy(remote_arch, "Win2K");
2171 fstrcpy(remote_arch, "WinXP");
2174 fstrcpy(remote_arch, "Win2K3");
2177 fstrcpy(remote_arch, "Vista");
2180 fstrcpy(remote_arch,"Samba");
2183 fstrcpy(remote_arch,"CIFSFS");
2186 ra_type = RA_UNKNOWN;
2187 fstrcpy(remote_arch, "UNKNOWN");
2191 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n", remote_arch));
2194 /*******************************************************************
2195 Get the remote_arch type.
2196 ********************************************************************/
2198 enum remote_arch_types get_remote_arch(void)
2203 void print_asc(int level, const unsigned char *buf,int len)
2207 DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
2210 void dump_data(int level, const char *buf1,int len)
2212 const unsigned char *buf = (const unsigned char *)buf1;
2216 if (!DEBUGLVL(level)) return;
2218 DEBUGADD(level,("[%03X] ",i));
2220 DEBUGADD(level,("%02X ",(int)buf[i]));
2222 if (i%8 == 0) DEBUGADD(level,(" "));
2224 print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
2225 print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
2226 if (i<len) DEBUGADD(level,("[%03X] ",i));
2232 DEBUGADD(level,(" "));
2233 if (n>8) DEBUGADD(level,(" "));
2234 while (n--) DEBUGADD(level,(" "));
2236 print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " ));
2238 if (n>0) print_asc(level,&buf[i-n],n);
2239 DEBUGADD(level,("\n"));
2243 void dump_data_pw(const char *msg, const uchar * data, size_t len)
2245 #ifdef DEBUG_PASSWORD
2246 DEBUG(11, ("%s", msg));
2247 if (data != NULL && len > 0)
2249 dump_data(11, (const char *)data, len);
2254 char *tab_depth(int depth)
2256 static pstring spaces;
2257 memset(spaces, ' ', depth * 4);
2258 spaces[depth * 4] = 0;
2262 /*****************************************************************************
2263 Provide a checksum on a string
2265 Input: s - the null-terminated character string for which the checksum
2268 Output: The checksum value calculated for s.
2269 *****************************************************************************/
2271 int str_checksum(const char *s)
2279 res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
2286 /*****************************************************************
2287 Zero a memory area then free it. Used to catch bugs faster.
2288 *****************************************************************/
2290 void zero_free(void *p, size_t size)
2296 /*****************************************************************
2297 Set our open file limit to a requested max and return the limit.
2298 *****************************************************************/
2300 int set_maxfiles(int requested_max)
2302 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
2304 int saved_current_limit;
2306 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2307 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
2310 return requested_max;
2314 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
2315 * account for the extra fd we need
2316 * as well as the log files and standard
2317 * handles etc. Save the limit we want to set in case
2318 * we are running on an OS that doesn't support this limit (AIX)
2319 * which always returns RLIM_INFINITY for rlp.rlim_max.
2322 /* Try raising the hard (max) limit to the requested amount. */
2324 #if defined(RLIM_INFINITY)
2325 if (rlp.rlim_max != RLIM_INFINITY) {
2326 int orig_max = rlp.rlim_max;
2328 if ( rlp.rlim_max < requested_max )
2329 rlp.rlim_max = requested_max;
2331 /* This failing is not an error - many systems (Linux) don't
2332 support our default request of 10,000 open files. JRA. */
2334 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2335 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
2336 (int)rlp.rlim_max, strerror(errno) ));
2338 /* Set failed - restore original value from get. */
2339 rlp.rlim_max = orig_max;
2344 /* Now try setting the soft (current) limit. */
2346 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
2348 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2349 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
2350 (int)rlp.rlim_cur, strerror(errno) ));
2352 return saved_current_limit;
2355 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2356 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2359 return saved_current_limit;
2362 #if defined(RLIM_INFINITY)
2363 if(rlp.rlim_cur == RLIM_INFINITY)
2364 return saved_current_limit;
2367 if((int)rlp.rlim_cur > saved_current_limit)
2368 return saved_current_limit;
2370 return rlp.rlim_cur;
2371 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2373 * No way to know - just guess...
2375 return requested_max;
2379 /*****************************************************************
2380 Possibly replace mkstemp if it is broken.
2381 *****************************************************************/
2383 int smb_mkstemp(char *name_template)
2385 #if HAVE_SECURE_MKSTEMP
2386 return mkstemp(name_template);
2388 /* have a reasonable go at emulating it. Hope that
2389 the system mktemp() isn't completly hopeless */
2390 char *p = mktemp(name_template);
2393 return open(p, O_CREAT|O_EXCL|O_RDWR, 0600);
2397 /*****************************************************************
2398 malloc that aborts with smb_panic on fail or zero size.
2399 *****************************************************************/
2401 void *smb_xmalloc_array(size_t size, unsigned int count)
2405 smb_panic("smb_xmalloc_array: called with zero size.\n");
2406 if (count >= MAX_ALLOC_SIZE/size) {
2407 smb_panic("smb_xmalloc: alloc size too large.\n");
2409 if ((p = SMB_MALLOC(size*count)) == NULL) {
2410 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2411 (unsigned long)size, (unsigned long)count));
2412 smb_panic("smb_xmalloc_array: malloc fail.\n");
2418 Memdup with smb_panic on fail.
2421 void *smb_xmemdup(const void *p, size_t size)
2424 p2 = SMB_XMALLOC_ARRAY(unsigned char,size);
2425 memcpy(p2, p, size);
2430 strdup that aborts on malloc fail.
2433 char *smb_xstrdup(const char *s)
2435 #if defined(PARANOID_MALLOC_CHECKER)
2442 #define strdup rep_strdup
2445 char *s1 = strdup(s);
2446 #if defined(PARANOID_MALLOC_CHECKER)
2450 #define strdup(s) __ERROR_DONT_USE_STRDUP_DIRECTLY
2453 smb_panic("smb_xstrdup: malloc fail\n");
2459 strndup that aborts on malloc fail.
2462 char *smb_xstrndup(const char *s, size_t n)
2464 #if defined(PARANOID_MALLOC_CHECKER)
2470 #if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
2472 #define strndup rep_strndup
2475 char *s1 = strndup(s, n);
2476 #if defined(PARANOID_MALLOC_CHECKER)
2480 #define strndup(s,n) __ERROR_DONT_USE_STRNDUP_DIRECTLY
2483 smb_panic("smb_xstrndup: malloc fail\n");
2488 vasprintf that aborts on malloc fail
2491 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
2498 n = vasprintf(ptr, format, ap2);
2499 if (n == -1 || ! *ptr)
2500 smb_panic("smb_xvasprintf: out of memory");
2504 /*****************************************************************
2505 Like strdup but for memory.
2506 *****************************************************************/
2508 void *memdup(const void *p, size_t size)
2513 p2 = SMB_MALLOC(size);
2516 memcpy(p2, p, size);
2520 /*****************************************************************
2521 Get local hostname and cache result.
2522 *****************************************************************/
2524 char *myhostname(void)
2532 /*****************************************************************
2533 A useful function for returning a path in the Samba lock directory.
2534 *****************************************************************/
2536 char *lock_path(const char *name)
2538 static pstring fname;
2540 pstrcpy(fname,lp_lockdir());
2541 trim_char(fname,'\0','/');
2543 if (!directory_exist(fname,NULL))
2547 pstrcat(fname,name);
2552 /*****************************************************************
2553 A useful function for returning a path in the Samba pid directory.
2554 *****************************************************************/
2556 char *pid_path(const char *name)
2558 static pstring fname;
2560 pstrcpy(fname,lp_piddir());
2561 trim_char(fname,'\0','/');
2563 if (!directory_exist(fname,NULL))
2567 pstrcat(fname,name);
2573 * @brief Returns an absolute path to a file in the Samba lib directory.
2575 * @param name File to find, relative to LIBDIR.
2577 * @retval Pointer to a static #pstring containing the full path.
2580 char *lib_path(const char *name)
2582 static pstring fname;
2583 fstr_sprintf(fname, "%s/%s", dyn_LIBDIR, name);
2588 * @brief Returns the platform specific shared library extension.
2590 * @retval Pointer to a static #fstring containing the extension.
2593 const char *shlib_ext(void)
2595 return dyn_SHLIBEXT;
2598 /*******************************************************************
2599 Given a filename - get its directory name
2600 NB: Returned in static storage. Caveats:
2601 o Not safe in thread environment.
2602 o Caller must not free.
2603 o If caller wishes to preserve, they should copy.
2604 ********************************************************************/
2606 char *parent_dirname(const char *path)
2608 static pstring dirpath;
2614 pstrcpy(dirpath, path);
2615 p = strrchr_m(dirpath, '/'); /* Find final '/', if any */
2617 pstrcpy(dirpath, "."); /* No final "/", so dir is "." */
2620 ++p; /* For root "/", leave "/" in place */
2626 BOOL parent_dirname_talloc(TALLOC_CTX *mem_ctx, const char *dir,
2627 char **parent, const char **name)
2632 p = strrchr_m(dir, '/'); /* Find final '/', if any */
2635 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
2646 if (!(*parent = TALLOC_ARRAY(mem_ctx, char, len+1))) {
2649 memcpy(*parent, dir, len);
2650 (*parent)[len] = '\0';
2658 /*******************************************************************
2659 Determine if a pattern contains any Microsoft wildcard characters.
2660 *******************************************************************/
2662 BOOL ms_has_wild(const char *s)
2666 if (lp_posix_pathnames()) {
2667 /* With posix pathnames no characters are wild. */
2671 while ((c = *s++)) {
2684 BOOL ms_has_wild_w(const smb_ucs2_t *s)
2687 if (!s) return False;
2688 while ((c = *s++)) {
2690 case UCS2_CHAR('*'):
2691 case UCS2_CHAR('?'):
2692 case UCS2_CHAR('<'):
2693 case UCS2_CHAR('>'):
2694 case UCS2_CHAR('"'):
2701 /*******************************************************************
2702 A wrapper that handles case sensitivity and the special handling
2704 *******************************************************************/
2706 BOOL mask_match(const char *string, char *pattern, BOOL is_case_sensitive)
2708 if (strcmp(string,"..") == 0)
2710 if (strcmp(pattern,".") == 0)
2713 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2716 /*******************************************************************
2717 A wrapper that handles case sensitivity and the special handling
2718 of the ".." name. Varient that is only called by old search code which requires
2719 pattern translation.
2720 *******************************************************************/
2722 BOOL mask_match_search(const char *string, char *pattern, BOOL is_case_sensitive)
2724 if (strcmp(string,"..") == 0)
2726 if (strcmp(pattern,".") == 0)
2729 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2732 /*******************************************************************
2733 A wrapper that handles a list of patters and calls mask_match()
2734 on each. Returns True if any of the patterns match.
2735 *******************************************************************/
2737 BOOL mask_match_list(const char *string, char **list, int listLen, BOOL is_case_sensitive)
2739 while (listLen-- > 0) {
2740 if (mask_match(string, *list++, is_case_sensitive))
2746 /*********************************************************
2747 Recursive routine that is called by unix_wild_match.
2748 *********************************************************/
2750 static BOOL unix_do_match(const char *regexp, const char *str)
2754 for( p = regexp; *p && *str; ) {
2765 * Look for a character matching
2766 * the one after the '*'.
2770 return True; /* Automatic match */
2773 while(*str && (*p != *str))
2777 * Patch from weidel@multichart.de. In the case of the regexp
2778 * '*XX*' we want to ensure there are at least 2 'X' characters
2779 * in the string after the '*' for a match to be made.
2786 * Eat all the characters that match, but count how many there were.
2789 while(*str && (*p == *str)) {
2795 * Now check that if the regexp had n identical characters that
2796 * matchcount had at least that many matches.
2799 while ( *(p+1) && (*(p+1) == *p)) {
2804 if ( matchcount <= 0 )
2808 str--; /* We've eaten the match char after the '*' */
2810 if(unix_do_match(p, str))
2832 if (!*p && str[0] == '.' && str[1] == 0)
2835 if (!*str && *p == '?') {
2841 if(!*str && (*p == '*' && p[1] == '\0'))
2847 /*******************************************************************
2848 Simple case insensitive interface to a UNIX wildcard matcher.
2849 Returns True if match, False if not.
2850 *******************************************************************/
2852 BOOL unix_wild_match(const char *pattern, const char *string)
2857 pstrcpy(p2, pattern);
2858 pstrcpy(s2, string);
2862 /* Remove any *? and ** from the pattern as they are meaningless */
2863 for(p = p2; *p; p++)
2864 while( *p == '*' && (p[1] == '?' ||p[1] == '*'))
2865 pstrcpy( &p[1], &p[2]);
2867 if (strequal(p2,"*"))
2870 return unix_do_match(p2, s2);
2873 /**********************************************************************
2874 Converts a name to a fully qalified domain name.
2875 ***********************************************************************/
2877 void name_to_fqdn(fstring fqdn, const char *name)
2879 struct hostent *hp = sys_gethostbyname(name);
2881 if ( hp && hp->h_name && *hp->h_name ) {
2884 /* find out if the fqdn is returned as an alias
2885 * to cope with /etc/hosts files where the first
2886 * name is not the fqdn but the short name */
2887 if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2889 for (i = 0; hp->h_aliases[i]; i++) {
2890 if (strchr_m(hp->h_aliases[i], '.')) {
2891 full = hp->h_aliases[i];
2896 if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2897 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2898 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2899 DEBUGADD(1, (" to Kerberos authentication probelms as localhost.localdomain\n"));
2900 DEBUGADD(1, (" may end up being used instead of the real machine FQDN.\n"));
2908 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2909 fstrcpy(fqdn, full);
2911 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2912 fstrcpy(fqdn, name);
2916 /**********************************************************************
2917 Extension to talloc_get_type: Abort on type mismatch
2918 ***********************************************************************/
2920 void *talloc_check_name_abort(const void *ptr, const char *name)
2924 result = talloc_check_name(ptr, name);
2928 DEBUG(0, ("Talloc type mismatch, expected %s, got %s\n",
2929 name, talloc_get_name(ptr)));
2930 smb_panic("aborting");
2931 /* Keep the compiler happy */
2938 /*******************************************************************
2939 This routine is a trick to immediately catch errors when debugging
2940 with insure. A xterm with a gdb is popped up when insure catches
2941 a error. It is Linux specific.
2942 ********************************************************************/
2944 int _Insure_trap_error(int a1, int a2, int a3, int a4, int a5, int a6)
2949 /* you can get /usr/bin/backtrace from
2950 http://samba.org/ftp/unpacked/junkcode/backtrace */
2951 pstring cmd = "/usr/bin/backtrace %d";
2953 slprintf(pidstr, sizeof(pidstr)-1, "%d", sys_getpid());
2954 pstring_sub(cmd, "%d", pidstr);
2958 h = dlopen("/usr/local/parasoft/insure++lite/lib.linux2/libinsure.so", RTLD_LAZY);
2959 fn = dlsym(h, "_Insure_trap_error");
2961 if (!h || h == _Insure_trap_error) {
2962 h = dlopen("/usr/local/parasoft/lib.linux2/libinsure.so", RTLD_LAZY);
2963 fn = dlsym(h, "_Insure_trap_error");
2967 ret = fn(a1, a2, a3, a4, a5, a6);
2975 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2977 switch (share_access & ~FILE_SHARE_DELETE) {
2978 case FILE_SHARE_NONE:
2980 case FILE_SHARE_READ:
2982 case FILE_SHARE_WRITE:
2984 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2987 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2989 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2996 pid_t procid_to_pid(const struct process_id *proc)
3001 struct process_id pid_to_procid(pid_t pid)
3003 struct process_id result;
3008 struct process_id procid_self(void)
3010 return pid_to_procid(sys_getpid());
3013 struct server_id server_id_self(void)
3015 struct server_id id;
3016 id.id = procid_self();
3020 BOOL procid_equal(const struct process_id *p1, const struct process_id *p2)
3022 return (p1->pid == p2->pid);
3025 BOOL cluster_id_equal(const struct server_id *id1,
3026 const struct server_id *id2)
3028 return procid_equal(&id1->id, &id2->id);
3031 BOOL procid_is_me(const struct process_id *pid)
3033 return (pid->pid == sys_getpid());
3036 struct process_id interpret_pid(const char *pid_string)
3038 return pid_to_procid(atoi(pid_string));
3041 char *procid_str_static(const struct process_id *pid)
3044 fstr_sprintf(str, "%d", pid->pid);
3048 char *procid_str(TALLOC_CTX *mem_ctx, const struct process_id *pid)
3050 return talloc_strdup(mem_ctx, procid_str_static(pid));
3053 BOOL procid_valid(const struct process_id *pid)
3055 return (pid->pid != -1);
3058 BOOL procid_is_local(const struct process_id *pid)
3063 int this_is_smp(void)
3065 #if defined(HAVE_SYSCONF)
3067 #if defined(SYSCONF_SC_NPROC_ONLN)
3068 return (sysconf(_SC_NPROC_ONLN) > 1) ? 1 : 0;
3069 #elif defined(SYSCONF_SC_NPROCESSORS_ONLN)
3070 return (sysconf(_SC_NPROCESSORS_ONLN) > 1) ? 1 : 0;