Compile fix to the automount support. Patch from GlaDiaC.
[Samba/gebeck_regimport.git] / source3 / lib / util.c
blobf0ea6c8e333244a7148e0b6caafc265475ea0899
1 /*
2 Unix SMB/CIFS implementation.
3 Samba utility functions
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 2001-2007
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 3 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, see <http://www.gnu.org/licenses/>.
24 #include "includes.h"
26 extern char *global_clobber_region_function;
27 extern unsigned int global_clobber_region_line;
29 /* Max allowable allococation - 256mb - 0x10000000 */
30 #define MAX_ALLOC_SIZE (1024*1024*256)
32 #if (defined(HAVE_NETGROUP) && defined (WITH_AUTOMOUNT))
33 #ifdef WITH_NISPLUS_HOME
34 #ifdef BROKEN_NISPLUS_INCLUDE_FILES
36 * The following lines are needed due to buggy include files
37 * in Solaris 2.6 which define GROUP in both /usr/include/sys/acl.h and
38 * also in /usr/include/rpcsvc/nis.h. The definitions conflict. JRA.
39 * Also GROUP_OBJ is defined as 0x4 in /usr/include/sys/acl.h and as
40 * an enum in /usr/include/rpcsvc/nis.h.
43 #if defined(GROUP)
44 #undef GROUP
45 #endif
47 #if defined(GROUP_OBJ)
48 #undef GROUP_OBJ
49 #endif
51 #endif /* BROKEN_NISPLUS_INCLUDE_FILES */
53 #include <rpcsvc/nis.h>
55 #endif /* WITH_NISPLUS_HOME */
56 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
58 enum protocol_types Protocol = PROTOCOL_COREPLUS;
60 /* a default finfo structure to ensure all fields are sensible */
61 file_info def_finfo;
63 /* this is used by the chaining code */
64 int chain_size = 0;
66 int trans_num = 0;
68 static enum remote_arch_types ra_type = RA_UNKNOWN;
70 /***********************************************************************
71 Definitions for all names.
72 ***********************************************************************/
74 static char *smb_myname;
75 static char *smb_myworkgroup;
76 static char *smb_scope;
77 static int smb_num_netbios_names;
78 static char **smb_my_netbios_names;
80 /***********************************************************************
81 Allocate and set myname. Ensure upper case.
82 ***********************************************************************/
84 bool set_global_myname(const char *myname)
86 SAFE_FREE(smb_myname);
87 smb_myname = SMB_STRDUP(myname);
88 if (!smb_myname)
89 return False;
90 strupper_m(smb_myname);
91 return True;
94 const char *global_myname(void)
96 return smb_myname;
99 /***********************************************************************
100 Allocate and set myworkgroup. Ensure upper case.
101 ***********************************************************************/
103 bool set_global_myworkgroup(const char *myworkgroup)
105 SAFE_FREE(smb_myworkgroup);
106 smb_myworkgroup = SMB_STRDUP(myworkgroup);
107 if (!smb_myworkgroup)
108 return False;
109 strupper_m(smb_myworkgroup);
110 return True;
113 const char *lp_workgroup(void)
115 return smb_myworkgroup;
118 /***********************************************************************
119 Allocate and set scope. Ensure upper case.
120 ***********************************************************************/
122 bool set_global_scope(const char *scope)
124 SAFE_FREE(smb_scope);
125 smb_scope = SMB_STRDUP(scope);
126 if (!smb_scope)
127 return False;
128 strupper_m(smb_scope);
129 return True;
132 /*********************************************************************
133 Ensure scope is never null string.
134 *********************************************************************/
136 const char *global_scope(void)
138 if (!smb_scope)
139 set_global_scope("");
140 return smb_scope;
143 static void free_netbios_names_array(void)
145 int i;
147 for (i = 0; i < smb_num_netbios_names; i++)
148 SAFE_FREE(smb_my_netbios_names[i]);
150 SAFE_FREE(smb_my_netbios_names);
151 smb_num_netbios_names = 0;
154 static bool allocate_my_netbios_names_array(size_t number)
156 free_netbios_names_array();
158 smb_num_netbios_names = number + 1;
159 smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
161 if (!smb_my_netbios_names)
162 return False;
164 memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
165 return True;
168 static bool set_my_netbios_names(const char *name, int i)
170 SAFE_FREE(smb_my_netbios_names[i]);
172 smb_my_netbios_names[i] = SMB_STRDUP(name);
173 if (!smb_my_netbios_names[i])
174 return False;
175 strupper_m(smb_my_netbios_names[i]);
176 return True;
179 /***********************************************************************
180 Free memory allocated to global objects
181 ***********************************************************************/
183 void gfree_names(void)
185 SAFE_FREE( smb_myname );
186 SAFE_FREE( smb_myworkgroup );
187 SAFE_FREE( smb_scope );
188 free_netbios_names_array();
191 void gfree_all( void )
193 gfree_names();
194 gfree_loadparm();
195 gfree_case_tables();
196 gfree_debugsyms();
197 gfree_charcnv();
198 gfree_interfaces();
200 /* release the talloc null_context memory last */
201 talloc_disable_null_tracking();
204 const char *my_netbios_names(int i)
206 return smb_my_netbios_names[i];
209 bool set_netbios_aliases(const char **str_array)
211 size_t namecount;
213 /* Work out the max number of netbios aliases that we have */
214 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
217 if ( global_myname() && *global_myname())
218 namecount++;
220 /* Allocate space for the netbios aliases */
221 if (!allocate_my_netbios_names_array(namecount))
222 return False;
224 /* Use the global_myname string first */
225 namecount=0;
226 if ( global_myname() && *global_myname()) {
227 set_my_netbios_names( global_myname(), namecount );
228 namecount++;
231 if (str_array) {
232 size_t i;
233 for ( i = 0; str_array[i] != NULL; i++) {
234 size_t n;
235 bool duplicate = False;
237 /* Look for duplicates */
238 for( n=0; n<namecount; n++ ) {
239 if( strequal( str_array[i], my_netbios_names(n) ) ) {
240 duplicate = True;
241 break;
244 if (!duplicate) {
245 if (!set_my_netbios_names(str_array[i], namecount))
246 return False;
247 namecount++;
251 return True;
254 /****************************************************************************
255 Common name initialization code.
256 ****************************************************************************/
258 bool init_names(void)
260 int n;
262 if (global_myname() == NULL || *global_myname() == '\0') {
263 if (!set_global_myname(myhostname())) {
264 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
265 return False;
269 if (!set_netbios_aliases(lp_netbios_aliases())) {
270 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
271 return False;
274 set_local_machine_name(global_myname(),false);
276 DEBUG( 5, ("Netbios name list:-\n") );
277 for( n=0; my_netbios_names(n); n++ ) {
278 DEBUGADD( 5, ("my_netbios_names[%d]=\"%s\"\n",
279 n, my_netbios_names(n) ) );
282 return( True );
285 /**************************************************************************n
286 Find a suitable temporary directory. The result should be copied immediately
287 as it may be overwritten by a subsequent call.
288 ****************************************************************************/
290 const char *tmpdir(void)
292 char *p;
293 if ((p = getenv("TMPDIR")))
294 return p;
295 return "/tmp";
298 /****************************************************************************
299 Add a gid to an array of gids if it's not already there.
300 ****************************************************************************/
302 bool add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
303 gid_t **gids, size_t *num_gids)
305 int i;
307 if ((*num_gids != 0) && (*gids == NULL)) {
309 * A former call to this routine has failed to allocate memory
311 return False;
314 for (i=0; i<*num_gids; i++) {
315 if ((*gids)[i] == gid) {
316 return True;
320 *gids = TALLOC_REALLOC_ARRAY(mem_ctx, *gids, gid_t, *num_gids+1);
321 if (*gids == NULL) {
322 *num_gids = 0;
323 return False;
326 (*gids)[*num_gids] = gid;
327 *num_gids += 1;
328 return True;
331 /****************************************************************************
332 Like atoi but gets the value up to the separator character.
333 ****************************************************************************/
335 static const char *Atoic(const char *p, int *n, const char *c)
337 if (!isdigit((int)*p)) {
338 DEBUG(5, ("Atoic: malformed number\n"));
339 return NULL;
342 (*n) = atoi(p);
344 while ((*p) && isdigit((int)*p))
345 p++;
347 if (strchr_m(c, *p) == NULL) {
348 DEBUG(5, ("Atoic: no separator characters (%s) not found\n", c));
349 return NULL;
352 return p;
355 /*************************************************************************
356 Reads a list of numbers.
357 *************************************************************************/
359 const char *get_numlist(const char *p, uint32 **num, int *count)
361 int val;
363 if (num == NULL || count == NULL)
364 return NULL;
366 (*count) = 0;
367 (*num ) = NULL;
369 while ((p = Atoic(p, &val, ":,")) != NULL && (*p) != ':') {
370 *num = SMB_REALLOC_ARRAY((*num), uint32, (*count)+1);
371 if (!(*num)) {
372 return NULL;
374 (*num)[(*count)] = val;
375 (*count)++;
376 p++;
379 return p;
382 /*******************************************************************
383 Check if a file exists - call vfs_file_exist for samba files.
384 ********************************************************************/
386 bool file_exist(const char *fname,SMB_STRUCT_STAT *sbuf)
388 SMB_STRUCT_STAT st;
389 if (!sbuf)
390 sbuf = &st;
392 if (sys_stat(fname,sbuf) != 0)
393 return(False);
395 return((S_ISREG(sbuf->st_mode)) || (S_ISFIFO(sbuf->st_mode)));
398 /*******************************************************************
399 Check a files mod time.
400 ********************************************************************/
402 time_t file_modtime(const char *fname)
404 SMB_STRUCT_STAT st;
406 if (sys_stat(fname,&st) != 0)
407 return(0);
409 return(st.st_mtime);
412 /*******************************************************************
413 Check if a directory exists.
414 ********************************************************************/
416 bool directory_exist(char *dname,SMB_STRUCT_STAT *st)
418 SMB_STRUCT_STAT st2;
419 bool ret;
421 if (!st)
422 st = &st2;
424 if (sys_stat(dname,st) != 0)
425 return(False);
427 ret = S_ISDIR(st->st_mode);
428 if(!ret)
429 errno = ENOTDIR;
430 return ret;
433 /*******************************************************************
434 Returns the size in bytes of the named file.
435 ********************************************************************/
437 SMB_OFF_T get_file_size(char *file_name)
439 SMB_STRUCT_STAT buf;
440 buf.st_size = 0;
441 if(sys_stat(file_name,&buf) != 0)
442 return (SMB_OFF_T)-1;
443 return(buf.st_size);
446 /*******************************************************************
447 Return a string representing an attribute for a file.
448 ********************************************************************/
450 char *attrib_string(uint16 mode)
452 fstring attrstr;
454 attrstr[0] = 0;
456 if (mode & aVOLID) fstrcat(attrstr,"V");
457 if (mode & aDIR) fstrcat(attrstr,"D");
458 if (mode & aARCH) fstrcat(attrstr,"A");
459 if (mode & aHIDDEN) fstrcat(attrstr,"H");
460 if (mode & aSYSTEM) fstrcat(attrstr,"S");
461 if (mode & aRONLY) fstrcat(attrstr,"R");
463 return talloc_strdup(talloc_tos(), attrstr);
466 /*******************************************************************
467 Show a smb message structure.
468 ********************************************************************/
470 void show_msg(char *buf)
472 int i;
473 int bcc=0;
475 if (!DEBUGLVL(5))
476 return;
478 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
479 smb_len(buf),
480 (int)CVAL(buf,smb_com),
481 (int)CVAL(buf,smb_rcls),
482 (int)CVAL(buf,smb_reh),
483 (int)SVAL(buf,smb_err),
484 (int)CVAL(buf,smb_flg),
485 (int)SVAL(buf,smb_flg2)));
486 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
487 (int)SVAL(buf,smb_tid),
488 (int)SVAL(buf,smb_pid),
489 (int)SVAL(buf,smb_uid),
490 (int)SVAL(buf,smb_mid)));
491 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
493 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
494 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
495 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
497 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
499 DEBUGADD(5,("smb_bcc=%d\n",bcc));
501 if (DEBUGLEVEL < 10)
502 return;
504 if (DEBUGLEVEL < 50)
505 bcc = MIN(bcc, 512);
507 dump_data(10, (uint8 *)smb_buf(buf), bcc);
510 /*******************************************************************
511 Set the length and marker of an smb packet.
512 ********************************************************************/
514 void smb_setlen(char *buf,int len)
516 _smb_setlen(buf,len);
518 SCVAL(buf,4,0xFF);
519 SCVAL(buf,5,'S');
520 SCVAL(buf,6,'M');
521 SCVAL(buf,7,'B');
524 /*******************************************************************
525 Setup the word count and byte count for a smb message.
526 ********************************************************************/
528 int set_message(char *buf,int num_words,int num_bytes,bool zero)
530 if (zero && (num_words || num_bytes)) {
531 memset(buf + smb_size,'\0',num_words*2 + num_bytes);
533 SCVAL(buf,smb_wct,num_words);
534 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
535 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
536 return (smb_size + num_words*2 + num_bytes);
539 /*******************************************************************
540 Setup only the byte count for a smb message.
541 ********************************************************************/
543 int set_message_bcc(char *buf,int num_bytes)
545 int num_words = CVAL(buf,smb_wct);
546 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
547 smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
548 return (smb_size + num_words*2 + num_bytes);
551 /*******************************************************************
552 Setup only the byte count for a smb message, using the end of the
553 message as a marker.
554 ********************************************************************/
556 int set_message_end(void *outbuf,void *end_ptr)
558 return set_message_bcc((char *)outbuf,PTR_DIFF(end_ptr,smb_buf((char *)outbuf)));
561 /*******************************************************************
562 Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
563 Return the bytes added
564 ********************************************************************/
566 ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
568 size_t newlen = smb_len(*outbuf) + 4 + blob.length;
569 uint8 *tmp;
571 if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
572 DEBUG(0, ("talloc failed\n"));
573 return -1;
575 *outbuf = tmp;
577 memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
578 set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
579 return blob.length;
582 /*******************************************************************
583 Reduce a file name, removing .. elements.
584 ********************************************************************/
586 static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
588 char *p = NULL;
589 char *str = NULL;
591 DEBUG(3,("dos_clean_name [%s]\n",s));
593 /* remove any double slashes */
594 str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
595 if (!str) {
596 return NULL;
599 /* Remove leading .\\ characters */
600 if(strncmp(str, ".\\", 2) == 0) {
601 trim_string(str, ".\\", NULL);
602 if(*str == 0) {
603 str = talloc_strdup(ctx, ".\\");
604 if (!str) {
605 return NULL;
610 while ((p = strstr_m(str,"\\..\\")) != NULL) {
611 char *s1;
613 *p = 0;
614 s1 = p+3;
616 if ((p=strrchr_m(str,'\\')) != NULL) {
617 *p = 0;
618 } else {
619 *str = 0;
621 str = talloc_asprintf(ctx,
622 "%s%s",
623 str,
624 s1);
625 if (!str) {
626 return NULL;
630 trim_string(str,NULL,"\\..");
631 return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
634 /*******************************************************************
635 Reduce a file name, removing .. elements.
636 ********************************************************************/
638 char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
640 char *p = NULL;
641 char *str = NULL;
643 DEBUG(3,("unix_clean_name [%s]\n",s));
645 /* remove any double slashes */
646 str = talloc_all_string_sub(ctx, s, "//","/");
647 if (!str) {
648 return NULL;
651 /* Remove leading ./ characters */
652 if(strncmp(str, "./", 2) == 0) {
653 trim_string(str, "./", NULL);
654 if(*str == 0) {
655 str = talloc_strdup(ctx, "./");
656 if (!str) {
657 return NULL;
662 while ((p = strstr_m(str,"/../")) != NULL) {
663 char *s1;
665 *p = 0;
666 s1 = p+3;
668 if ((p=strrchr_m(str,'/')) != NULL) {
669 *p = 0;
670 } else {
671 *str = 0;
673 str = talloc_asprintf(ctx,
674 "%s%s",
675 str,
676 s1);
677 if (!str) {
678 return NULL;
682 trim_string(str,NULL,"/..");
683 return talloc_all_string_sub(ctx, str, "/./", "/");
686 char *clean_name(TALLOC_CTX *ctx, const char *s)
688 char *str = dos_clean_name(ctx, s);
689 if (!str) {
690 return NULL;
692 return unix_clean_name(ctx, str);
695 /*******************************************************************
696 Horrible temporary hack until pstring is dead.
697 ********************************************************************/
699 char *pstring_clean_name(pstring s)
701 char *str = clean_name(NULL,s);
702 if (!str) {
703 return NULL;
705 pstrcpy(s, str);
706 TALLOC_FREE(str);
707 return s;
710 /*******************************************************************
711 Close the low 3 fd's and open dev/null in their place.
712 ********************************************************************/
714 void close_low_fds(bool stderr_too)
716 #ifndef VALGRIND
717 int fd;
718 int i;
720 close(0);
721 close(1);
723 if (stderr_too)
724 close(2);
726 /* try and use up these file descriptors, so silly
727 library routines writing to stdout etc won't cause havoc */
728 for (i=0;i<3;i++) {
729 if (i == 2 && !stderr_too)
730 continue;
732 fd = sys_open("/dev/null",O_RDWR,0);
733 if (fd < 0)
734 fd = sys_open("/dev/null",O_WRONLY,0);
735 if (fd < 0) {
736 DEBUG(0,("Can't open /dev/null\n"));
737 return;
739 if (fd != i) {
740 DEBUG(0,("Didn't get file descriptor %d\n",i));
741 return;
744 #endif
747 /*******************************************************************
748 Write data into an fd at a given offset. Ignore seek errors.
749 ********************************************************************/
751 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
753 size_t total=0;
754 ssize_t ret;
756 if (pos == (SMB_OFF_T)-1) {
757 return write_data(fd, buffer, N);
759 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
760 while (total < N) {
761 ret = sys_pwrite(fd,buffer + total,N - total, pos);
762 if (ret == -1 && errno == ESPIPE) {
763 return write_data(fd, buffer + total,N - total);
765 if (ret == -1) {
766 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
767 return -1;
769 if (ret == 0) {
770 return total;
772 total += ret;
773 pos += ret;
775 return (ssize_t)total;
776 #else
777 /* Use lseek and write_data. */
778 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
779 if (errno != ESPIPE) {
780 return -1;
783 return write_data(fd, buffer, N);
784 #endif
787 /****************************************************************************
788 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
789 else
790 if SYSV use O_NDELAY
791 if BSD use FNDELAY
792 ****************************************************************************/
794 int set_blocking(int fd, bool set)
796 int val;
797 #ifdef O_NONBLOCK
798 #define FLAG_TO_SET O_NONBLOCK
799 #else
800 #ifdef SYSV
801 #define FLAG_TO_SET O_NDELAY
802 #else /* BSD */
803 #define FLAG_TO_SET FNDELAY
804 #endif
805 #endif
807 if((val = sys_fcntl_long(fd, F_GETFL, 0)) == -1)
808 return -1;
809 if(set) /* Turn blocking on - ie. clear nonblock flag */
810 val &= ~FLAG_TO_SET;
811 else
812 val |= FLAG_TO_SET;
813 return sys_fcntl_long( fd, F_SETFL, val);
814 #undef FLAG_TO_SET
817 /****************************************************************************
818 Transfer some data between two fd's.
819 ****************************************************************************/
821 #ifndef TRANSFER_BUF_SIZE
822 #define TRANSFER_BUF_SIZE 65536
823 #endif
825 ssize_t transfer_file_internal(int infd, int outfd, size_t n, ssize_t (*read_fn)(int, void *, size_t),
826 ssize_t (*write_fn)(int, const void *, size_t))
828 char *buf;
829 size_t total = 0;
830 ssize_t read_ret;
831 ssize_t write_ret;
832 size_t num_to_read_thistime;
833 size_t num_written = 0;
835 if ((buf = SMB_MALLOC_ARRAY(char, TRANSFER_BUF_SIZE)) == NULL)
836 return -1;
838 while (total < n) {
839 num_to_read_thistime = MIN((n - total), TRANSFER_BUF_SIZE);
841 read_ret = (*read_fn)(infd, buf, num_to_read_thistime);
842 if (read_ret == -1) {
843 DEBUG(0,("transfer_file_internal: read failure. Error = %s\n", strerror(errno) ));
844 SAFE_FREE(buf);
845 return -1;
847 if (read_ret == 0)
848 break;
850 num_written = 0;
852 while (num_written < read_ret) {
853 write_ret = (*write_fn)(outfd,buf + num_written, read_ret - num_written);
855 if (write_ret == -1) {
856 DEBUG(0,("transfer_file_internal: write failure. Error = %s\n", strerror(errno) ));
857 SAFE_FREE(buf);
858 return -1;
860 if (write_ret == 0)
861 return (ssize_t)total;
863 num_written += (size_t)write_ret;
866 total += (size_t)read_ret;
869 SAFE_FREE(buf);
870 return (ssize_t)total;
873 SMB_OFF_T transfer_file(int infd,int outfd,SMB_OFF_T n)
875 return (SMB_OFF_T)transfer_file_internal(infd, outfd, (size_t)n, sys_read, sys_write);
878 /*******************************************************************
879 Sleep for a specified number of milliseconds.
880 ********************************************************************/
882 void smb_msleep(unsigned int t)
884 #if defined(HAVE_NANOSLEEP)
885 struct timespec tval;
886 int ret;
888 tval.tv_sec = t/1000;
889 tval.tv_nsec = 1000000*(t%1000);
891 do {
892 errno = 0;
893 ret = nanosleep(&tval, &tval);
894 } while (ret < 0 && errno == EINTR && (tval.tv_sec > 0 || tval.tv_nsec > 0));
895 #else
896 unsigned int tdiff=0;
897 struct timeval tval,t1,t2;
898 fd_set fds;
900 GetTimeOfDay(&t1);
901 t2 = t1;
903 while (tdiff < t) {
904 tval.tv_sec = (t-tdiff)/1000;
905 tval.tv_usec = 1000*((t-tdiff)%1000);
907 /* Never wait for more than 1 sec. */
908 if (tval.tv_sec > 1) {
909 tval.tv_sec = 1;
910 tval.tv_usec = 0;
913 FD_ZERO(&fds);
914 errno = 0;
915 sys_select_intr(0,&fds,NULL,NULL,&tval);
917 GetTimeOfDay(&t2);
918 if (t2.tv_sec < t1.tv_sec) {
919 /* Someone adjusted time... */
920 t1 = t2;
923 tdiff = TvalDiff(&t1,&t2);
925 #endif
928 /****************************************************************************
929 Become a daemon, discarding the controlling terminal.
930 ****************************************************************************/
932 void become_daemon(bool Fork, bool no_process_group)
934 if (Fork) {
935 if (sys_fork()) {
936 _exit(0);
940 /* detach from the terminal */
941 #ifdef HAVE_SETSID
942 if (!no_process_group) setsid();
943 #elif defined(TIOCNOTTY)
944 if (!no_process_group) {
945 int i = sys_open("/dev/tty", O_RDWR, 0);
946 if (i != -1) {
947 ioctl(i, (int) TIOCNOTTY, (char *)0);
948 close(i);
951 #endif /* HAVE_SETSID */
953 /* Close fd's 0,1,2. Needed if started by rsh */
954 close_low_fds(False); /* Don't close stderr, let the debug system
955 attach it to the logfile */
958 /****************************************************************************
959 Put up a yes/no prompt.
960 ****************************************************************************/
962 bool yesno(const char *p)
964 char ans[20];
965 printf("%s",p);
967 if (!fgets(ans,sizeof(ans)-1,stdin))
968 return(False);
970 if (*ans == 'y' || *ans == 'Y')
971 return(True);
973 return(False);
976 #if defined(PARANOID_MALLOC_CHECKER)
978 /****************************************************************************
979 Internal malloc wrapper. Externally visible.
980 ****************************************************************************/
982 void *malloc_(size_t size)
984 if (size == 0) {
985 return NULL;
987 #undef malloc
988 return malloc(size);
989 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
992 /****************************************************************************
993 Internal calloc wrapper. Not externally visible.
994 ****************************************************************************/
996 static void *calloc_(size_t count, size_t size)
998 if (size == 0 || count == 0) {
999 return NULL;
1001 #undef calloc
1002 return calloc(count, size);
1003 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
1006 /****************************************************************************
1007 Internal realloc wrapper. Not externally visible.
1008 ****************************************************************************/
1010 static void *realloc_(void *ptr, size_t size)
1012 #undef realloc
1013 return realloc(ptr, size);
1014 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
1017 #endif /* PARANOID_MALLOC_CHECKER */
1019 /****************************************************************************
1020 Type-safe malloc.
1021 ****************************************************************************/
1023 void *malloc_array(size_t el_size, unsigned int count)
1025 if (count >= MAX_ALLOC_SIZE/el_size) {
1026 return NULL;
1029 if (el_size == 0 || count == 0) {
1030 return NULL;
1032 #if defined(PARANOID_MALLOC_CHECKER)
1033 return malloc_(el_size*count);
1034 #else
1035 return malloc(el_size*count);
1036 #endif
1039 /****************************************************************************
1040 Type-safe memalign
1041 ****************************************************************************/
1043 void *memalign_array(size_t el_size, size_t align, unsigned int count)
1045 if (count >= MAX_ALLOC_SIZE/el_size) {
1046 return NULL;
1049 return sys_memalign(align, el_size*count);
1052 /****************************************************************************
1053 Type-safe calloc.
1054 ****************************************************************************/
1056 void *calloc_array(size_t size, size_t nmemb)
1058 if (nmemb >= MAX_ALLOC_SIZE/size) {
1059 return NULL;
1061 if (size == 0 || nmemb == 0) {
1062 return NULL;
1064 #if defined(PARANOID_MALLOC_CHECKER)
1065 return calloc_(nmemb, size);
1066 #else
1067 return calloc(nmemb, size);
1068 #endif
1071 /****************************************************************************
1072 Expand a pointer to be a particular size.
1073 Note that this version of Realloc has an extra parameter that decides
1074 whether to free the passed in storage on allocation failure or if the
1075 new size is zero.
1077 This is designed for use in the typical idiom of :
1079 p = SMB_REALLOC(p, size)
1080 if (!p) {
1081 return error;
1084 and not to have to keep track of the old 'p' contents to free later, nor
1085 to worry if the size parameter was zero. In the case where NULL is returned
1086 we guarentee that p has been freed.
1088 If free later semantics are desired, then pass 'free_old_on_error' as False which
1089 guarentees that the old contents are not freed on error, even if size == 0. To use
1090 this idiom use :
1092 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
1093 if (!tmp) {
1094 SAFE_FREE(p);
1095 return error;
1096 } else {
1097 p = tmp;
1100 Changes were instigated by Coverity error checking. JRA.
1101 ****************************************************************************/
1103 void *Realloc(void *p, size_t size, bool free_old_on_error)
1105 void *ret=NULL;
1107 if (size == 0) {
1108 if (free_old_on_error) {
1109 SAFE_FREE(p);
1111 DEBUG(2,("Realloc asked for 0 bytes\n"));
1112 return NULL;
1115 #if defined(PARANOID_MALLOC_CHECKER)
1116 if (!p) {
1117 ret = (void *)malloc_(size);
1118 } else {
1119 ret = (void *)realloc_(p,size);
1121 #else
1122 if (!p) {
1123 ret = (void *)malloc(size);
1124 } else {
1125 ret = (void *)realloc(p,size);
1127 #endif
1129 if (!ret) {
1130 if (free_old_on_error && p) {
1131 SAFE_FREE(p);
1133 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
1136 return(ret);
1139 /****************************************************************************
1140 Type-safe realloc.
1141 ****************************************************************************/
1143 void *realloc_array(void *p, size_t el_size, unsigned int count, bool free_old_on_error)
1145 if (count >= MAX_ALLOC_SIZE/el_size) {
1146 if (free_old_on_error) {
1147 SAFE_FREE(p);
1149 return NULL;
1151 return Realloc(p, el_size*count, free_old_on_error);
1154 /****************************************************************************
1155 (Hopefully) efficient array append.
1156 ****************************************************************************/
1158 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
1159 void *element, void *_array, uint32 *num_elements,
1160 ssize_t *array_size)
1162 void **array = (void **)_array;
1164 if (*array_size < 0) {
1165 return;
1168 if (*array == NULL) {
1169 if (*array_size == 0) {
1170 *array_size = 128;
1173 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1174 goto error;
1177 *array = TALLOC(mem_ctx, element_size * (*array_size));
1178 if (*array == NULL) {
1179 goto error;
1183 if (*num_elements == *array_size) {
1184 *array_size *= 2;
1186 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1187 goto error;
1190 *array = TALLOC_REALLOC(mem_ctx, *array,
1191 element_size * (*array_size));
1193 if (*array == NULL) {
1194 goto error;
1198 memcpy((char *)(*array) + element_size*(*num_elements),
1199 element, element_size);
1200 *num_elements += 1;
1202 return;
1204 error:
1205 *num_elements = 0;
1206 *array_size = -1;
1209 /****************************************************************************
1210 Free memory, checks for NULL.
1211 Use directly SAFE_FREE()
1212 Exists only because we need to pass a function pointer somewhere --SSS
1213 ****************************************************************************/
1215 void safe_free(void *p)
1217 SAFE_FREE(p);
1220 /****************************************************************************
1221 Get my own name and IP.
1222 ****************************************************************************/
1224 char *get_myname(TALLOC_CTX *ctx)
1226 char *p;
1227 char hostname[HOST_NAME_MAX];
1229 *hostname = 0;
1231 /* get my host name */
1232 if (gethostname(hostname, sizeof(hostname)) == -1) {
1233 DEBUG(0,("gethostname failed\n"));
1234 return False;
1237 /* Ensure null termination. */
1238 hostname[sizeof(hostname)-1] = '\0';
1240 /* split off any parts after an initial . */
1241 p = strchr_m(hostname,'.');
1242 if (p) {
1243 *p = 0;
1246 return talloc_strdup(ctx, hostname);
1249 /****************************************************************************
1250 Get my own domain name, or "" if we have none.
1251 ****************************************************************************/
1253 char *get_mydnsdomname(TALLOC_CTX *ctx)
1255 const char *domname;
1256 char *p;
1258 domname = get_mydnsfullname();
1259 if (!domname) {
1260 return NULL;
1263 p = strchr_m(domname, '.');
1264 if (p) {
1265 p++;
1266 return talloc_strdup(ctx, p);
1267 } else {
1268 return talloc_strdup(ctx, "");
1272 /****************************************************************************
1273 Interpret a protocol description string, with a default.
1274 ****************************************************************************/
1276 int interpret_protocol(const char *str,int def)
1278 if (strequal(str,"NT1"))
1279 return(PROTOCOL_NT1);
1280 if (strequal(str,"LANMAN2"))
1281 return(PROTOCOL_LANMAN2);
1282 if (strequal(str,"LANMAN1"))
1283 return(PROTOCOL_LANMAN1);
1284 if (strequal(str,"CORE"))
1285 return(PROTOCOL_CORE);
1286 if (strequal(str,"COREPLUS"))
1287 return(PROTOCOL_COREPLUS);
1288 if (strequal(str,"CORE+"))
1289 return(PROTOCOL_COREPLUS);
1291 DEBUG(0,("Unrecognised protocol level %s\n",str));
1293 return(def);
1297 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1298 /******************************************************************
1299 Remove any mount options such as -rsize=2048,wsize=2048 etc.
1300 Based on a fix from <Thomas.Hepper@icem.de>.
1301 Returns a malloc'ed string.
1302 *******************************************************************/
1304 static char *strip_mount_options(TALLOC_CTX *ctx, const char *str)
1306 if (*str == '-') {
1307 const char *p = str;
1308 while(*p && !isspace(*p))
1309 p++;
1310 while(*p && isspace(*p))
1311 p++;
1312 if(*p) {
1313 return talloc_strdup(ctx, p);
1316 return NULL;
1319 /*******************************************************************
1320 Patch from jkf@soton.ac.uk
1321 Split Luke's automount_server into YP lookup and string splitter
1322 so can easily implement automount_path().
1323 Returns a malloc'ed string.
1324 *******************************************************************/
1326 #ifdef WITH_NISPLUS_HOME
1327 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1329 char *value = NULL;
1331 char *nis_map = (char *)lp_nis_home_map_name();
1333 char buffer[NIS_MAXATTRVAL + 1];
1334 nis_result *result;
1335 nis_object *object;
1336 entry_obj *entry;
1338 snprintf(buffer, sizeof(buffer), "[key=%s],%s", user_name, nis_map);
1339 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
1341 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
1342 if (result->status != NIS_SUCCESS) {
1343 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
1344 } else {
1345 object = result->objects.objects_val;
1346 if (object->zo_data.zo_type == ENTRY_OBJ) {
1347 entry = &object->zo_data.objdata_u.en_data;
1348 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
1349 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
1351 value = talloc_strdup(ctx,
1352 entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
1353 if (!value) {
1354 nis_freeresult(result);
1355 return NULL;
1357 value = talloc_string_sub(ctx,
1358 value,
1359 "&",
1360 user_name);
1364 nis_freeresult(result);
1366 if (value) {
1367 value = strip_mount_options(ctx, value);
1368 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n",
1369 user_name, value));
1371 return value;
1373 #else /* WITH_NISPLUS_HOME */
1375 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1377 char *value = NULL;
1379 int nis_error; /* returned by yp all functions */
1380 char *nis_result; /* yp_match inits this */
1381 int nis_result_len; /* and set this */
1382 char *nis_domain; /* yp_get_default_domain inits this */
1383 char *nis_map = (char *)lp_nis_home_map_name();
1385 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
1386 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
1387 return NULL;
1390 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
1392 if ((nis_error = yp_match(nis_domain, nis_map, user_name,
1393 strlen(user_name), &nis_result,
1394 &nis_result_len)) == 0) {
1395 value = talloc_strdup(ctx, nis_result);
1396 if (!value) {
1397 return NULL;
1399 value = strip_mount_options(ctx, value);
1400 } else if(nis_error == YPERR_KEY) {
1401 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
1402 user_name, nis_map));
1403 DEBUG(3, ("using defaults for server and home directory\n"));
1404 } else {
1405 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
1406 yperr_string(nis_error), user_name, nis_map));
1409 if (value) {
1410 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, value));
1412 return value;
1414 #endif /* WITH_NISPLUS_HOME */
1415 #endif
1417 /****************************************************************************
1418 Check if a process exists. Does this work on all unixes?
1419 ****************************************************************************/
1421 bool process_exists(const struct server_id pid)
1423 if (procid_is_me(&pid)) {
1424 return True;
1427 if (procid_is_local(&pid)) {
1428 return (kill(pid.pid,0) == 0 || errno != ESRCH);
1431 #ifdef CLUSTER_SUPPORT
1432 return ctdbd_process_exists(messaging_ctdbd_connection(), pid.vnn,
1433 pid.pid);
1434 #else
1435 return False;
1436 #endif
1439 bool process_exists_by_pid(pid_t pid)
1441 /* Doing kill with a non-positive pid causes messages to be
1442 * sent to places we don't want. */
1443 SMB_ASSERT(pid > 0);
1444 return(kill(pid,0) == 0 || errno != ESRCH);
1447 /*******************************************************************
1448 Convert a uid into a user name.
1449 ********************************************************************/
1451 const char *uidtoname(uid_t uid)
1453 TALLOC_CTX *ctx = talloc_tos();
1454 char *name = NULL;
1455 struct passwd *pass = NULL;
1457 pass = getpwuid_alloc(ctx,uid);
1458 if (pass) {
1459 name = talloc_strdup(ctx,pass->pw_name);
1460 TALLOC_FREE(pass);
1461 } else {
1462 name = talloc_asprintf(ctx,
1463 "%ld",
1464 (long int)uid);
1466 return name;
1469 /*******************************************************************
1470 Convert a gid into a group name.
1471 ********************************************************************/
1473 char *gidtoname(gid_t gid)
1475 struct group *grp;
1477 grp = getgrgid(gid);
1478 if (grp) {
1479 return talloc_strdup(talloc_tos(), grp->gr_name);
1481 else {
1482 return talloc_asprintf(talloc_tos(),
1483 "%d",
1484 (int)gid);
1488 /*******************************************************************
1489 Convert a user name into a uid.
1490 ********************************************************************/
1492 uid_t nametouid(const char *name)
1494 struct passwd *pass;
1495 char *p;
1496 uid_t u;
1498 pass = getpwnam_alloc(NULL, name);
1499 if (pass) {
1500 u = pass->pw_uid;
1501 TALLOC_FREE(pass);
1502 return u;
1505 u = (uid_t)strtol(name, &p, 0);
1506 if ((p != name) && (*p == '\0'))
1507 return u;
1509 return (uid_t)-1;
1512 /*******************************************************************
1513 Convert a name to a gid_t if possible. Return -1 if not a group.
1514 ********************************************************************/
1516 gid_t nametogid(const char *name)
1518 struct group *grp;
1519 char *p;
1520 gid_t g;
1522 g = (gid_t)strtol(name, &p, 0);
1523 if ((p != name) && (*p == '\0'))
1524 return g;
1526 grp = sys_getgrnam(name);
1527 if (grp)
1528 return(grp->gr_gid);
1529 return (gid_t)-1;
1532 /*******************************************************************
1533 Something really nasty happened - panic !
1534 ********************************************************************/
1536 void smb_panic(const char *const why)
1538 char *cmd;
1539 int result;
1541 #ifdef DEVELOPER
1544 if (global_clobber_region_function) {
1545 DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1546 global_clobber_region_function,
1547 global_clobber_region_line));
1550 #endif
1552 DEBUG(0,("PANIC (pid %llu): %s\n",
1553 (unsigned long long)sys_getpid(), why));
1554 log_stack_trace();
1556 cmd = lp_panic_action();
1557 if (cmd && *cmd) {
1558 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1559 result = system(cmd);
1561 if (result == -1)
1562 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1563 strerror(errno)));
1564 else
1565 DEBUG(0, ("smb_panic(): action returned status %d\n",
1566 WEXITSTATUS(result)));
1569 dump_core();
1572 /*******************************************************************
1573 Print a backtrace of the stack to the debug log. This function
1574 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1575 exit shortly after calling it.
1576 ********************************************************************/
1578 #ifdef HAVE_LIBUNWIND_H
1579 #include <libunwind.h>
1580 #endif
1582 #ifdef HAVE_EXECINFO_H
1583 #include <execinfo.h>
1584 #endif
1586 #ifdef HAVE_LIBEXC_H
1587 #include <libexc.h>
1588 #endif
1590 void log_stack_trace(void)
1592 #ifdef HAVE_LIBUNWIND
1593 /* Try to use libunwind before any other technique since on ia64
1594 * libunwind correctly walks the stack in more circumstances than
1595 * backtrace.
1597 unw_cursor_t cursor;
1598 unw_context_t uc;
1599 unsigned i = 0;
1601 char procname[256];
1602 unw_word_t ip, sp, off;
1604 procname[sizeof(procname) - 1] = '\0';
1606 if (unw_getcontext(&uc) != 0) {
1607 goto libunwind_failed;
1610 if (unw_init_local(&cursor, &uc) != 0) {
1611 goto libunwind_failed;
1614 DEBUG(0, ("BACKTRACE:\n"));
1616 do {
1617 ip = sp = 0;
1618 unw_get_reg(&cursor, UNW_REG_IP, &ip);
1619 unw_get_reg(&cursor, UNW_REG_SP, &sp);
1621 switch (unw_get_proc_name(&cursor,
1622 procname, sizeof(procname) - 1, &off) ) {
1623 case 0:
1624 /* Name found. */
1625 case -UNW_ENOMEM:
1626 /* Name truncated. */
1627 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1628 i, procname, (long long)off,
1629 (long long)ip, (long long) sp));
1630 break;
1631 default:
1632 /* case -UNW_ENOINFO: */
1633 /* case -UNW_EUNSPEC: */
1634 /* No symbol name found. */
1635 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1636 i, "<unknown symbol>",
1637 (long long)ip, (long long) sp));
1639 ++i;
1640 } while (unw_step(&cursor) > 0);
1642 return;
1644 libunwind_failed:
1645 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1647 #elif HAVE_BACKTRACE_SYMBOLS
1648 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1649 size_t backtrace_size;
1650 char **backtrace_strings;
1652 /* get the backtrace (stack frames) */
1653 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1654 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1656 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1657 (unsigned long)backtrace_size));
1659 if (backtrace_strings) {
1660 int i;
1662 for (i = 0; i < backtrace_size; i++)
1663 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1665 /* Leak the backtrace_strings, rather than risk what free() might do */
1668 #elif HAVE_LIBEXC
1670 /* The IRIX libexc library provides an API for unwinding the stack. See
1671 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1672 * since we are about to abort anyway, it hardly matters.
1675 #define NAMESIZE 32 /* Arbitrary */
1677 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1678 char * names[BACKTRACE_STACK_SIZE];
1679 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1681 int i;
1682 int levels;
1684 ZERO_ARRAY(addrs);
1685 ZERO_ARRAY(names);
1686 ZERO_ARRAY(namebuf);
1688 /* We need to be root so we can open our /proc entry to walk
1689 * our stack. It also helps when we want to dump core.
1691 become_root();
1693 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1694 names[i] = namebuf + (i * NAMESIZE);
1697 levels = trace_back_stack(0, addrs, names,
1698 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1700 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1701 for (i = 0; i < levels; i++) {
1702 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1704 #undef NAMESIZE
1706 #else
1707 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1708 #endif
1711 /*******************************************************************
1712 A readdir wrapper which just returns the file name.
1713 ********************************************************************/
1715 const char *readdirname(SMB_STRUCT_DIR *p)
1717 SMB_STRUCT_DIRENT *ptr;
1718 char *dname;
1720 if (!p)
1721 return(NULL);
1723 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1724 if (!ptr)
1725 return(NULL);
1727 dname = ptr->d_name;
1729 #ifdef NEXT2
1730 if (telldir(p) < 0)
1731 return(NULL);
1732 #endif
1734 #ifdef HAVE_BROKEN_READDIR_NAME
1735 /* using /usr/ucb/cc is BAD */
1736 dname = dname - 2;
1737 #endif
1739 return talloc_strdup(talloc_tos(), dname);
1742 /*******************************************************************
1743 Utility function used to decide if the last component
1744 of a path matches a (possibly wildcarded) entry in a namelist.
1745 ********************************************************************/
1747 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive)
1749 const char *last_component;
1751 /* if we have no list it's obviously not in the path */
1752 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1753 return False;
1756 DEBUG(8, ("is_in_path: %s\n", name));
1758 /* Get the last component of the unix name. */
1759 last_component = strrchr_m(name, '/');
1760 if (!last_component) {
1761 last_component = name;
1762 } else {
1763 last_component++; /* Go past '/' */
1766 for(; namelist->name != NULL; namelist++) {
1767 if(namelist->is_wild) {
1768 if (mask_match(last_component, namelist->name, case_sensitive)) {
1769 DEBUG(8,("is_in_path: mask match succeeded\n"));
1770 return True;
1772 } else {
1773 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1774 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1775 DEBUG(8,("is_in_path: match succeeded\n"));
1776 return True;
1780 DEBUG(8,("is_in_path: match not found\n"));
1781 return False;
1784 /*******************************************************************
1785 Strip a '/' separated list into an array of
1786 name_compare_enties structures suitable for
1787 passing to is_in_path(). We do this for
1788 speed so we can pre-parse all the names in the list
1789 and don't do it for each call to is_in_path().
1790 namelist is modified here and is assumed to be
1791 a copy owned by the caller.
1792 We also check if the entry contains a wildcard to
1793 remove a potentially expensive call to mask_match
1794 if possible.
1795 ********************************************************************/
1797 void set_namearray(name_compare_entry **ppname_array, char *namelist)
1799 char *name_end;
1800 char *nameptr = namelist;
1801 int num_entries = 0;
1802 int i;
1804 (*ppname_array) = NULL;
1806 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
1807 return;
1809 /* We need to make two passes over the string. The
1810 first to count the number of elements, the second
1811 to split it.
1814 while(*nameptr) {
1815 if ( *nameptr == '/' ) {
1816 /* cope with multiple (useless) /s) */
1817 nameptr++;
1818 continue;
1820 /* find the next / */
1821 name_end = strchr_m(nameptr, '/');
1823 /* oops - the last check for a / didn't find one. */
1824 if (name_end == NULL)
1825 break;
1827 /* next segment please */
1828 nameptr = name_end + 1;
1829 num_entries++;
1832 if(num_entries == 0)
1833 return;
1835 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1836 DEBUG(0,("set_namearray: malloc fail\n"));
1837 return;
1840 /* Now copy out the names */
1841 nameptr = namelist;
1842 i = 0;
1843 while(*nameptr) {
1844 if ( *nameptr == '/' ) {
1845 /* cope with multiple (useless) /s) */
1846 nameptr++;
1847 continue;
1849 /* find the next / */
1850 if ((name_end = strchr_m(nameptr, '/')) != NULL)
1851 *name_end = 0;
1853 /* oops - the last check for a / didn't find one. */
1854 if(name_end == NULL)
1855 break;
1857 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1858 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1859 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1860 return;
1863 /* next segment please */
1864 nameptr = name_end + 1;
1865 i++;
1868 (*ppname_array)[i].name = NULL;
1870 return;
1873 /****************************************************************************
1874 Routine to free a namearray.
1875 ****************************************************************************/
1877 void free_namearray(name_compare_entry *name_array)
1879 int i;
1881 if(name_array == NULL)
1882 return;
1884 for(i=0; name_array[i].name!=NULL; i++)
1885 SAFE_FREE(name_array[i].name);
1886 SAFE_FREE(name_array);
1889 #undef DBGC_CLASS
1890 #define DBGC_CLASS DBGC_LOCKING
1892 /****************************************************************************
1893 Simple routine to do POSIX file locking. Cruft in NFS and 64->32 bit mapping
1894 is dealt with in posix.c
1895 Returns True if the lock was granted, False otherwise.
1896 ****************************************************************************/
1898 bool fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
1900 SMB_STRUCT_FLOCK lock;
1901 int ret;
1903 DEBUG(8,("fcntl_lock fd=%d op=%d offset=%.0f count=%.0f type=%d\n",
1904 fd,op,(double)offset,(double)count,type));
1906 lock.l_type = type;
1907 lock.l_whence = SEEK_SET;
1908 lock.l_start = offset;
1909 lock.l_len = count;
1910 lock.l_pid = 0;
1912 ret = sys_fcntl_ptr(fd,op,&lock);
1914 if (ret == -1) {
1915 int sav = errno;
1916 DEBUG(3,("fcntl_lock: lock failed at offset %.0f count %.0f op %d type %d (%s)\n",
1917 (double)offset,(double)count,op,type,strerror(errno)));
1918 errno = sav;
1919 return False;
1922 /* everything went OK */
1923 DEBUG(8,("fcntl_lock: Lock call successful\n"));
1925 return True;
1928 /****************************************************************************
1929 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1930 is dealt with in posix.c
1931 Returns True if we have information regarding this lock region (and returns
1932 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1933 ****************************************************************************/
1935 bool fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1937 SMB_STRUCT_FLOCK lock;
1938 int ret;
1940 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
1941 fd,(double)*poffset,(double)*pcount,*ptype));
1943 lock.l_type = *ptype;
1944 lock.l_whence = SEEK_SET;
1945 lock.l_start = *poffset;
1946 lock.l_len = *pcount;
1947 lock.l_pid = 0;
1949 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
1951 if (ret == -1) {
1952 int sav = errno;
1953 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
1954 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
1955 errno = sav;
1956 return False;
1959 *ptype = lock.l_type;
1960 *poffset = lock.l_start;
1961 *pcount = lock.l_len;
1962 *ppid = lock.l_pid;
1964 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
1965 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
1966 return True;
1969 #undef DBGC_CLASS
1970 #define DBGC_CLASS DBGC_ALL
1972 /*******************************************************************
1973 Is the name specified one of my netbios names.
1974 Returns true if it is equal, false otherwise.
1975 ********************************************************************/
1977 bool is_myname(const char *s)
1979 int n;
1980 bool ret = False;
1982 for (n=0; my_netbios_names(n); n++) {
1983 if (strequal(my_netbios_names(n), s)) {
1984 ret=True;
1985 break;
1988 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
1989 return(ret);
1992 /*******************************************************************
1993 Is the name specified our workgroup/domain.
1994 Returns true if it is equal, false otherwise.
1995 ********************************************************************/
1997 bool is_myworkgroup(const char *s)
1999 bool ret = False;
2001 if (strequal(s, lp_workgroup())) {
2002 ret=True;
2005 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
2006 return(ret);
2009 /*******************************************************************
2010 we distinguish between 2K and XP by the "Native Lan Manager" string
2011 WinXP => "Windows 2002 5.1"
2012 WinXP 64bit => "Windows XP 5.2"
2013 Win2k => "Windows 2000 5.0"
2014 NT4 => "Windows NT 4.0"
2015 Win9x => "Windows 4.0"
2016 Windows 2003 doesn't set the native lan manager string but
2017 they do set the domain to "Windows 2003 5.2" (probably a bug).
2018 ********************************************************************/
2020 void ra_lanman_string( const char *native_lanman )
2022 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
2023 set_remote_arch( RA_WINXP );
2024 else if ( strcmp( native_lanman, "Windows XP 5.2" ) == 0 )
2025 set_remote_arch( RA_WINXP );
2026 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
2027 set_remote_arch( RA_WIN2K3 );
2030 static const char *remote_arch_str;
2032 const char *get_remote_arch_str(void)
2034 if (!remote_arch_str) {
2035 return "UNKNOWN";
2037 return remote_arch_str;
2040 /*******************************************************************
2041 Set the horrid remote_arch string based on an enum.
2042 ********************************************************************/
2044 void set_remote_arch(enum remote_arch_types type)
2046 ra_type = type;
2047 switch( type ) {
2048 case RA_WFWG:
2049 remote_arch_str = "WfWg";
2050 break;
2051 case RA_OS2:
2052 remote_arch_str = "OS2";
2053 break;
2054 case RA_WIN95:
2055 remote_arch_str = "Win95";
2056 break;
2057 case RA_WINNT:
2058 remote_arch_str = "WinNT";
2059 break;
2060 case RA_WIN2K:
2061 remote_arch_str = "Win2K";
2062 break;
2063 case RA_WINXP:
2064 remote_arch_str = "WinXP";
2065 break;
2066 case RA_WIN2K3:
2067 remote_arch_str = "Win2K3";
2068 break;
2069 case RA_VISTA:
2070 remote_arch_str = "Vista";
2071 break;
2072 case RA_SAMBA:
2073 remote_arch_str = "Samba";
2074 break;
2075 case RA_CIFSFS:
2076 remote_arch_str = "CIFSFS";
2077 break;
2078 default:
2079 ra_type = RA_UNKNOWN;
2080 remote_arch_str = "UNKNOWN";
2081 break;
2084 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
2085 remote_arch_str));
2088 /*******************************************************************
2089 Get the remote_arch type.
2090 ********************************************************************/
2092 enum remote_arch_types get_remote_arch(void)
2094 return ra_type;
2097 void print_asc(int level, const unsigned char *buf,int len)
2099 int i;
2100 for (i=0;i<len;i++)
2101 DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
2104 void dump_data(int level, const unsigned char *buf1,int len)
2106 const unsigned char *buf = (const unsigned char *)buf1;
2107 int i=0;
2108 if (len<=0) return;
2110 if (!DEBUGLVL(level)) return;
2112 DEBUGADD(level,("[%03X] ",i));
2113 for (i=0;i<len;) {
2114 DEBUGADD(level,("%02X ",(int)buf[i]));
2115 i++;
2116 if (i%8 == 0) DEBUGADD(level,(" "));
2117 if (i%16 == 0) {
2118 print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
2119 print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
2120 if (i<len) DEBUGADD(level,("[%03X] ",i));
2123 if (i%16) {
2124 int n;
2125 n = 16 - (i%16);
2126 DEBUGADD(level,(" "));
2127 if (n>8) DEBUGADD(level,(" "));
2128 while (n--) DEBUGADD(level,(" "));
2129 n = MIN(8,i%16);
2130 print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " ));
2131 n = (i%16) - n;
2132 if (n>0) print_asc(level,&buf[i-n],n);
2133 DEBUGADD(level,("\n"));
2137 void dump_data_pw(const char *msg, const uchar * data, size_t len)
2139 #ifdef DEBUG_PASSWORD
2140 DEBUG(11, ("%s", msg));
2141 if (data != NULL && len > 0)
2143 dump_data(11, data, len);
2145 #endif
2148 char *tab_depth(int depth)
2150 static pstring spaces;
2151 size_t len = depth * 4;
2152 if (len > sizeof(pstring)-1) {
2153 len = sizeof(pstring)-1;
2156 memset(spaces, ' ', len);
2157 spaces[len] = 0;
2158 return spaces;
2161 /*****************************************************************************
2162 Provide a checksum on a string
2164 Input: s - the null-terminated character string for which the checksum
2165 will be calculated.
2167 Output: The checksum value calculated for s.
2168 *****************************************************************************/
2170 int str_checksum(const char *s)
2172 int res = 0;
2173 int c;
2174 int i=0;
2176 while(*s) {
2177 c = *s;
2178 res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
2179 s++;
2180 i++;
2182 return(res);
2185 /*****************************************************************
2186 Zero a memory area then free it. Used to catch bugs faster.
2187 *****************************************************************/
2189 void zero_free(void *p, size_t size)
2191 memset(p, 0, size);
2192 SAFE_FREE(p);
2195 /*****************************************************************
2196 Set our open file limit to a requested max and return the limit.
2197 *****************************************************************/
2199 int set_maxfiles(int requested_max)
2201 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
2202 struct rlimit rlp;
2203 int saved_current_limit;
2205 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2206 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
2207 strerror(errno) ));
2208 /* just guess... */
2209 return requested_max;
2213 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
2214 * account for the extra fd we need
2215 * as well as the log files and standard
2216 * handles etc. Save the limit we want to set in case
2217 * we are running on an OS that doesn't support this limit (AIX)
2218 * which always returns RLIM_INFINITY for rlp.rlim_max.
2221 /* Try raising the hard (max) limit to the requested amount. */
2223 #if defined(RLIM_INFINITY)
2224 if (rlp.rlim_max != RLIM_INFINITY) {
2225 int orig_max = rlp.rlim_max;
2227 if ( rlp.rlim_max < requested_max )
2228 rlp.rlim_max = requested_max;
2230 /* This failing is not an error - many systems (Linux) don't
2231 support our default request of 10,000 open files. JRA. */
2233 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2234 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
2235 (int)rlp.rlim_max, strerror(errno) ));
2237 /* Set failed - restore original value from get. */
2238 rlp.rlim_max = orig_max;
2241 #endif
2243 /* Now try setting the soft (current) limit. */
2245 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
2247 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2248 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
2249 (int)rlp.rlim_cur, strerror(errno) ));
2250 /* just guess... */
2251 return saved_current_limit;
2254 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2255 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2256 strerror(errno) ));
2257 /* just guess... */
2258 return saved_current_limit;
2261 #if defined(RLIM_INFINITY)
2262 if(rlp.rlim_cur == RLIM_INFINITY)
2263 return saved_current_limit;
2264 #endif
2266 if((int)rlp.rlim_cur > saved_current_limit)
2267 return saved_current_limit;
2269 return rlp.rlim_cur;
2270 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2272 * No way to know - just guess...
2274 return requested_max;
2275 #endif
2278 /*****************************************************************
2279 Possibly replace mkstemp if it is broken.
2280 *****************************************************************/
2282 int smb_mkstemp(char *name_template)
2284 #if HAVE_SECURE_MKSTEMP
2285 return mkstemp(name_template);
2286 #else
2287 /* have a reasonable go at emulating it. Hope that
2288 the system mktemp() isn't completly hopeless */
2289 char *p = mktemp(name_template);
2290 if (!p)
2291 return -1;
2292 return open(p, O_CREAT|O_EXCL|O_RDWR, 0600);
2293 #endif
2296 /*****************************************************************
2297 malloc that aborts with smb_panic on fail or zero size.
2298 *****************************************************************/
2300 void *smb_xmalloc_array(size_t size, unsigned int count)
2302 void *p;
2303 if (size == 0) {
2304 smb_panic("smb_xmalloc_array: called with zero size");
2306 if (count >= MAX_ALLOC_SIZE/size) {
2307 smb_panic("smb_xmalloc_array: alloc size too large");
2309 if ((p = SMB_MALLOC(size*count)) == NULL) {
2310 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2311 (unsigned long)size, (unsigned long)count));
2312 smb_panic("smb_xmalloc_array: malloc failed");
2314 return p;
2318 Memdup with smb_panic on fail.
2321 void *smb_xmemdup(const void *p, size_t size)
2323 void *p2;
2324 p2 = SMB_XMALLOC_ARRAY(unsigned char,size);
2325 memcpy(p2, p, size);
2326 return p2;
2330 strdup that aborts on malloc fail.
2333 char *smb_xstrdup(const char *s)
2335 #if defined(PARANOID_MALLOC_CHECKER)
2336 #ifdef strdup
2337 #undef strdup
2338 #endif
2339 #endif
2341 #ifndef HAVE_STRDUP
2342 #define strdup rep_strdup
2343 #endif
2345 char *s1 = strdup(s);
2346 #if defined(PARANOID_MALLOC_CHECKER)
2347 #ifdef strdup
2348 #undef strdup
2349 #endif
2350 #define strdup(s) __ERROR_DONT_USE_STRDUP_DIRECTLY
2351 #endif
2352 if (!s1) {
2353 smb_panic("smb_xstrdup: malloc failed");
2355 return s1;
2360 strndup that aborts on malloc fail.
2363 char *smb_xstrndup(const char *s, size_t n)
2365 #if defined(PARANOID_MALLOC_CHECKER)
2366 #ifdef strndup
2367 #undef strndup
2368 #endif
2369 #endif
2371 #if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
2372 #undef HAVE_STRNDUP
2373 #define strndup rep_strndup
2374 #endif
2376 char *s1 = strndup(s, n);
2377 #if defined(PARANOID_MALLOC_CHECKER)
2378 #ifdef strndup
2379 #undef strndup
2380 #endif
2381 #define strndup(s,n) __ERROR_DONT_USE_STRNDUP_DIRECTLY
2382 #endif
2383 if (!s1) {
2384 smb_panic("smb_xstrndup: malloc failed");
2386 return s1;
2390 vasprintf that aborts on malloc fail
2393 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
2395 int n;
2396 va_list ap2;
2398 VA_COPY(ap2, ap);
2400 n = vasprintf(ptr, format, ap2);
2401 if (n == -1 || ! *ptr) {
2402 smb_panic("smb_xvasprintf: out of memory");
2404 return n;
2407 /*****************************************************************
2408 Like strdup but for memory.
2409 *****************************************************************/
2411 void *memdup(const void *p, size_t size)
2413 void *p2;
2414 if (size == 0)
2415 return NULL;
2416 p2 = SMB_MALLOC(size);
2417 if (!p2)
2418 return NULL;
2419 memcpy(p2, p, size);
2420 return p2;
2423 /*****************************************************************
2424 Get local hostname and cache result.
2425 *****************************************************************/
2427 char *myhostname(void)
2429 static char *ret;
2430 if (ret == NULL) {
2431 /* This is cached forever so
2432 * use NULL talloc ctx. */
2433 ret = get_myname(NULL);
2435 return ret;
2438 /*****************************************************************
2439 A useful function for returning a path in the Samba pid directory.
2440 *****************************************************************/
2442 static char *xx_path(const char *name, const char *rootpath)
2444 char *fname = NULL;
2446 fname = talloc_strdup(talloc_tos(), rootpath);
2447 if (!fname) {
2448 return NULL;
2450 trim_string(fname,"","/");
2452 if (!directory_exist(fname,NULL)) {
2453 mkdir(fname,0755);
2456 return talloc_asprintf(talloc_tos(),
2457 "%s/%s",
2458 fname,
2459 name);
2462 /*****************************************************************
2463 A useful function for returning a path in the Samba lock directory.
2464 *****************************************************************/
2466 char *lock_path(const char *name)
2468 return xx_path(name, lp_lockdir());
2471 /*****************************************************************
2472 A useful function for returning a path in the Samba pid directory.
2473 *****************************************************************/
2475 char *pid_path(const char *name)
2477 return xx_path(name, lp_piddir());
2481 * @brief Returns an absolute path to a file in the Samba lib directory.
2483 * @param name File to find, relative to LIBDIR.
2485 * @retval Pointer to a static #pstring containing the full path.
2488 char *lib_path(const char *name)
2490 return talloc_asprintf(talloc_tos(), "%s/%s", dyn_LIBDIR, name);
2494 * @brief Returns an absolute path to a file in the Samba data directory.
2496 * @param name File to find, relative to CODEPAGEDIR.
2498 * @retval Pointer to a talloc'ed string containing the full path.
2501 char *data_path(const char *name)
2503 return talloc_asprintf(talloc_tos(), "%s/%s", dyn_CODEPAGEDIR, name);
2506 /*****************************************************************
2507 a useful function for returning a path in the Samba state directory
2508 *****************************************************************/
2510 char *state_path(const char *name)
2512 return xx_path(name, dyn_STATEDIR());
2516 * @brief Returns the platform specific shared library extension.
2518 * @retval Pointer to a static #fstring containing the extension.
2521 const char *shlib_ext(void)
2523 return dyn_SHLIBEXT;
2526 /*******************************************************************
2527 Given a filename - get its directory name
2528 NB: Returned in static storage. Caveats:
2529 o If caller wishes to preserve, they should copy.
2530 ********************************************************************/
2532 char *parent_dirname(const char *path)
2534 char *parent;
2536 if (!parent_dirname_talloc(talloc_tos(), path, &parent, NULL)) {
2537 return NULL;
2540 return parent;
2543 bool parent_dirname_talloc(TALLOC_CTX *mem_ctx, const char *dir,
2544 char **parent, const char **name)
2546 char *p;
2547 ptrdiff_t len;
2549 p = strrchr_m(dir, '/'); /* Find final '/', if any */
2551 if (p == NULL) {
2552 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
2553 return False;
2555 if (name) {
2556 *name = "";
2558 return True;
2561 len = p-dir;
2563 if (!(*parent = TALLOC_ARRAY(mem_ctx, char, len+1))) {
2564 return False;
2566 memcpy(*parent, dir, len);
2567 (*parent)[len] = '\0';
2569 if (name) {
2570 *name = p+1;
2572 return True;
2575 /*******************************************************************
2576 Determine if a pattern contains any Microsoft wildcard characters.
2577 *******************************************************************/
2579 bool ms_has_wild(const char *s)
2581 char c;
2583 if (lp_posix_pathnames()) {
2584 /* With posix pathnames no characters are wild. */
2585 return False;
2588 while ((c = *s++)) {
2589 switch (c) {
2590 case '*':
2591 case '?':
2592 case '<':
2593 case '>':
2594 case '"':
2595 return True;
2598 return False;
2601 bool ms_has_wild_w(const smb_ucs2_t *s)
2603 smb_ucs2_t c;
2604 if (!s) return False;
2605 while ((c = *s++)) {
2606 switch (c) {
2607 case UCS2_CHAR('*'):
2608 case UCS2_CHAR('?'):
2609 case UCS2_CHAR('<'):
2610 case UCS2_CHAR('>'):
2611 case UCS2_CHAR('"'):
2612 return True;
2615 return False;
2618 /*******************************************************************
2619 A wrapper that handles case sensitivity and the special handling
2620 of the ".." name.
2621 *******************************************************************/
2623 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
2625 if (strcmp(string,"..") == 0)
2626 string = ".";
2627 if (strcmp(pattern,".") == 0)
2628 return False;
2630 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2633 /*******************************************************************
2634 A wrapper that handles case sensitivity and the special handling
2635 of the ".." name. Varient that is only called by old search code which requires
2636 pattern translation.
2637 *******************************************************************/
2639 bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
2641 if (strcmp(string,"..") == 0)
2642 string = ".";
2643 if (strcmp(pattern,".") == 0)
2644 return False;
2646 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2649 /*******************************************************************
2650 A wrapper that handles a list of patters and calls mask_match()
2651 on each. Returns True if any of the patterns match.
2652 *******************************************************************/
2654 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive)
2656 while (listLen-- > 0) {
2657 if (mask_match(string, *list++, is_case_sensitive))
2658 return True;
2660 return False;
2663 /*********************************************************
2664 Recursive routine that is called by unix_wild_match.
2665 *********************************************************/
2667 static bool unix_do_match(const char *regexp, const char *str)
2669 const char *p;
2671 for( p = regexp; *p && *str; ) {
2673 switch(*p) {
2674 case '?':
2675 str++;
2676 p++;
2677 break;
2679 case '*':
2682 * Look for a character matching
2683 * the one after the '*'.
2685 p++;
2686 if(!*p)
2687 return true; /* Automatic match */
2688 while(*str) {
2690 while(*str && (*p != *str))
2691 str++;
2694 * Patch from weidel@multichart.de. In the case of the regexp
2695 * '*XX*' we want to ensure there are at least 2 'X' characters
2696 * in the string after the '*' for a match to be made.
2700 int matchcount=0;
2703 * Eat all the characters that match, but count how many there were.
2706 while(*str && (*p == *str)) {
2707 str++;
2708 matchcount++;
2712 * Now check that if the regexp had n identical characters that
2713 * matchcount had at least that many matches.
2716 while ( *(p+1) && (*(p+1) == *p)) {
2717 p++;
2718 matchcount--;
2721 if ( matchcount <= 0 )
2722 return false;
2725 str--; /* We've eaten the match char after the '*' */
2727 if(unix_do_match(p, str))
2728 return true;
2730 if(!*str)
2731 return false;
2732 else
2733 str++;
2735 return false;
2737 default:
2738 if(*str != *p)
2739 return false;
2740 str++;
2741 p++;
2742 break;
2746 if(!*p && !*str)
2747 return true;
2749 if (!*p && str[0] == '.' && str[1] == 0)
2750 return true;
2752 if (!*str && *p == '?') {
2753 while (*p == '?')
2754 p++;
2755 return(!*p);
2758 if(!*str && (*p == '*' && p[1] == '\0'))
2759 return true;
2761 return false;
2764 /*******************************************************************
2765 Simple case insensitive interface to a UNIX wildcard matcher.
2766 Returns True if match, False if not.
2767 *******************************************************************/
2769 bool unix_wild_match(const char *pattern, const char *string)
2771 TALLOC_CTX *ctx = talloc_stackframe();
2772 char *p2;
2773 char *s2;
2774 char *p;
2775 bool ret = false;
2777 p2 = talloc_strdup(ctx,pattern);
2778 s2 = talloc_strdup(ctx,string);
2779 if (!p2 || !s2) {
2780 TALLOC_FREE(ctx);
2781 return false;
2783 strlower_m(p2);
2784 strlower_m(s2);
2786 /* Remove any *? and ** from the pattern as they are meaningless */
2787 for(p = p2; *p; p++) {
2788 while( *p == '*' && (p[1] == '?' ||p[1] == '*')) {
2789 memmove(&p[1], &p[2], strlen(&p[2])+1);
2793 if (strequal(p2,"*")) {
2794 TALLOC_FREE(ctx);
2795 return true;
2798 ret = unix_do_match(p2, s2);
2799 TALLOC_FREE(ctx);
2800 return ret;
2803 /**********************************************************************
2804 Converts a name to a fully qualified domain name.
2805 Returns true if lookup succeeded, false if not (then fqdn is set to name)
2806 Note we deliberately use gethostbyname here, not getaddrinfo as we want
2807 to examine the h_aliases and I don't know how to do that with getaddrinfo.
2808 ***********************************************************************/
2810 bool name_to_fqdn(fstring fqdn, const char *name)
2812 char *full = NULL;
2813 struct hostent *hp = gethostbyname(name);
2815 if (!hp || !hp->h_name || !*hp->h_name) {
2816 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2817 fstrcpy(fqdn, name);
2818 return false;
2821 /* Find out if the fqdn is returned as an alias
2822 * to cope with /etc/hosts files where the first
2823 * name is not the fqdn but the short name */
2824 if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2825 int i;
2826 for (i = 0; hp->h_aliases[i]; i++) {
2827 if (strchr_m(hp->h_aliases[i], '.')) {
2828 full = hp->h_aliases[i];
2829 break;
2833 if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2834 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2835 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2836 DEBUGADD(1, (" to Kerberos authentication problems as localhost.localdomain\n"));
2837 DEBUGADD(1, (" may end up being used instead of the real machine FQDN.\n"));
2838 full = hp->h_name;
2840 if (!full) {
2841 full = hp->h_name;
2844 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2845 fstrcpy(fqdn, full);
2846 return true;
2849 /**********************************************************************
2850 Extension to talloc_get_type: Abort on type mismatch
2851 ***********************************************************************/
2853 void *talloc_check_name_abort(const void *ptr, const char *name)
2855 void *result;
2857 result = talloc_check_name(ptr, name);
2858 if (result != NULL)
2859 return result;
2861 DEBUG(0, ("Talloc type mismatch, expected %s, got %s\n",
2862 name, talloc_get_name(ptr)));
2863 smb_panic("talloc type mismatch");
2864 /* Keep the compiler happy */
2865 return NULL;
2868 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2870 switch (share_access & ~FILE_SHARE_DELETE) {
2871 case FILE_SHARE_NONE:
2872 return DENY_ALL;
2873 case FILE_SHARE_READ:
2874 return DENY_WRITE;
2875 case FILE_SHARE_WRITE:
2876 return DENY_READ;
2877 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2878 return DENY_NONE;
2880 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2881 return DENY_DOS;
2882 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2883 return DENY_FCB;
2886 return (uint32)-1;
2889 pid_t procid_to_pid(const struct server_id *proc)
2891 return proc->pid;
2894 static uint32 my_vnn = NONCLUSTER_VNN;
2896 void set_my_vnn(uint32 vnn)
2898 DEBUG(10, ("vnn pid %d = %u\n", (int)sys_getpid(), (unsigned int)vnn));
2899 my_vnn = vnn;
2902 uint32 get_my_vnn(void)
2904 return my_vnn;
2907 struct server_id pid_to_procid(pid_t pid)
2909 struct server_id result;
2910 result.pid = pid;
2911 #ifdef CLUSTER_SUPPORT
2912 result.vnn = my_vnn;
2913 #endif
2914 return result;
2917 struct server_id procid_self(void)
2919 return pid_to_procid(sys_getpid());
2922 struct server_id server_id_self(void)
2924 return procid_self();
2927 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
2929 if (p1->pid != p2->pid)
2930 return False;
2931 #ifdef CLUSTER_SUPPORT
2932 if (p1->vnn != p2->vnn)
2933 return False;
2934 #endif
2935 return True;
2938 bool cluster_id_equal(const struct server_id *id1,
2939 const struct server_id *id2)
2941 return procid_equal(id1, id2);
2944 bool procid_is_me(const struct server_id *pid)
2946 if (pid->pid != sys_getpid())
2947 return False;
2948 #ifdef CLUSTER_SUPPORT
2949 if (pid->vnn != my_vnn)
2950 return False;
2951 #endif
2952 return True;
2955 struct server_id interpret_pid(const char *pid_string)
2957 #ifdef CLUSTER_SUPPORT
2958 unsigned int vnn, pid;
2959 struct server_id result;
2960 if (sscanf(pid_string, "%u:%u", &vnn, &pid) == 2) {
2961 result.vnn = vnn;
2962 result.pid = pid;
2964 else if (sscanf(pid_string, "%u", &pid) == 1) {
2965 result.vnn = NONCLUSTER_VNN;
2966 result.pid = pid;
2968 else {
2969 result.vnn = NONCLUSTER_VNN;
2970 result.pid = -1;
2972 return result;
2973 #else
2974 return pid_to_procid(atoi(pid_string));
2975 #endif
2978 char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid)
2980 #ifdef CLUSTER_SUPPORT
2981 if (pid->vnn == NONCLUSTER_VNN) {
2982 return talloc_asprintf(mem_ctx,
2983 "%d",
2984 (int)pid->pid);
2986 else {
2987 return talloc_asprintf(mem_ctx,
2988 "%u:%d",
2989 (unsigned)pid->vnn,
2990 (int)pid->pid);
2992 #else
2993 return talloc_asprintf(mem_ctx,
2994 "%d",
2995 (int)pid->pid);
2996 #endif
2999 char *procid_str_static(const struct server_id *pid)
3001 return procid_str(talloc_tos(), pid);
3004 bool procid_valid(const struct server_id *pid)
3006 return (pid->pid != -1);
3009 bool procid_is_local(const struct server_id *pid)
3011 #ifdef CLUSTER_SUPPORT
3012 return pid->vnn == my_vnn;
3013 #else
3014 return True;
3015 #endif
3018 int this_is_smp(void)
3020 #if defined(HAVE_SYSCONF)
3022 #if defined(SYSCONF_SC_NPROC_ONLN)
3023 return (sysconf(_SC_NPROC_ONLN) > 1) ? 1 : 0;
3024 #elif defined(SYSCONF_SC_NPROCESSORS_ONLN)
3025 return (sysconf(_SC_NPROCESSORS_ONLN) > 1) ? 1 : 0;
3026 #else
3027 return 0;
3028 #endif
3030 #else
3031 return 0;
3032 #endif
3035 /****************************************************************
3036 Check if an offset into a buffer is safe.
3037 If this returns True it's safe to indirect into the byte at
3038 pointer ptr+off.
3039 ****************************************************************/
3041 bool is_offset_safe(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3043 const char *end_base = buf_base + buf_len;
3044 char *end_ptr = ptr + off;
3046 if (!buf_base || !ptr) {
3047 return False;
3050 if (end_base < buf_base || end_ptr < ptr) {
3051 return False; /* wrap. */
3054 if (end_ptr < end_base) {
3055 return True;
3057 return False;
3060 /****************************************************************
3061 Return a safe pointer into a buffer, or NULL.
3062 ****************************************************************/
3064 char *get_safe_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3066 return is_offset_safe(buf_base, buf_len, ptr, off) ?
3067 ptr + off : NULL;
3070 /****************************************************************
3071 Return a safe pointer into a string within a buffer, or NULL.
3072 ****************************************************************/
3074 char *get_safe_str_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3076 if (!is_offset_safe(buf_base, buf_len, ptr, off)) {
3077 return NULL;
3079 /* Check if a valid string exists at this offset. */
3080 if (skip_string(buf_base,buf_len, ptr + off) == NULL) {
3081 return NULL;
3083 return ptr + off;
3086 /****************************************************************
3087 Return an SVAL at a pointer, or failval if beyond the end.
3088 ****************************************************************/
3090 int get_safe_SVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
3093 * Note we use off+1 here, not off+2 as SVAL accesses ptr[0] and ptr[1],
3094 * NOT ptr[2].
3096 if (!is_offset_safe(buf_base, buf_len, ptr, off+1)) {
3097 return failval;
3099 return SVAL(ptr,off);
3102 /****************************************************************
3103 Return an IVAL at a pointer, or failval if beyond the end.
3104 ****************************************************************/
3106 int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
3109 * Note we use off+3 here, not off+4 as IVAL accesses
3110 * ptr[0] ptr[1] ptr[2] ptr[3] NOT ptr[4].
3112 if (!is_offset_safe(buf_base, buf_len, ptr, off+3)) {
3113 return failval;
3115 return IVAL(ptr,off);
3118 #if 0
3120 Disable these now we have checked all code paths and ensured
3121 NULL returns on zero request. JRA.
3123 /****************************************************************
3124 talloc wrapper functions that guarentee a null pointer return
3125 if size == 0.
3126 ****************************************************************/
3128 #ifndef MAX_TALLOC_SIZE
3129 #define MAX_TALLOC_SIZE 0x10000000
3130 #endif
3133 * talloc and zero memory.
3134 * - returns NULL if size is zero.
3137 void *_talloc_zero_zeronull(const void *ctx, size_t size, const char *name)
3139 void *p;
3141 if (size == 0) {
3142 return NULL;
3145 p = talloc_named_const(ctx, size, name);
3147 if (p) {
3148 memset(p, '\0', size);
3151 return p;
3155 * memdup with a talloc.
3156 * - returns NULL if size is zero.
3159 void *_talloc_memdup_zeronull(const void *t, const void *p, size_t size, const char *name)
3161 void *newp;
3163 if (size == 0) {
3164 return NULL;
3167 newp = talloc_named_const(t, size, name);
3168 if (newp) {
3169 memcpy(newp, p, size);
3172 return newp;
3176 * alloc an array, checking for integer overflow in the array size.
3177 * - returns NULL if count or el_size are zero.
3180 void *_talloc_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
3182 if (count >= MAX_TALLOC_SIZE/el_size) {
3183 return NULL;
3186 if (el_size == 0 || count == 0) {
3187 return NULL;
3190 return talloc_named_const(ctx, el_size * count, name);
3194 * alloc an zero array, checking for integer overflow in the array size
3195 * - returns NULL if count or el_size are zero.
3198 void *_talloc_zero_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
3200 if (count >= MAX_TALLOC_SIZE/el_size) {
3201 return NULL;
3204 if (el_size == 0 || count == 0) {
3205 return NULL;
3208 return _talloc_zero(ctx, el_size * count, name);
3212 * Talloc wrapper that returns NULL if size == 0.
3214 void *talloc_zeronull(const void *context, size_t size, const char *name)
3216 if (size == 0) {
3217 return NULL;
3219 return talloc_named_const(context, size, name);
3221 #endif