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/>.
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.
47 #if defined(GROUP_OBJ)
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 /* this is used by the chaining code */
65 static enum remote_arch_types ra_type = RA_UNKNOWN;
67 /***********************************************************************
68 Definitions for all names.
69 ***********************************************************************/
71 static char *smb_myname;
72 static char *smb_myworkgroup;
73 static char *smb_scope;
74 static int smb_num_netbios_names;
75 static char **smb_my_netbios_names;
77 /***********************************************************************
78 Allocate and set myname. Ensure upper case.
79 ***********************************************************************/
81 bool set_global_myname(const char *myname)
83 SAFE_FREE(smb_myname);
84 smb_myname = SMB_STRDUP(myname);
87 strupper_m(smb_myname);
91 const char *global_myname(void)
96 /***********************************************************************
97 Allocate and set myworkgroup. Ensure upper case.
98 ***********************************************************************/
100 bool set_global_myworkgroup(const char *myworkgroup)
102 SAFE_FREE(smb_myworkgroup);
103 smb_myworkgroup = SMB_STRDUP(myworkgroup);
104 if (!smb_myworkgroup)
106 strupper_m(smb_myworkgroup);
110 const char *lp_workgroup(void)
112 return smb_myworkgroup;
115 /***********************************************************************
116 Allocate and set scope. Ensure upper case.
117 ***********************************************************************/
119 bool set_global_scope(const char *scope)
121 SAFE_FREE(smb_scope);
122 smb_scope = SMB_STRDUP(scope);
125 strupper_m(smb_scope);
129 /*********************************************************************
130 Ensure scope is never null string.
131 *********************************************************************/
133 const char *global_scope(void)
136 set_global_scope("");
140 static void free_netbios_names_array(void)
144 for (i = 0; i < smb_num_netbios_names; i++)
145 SAFE_FREE(smb_my_netbios_names[i]);
147 SAFE_FREE(smb_my_netbios_names);
148 smb_num_netbios_names = 0;
151 static bool allocate_my_netbios_names_array(size_t number)
153 free_netbios_names_array();
155 smb_num_netbios_names = number + 1;
156 smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
158 if (!smb_my_netbios_names)
161 memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
165 static bool set_my_netbios_names(const char *name, int i)
167 SAFE_FREE(smb_my_netbios_names[i]);
169 smb_my_netbios_names[i] = SMB_STRDUP(name);
170 if (!smb_my_netbios_names[i])
172 strupper_m(smb_my_netbios_names[i]);
176 /***********************************************************************
177 Free memory allocated to global objects
178 ***********************************************************************/
180 void gfree_names(void)
182 SAFE_FREE( smb_myname );
183 SAFE_FREE( smb_myworkgroup );
184 SAFE_FREE( smb_scope );
185 free_netbios_names_array();
186 free_local_machine_name();
189 void gfree_all( void )
198 /* release the talloc null_context memory last */
199 talloc_disable_null_tracking();
202 const char *my_netbios_names(int i)
204 return smb_my_netbios_names[i];
207 bool set_netbios_aliases(const char **str_array)
211 /* Work out the max number of netbios aliases that we have */
212 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
215 if ( global_myname() && *global_myname())
218 /* Allocate space for the netbios aliases */
219 if (!allocate_my_netbios_names_array(namecount))
222 /* Use the global_myname string first */
224 if ( global_myname() && *global_myname()) {
225 set_my_netbios_names( global_myname(), namecount );
231 for ( i = 0; str_array[i] != NULL; i++) {
233 bool duplicate = False;
235 /* Look for duplicates */
236 for( n=0; n<namecount; n++ ) {
237 if( strequal( str_array[i], my_netbios_names(n) ) ) {
243 if (!set_my_netbios_names(str_array[i], namecount))
252 /****************************************************************************
253 Common name initialization code.
254 ****************************************************************************/
256 bool init_names(void)
260 if (global_myname() == NULL || *global_myname() == '\0') {
261 if (!set_global_myname(myhostname())) {
262 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
267 if (!set_netbios_aliases(lp_netbios_aliases())) {
268 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
272 set_local_machine_name(global_myname(),false);
274 DEBUG( 5, ("Netbios name list:-\n") );
275 for( n=0; my_netbios_names(n); n++ ) {
276 DEBUGADD( 5, ("my_netbios_names[%d]=\"%s\"\n",
277 n, my_netbios_names(n) ) );
283 /**************************************************************************n
284 Code to cope with username/password auth options from the commandline.
285 Used mainly in client tools.
286 ****************************************************************************/
288 static struct user_auth_info cmdline_auth_info = {
291 false, /* got_pass */
292 false, /* use_kerberos */
293 Undefined, /* signing state */
294 false /* smb_encrypt */
297 const char *get_cmdline_auth_info_username(void)
299 if (!cmdline_auth_info.username) {
302 return cmdline_auth_info.username;
305 void set_cmdline_auth_info_username(const char *username)
307 SAFE_FREE(cmdline_auth_info.username);
308 cmdline_auth_info.username = SMB_STRDUP(username);
309 if (!cmdline_auth_info.username) {
314 const char *get_cmdline_auth_info_password(void)
316 if (!cmdline_auth_info.password) {
319 return cmdline_auth_info.password;
322 void set_cmdline_auth_info_password(const char *password)
324 SAFE_FREE(cmdline_auth_info.password);
325 cmdline_auth_info.password = SMB_STRDUP(password);
326 if (!cmdline_auth_info.password) {
329 cmdline_auth_info.got_pass = true;
332 bool set_cmdline_auth_info_signing_state(const char *arg)
334 cmdline_auth_info.signing_state = -1;
335 if (strequal(arg, "off") || strequal(arg, "no") ||
336 strequal(arg, "false")) {
337 cmdline_auth_info.signing_state = false;
338 } else if (strequal(arg, "on") || strequal(arg, "yes") ||
339 strequal(arg, "true") || strequal(arg, "auto")) {
340 cmdline_auth_info.signing_state = true;
341 } else if (strequal(arg, "force") || strequal(arg, "required") ||
342 strequal(arg, "forced")) {
343 cmdline_auth_info.signing_state = Required;
350 int get_cmdline_auth_info_signing_state(void)
352 return cmdline_auth_info.signing_state;
355 bool get_cmdline_auth_info_use_kerberos(void)
357 return cmdline_auth_info.use_kerberos;
360 /* This should only be used by lib/popt_common.c JRA */
361 void set_cmdline_auth_info_use_krb5_ticket(void)
363 cmdline_auth_info.use_kerberos = true;
364 cmdline_auth_info.got_pass = true;
367 /* This should only be used by lib/popt_common.c JRA */
368 void set_cmdline_auth_info_smb_encrypt(void)
370 cmdline_auth_info.smb_encrypt = true;
373 bool get_cmdline_auth_info_got_pass(void)
375 return cmdline_auth_info.got_pass;
378 bool get_cmdline_auth_info_smb_encrypt(void)
380 return cmdline_auth_info.smb_encrypt;
383 bool get_cmdline_auth_info_copy(struct user_auth_info *info)
385 *info = cmdline_auth_info;
386 /* Now re-alloc the strings. */
387 info->username = SMB_STRDUP(get_cmdline_auth_info_username());
388 info->password = SMB_STRDUP(get_cmdline_auth_info_password());
389 if (!info->username || !info->password) {
395 /**************************************************************************n
396 Find a suitable temporary directory. The result should be copied immediately
397 as it may be overwritten by a subsequent call.
398 ****************************************************************************/
400 const char *tmpdir(void)
403 if ((p = getenv("TMPDIR")))
408 /****************************************************************************
409 Add a gid to an array of gids if it's not already there.
410 ****************************************************************************/
412 bool add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
413 gid_t **gids, size_t *num_gids)
417 if ((*num_gids != 0) && (*gids == NULL)) {
419 * A former call to this routine has failed to allocate memory
424 for (i=0; i<*num_gids; i++) {
425 if ((*gids)[i] == gid) {
430 *gids = TALLOC_REALLOC_ARRAY(mem_ctx, *gids, gid_t, *num_gids+1);
436 (*gids)[*num_gids] = gid;
441 /****************************************************************************
442 Like atoi but gets the value up to the separator character.
443 ****************************************************************************/
445 static const char *Atoic(const char *p, int *n, const char *c)
447 if (!isdigit((int)*p)) {
448 DEBUG(5, ("Atoic: malformed number\n"));
454 while ((*p) && isdigit((int)*p))
457 if (strchr_m(c, *p) == NULL) {
458 DEBUG(5, ("Atoic: no separator characters (%s) not found\n", c));
465 /*************************************************************************
466 Reads a list of numbers.
467 *************************************************************************/
469 const char *get_numlist(const char *p, uint32 **num, int *count)
473 if (num == NULL || count == NULL)
479 while ((p = Atoic(p, &val, ":,")) != NULL && (*p) != ':') {
480 *num = SMB_REALLOC_ARRAY((*num), uint32, (*count)+1);
484 (*num)[(*count)] = val;
492 /*******************************************************************
493 Check if a file exists - call vfs_file_exist for samba files.
494 ********************************************************************/
496 bool file_exist(const char *fname,SMB_STRUCT_STAT *sbuf)
502 if (sys_stat(fname,sbuf) != 0)
505 return((S_ISREG(sbuf->st_mode)) || (S_ISFIFO(sbuf->st_mode)));
508 /*******************************************************************
509 Check a files mod time.
510 ********************************************************************/
512 time_t file_modtime(const char *fname)
516 if (sys_stat(fname,&st) != 0)
522 /*******************************************************************
523 Check if a directory exists.
524 ********************************************************************/
526 bool directory_exist(char *dname,SMB_STRUCT_STAT *st)
534 if (sys_stat(dname,st) != 0)
537 ret = S_ISDIR(st->st_mode);
543 /*******************************************************************
544 Returns the size in bytes of the named file.
545 ********************************************************************/
547 SMB_OFF_T get_file_size(char *file_name)
551 if(sys_stat(file_name,&buf) != 0)
552 return (SMB_OFF_T)-1;
556 /*******************************************************************
557 Return a string representing an attribute for a file.
558 ********************************************************************/
560 char *attrib_string(uint16 mode)
566 if (mode & aVOLID) fstrcat(attrstr,"V");
567 if (mode & aDIR) fstrcat(attrstr,"D");
568 if (mode & aARCH) fstrcat(attrstr,"A");
569 if (mode & aHIDDEN) fstrcat(attrstr,"H");
570 if (mode & aSYSTEM) fstrcat(attrstr,"S");
571 if (mode & aRONLY) fstrcat(attrstr,"R");
573 return talloc_strdup(talloc_tos(), attrstr);
576 /*******************************************************************
577 Show a smb message structure.
578 ********************************************************************/
580 void show_msg(char *buf)
588 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
590 (int)CVAL(buf,smb_com),
591 (int)CVAL(buf,smb_rcls),
592 (int)CVAL(buf,smb_reh),
593 (int)SVAL(buf,smb_err),
594 (int)CVAL(buf,smb_flg),
595 (int)SVAL(buf,smb_flg2)));
596 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
597 (int)SVAL(buf,smb_tid),
598 (int)SVAL(buf,smb_pid),
599 (int)SVAL(buf,smb_uid),
600 (int)SVAL(buf,smb_mid)));
601 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
603 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
604 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
605 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
607 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
609 DEBUGADD(5,("smb_bcc=%d\n",bcc));
617 dump_data(10, (uint8 *)smb_buf(buf), bcc);
620 /*******************************************************************
621 Set the length and marker of an encrypted smb packet.
622 ********************************************************************/
624 void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)
626 _smb_setlen(buf,len);
630 SSVAL(buf,6,enc_ctx_num);
633 /*******************************************************************
634 Set the length and marker of an smb packet.
635 ********************************************************************/
637 void smb_setlen(char *buf,int len)
639 _smb_setlen(buf,len);
647 /*******************************************************************
648 Setup only the byte count for a smb message.
649 ********************************************************************/
651 int set_message_bcc(char *buf,int num_bytes)
653 int num_words = CVAL(buf,smb_wct);
654 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
655 _smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
656 return (smb_size + num_words*2 + num_bytes);
659 /*******************************************************************
660 Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
661 Return the bytes added
662 ********************************************************************/
664 ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
666 size_t newlen = smb_len(*outbuf) + 4 + blob.length;
669 if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
670 DEBUG(0, ("talloc failed\n"));
675 memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
676 set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
680 /*******************************************************************
681 Reduce a file name, removing .. elements.
682 ********************************************************************/
684 static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
689 DEBUG(3,("dos_clean_name [%s]\n",s));
691 /* remove any double slashes */
692 str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
697 /* Remove leading .\\ characters */
698 if(strncmp(str, ".\\", 2) == 0) {
699 trim_string(str, ".\\", NULL);
701 str = talloc_strdup(ctx, ".\\");
708 while ((p = strstr_m(str,"\\..\\")) != NULL) {
714 if ((p=strrchr_m(str,'\\')) != NULL) {
719 str = talloc_asprintf(ctx,
728 trim_string(str,NULL,"\\..");
729 return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
732 /*******************************************************************
733 Reduce a file name, removing .. elements.
734 ********************************************************************/
736 char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
741 DEBUG(3,("unix_clean_name [%s]\n",s));
743 /* remove any double slashes */
744 str = talloc_all_string_sub(ctx, s, "//","/");
749 /* Remove leading ./ characters */
750 if(strncmp(str, "./", 2) == 0) {
751 trim_string(str, "./", NULL);
753 str = talloc_strdup(ctx, "./");
760 while ((p = strstr_m(str,"/../")) != NULL) {
766 if ((p=strrchr_m(str,'/')) != NULL) {
771 str = talloc_asprintf(ctx,
780 trim_string(str,NULL,"/..");
781 return talloc_all_string_sub(ctx, str, "/./", "/");
784 char *clean_name(TALLOC_CTX *ctx, const char *s)
786 char *str = dos_clean_name(ctx, s);
790 return unix_clean_name(ctx, str);
793 /*******************************************************************
794 Close the low 3 fd's and open dev/null in their place.
795 ********************************************************************/
797 void close_low_fds(bool stderr_too)
809 /* try and use up these file descriptors, so silly
810 library routines writing to stdout etc won't cause havoc */
812 if (i == 2 && !stderr_too)
815 fd = sys_open("/dev/null",O_RDWR,0);
817 fd = sys_open("/dev/null",O_WRONLY,0);
819 DEBUG(0,("Can't open /dev/null\n"));
823 DEBUG(0,("Didn't get file descriptor %d\n",i));
830 /*******************************************************************
831 Write data into an fd at a given offset. Ignore seek errors.
832 ********************************************************************/
834 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
839 if (pos == (SMB_OFF_T)-1) {
840 return write_data(fd, buffer, N);
842 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
844 ret = sys_pwrite(fd,buffer + total,N - total, pos);
845 if (ret == -1 && errno == ESPIPE) {
846 return write_data(fd, buffer + total,N - total);
849 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
858 return (ssize_t)total;
860 /* Use lseek and write_data. */
861 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
862 if (errno != ESPIPE) {
866 return write_data(fd, buffer, N);
870 /****************************************************************************
871 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
875 ****************************************************************************/
877 int set_blocking(int fd, bool set)
881 #define FLAG_TO_SET O_NONBLOCK
884 #define FLAG_TO_SET O_NDELAY
886 #define FLAG_TO_SET FNDELAY
890 if((val = sys_fcntl_long(fd, F_GETFL, 0)) == -1)
892 if(set) /* Turn blocking on - ie. clear nonblock flag */
896 return sys_fcntl_long( fd, F_SETFL, val);
900 /****************************************************************************
901 Transfer some data between two fd's.
902 ****************************************************************************/
904 #ifndef TRANSFER_BUF_SIZE
905 #define TRANSFER_BUF_SIZE 65536
909 ssize_t transfer_file_internal(void *in_file,
912 ssize_t (*read_fn)(void *, void *, size_t),
913 ssize_t (*write_fn)(void *, void *, size_t))
919 size_t num_to_read_thistime;
920 size_t num_written = 0;
922 if ((buf = SMB_MALLOC_ARRAY(char, TRANSFER_BUF_SIZE)) == NULL)
926 num_to_read_thistime = MIN((n - total), TRANSFER_BUF_SIZE);
928 read_ret = (*read_fn)(in_file, buf, num_to_read_thistime);
929 if (read_ret == -1) {
930 DEBUG(0,("transfer_file_internal: read failure. Error = %s\n", strerror(errno) ));
939 while (num_written < read_ret) {
940 write_ret = (*write_fn)(out_file, buf + num_written, read_ret - num_written);
942 if (write_ret == -1) {
943 DEBUG(0,("transfer_file_internal: write failure. Error = %s\n", strerror(errno) ));
948 return (ssize_t)total;
950 num_written += (size_t)write_ret;
953 total += (size_t)read_ret;
957 return (ssize_t)total;
960 static ssize_t sys_read_fn(void *file, void *buf, size_t len)
962 int *fd = (int *)file;
964 return sys_read(*fd, buf, len);
967 static ssize_t sys_write_fn(void *file, void *buf, size_t len)
969 int *fd = (int *)file;
971 return sys_read(*fd, buf, len);
974 SMB_OFF_T transfer_file(int infd,int outfd,SMB_OFF_T n)
976 return (SMB_OFF_T)transfer_file_internal(&infd, &outfd, (size_t)n, sys_read_fn, sys_write_fn);
979 /*******************************************************************
980 Sleep for a specified number of milliseconds.
981 ********************************************************************/
983 void smb_msleep(unsigned int t)
985 #if defined(HAVE_NANOSLEEP)
986 struct timespec tval;
989 tval.tv_sec = t/1000;
990 tval.tv_nsec = 1000000*(t%1000);
994 ret = nanosleep(&tval, &tval);
995 } while (ret < 0 && errno == EINTR && (tval.tv_sec > 0 || tval.tv_nsec > 0));
997 unsigned int tdiff=0;
998 struct timeval tval,t1,t2;
1005 tval.tv_sec = (t-tdiff)/1000;
1006 tval.tv_usec = 1000*((t-tdiff)%1000);
1008 /* Never wait for more than 1 sec. */
1009 if (tval.tv_sec > 1) {
1016 sys_select_intr(0,&fds,NULL,NULL,&tval);
1019 if (t2.tv_sec < t1.tv_sec) {
1020 /* Someone adjusted time... */
1024 tdiff = TvalDiff(&t1,&t2);
1029 /****************************************************************************
1030 Become a daemon, discarding the controlling terminal.
1031 ****************************************************************************/
1033 void become_daemon(bool Fork, bool no_process_group)
1041 /* detach from the terminal */
1043 if (!no_process_group) setsid();
1044 #elif defined(TIOCNOTTY)
1045 if (!no_process_group) {
1046 int i = sys_open("/dev/tty", O_RDWR, 0);
1048 ioctl(i, (int) TIOCNOTTY, (char *)0);
1052 #endif /* HAVE_SETSID */
1054 /* Close fd's 0,1,2. Needed if started by rsh */
1055 close_low_fds(False); /* Don't close stderr, let the debug system
1056 attach it to the logfile */
1059 /****************************************************************************
1060 Put up a yes/no prompt.
1061 ****************************************************************************/
1063 bool yesno(const char *p)
1068 if (!fgets(ans,sizeof(ans)-1,stdin))
1071 if (*ans == 'y' || *ans == 'Y')
1077 #if defined(PARANOID_MALLOC_CHECKER)
1079 /****************************************************************************
1080 Internal malloc wrapper. Externally visible.
1081 ****************************************************************************/
1083 void *malloc_(size_t size)
1089 return malloc(size);
1090 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
1093 /****************************************************************************
1094 Internal calloc wrapper. Not externally visible.
1095 ****************************************************************************/
1097 static void *calloc_(size_t count, size_t size)
1099 if (size == 0 || count == 0) {
1103 return calloc(count, size);
1104 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
1107 /****************************************************************************
1108 Internal realloc wrapper. Not externally visible.
1109 ****************************************************************************/
1111 static void *realloc_(void *ptr, size_t size)
1114 return realloc(ptr, size);
1115 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
1118 #endif /* PARANOID_MALLOC_CHECKER */
1120 /****************************************************************************
1122 ****************************************************************************/
1124 void *malloc_array(size_t el_size, unsigned int count)
1126 if (count >= MAX_ALLOC_SIZE/el_size) {
1130 if (el_size == 0 || count == 0) {
1133 #if defined(PARANOID_MALLOC_CHECKER)
1134 return malloc_(el_size*count);
1136 return malloc(el_size*count);
1140 /****************************************************************************
1142 ****************************************************************************/
1144 void *memalign_array(size_t el_size, size_t align, unsigned int count)
1146 if (count >= MAX_ALLOC_SIZE/el_size) {
1150 return sys_memalign(align, el_size*count);
1153 /****************************************************************************
1155 ****************************************************************************/
1157 void *calloc_array(size_t size, size_t nmemb)
1159 if (nmemb >= MAX_ALLOC_SIZE/size) {
1162 if (size == 0 || nmemb == 0) {
1165 #if defined(PARANOID_MALLOC_CHECKER)
1166 return calloc_(nmemb, size);
1168 return calloc(nmemb, size);
1172 /****************************************************************************
1173 Expand a pointer to be a particular size.
1174 Note that this version of Realloc has an extra parameter that decides
1175 whether to free the passed in storage on allocation failure or if the
1178 This is designed for use in the typical idiom of :
1180 p = SMB_REALLOC(p, size)
1185 and not to have to keep track of the old 'p' contents to free later, nor
1186 to worry if the size parameter was zero. In the case where NULL is returned
1187 we guarentee that p has been freed.
1189 If free later semantics are desired, then pass 'free_old_on_error' as False which
1190 guarentees that the old contents are not freed on error, even if size == 0. To use
1193 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
1201 Changes were instigated by Coverity error checking. JRA.
1202 ****************************************************************************/
1204 void *Realloc(void *p, size_t size, bool free_old_on_error)
1209 if (free_old_on_error) {
1212 DEBUG(2,("Realloc asked for 0 bytes\n"));
1216 #if defined(PARANOID_MALLOC_CHECKER)
1218 ret = (void *)malloc_(size);
1220 ret = (void *)realloc_(p,size);
1224 ret = (void *)malloc(size);
1226 ret = (void *)realloc(p,size);
1231 if (free_old_on_error && p) {
1234 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
1240 /****************************************************************************
1242 ****************************************************************************/
1244 void *realloc_array(void *p, size_t el_size, unsigned int count, bool free_old_on_error)
1246 if (count >= MAX_ALLOC_SIZE/el_size) {
1247 if (free_old_on_error) {
1252 return Realloc(p, el_size*count, free_old_on_error);
1255 /****************************************************************************
1256 (Hopefully) efficient array append.
1257 ****************************************************************************/
1259 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
1260 void *element, void *_array, uint32 *num_elements,
1261 ssize_t *array_size)
1263 void **array = (void **)_array;
1265 if (*array_size < 0) {
1269 if (*array == NULL) {
1270 if (*array_size == 0) {
1274 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1278 *array = TALLOC(mem_ctx, element_size * (*array_size));
1279 if (*array == NULL) {
1284 if (*num_elements == *array_size) {
1287 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1291 *array = TALLOC_REALLOC(mem_ctx, *array,
1292 element_size * (*array_size));
1294 if (*array == NULL) {
1299 memcpy((char *)(*array) + element_size*(*num_elements),
1300 element, element_size);
1310 /****************************************************************************
1311 Free memory, checks for NULL.
1312 Use directly SAFE_FREE()
1313 Exists only because we need to pass a function pointer somewhere --SSS
1314 ****************************************************************************/
1316 void safe_free(void *p)
1321 /****************************************************************************
1322 Get my own name and IP.
1323 ****************************************************************************/
1325 char *get_myname(TALLOC_CTX *ctx)
1328 char hostname[HOST_NAME_MAX];
1332 /* get my host name */
1333 if (gethostname(hostname, sizeof(hostname)) == -1) {
1334 DEBUG(0,("gethostname failed\n"));
1338 /* Ensure null termination. */
1339 hostname[sizeof(hostname)-1] = '\0';
1341 /* split off any parts after an initial . */
1342 p = strchr_m(hostname,'.');
1347 return talloc_strdup(ctx, hostname);
1350 /****************************************************************************
1351 Get my own domain name, or "" if we have none.
1352 ****************************************************************************/
1354 char *get_mydnsdomname(TALLOC_CTX *ctx)
1356 const char *domname;
1359 domname = get_mydnsfullname();
1364 p = strchr_m(domname, '.');
1367 return talloc_strdup(ctx, p);
1369 return talloc_strdup(ctx, "");
1373 /****************************************************************************
1374 Interpret a protocol description string, with a default.
1375 ****************************************************************************/
1377 int interpret_protocol(const char *str,int def)
1379 if (strequal(str,"NT1"))
1380 return(PROTOCOL_NT1);
1381 if (strequal(str,"LANMAN2"))
1382 return(PROTOCOL_LANMAN2);
1383 if (strequal(str,"LANMAN1"))
1384 return(PROTOCOL_LANMAN1);
1385 if (strequal(str,"CORE"))
1386 return(PROTOCOL_CORE);
1387 if (strequal(str,"COREPLUS"))
1388 return(PROTOCOL_COREPLUS);
1389 if (strequal(str,"CORE+"))
1390 return(PROTOCOL_COREPLUS);
1392 DEBUG(0,("Unrecognised protocol level %s\n",str));
1398 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1399 /******************************************************************
1400 Remove any mount options such as -rsize=2048,wsize=2048 etc.
1401 Based on a fix from <Thomas.Hepper@icem.de>.
1402 Returns a malloc'ed string.
1403 *******************************************************************/
1405 static char *strip_mount_options(TALLOC_CTX *ctx, const char *str)
1408 const char *p = str;
1409 while(*p && !isspace(*p))
1411 while(*p && isspace(*p))
1414 return talloc_strdup(ctx, p);
1420 /*******************************************************************
1421 Patch from jkf@soton.ac.uk
1422 Split Luke's automount_server into YP lookup and string splitter
1423 so can easily implement automount_path().
1424 Returns a malloc'ed string.
1425 *******************************************************************/
1427 #ifdef WITH_NISPLUS_HOME
1428 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1432 char *nis_map = (char *)lp_nis_home_map_name();
1434 char buffer[NIS_MAXATTRVAL + 1];
1439 snprintf(buffer, sizeof(buffer), "[key=%s],%s", user_name, nis_map);
1440 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
1442 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
1443 if (result->status != NIS_SUCCESS) {
1444 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
1446 object = result->objects.objects_val;
1447 if (object->zo_data.zo_type == ENTRY_OBJ) {
1448 entry = &object->zo_data.objdata_u.en_data;
1449 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
1450 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
1452 value = talloc_strdup(ctx,
1453 entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
1455 nis_freeresult(result);
1458 value = talloc_string_sub(ctx,
1465 nis_freeresult(result);
1468 value = strip_mount_options(ctx, value);
1469 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n",
1474 #else /* WITH_NISPLUS_HOME */
1476 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1480 int nis_error; /* returned by yp all functions */
1481 char *nis_result; /* yp_match inits this */
1482 int nis_result_len; /* and set this */
1483 char *nis_domain; /* yp_get_default_domain inits this */
1484 char *nis_map = (char *)lp_nis_home_map_name();
1486 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
1487 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
1491 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
1493 if ((nis_error = yp_match(nis_domain, nis_map, user_name,
1494 strlen(user_name), &nis_result,
1495 &nis_result_len)) == 0) {
1496 value = talloc_strdup(ctx, nis_result);
1500 value = strip_mount_options(ctx, value);
1501 } else if(nis_error == YPERR_KEY) {
1502 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
1503 user_name, nis_map));
1504 DEBUG(3, ("using defaults for server and home directory\n"));
1506 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
1507 yperr_string(nis_error), user_name, nis_map));
1511 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, value));
1515 #endif /* WITH_NISPLUS_HOME */
1518 /****************************************************************************
1519 Check if a process exists. Does this work on all unixes?
1520 ****************************************************************************/
1522 bool process_exists(const struct server_id pid)
1524 if (procid_is_me(&pid)) {
1528 if (procid_is_local(&pid)) {
1529 return (kill(pid.pid,0) == 0 || errno != ESRCH);
1532 #ifdef CLUSTER_SUPPORT
1533 return ctdbd_process_exists(messaging_ctdbd_connection(), pid.vnn,
1540 bool process_exists_by_pid(pid_t pid)
1542 /* Doing kill with a non-positive pid causes messages to be
1543 * sent to places we don't want. */
1544 SMB_ASSERT(pid > 0);
1545 return(kill(pid,0) == 0 || errno != ESRCH);
1548 /*******************************************************************
1549 Convert a uid into a user name.
1550 ********************************************************************/
1552 const char *uidtoname(uid_t uid)
1554 TALLOC_CTX *ctx = talloc_tos();
1556 struct passwd *pass = NULL;
1558 pass = getpwuid_alloc(ctx,uid);
1560 name = talloc_strdup(ctx,pass->pw_name);
1563 name = talloc_asprintf(ctx,
1570 /*******************************************************************
1571 Convert a gid into a group name.
1572 ********************************************************************/
1574 char *gidtoname(gid_t gid)
1578 grp = getgrgid(gid);
1580 return talloc_strdup(talloc_tos(), grp->gr_name);
1583 return talloc_asprintf(talloc_tos(),
1589 /*******************************************************************
1590 Convert a user name into a uid.
1591 ********************************************************************/
1593 uid_t nametouid(const char *name)
1595 struct passwd *pass;
1599 pass = getpwnam_alloc(NULL, name);
1606 u = (uid_t)strtol(name, &p, 0);
1607 if ((p != name) && (*p == '\0'))
1613 /*******************************************************************
1614 Convert a name to a gid_t if possible. Return -1 if not a group.
1615 ********************************************************************/
1617 gid_t nametogid(const char *name)
1623 g = (gid_t)strtol(name, &p, 0);
1624 if ((p != name) && (*p == '\0'))
1627 grp = sys_getgrnam(name);
1629 return(grp->gr_gid);
1633 /*******************************************************************
1634 Something really nasty happened - panic !
1635 ********************************************************************/
1637 void smb_panic(const char *const why)
1645 if (global_clobber_region_function) {
1646 DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1647 global_clobber_region_function,
1648 global_clobber_region_line));
1653 DEBUG(0,("PANIC (pid %llu): %s\n",
1654 (unsigned long long)sys_getpid(), why));
1657 cmd = lp_panic_action();
1659 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1660 result = system(cmd);
1663 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1666 DEBUG(0, ("smb_panic(): action returned status %d\n",
1667 WEXITSTATUS(result)));
1673 /*******************************************************************
1674 Print a backtrace of the stack to the debug log. This function
1675 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1676 exit shortly after calling it.
1677 ********************************************************************/
1679 #ifdef HAVE_LIBUNWIND_H
1680 #include <libunwind.h>
1683 #ifdef HAVE_EXECINFO_H
1684 #include <execinfo.h>
1687 #ifdef HAVE_LIBEXC_H
1691 void log_stack_trace(void)
1693 #ifdef HAVE_LIBUNWIND
1694 /* Try to use libunwind before any other technique since on ia64
1695 * libunwind correctly walks the stack in more circumstances than
1698 unw_cursor_t cursor;
1703 unw_word_t ip, sp, off;
1705 procname[sizeof(procname) - 1] = '\0';
1707 if (unw_getcontext(&uc) != 0) {
1708 goto libunwind_failed;
1711 if (unw_init_local(&cursor, &uc) != 0) {
1712 goto libunwind_failed;
1715 DEBUG(0, ("BACKTRACE:\n"));
1719 unw_get_reg(&cursor, UNW_REG_IP, &ip);
1720 unw_get_reg(&cursor, UNW_REG_SP, &sp);
1722 switch (unw_get_proc_name(&cursor,
1723 procname, sizeof(procname) - 1, &off) ) {
1727 /* Name truncated. */
1728 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1729 i, procname, (long long)off,
1730 (long long)ip, (long long) sp));
1733 /* case -UNW_ENOINFO: */
1734 /* case -UNW_EUNSPEC: */
1735 /* No symbol name found. */
1736 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1737 i, "<unknown symbol>",
1738 (long long)ip, (long long) sp));
1741 } while (unw_step(&cursor) > 0);
1746 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1748 #elif HAVE_BACKTRACE_SYMBOLS
1749 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1750 size_t backtrace_size;
1751 char **backtrace_strings;
1753 /* get the backtrace (stack frames) */
1754 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1755 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1757 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1758 (unsigned long)backtrace_size));
1760 if (backtrace_strings) {
1763 for (i = 0; i < backtrace_size; i++)
1764 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1766 /* Leak the backtrace_strings, rather than risk what free() might do */
1771 /* The IRIX libexc library provides an API for unwinding the stack. See
1772 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1773 * since we are about to abort anyway, it hardly matters.
1776 #define NAMESIZE 32 /* Arbitrary */
1778 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1779 char * names[BACKTRACE_STACK_SIZE];
1780 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1787 ZERO_ARRAY(namebuf);
1789 /* We need to be root so we can open our /proc entry to walk
1790 * our stack. It also helps when we want to dump core.
1794 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1795 names[i] = namebuf + (i * NAMESIZE);
1798 levels = trace_back_stack(0, addrs, names,
1799 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1801 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1802 for (i = 0; i < levels; i++) {
1803 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1808 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1812 /*******************************************************************
1813 A readdir wrapper which just returns the file name.
1814 ********************************************************************/
1816 const char *readdirname(SMB_STRUCT_DIR *p)
1818 SMB_STRUCT_DIRENT *ptr;
1824 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1828 dname = ptr->d_name;
1835 #ifdef HAVE_BROKEN_READDIR_NAME
1836 /* using /usr/ucb/cc is BAD */
1840 return talloc_strdup(talloc_tos(), dname);
1843 /*******************************************************************
1844 Utility function used to decide if the last component
1845 of a path matches a (possibly wildcarded) entry in a namelist.
1846 ********************************************************************/
1848 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive)
1850 const char *last_component;
1852 /* if we have no list it's obviously not in the path */
1853 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1857 DEBUG(8, ("is_in_path: %s\n", name));
1859 /* Get the last component of the unix name. */
1860 last_component = strrchr_m(name, '/');
1861 if (!last_component) {
1862 last_component = name;
1864 last_component++; /* Go past '/' */
1867 for(; namelist->name != NULL; namelist++) {
1868 if(namelist->is_wild) {
1869 if (mask_match(last_component, namelist->name, case_sensitive)) {
1870 DEBUG(8,("is_in_path: mask match succeeded\n"));
1874 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1875 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1876 DEBUG(8,("is_in_path: match succeeded\n"));
1881 DEBUG(8,("is_in_path: match not found\n"));
1885 /*******************************************************************
1886 Strip a '/' separated list into an array of
1887 name_compare_enties structures suitable for
1888 passing to is_in_path(). We do this for
1889 speed so we can pre-parse all the names in the list
1890 and don't do it for each call to is_in_path().
1891 namelist is modified here and is assumed to be
1892 a copy owned by the caller.
1893 We also check if the entry contains a wildcard to
1894 remove a potentially expensive call to mask_match
1896 ********************************************************************/
1898 void set_namearray(name_compare_entry **ppname_array, char *namelist)
1901 char *nameptr = namelist;
1902 int num_entries = 0;
1905 (*ppname_array) = NULL;
1907 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
1910 /* We need to make two passes over the string. The
1911 first to count the number of elements, the second
1916 if ( *nameptr == '/' ) {
1917 /* cope with multiple (useless) /s) */
1921 /* find the next / */
1922 name_end = strchr_m(nameptr, '/');
1924 /* oops - the last check for a / didn't find one. */
1925 if (name_end == NULL)
1928 /* next segment please */
1929 nameptr = name_end + 1;
1933 if(num_entries == 0)
1936 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1937 DEBUG(0,("set_namearray: malloc fail\n"));
1941 /* Now copy out the names */
1945 if ( *nameptr == '/' ) {
1946 /* cope with multiple (useless) /s) */
1950 /* find the next / */
1951 if ((name_end = strchr_m(nameptr, '/')) != NULL)
1954 /* oops - the last check for a / didn't find one. */
1955 if(name_end == NULL)
1958 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1959 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1960 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1964 /* next segment please */
1965 nameptr = name_end + 1;
1969 (*ppname_array)[i].name = NULL;
1974 /****************************************************************************
1975 Routine to free a namearray.
1976 ****************************************************************************/
1978 void free_namearray(name_compare_entry *name_array)
1982 if(name_array == NULL)
1985 for(i=0; name_array[i].name!=NULL; i++)
1986 SAFE_FREE(name_array[i].name);
1987 SAFE_FREE(name_array);
1991 #define DBGC_CLASS DBGC_LOCKING
1993 /****************************************************************************
1994 Simple routine to do POSIX file locking. Cruft in NFS and 64->32 bit mapping
1995 is dealt with in posix.c
1996 Returns True if the lock was granted, False otherwise.
1997 ****************************************************************************/
1999 bool fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
2001 SMB_STRUCT_FLOCK lock;
2004 DEBUG(8,("fcntl_lock fd=%d op=%d offset=%.0f count=%.0f type=%d\n",
2005 fd,op,(double)offset,(double)count,type));
2008 lock.l_whence = SEEK_SET;
2009 lock.l_start = offset;
2013 ret = sys_fcntl_ptr(fd,op,&lock);
2017 DEBUG(3,("fcntl_lock: lock failed at offset %.0f count %.0f op %d type %d (%s)\n",
2018 (double)offset,(double)count,op,type,strerror(errno)));
2023 /* everything went OK */
2024 DEBUG(8,("fcntl_lock: Lock call successful\n"));
2029 /****************************************************************************
2030 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
2031 is dealt with in posix.c
2032 Returns True if we have information regarding this lock region (and returns
2033 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
2034 ****************************************************************************/
2036 bool fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
2038 SMB_STRUCT_FLOCK lock;
2041 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
2042 fd,(double)*poffset,(double)*pcount,*ptype));
2044 lock.l_type = *ptype;
2045 lock.l_whence = SEEK_SET;
2046 lock.l_start = *poffset;
2047 lock.l_len = *pcount;
2050 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
2054 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
2055 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
2060 *ptype = lock.l_type;
2061 *poffset = lock.l_start;
2062 *pcount = lock.l_len;
2065 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
2066 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
2071 #define DBGC_CLASS DBGC_ALL
2073 /*******************************************************************
2074 Is the name specified one of my netbios names.
2075 Returns true if it is equal, false otherwise.
2076 ********************************************************************/
2078 bool is_myname(const char *s)
2083 for (n=0; my_netbios_names(n); n++) {
2084 if (strequal(my_netbios_names(n), s)) {
2089 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
2093 /*******************************************************************
2094 Is the name specified our workgroup/domain.
2095 Returns true if it is equal, false otherwise.
2096 ********************************************************************/
2098 bool is_myworkgroup(const char *s)
2102 if (strequal(s, lp_workgroup())) {
2106 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
2110 /*******************************************************************
2111 we distinguish between 2K and XP by the "Native Lan Manager" string
2112 WinXP => "Windows 2002 5.1"
2113 WinXP 64bit => "Windows XP 5.2"
2114 Win2k => "Windows 2000 5.0"
2115 NT4 => "Windows NT 4.0"
2116 Win9x => "Windows 4.0"
2117 Windows 2003 doesn't set the native lan manager string but
2118 they do set the domain to "Windows 2003 5.2" (probably a bug).
2119 ********************************************************************/
2121 void ra_lanman_string( const char *native_lanman )
2123 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
2124 set_remote_arch( RA_WINXP );
2125 else if ( strcmp( native_lanman, "Windows XP 5.2" ) == 0 )
2126 set_remote_arch( RA_WINXP );
2127 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
2128 set_remote_arch( RA_WIN2K3 );
2131 static const char *remote_arch_str;
2133 const char *get_remote_arch_str(void)
2135 if (!remote_arch_str) {
2138 return remote_arch_str;
2141 /*******************************************************************
2142 Set the horrid remote_arch string based on an enum.
2143 ********************************************************************/
2145 void set_remote_arch(enum remote_arch_types type)
2150 remote_arch_str = "WfWg";
2153 remote_arch_str = "OS2";
2156 remote_arch_str = "Win95";
2159 remote_arch_str = "WinNT";
2162 remote_arch_str = "Win2K";
2165 remote_arch_str = "WinXP";
2168 remote_arch_str = "Win2K3";
2171 remote_arch_str = "Vista";
2174 remote_arch_str = "Samba";
2177 remote_arch_str = "CIFSFS";
2180 ra_type = RA_UNKNOWN;
2181 remote_arch_str = "UNKNOWN";
2185 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
2189 /*******************************************************************
2190 Get the remote_arch type.
2191 ********************************************************************/
2193 enum remote_arch_types get_remote_arch(void)
2198 void print_asc(int level, const unsigned char *buf,int len)
2202 DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
2205 void dump_data(int level, const unsigned char *buf1,int len)
2207 const unsigned char *buf = (const unsigned char *)buf1;
2211 if (!DEBUGLVL(level)) return;
2213 DEBUGADD(level,("[%03X] ",i));
2215 DEBUGADD(level,("%02X ",(int)buf[i]));
2217 if (i%8 == 0) DEBUGADD(level,(" "));
2219 print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
2220 print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
2221 if (i<len) DEBUGADD(level,("[%03X] ",i));
2227 DEBUGADD(level,(" "));
2228 if (n>8) DEBUGADD(level,(" "));
2229 while (n--) DEBUGADD(level,(" "));
2231 print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " ));
2233 if (n>0) print_asc(level,&buf[i-n],n);
2234 DEBUGADD(level,("\n"));
2238 void dump_data_pw(const char *msg, const uchar * data, size_t len)
2240 #ifdef DEBUG_PASSWORD
2241 DEBUG(11, ("%s", msg));
2242 if (data != NULL && len > 0)
2244 dump_data(11, data, len);
2249 const char *tab_depth(int level, int depth)
2251 if( DEBUGLVL(level) ) {
2252 dbgtext("%*s", depth*4, "");
2257 /*****************************************************************************
2258 Provide a checksum on a string
2260 Input: s - the null-terminated character string for which the checksum
2263 Output: The checksum value calculated for s.
2264 *****************************************************************************/
2266 int str_checksum(const char *s)
2274 res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
2281 /*****************************************************************
2282 Zero a memory area then free it. Used to catch bugs faster.
2283 *****************************************************************/
2285 void zero_free(void *p, size_t size)
2291 /*****************************************************************
2292 Set our open file limit to a requested max and return the limit.
2293 *****************************************************************/
2295 int set_maxfiles(int requested_max)
2297 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
2299 int saved_current_limit;
2301 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2302 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
2305 return requested_max;
2309 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
2310 * account for the extra fd we need
2311 * as well as the log files and standard
2312 * handles etc. Save the limit we want to set in case
2313 * we are running on an OS that doesn't support this limit (AIX)
2314 * which always returns RLIM_INFINITY for rlp.rlim_max.
2317 /* Try raising the hard (max) limit to the requested amount. */
2319 #if defined(RLIM_INFINITY)
2320 if (rlp.rlim_max != RLIM_INFINITY) {
2321 int orig_max = rlp.rlim_max;
2323 if ( rlp.rlim_max < requested_max )
2324 rlp.rlim_max = requested_max;
2326 /* This failing is not an error - many systems (Linux) don't
2327 support our default request of 10,000 open files. JRA. */
2329 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2330 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
2331 (int)rlp.rlim_max, strerror(errno) ));
2333 /* Set failed - restore original value from get. */
2334 rlp.rlim_max = orig_max;
2339 /* Now try setting the soft (current) limit. */
2341 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
2343 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2344 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
2345 (int)rlp.rlim_cur, strerror(errno) ));
2347 return saved_current_limit;
2350 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2351 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2354 return saved_current_limit;
2357 #if defined(RLIM_INFINITY)
2358 if(rlp.rlim_cur == RLIM_INFINITY)
2359 return saved_current_limit;
2362 if((int)rlp.rlim_cur > saved_current_limit)
2363 return saved_current_limit;
2365 return rlp.rlim_cur;
2366 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2368 * No way to know - just guess...
2370 return requested_max;
2374 /*****************************************************************
2375 Possibly replace mkstemp if it is broken.
2376 *****************************************************************/
2378 int smb_mkstemp(char *name_template)
2380 #if HAVE_SECURE_MKSTEMP
2381 return mkstemp(name_template);
2383 /* have a reasonable go at emulating it. Hope that
2384 the system mktemp() isn't completly hopeless */
2385 char *p = mktemp(name_template);
2388 return open(p, O_CREAT|O_EXCL|O_RDWR, 0600);
2392 /*****************************************************************
2393 malloc that aborts with smb_panic on fail or zero size.
2394 *****************************************************************/
2396 void *smb_xmalloc_array(size_t size, unsigned int count)
2400 smb_panic("smb_xmalloc_array: called with zero size");
2402 if (count >= MAX_ALLOC_SIZE/size) {
2403 smb_panic("smb_xmalloc_array: alloc size too large");
2405 if ((p = SMB_MALLOC(size*count)) == NULL) {
2406 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2407 (unsigned long)size, (unsigned long)count));
2408 smb_panic("smb_xmalloc_array: malloc failed");
2414 Memdup with smb_panic on fail.
2417 void *smb_xmemdup(const void *p, size_t size)
2420 p2 = SMB_XMALLOC_ARRAY(unsigned char,size);
2421 memcpy(p2, p, size);
2426 strdup that aborts on malloc fail.
2429 char *smb_xstrdup(const char *s)
2431 #if defined(PARANOID_MALLOC_CHECKER)
2438 #define strdup rep_strdup
2441 char *s1 = strdup(s);
2442 #if defined(PARANOID_MALLOC_CHECKER)
2446 #define strdup(s) __ERROR_DONT_USE_STRDUP_DIRECTLY
2449 smb_panic("smb_xstrdup: malloc failed");
2456 strndup that aborts on malloc fail.
2459 char *smb_xstrndup(const char *s, size_t n)
2461 #if defined(PARANOID_MALLOC_CHECKER)
2467 #if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
2469 #define strndup rep_strndup
2472 char *s1 = strndup(s, n);
2473 #if defined(PARANOID_MALLOC_CHECKER)
2477 #define strndup(s,n) __ERROR_DONT_USE_STRNDUP_DIRECTLY
2480 smb_panic("smb_xstrndup: malloc failed");
2486 vasprintf that aborts on malloc fail
2489 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
2496 n = vasprintf(ptr, format, ap2);
2497 if (n == -1 || ! *ptr) {
2498 smb_panic("smb_xvasprintf: out of memory");
2503 /*****************************************************************
2504 Like strdup but for memory.
2505 *****************************************************************/
2507 void *memdup(const void *p, size_t size)
2512 p2 = SMB_MALLOC(size);
2515 memcpy(p2, p, size);
2519 /*****************************************************************
2520 Get local hostname and cache result.
2521 *****************************************************************/
2523 char *myhostname(void)
2527 /* This is cached forever so
2528 * use NULL talloc ctx. */
2529 ret = get_myname(NULL);
2534 /*****************************************************************
2535 A useful function for returning a path in the Samba pid directory.
2536 *****************************************************************/
2538 static char *xx_path(const char *name, const char *rootpath)
2542 fname = talloc_strdup(talloc_tos(), rootpath);
2546 trim_string(fname,"","/");
2548 if (!directory_exist(fname,NULL)) {
2552 return talloc_asprintf(talloc_tos(),
2558 /*****************************************************************
2559 A useful function for returning a path in the Samba lock directory.
2560 *****************************************************************/
2562 char *lock_path(const char *name)
2564 return xx_path(name, lp_lockdir());
2567 /*****************************************************************
2568 A useful function for returning a path in the Samba pid directory.
2569 *****************************************************************/
2571 char *pid_path(const char *name)
2573 return xx_path(name, lp_piddir());
2577 * @brief Returns an absolute path to a file in the Samba lib directory.
2579 * @param name File to find, relative to LIBDIR.
2581 * @retval Pointer to a string containing the full path.
2584 char *lib_path(const char *name)
2586 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_LIBDIR(), name);
2590 * @brief Returns an absolute path to a file in the Samba data directory.
2592 * @param name File to find, relative to CODEPAGEDIR.
2594 * @retval Pointer to a talloc'ed string containing the full path.
2597 char *data_path(const char *name)
2599 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_CODEPAGEDIR(), name);
2602 /*****************************************************************
2603 a useful function for returning a path in the Samba state directory
2604 *****************************************************************/
2606 char *state_path(const char *name)
2608 return xx_path(name, get_dyn_STATEDIR());
2612 * @brief Returns the platform specific shared library extension.
2614 * @retval Pointer to a const char * containing the extension.
2617 const char *shlib_ext(void)
2619 return get_dyn_SHLIBEXT();
2622 /*******************************************************************
2623 Given a filename - get its directory name
2624 NB: Returned in static storage. Caveats:
2625 o If caller wishes to preserve, they should copy.
2626 ********************************************************************/
2628 char *parent_dirname(const char *path)
2632 if (!parent_dirname_talloc(talloc_tos(), path, &parent, NULL)) {
2639 bool parent_dirname_talloc(TALLOC_CTX *mem_ctx, const char *dir,
2640 char **parent, const char **name)
2645 p = strrchr_m(dir, '/'); /* Find final '/', if any */
2648 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
2659 if (!(*parent = TALLOC_ARRAY(mem_ctx, char, len+1))) {
2662 memcpy(*parent, dir, len);
2663 (*parent)[len] = '\0';
2671 /*******************************************************************
2672 Determine if a pattern contains any Microsoft wildcard characters.
2673 *******************************************************************/
2675 bool ms_has_wild(const char *s)
2679 if (lp_posix_pathnames()) {
2680 /* With posix pathnames no characters are wild. */
2684 while ((c = *s++)) {
2697 bool ms_has_wild_w(const smb_ucs2_t *s)
2700 if (!s) return False;
2701 while ((c = *s++)) {
2703 case UCS2_CHAR('*'):
2704 case UCS2_CHAR('?'):
2705 case UCS2_CHAR('<'):
2706 case UCS2_CHAR('>'):
2707 case UCS2_CHAR('"'):
2714 /*******************************************************************
2715 A wrapper that handles case sensitivity and the special handling
2717 *******************************************************************/
2719 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
2721 if (strcmp(string,"..") == 0)
2723 if (strcmp(pattern,".") == 0)
2726 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2729 /*******************************************************************
2730 A wrapper that handles case sensitivity and the special handling
2731 of the ".." name. Varient that is only called by old search code which requires
2732 pattern translation.
2733 *******************************************************************/
2735 bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
2737 if (strcmp(string,"..") == 0)
2739 if (strcmp(pattern,".") == 0)
2742 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2745 /*******************************************************************
2746 A wrapper that handles a list of patters and calls mask_match()
2747 on each. Returns True if any of the patterns match.
2748 *******************************************************************/
2750 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive)
2752 while (listLen-- > 0) {
2753 if (mask_match(string, *list++, is_case_sensitive))
2759 /*********************************************************
2760 Recursive routine that is called by unix_wild_match.
2761 *********************************************************/
2763 static bool unix_do_match(const char *regexp, const char *str)
2767 for( p = regexp; *p && *str; ) {
2778 * Look for a character matching
2779 * the one after the '*'.
2783 return true; /* Automatic match */
2786 while(*str && (*p != *str))
2790 * Patch from weidel@multichart.de. In the case of the regexp
2791 * '*XX*' we want to ensure there are at least 2 'X' characters
2792 * in the string after the '*' for a match to be made.
2799 * Eat all the characters that match, but count how many there were.
2802 while(*str && (*p == *str)) {
2808 * Now check that if the regexp had n identical characters that
2809 * matchcount had at least that many matches.
2812 while ( *(p+1) && (*(p+1) == *p)) {
2817 if ( matchcount <= 0 )
2821 str--; /* We've eaten the match char after the '*' */
2823 if(unix_do_match(p, str))
2845 if (!*p && str[0] == '.' && str[1] == 0)
2848 if (!*str && *p == '?') {
2854 if(!*str && (*p == '*' && p[1] == '\0'))
2860 /*******************************************************************
2861 Simple case insensitive interface to a UNIX wildcard matcher.
2862 Returns True if match, False if not.
2863 *******************************************************************/
2865 bool unix_wild_match(const char *pattern, const char *string)
2867 TALLOC_CTX *ctx = talloc_stackframe();
2873 p2 = talloc_strdup(ctx,pattern);
2874 s2 = talloc_strdup(ctx,string);
2882 /* Remove any *? and ** from the pattern as they are meaningless */
2883 for(p = p2; *p; p++) {
2884 while( *p == '*' && (p[1] == '?' ||p[1] == '*')) {
2885 memmove(&p[1], &p[2], strlen(&p[2])+1);
2889 if (strequal(p2,"*")) {
2894 ret = unix_do_match(p2, s2);
2899 /**********************************************************************
2900 Converts a name to a fully qualified domain name.
2901 Returns true if lookup succeeded, false if not (then fqdn is set to name)
2902 Note we deliberately use gethostbyname here, not getaddrinfo as we want
2903 to examine the h_aliases and I don't know how to do that with getaddrinfo.
2904 ***********************************************************************/
2906 bool name_to_fqdn(fstring fqdn, const char *name)
2909 struct hostent *hp = gethostbyname(name);
2911 if (!hp || !hp->h_name || !*hp->h_name) {
2912 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2913 fstrcpy(fqdn, name);
2917 /* Find out if the fqdn is returned as an alias
2918 * to cope with /etc/hosts files where the first
2919 * name is not the fqdn but the short name */
2920 if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2922 for (i = 0; hp->h_aliases[i]; i++) {
2923 if (strchr_m(hp->h_aliases[i], '.')) {
2924 full = hp->h_aliases[i];
2929 if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2930 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2931 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2932 DEBUGADD(1, (" to Kerberos authentication problems as localhost.localdomain\n"));
2933 DEBUGADD(1, (" may end up being used instead of the real machine FQDN.\n"));
2940 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2941 fstrcpy(fqdn, full);
2945 /**********************************************************************
2946 Extension to talloc_get_type: Abort on type mismatch
2947 ***********************************************************************/
2949 void *talloc_check_name_abort(const void *ptr, const char *name)
2953 result = talloc_check_name(ptr, name);
2957 DEBUG(0, ("Talloc type mismatch, expected %s, got %s\n",
2958 name, talloc_get_name(ptr)));
2959 smb_panic("talloc type mismatch");
2960 /* Keep the compiler happy */
2964 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2966 switch (share_access & ~FILE_SHARE_DELETE) {
2967 case FILE_SHARE_NONE:
2969 case FILE_SHARE_READ:
2971 case FILE_SHARE_WRITE:
2973 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2976 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2978 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2985 pid_t procid_to_pid(const struct server_id *proc)
2990 static uint32 my_vnn = NONCLUSTER_VNN;
2992 void set_my_vnn(uint32 vnn)
2994 DEBUG(10, ("vnn pid %d = %u\n", (int)sys_getpid(), (unsigned int)vnn));
2998 uint32 get_my_vnn(void)
3003 struct server_id pid_to_procid(pid_t pid)
3005 struct server_id result;
3007 #ifdef CLUSTER_SUPPORT
3008 result.vnn = my_vnn;
3013 struct server_id procid_self(void)
3015 return pid_to_procid(sys_getpid());
3018 struct server_id server_id_self(void)
3020 return procid_self();
3023 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
3025 if (p1->pid != p2->pid)
3027 #ifdef CLUSTER_SUPPORT
3028 if (p1->vnn != p2->vnn)
3034 bool cluster_id_equal(const struct server_id *id1,
3035 const struct server_id *id2)
3037 return procid_equal(id1, id2);
3040 bool procid_is_me(const struct server_id *pid)
3042 if (pid->pid != sys_getpid())
3044 #ifdef CLUSTER_SUPPORT
3045 if (pid->vnn != my_vnn)
3051 struct server_id interpret_pid(const char *pid_string)
3053 #ifdef CLUSTER_SUPPORT
3054 unsigned int vnn, pid;
3055 struct server_id result;
3056 if (sscanf(pid_string, "%u:%u", &vnn, &pid) == 2) {
3060 else if (sscanf(pid_string, "%u", &pid) == 1) {
3061 result.vnn = NONCLUSTER_VNN;
3065 result.vnn = NONCLUSTER_VNN;
3070 return pid_to_procid(atoi(pid_string));
3074 char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid)
3076 #ifdef CLUSTER_SUPPORT
3077 if (pid->vnn == NONCLUSTER_VNN) {
3078 return talloc_asprintf(mem_ctx,
3083 return talloc_asprintf(mem_ctx,
3089 return talloc_asprintf(mem_ctx,
3095 char *procid_str_static(const struct server_id *pid)
3097 return procid_str(talloc_tos(), pid);
3100 bool procid_valid(const struct server_id *pid)
3102 return (pid->pid != -1);
3105 bool procid_is_local(const struct server_id *pid)
3107 #ifdef CLUSTER_SUPPORT
3108 return pid->vnn == my_vnn;
3114 int this_is_smp(void)
3116 #if defined(HAVE_SYSCONF)
3118 #if defined(SYSCONF_SC_NPROC_ONLN)
3119 return (sysconf(_SC_NPROC_ONLN) > 1) ? 1 : 0;
3120 #elif defined(SYSCONF_SC_NPROCESSORS_ONLN)
3121 return (sysconf(_SC_NPROCESSORS_ONLN) > 1) ? 1 : 0;
3131 /****************************************************************
3132 Check if an offset into a buffer is safe.
3133 If this returns True it's safe to indirect into the byte at
3135 ****************************************************************/
3137 bool is_offset_safe(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3139 const char *end_base = buf_base + buf_len;
3140 char *end_ptr = ptr + off;
3142 if (!buf_base || !ptr) {
3146 if (end_base < buf_base || end_ptr < ptr) {
3147 return False; /* wrap. */
3150 if (end_ptr < end_base) {
3156 /****************************************************************
3157 Return a safe pointer into a buffer, or NULL.
3158 ****************************************************************/
3160 char *get_safe_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3162 return is_offset_safe(buf_base, buf_len, ptr, off) ?
3166 /****************************************************************
3167 Return a safe pointer into a string within a buffer, or NULL.
3168 ****************************************************************/
3170 char *get_safe_str_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3172 if (!is_offset_safe(buf_base, buf_len, ptr, off)) {
3175 /* Check if a valid string exists at this offset. */
3176 if (skip_string(buf_base,buf_len, ptr + off) == NULL) {
3182 /****************************************************************
3183 Return an SVAL at a pointer, or failval if beyond the end.
3184 ****************************************************************/
3186 int get_safe_SVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
3189 * Note we use off+1 here, not off+2 as SVAL accesses ptr[0] and ptr[1],
3192 if (!is_offset_safe(buf_base, buf_len, ptr, off+1)) {
3195 return SVAL(ptr,off);
3198 /****************************************************************
3199 Return an IVAL at a pointer, or failval if beyond the end.
3200 ****************************************************************/
3202 int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
3205 * Note we use off+3 here, not off+4 as IVAL accesses
3206 * ptr[0] ptr[1] ptr[2] ptr[3] NOT ptr[4].
3208 if (!is_offset_safe(buf_base, buf_len, ptr, off+3)) {
3211 return IVAL(ptr,off);
3214 /****************************************************************
3215 Split DOM\user into DOM and user. Do not mix with winbind variants of that
3216 call (they take care of winbind separator and other winbind specific settings).
3217 ****************************************************************/
3219 void split_domain_user(TALLOC_CTX *mem_ctx,
3220 const char *full_name,
3224 const char *p = NULL;
3226 p = strchr_m(full_name, '\\');
3229 *domain = talloc_strndup(mem_ctx, full_name,
3230 PTR_DIFF(p, full_name));
3231 *user = talloc_strdup(mem_ctx, p+1);
3233 *domain = talloc_strdup(mem_ctx, "");
3234 *user = talloc_strdup(mem_ctx, full_name);
3240 Disable these now we have checked all code paths and ensured
3241 NULL returns on zero request. JRA.
3243 /****************************************************************
3244 talloc wrapper functions that guarentee a null pointer return
3246 ****************************************************************/
3248 #ifndef MAX_TALLOC_SIZE
3249 #define MAX_TALLOC_SIZE 0x10000000
3253 * talloc and zero memory.
3254 * - returns NULL if size is zero.
3257 void *_talloc_zero_zeronull(const void *ctx, size_t size, const char *name)
3265 p = talloc_named_const(ctx, size, name);
3268 memset(p, '\0', size);
3275 * memdup with a talloc.
3276 * - returns NULL if size is zero.
3279 void *_talloc_memdup_zeronull(const void *t, const void *p, size_t size, const char *name)
3287 newp = talloc_named_const(t, size, name);
3289 memcpy(newp, p, size);
3296 * alloc an array, checking for integer overflow in the array size.
3297 * - returns NULL if count or el_size are zero.
3300 void *_talloc_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
3302 if (count >= MAX_TALLOC_SIZE/el_size) {
3306 if (el_size == 0 || count == 0) {
3310 return talloc_named_const(ctx, el_size * count, name);
3314 * alloc an zero array, checking for integer overflow in the array size
3315 * - returns NULL if count or el_size are zero.
3318 void *_talloc_zero_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
3320 if (count >= MAX_TALLOC_SIZE/el_size) {
3324 if (el_size == 0 || count == 0) {
3328 return _talloc_zero(ctx, el_size * count, name);
3332 * Talloc wrapper that returns NULL if size == 0.
3334 void *talloc_zeronull(const void *context, size_t size, const char *name)
3339 return talloc_named_const(context, size, name);