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();
188 void gfree_all( void )
197 /* release the talloc null_context memory last */
198 talloc_disable_null_tracking();
201 const char *my_netbios_names(int i)
203 return smb_my_netbios_names[i];
206 bool set_netbios_aliases(const char **str_array)
210 /* Work out the max number of netbios aliases that we have */
211 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
214 if ( global_myname() && *global_myname())
217 /* Allocate space for the netbios aliases */
218 if (!allocate_my_netbios_names_array(namecount))
221 /* Use the global_myname string first */
223 if ( global_myname() && *global_myname()) {
224 set_my_netbios_names( global_myname(), namecount );
230 for ( i = 0; str_array[i] != NULL; i++) {
232 bool duplicate = False;
234 /* Look for duplicates */
235 for( n=0; n<namecount; n++ ) {
236 if( strequal( str_array[i], my_netbios_names(n) ) ) {
242 if (!set_my_netbios_names(str_array[i], namecount))
251 /****************************************************************************
252 Common name initialization code.
253 ****************************************************************************/
255 bool init_names(void)
259 if (global_myname() == NULL || *global_myname() == '\0') {
260 if (!set_global_myname(myhostname())) {
261 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
266 if (!set_netbios_aliases(lp_netbios_aliases())) {
267 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
271 set_local_machine_name(global_myname(),false);
273 DEBUG( 5, ("Netbios name list:-\n") );
274 for( n=0; my_netbios_names(n); n++ ) {
275 DEBUGADD( 5, ("my_netbios_names[%d]=\"%s\"\n",
276 n, my_netbios_names(n) ) );
282 /**************************************************************************n
283 Code to cope with username/password auth options from the commandline.
284 Used mainly in client tools.
285 ****************************************************************************/
287 static struct user_auth_info cmdline_auth_info = {
290 false, /* got_pass */
291 false, /* use_kerberos */
292 Undefined, /* signing state */
293 false /* smb_encrypt */
296 const char *get_cmdline_auth_info_username(void)
298 if (!cmdline_auth_info.username) {
301 return cmdline_auth_info.username;
304 void set_cmdline_auth_info_username(const char *username)
306 SAFE_FREE(cmdline_auth_info.username);
307 cmdline_auth_info.username = SMB_STRDUP(username);
308 if (!cmdline_auth_info.username) {
313 const char *get_cmdline_auth_info_password(void)
315 if (!cmdline_auth_info.password) {
318 return cmdline_auth_info.password;
321 void set_cmdline_auth_info_password(const char *password)
323 SAFE_FREE(cmdline_auth_info.password);
324 cmdline_auth_info.password = SMB_STRDUP(password);
325 if (!cmdline_auth_info.password) {
328 cmdline_auth_info.got_pass = true;
331 bool set_cmdline_auth_info_signing_state(const char *arg)
333 cmdline_auth_info.signing_state = -1;
334 if (strequal(arg, "off") || strequal(arg, "no") ||
335 strequal(arg, "false")) {
336 cmdline_auth_info.signing_state = false;
337 } else if (strequal(arg, "on") || strequal(arg, "yes") ||
338 strequal(arg, "true") || strequal(arg, "auto")) {
339 cmdline_auth_info.signing_state = true;
340 } else if (strequal(arg, "force") || strequal(arg, "required") ||
341 strequal(arg, "forced")) {
342 cmdline_auth_info.signing_state = Required;
349 int get_cmdline_auth_info_signing_state(void)
351 return cmdline_auth_info.signing_state;
354 bool get_cmdline_auth_info_use_kerberos(void)
356 return cmdline_auth_info.use_kerberos;
359 /* This should only be used by lib/popt_common.c JRA */
360 void set_cmdline_auth_info_use_krb5_ticket(void)
362 cmdline_auth_info.use_kerberos = true;
363 cmdline_auth_info.got_pass = true;
366 /* This should only be used by lib/popt_common.c JRA */
367 void set_cmdline_auth_info_smb_encrypt(void)
369 cmdline_auth_info.smb_encrypt = true;
372 bool get_cmdline_auth_info_got_pass(void)
374 return cmdline_auth_info.got_pass;
377 bool get_cmdline_auth_info_smb_encrypt(void)
379 return cmdline_auth_info.smb_encrypt;
382 bool get_cmdline_auth_info_copy(struct user_auth_info *info)
384 *info = cmdline_auth_info;
385 /* Now re-alloc the strings. */
386 info->username = SMB_STRDUP(get_cmdline_auth_info_username());
387 info->password = SMB_STRDUP(get_cmdline_auth_info_password());
388 if (!info->username || !info->password) {
394 /**************************************************************************n
395 Find a suitable temporary directory. The result should be copied immediately
396 as it may be overwritten by a subsequent call.
397 ****************************************************************************/
399 const char *tmpdir(void)
402 if ((p = getenv("TMPDIR")))
407 /****************************************************************************
408 Add a gid to an array of gids if it's not already there.
409 ****************************************************************************/
411 bool add_gid_to_array_unique(TALLOC_CTX *mem_ctx, gid_t gid,
412 gid_t **gids, size_t *num_gids)
416 if ((*num_gids != 0) && (*gids == NULL)) {
418 * A former call to this routine has failed to allocate memory
423 for (i=0; i<*num_gids; i++) {
424 if ((*gids)[i] == gid) {
429 *gids = TALLOC_REALLOC_ARRAY(mem_ctx, *gids, gid_t, *num_gids+1);
435 (*gids)[*num_gids] = gid;
440 /****************************************************************************
441 Like atoi but gets the value up to the separator character.
442 ****************************************************************************/
444 static const char *Atoic(const char *p, int *n, const char *c)
446 if (!isdigit((int)*p)) {
447 DEBUG(5, ("Atoic: malformed number\n"));
453 while ((*p) && isdigit((int)*p))
456 if (strchr_m(c, *p) == NULL) {
457 DEBUG(5, ("Atoic: no separator characters (%s) not found\n", c));
464 /*************************************************************************
465 Reads a list of numbers.
466 *************************************************************************/
468 const char *get_numlist(const char *p, uint32 **num, int *count)
472 if (num == NULL || count == NULL)
478 while ((p = Atoic(p, &val, ":,")) != NULL && (*p) != ':') {
479 *num = SMB_REALLOC_ARRAY((*num), uint32, (*count)+1);
483 (*num)[(*count)] = val;
491 /*******************************************************************
492 Check if a file exists - call vfs_file_exist for samba files.
493 ********************************************************************/
495 bool file_exist(const char *fname,SMB_STRUCT_STAT *sbuf)
501 if (sys_stat(fname,sbuf) != 0)
504 return((S_ISREG(sbuf->st_mode)) || (S_ISFIFO(sbuf->st_mode)));
507 /*******************************************************************
508 Check a files mod time.
509 ********************************************************************/
511 time_t file_modtime(const char *fname)
515 if (sys_stat(fname,&st) != 0)
521 /*******************************************************************
522 Check if a directory exists.
523 ********************************************************************/
525 bool directory_exist(char *dname,SMB_STRUCT_STAT *st)
533 if (sys_stat(dname,st) != 0)
536 ret = S_ISDIR(st->st_mode);
542 /*******************************************************************
543 Returns the size in bytes of the named file.
544 ********************************************************************/
546 SMB_OFF_T get_file_size(char *file_name)
550 if(sys_stat(file_name,&buf) != 0)
551 return (SMB_OFF_T)-1;
555 /*******************************************************************
556 Return a string representing an attribute for a file.
557 ********************************************************************/
559 char *attrib_string(uint16 mode)
565 if (mode & aVOLID) fstrcat(attrstr,"V");
566 if (mode & aDIR) fstrcat(attrstr,"D");
567 if (mode & aARCH) fstrcat(attrstr,"A");
568 if (mode & aHIDDEN) fstrcat(attrstr,"H");
569 if (mode & aSYSTEM) fstrcat(attrstr,"S");
570 if (mode & aRONLY) fstrcat(attrstr,"R");
572 return talloc_strdup(talloc_tos(), attrstr);
575 /*******************************************************************
576 Show a smb message structure.
577 ********************************************************************/
579 void show_msg(char *buf)
587 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
589 (int)CVAL(buf,smb_com),
590 (int)CVAL(buf,smb_rcls),
591 (int)CVAL(buf,smb_reh),
592 (int)SVAL(buf,smb_err),
593 (int)CVAL(buf,smb_flg),
594 (int)SVAL(buf,smb_flg2)));
595 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
596 (int)SVAL(buf,smb_tid),
597 (int)SVAL(buf,smb_pid),
598 (int)SVAL(buf,smb_uid),
599 (int)SVAL(buf,smb_mid)));
600 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
602 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
603 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
604 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
606 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
608 DEBUGADD(5,("smb_bcc=%d\n",bcc));
616 dump_data(10, (uint8 *)smb_buf(buf), bcc);
619 /*******************************************************************
620 Set the length and marker of an encrypted smb packet.
621 ********************************************************************/
623 void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)
625 _smb_setlen(buf,len);
629 SSVAL(buf,6,enc_ctx_num);
632 /*******************************************************************
633 Set the length and marker of an smb packet.
634 ********************************************************************/
636 void smb_setlen(char *buf,int len)
638 _smb_setlen(buf,len);
646 /*******************************************************************
647 Setup only the byte count for a smb message.
648 ********************************************************************/
650 int set_message_bcc(char *buf,int num_bytes)
652 int num_words = CVAL(buf,smb_wct);
653 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
654 _smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
655 return (smb_size + num_words*2 + num_bytes);
658 /*******************************************************************
659 Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
660 Return the bytes added
661 ********************************************************************/
663 ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
665 size_t newlen = smb_len(*outbuf) + 4 + blob.length;
668 if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
669 DEBUG(0, ("talloc failed\n"));
674 memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
675 set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
679 /*******************************************************************
680 Reduce a file name, removing .. elements.
681 ********************************************************************/
683 static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
688 DEBUG(3,("dos_clean_name [%s]\n",s));
690 /* remove any double slashes */
691 str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
696 /* Remove leading .\\ characters */
697 if(strncmp(str, ".\\", 2) == 0) {
698 trim_string(str, ".\\", NULL);
700 str = talloc_strdup(ctx, ".\\");
707 while ((p = strstr_m(str,"\\..\\")) != NULL) {
713 if ((p=strrchr_m(str,'\\')) != NULL) {
718 str = talloc_asprintf(ctx,
727 trim_string(str,NULL,"\\..");
728 return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
731 /*******************************************************************
732 Reduce a file name, removing .. elements.
733 ********************************************************************/
735 char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
740 DEBUG(3,("unix_clean_name [%s]\n",s));
742 /* remove any double slashes */
743 str = talloc_all_string_sub(ctx, s, "//","/");
748 /* Remove leading ./ characters */
749 if(strncmp(str, "./", 2) == 0) {
750 trim_string(str, "./", NULL);
752 str = talloc_strdup(ctx, "./");
759 while ((p = strstr_m(str,"/../")) != NULL) {
765 if ((p=strrchr_m(str,'/')) != NULL) {
770 str = talloc_asprintf(ctx,
779 trim_string(str,NULL,"/..");
780 return talloc_all_string_sub(ctx, str, "/./", "/");
783 char *clean_name(TALLOC_CTX *ctx, const char *s)
785 char *str = dos_clean_name(ctx, s);
789 return unix_clean_name(ctx, str);
792 /*******************************************************************
793 Close the low 3 fd's and open dev/null in their place.
794 ********************************************************************/
796 void close_low_fds(bool stderr_too)
808 /* try and use up these file descriptors, so silly
809 library routines writing to stdout etc won't cause havoc */
811 if (i == 2 && !stderr_too)
814 fd = sys_open("/dev/null",O_RDWR,0);
816 fd = sys_open("/dev/null",O_WRONLY,0);
818 DEBUG(0,("Can't open /dev/null\n"));
822 DEBUG(0,("Didn't get file descriptor %d\n",i));
829 /*******************************************************************
830 Write data into an fd at a given offset. Ignore seek errors.
831 ********************************************************************/
833 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
838 if (pos == (SMB_OFF_T)-1) {
839 return write_data(fd, buffer, N);
841 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
843 ret = sys_pwrite(fd,buffer + total,N - total, pos);
844 if (ret == -1 && errno == ESPIPE) {
845 return write_data(fd, buffer + total,N - total);
848 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
857 return (ssize_t)total;
859 /* Use lseek and write_data. */
860 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
861 if (errno != ESPIPE) {
865 return write_data(fd, buffer, N);
869 /****************************************************************************
870 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
874 ****************************************************************************/
876 int set_blocking(int fd, bool set)
880 #define FLAG_TO_SET O_NONBLOCK
883 #define FLAG_TO_SET O_NDELAY
885 #define FLAG_TO_SET FNDELAY
889 if((val = sys_fcntl_long(fd, F_GETFL, 0)) == -1)
891 if(set) /* Turn blocking on - ie. clear nonblock flag */
895 return sys_fcntl_long( fd, F_SETFL, val);
899 /****************************************************************************
900 Transfer some data between two fd's.
901 ****************************************************************************/
903 #ifndef TRANSFER_BUF_SIZE
904 #define TRANSFER_BUF_SIZE 65536
907 ssize_t transfer_file_internal(int infd, int outfd, size_t n, ssize_t (*read_fn)(int, void *, size_t),
908 ssize_t (*write_fn)(int, const void *, size_t))
914 size_t num_to_read_thistime;
915 size_t num_written = 0;
917 if ((buf = SMB_MALLOC_ARRAY(char, TRANSFER_BUF_SIZE)) == NULL)
921 num_to_read_thistime = MIN((n - total), TRANSFER_BUF_SIZE);
923 read_ret = (*read_fn)(infd, buf, num_to_read_thistime);
924 if (read_ret == -1) {
925 DEBUG(0,("transfer_file_internal: read failure. Error = %s\n", strerror(errno) ));
934 while (num_written < read_ret) {
935 write_ret = (*write_fn)(outfd,buf + num_written, read_ret - num_written);
937 if (write_ret == -1) {
938 DEBUG(0,("transfer_file_internal: write failure. Error = %s\n", strerror(errno) ));
943 return (ssize_t)total;
945 num_written += (size_t)write_ret;
948 total += (size_t)read_ret;
952 return (ssize_t)total;
955 SMB_OFF_T transfer_file(int infd,int outfd,SMB_OFF_T n)
957 return (SMB_OFF_T)transfer_file_internal(infd, outfd, (size_t)n, sys_read, sys_write);
960 /*******************************************************************
961 Sleep for a specified number of milliseconds.
962 ********************************************************************/
964 void smb_msleep(unsigned int t)
966 #if defined(HAVE_NANOSLEEP)
967 struct timespec tval;
970 tval.tv_sec = t/1000;
971 tval.tv_nsec = 1000000*(t%1000);
975 ret = nanosleep(&tval, &tval);
976 } while (ret < 0 && errno == EINTR && (tval.tv_sec > 0 || tval.tv_nsec > 0));
978 unsigned int tdiff=0;
979 struct timeval tval,t1,t2;
986 tval.tv_sec = (t-tdiff)/1000;
987 tval.tv_usec = 1000*((t-tdiff)%1000);
989 /* Never wait for more than 1 sec. */
990 if (tval.tv_sec > 1) {
997 sys_select_intr(0,&fds,NULL,NULL,&tval);
1000 if (t2.tv_sec < t1.tv_sec) {
1001 /* Someone adjusted time... */
1005 tdiff = TvalDiff(&t1,&t2);
1010 /****************************************************************************
1011 Become a daemon, discarding the controlling terminal.
1012 ****************************************************************************/
1014 void become_daemon(bool Fork, bool no_process_group)
1022 /* detach from the terminal */
1024 if (!no_process_group) setsid();
1025 #elif defined(TIOCNOTTY)
1026 if (!no_process_group) {
1027 int i = sys_open("/dev/tty", O_RDWR, 0);
1029 ioctl(i, (int) TIOCNOTTY, (char *)0);
1033 #endif /* HAVE_SETSID */
1035 /* Close fd's 0,1,2. Needed if started by rsh */
1036 close_low_fds(False); /* Don't close stderr, let the debug system
1037 attach it to the logfile */
1040 /****************************************************************************
1041 Put up a yes/no prompt.
1042 ****************************************************************************/
1044 bool yesno(const char *p)
1049 if (!fgets(ans,sizeof(ans)-1,stdin))
1052 if (*ans == 'y' || *ans == 'Y')
1058 #if defined(PARANOID_MALLOC_CHECKER)
1060 /****************************************************************************
1061 Internal malloc wrapper. Externally visible.
1062 ****************************************************************************/
1064 void *malloc_(size_t size)
1070 return malloc(size);
1071 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
1074 /****************************************************************************
1075 Internal calloc wrapper. Not externally visible.
1076 ****************************************************************************/
1078 static void *calloc_(size_t count, size_t size)
1080 if (size == 0 || count == 0) {
1084 return calloc(count, size);
1085 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
1088 /****************************************************************************
1089 Internal realloc wrapper. Not externally visible.
1090 ****************************************************************************/
1092 static void *realloc_(void *ptr, size_t size)
1095 return realloc(ptr, size);
1096 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
1099 #endif /* PARANOID_MALLOC_CHECKER */
1101 /****************************************************************************
1103 ****************************************************************************/
1105 void *malloc_array(size_t el_size, unsigned int count)
1107 if (count >= MAX_ALLOC_SIZE/el_size) {
1111 if (el_size == 0 || count == 0) {
1114 #if defined(PARANOID_MALLOC_CHECKER)
1115 return malloc_(el_size*count);
1117 return malloc(el_size*count);
1121 /****************************************************************************
1123 ****************************************************************************/
1125 void *memalign_array(size_t el_size, size_t align, unsigned int count)
1127 if (count >= MAX_ALLOC_SIZE/el_size) {
1131 return sys_memalign(align, el_size*count);
1134 /****************************************************************************
1136 ****************************************************************************/
1138 void *calloc_array(size_t size, size_t nmemb)
1140 if (nmemb >= MAX_ALLOC_SIZE/size) {
1143 if (size == 0 || nmemb == 0) {
1146 #if defined(PARANOID_MALLOC_CHECKER)
1147 return calloc_(nmemb, size);
1149 return calloc(nmemb, size);
1153 /****************************************************************************
1154 Expand a pointer to be a particular size.
1155 Note that this version of Realloc has an extra parameter that decides
1156 whether to free the passed in storage on allocation failure or if the
1159 This is designed for use in the typical idiom of :
1161 p = SMB_REALLOC(p, size)
1166 and not to have to keep track of the old 'p' contents to free later, nor
1167 to worry if the size parameter was zero. In the case where NULL is returned
1168 we guarentee that p has been freed.
1170 If free later semantics are desired, then pass 'free_old_on_error' as False which
1171 guarentees that the old contents are not freed on error, even if size == 0. To use
1174 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
1182 Changes were instigated by Coverity error checking. JRA.
1183 ****************************************************************************/
1185 void *Realloc(void *p, size_t size, bool free_old_on_error)
1190 if (free_old_on_error) {
1193 DEBUG(2,("Realloc asked for 0 bytes\n"));
1197 #if defined(PARANOID_MALLOC_CHECKER)
1199 ret = (void *)malloc_(size);
1201 ret = (void *)realloc_(p,size);
1205 ret = (void *)malloc(size);
1207 ret = (void *)realloc(p,size);
1212 if (free_old_on_error && p) {
1215 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
1221 /****************************************************************************
1223 ****************************************************************************/
1225 void *realloc_array(void *p, size_t el_size, unsigned int count, bool free_old_on_error)
1227 if (count >= MAX_ALLOC_SIZE/el_size) {
1228 if (free_old_on_error) {
1233 return Realloc(p, el_size*count, free_old_on_error);
1236 /****************************************************************************
1237 (Hopefully) efficient array append.
1238 ****************************************************************************/
1240 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
1241 void *element, void *_array, uint32 *num_elements,
1242 ssize_t *array_size)
1244 void **array = (void **)_array;
1246 if (*array_size < 0) {
1250 if (*array == NULL) {
1251 if (*array_size == 0) {
1255 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1259 *array = TALLOC(mem_ctx, element_size * (*array_size));
1260 if (*array == NULL) {
1265 if (*num_elements == *array_size) {
1268 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1272 *array = TALLOC_REALLOC(mem_ctx, *array,
1273 element_size * (*array_size));
1275 if (*array == NULL) {
1280 memcpy((char *)(*array) + element_size*(*num_elements),
1281 element, element_size);
1291 /****************************************************************************
1292 Free memory, checks for NULL.
1293 Use directly SAFE_FREE()
1294 Exists only because we need to pass a function pointer somewhere --SSS
1295 ****************************************************************************/
1297 void safe_free(void *p)
1302 /****************************************************************************
1303 Get my own name and IP.
1304 ****************************************************************************/
1306 char *get_myname(TALLOC_CTX *ctx)
1309 char hostname[HOST_NAME_MAX];
1313 /* get my host name */
1314 if (gethostname(hostname, sizeof(hostname)) == -1) {
1315 DEBUG(0,("gethostname failed\n"));
1319 /* Ensure null termination. */
1320 hostname[sizeof(hostname)-1] = '\0';
1322 /* split off any parts after an initial . */
1323 p = strchr_m(hostname,'.');
1328 return talloc_strdup(ctx, hostname);
1331 /****************************************************************************
1332 Get my own domain name, or "" if we have none.
1333 ****************************************************************************/
1335 char *get_mydnsdomname(TALLOC_CTX *ctx)
1337 const char *domname;
1340 domname = get_mydnsfullname();
1345 p = strchr_m(domname, '.');
1348 return talloc_strdup(ctx, p);
1350 return talloc_strdup(ctx, "");
1354 /****************************************************************************
1355 Interpret a protocol description string, with a default.
1356 ****************************************************************************/
1358 int interpret_protocol(const char *str,int def)
1360 if (strequal(str,"NT1"))
1361 return(PROTOCOL_NT1);
1362 if (strequal(str,"LANMAN2"))
1363 return(PROTOCOL_LANMAN2);
1364 if (strequal(str,"LANMAN1"))
1365 return(PROTOCOL_LANMAN1);
1366 if (strequal(str,"CORE"))
1367 return(PROTOCOL_CORE);
1368 if (strequal(str,"COREPLUS"))
1369 return(PROTOCOL_COREPLUS);
1370 if (strequal(str,"CORE+"))
1371 return(PROTOCOL_COREPLUS);
1373 DEBUG(0,("Unrecognised protocol level %s\n",str));
1379 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1380 /******************************************************************
1381 Remove any mount options such as -rsize=2048,wsize=2048 etc.
1382 Based on a fix from <Thomas.Hepper@icem.de>.
1383 Returns a malloc'ed string.
1384 *******************************************************************/
1386 static char *strip_mount_options(TALLOC_CTX *ctx, const char *str)
1389 const char *p = str;
1390 while(*p && !isspace(*p))
1392 while(*p && isspace(*p))
1395 return talloc_strdup(ctx, p);
1401 /*******************************************************************
1402 Patch from jkf@soton.ac.uk
1403 Split Luke's automount_server into YP lookup and string splitter
1404 so can easily implement automount_path().
1405 Returns a malloc'ed string.
1406 *******************************************************************/
1408 #ifdef WITH_NISPLUS_HOME
1409 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1413 char *nis_map = (char *)lp_nis_home_map_name();
1415 char buffer[NIS_MAXATTRVAL + 1];
1420 snprintf(buffer, sizeof(buffer), "[key=%s],%s", user_name, nis_map);
1421 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
1423 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
1424 if (result->status != NIS_SUCCESS) {
1425 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
1427 object = result->objects.objects_val;
1428 if (object->zo_data.zo_type == ENTRY_OBJ) {
1429 entry = &object->zo_data.objdata_u.en_data;
1430 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
1431 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
1433 value = talloc_strdup(ctx,
1434 entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
1436 nis_freeresult(result);
1439 value = talloc_string_sub(ctx,
1446 nis_freeresult(result);
1449 value = strip_mount_options(ctx, value);
1450 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n",
1455 #else /* WITH_NISPLUS_HOME */
1457 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1461 int nis_error; /* returned by yp all functions */
1462 char *nis_result; /* yp_match inits this */
1463 int nis_result_len; /* and set this */
1464 char *nis_domain; /* yp_get_default_domain inits this */
1465 char *nis_map = (char *)lp_nis_home_map_name();
1467 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
1468 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
1472 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
1474 if ((nis_error = yp_match(nis_domain, nis_map, user_name,
1475 strlen(user_name), &nis_result,
1476 &nis_result_len)) == 0) {
1477 value = talloc_strdup(ctx, nis_result);
1481 value = strip_mount_options(ctx, value);
1482 } else if(nis_error == YPERR_KEY) {
1483 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
1484 user_name, nis_map));
1485 DEBUG(3, ("using defaults for server and home directory\n"));
1487 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
1488 yperr_string(nis_error), user_name, nis_map));
1492 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, value));
1496 #endif /* WITH_NISPLUS_HOME */
1499 /****************************************************************************
1500 Check if a process exists. Does this work on all unixes?
1501 ****************************************************************************/
1503 bool process_exists(const struct server_id pid)
1505 if (procid_is_me(&pid)) {
1509 if (procid_is_local(&pid)) {
1510 return (kill(pid.pid,0) == 0 || errno != ESRCH);
1513 #ifdef CLUSTER_SUPPORT
1514 return ctdbd_process_exists(messaging_ctdbd_connection(), pid.vnn,
1521 bool process_exists_by_pid(pid_t pid)
1523 /* Doing kill with a non-positive pid causes messages to be
1524 * sent to places we don't want. */
1525 SMB_ASSERT(pid > 0);
1526 return(kill(pid,0) == 0 || errno != ESRCH);
1529 /*******************************************************************
1530 Convert a uid into a user name.
1531 ********************************************************************/
1533 const char *uidtoname(uid_t uid)
1535 TALLOC_CTX *ctx = talloc_tos();
1537 struct passwd *pass = NULL;
1539 pass = getpwuid_alloc(ctx,uid);
1541 name = talloc_strdup(ctx,pass->pw_name);
1544 name = talloc_asprintf(ctx,
1551 /*******************************************************************
1552 Convert a gid into a group name.
1553 ********************************************************************/
1555 char *gidtoname(gid_t gid)
1559 grp = getgrgid(gid);
1561 return talloc_strdup(talloc_tos(), grp->gr_name);
1564 return talloc_asprintf(talloc_tos(),
1570 /*******************************************************************
1571 Convert a user name into a uid.
1572 ********************************************************************/
1574 uid_t nametouid(const char *name)
1576 struct passwd *pass;
1580 pass = getpwnam_alloc(NULL, name);
1587 u = (uid_t)strtol(name, &p, 0);
1588 if ((p != name) && (*p == '\0'))
1594 /*******************************************************************
1595 Convert a name to a gid_t if possible. Return -1 if not a group.
1596 ********************************************************************/
1598 gid_t nametogid(const char *name)
1604 g = (gid_t)strtol(name, &p, 0);
1605 if ((p != name) && (*p == '\0'))
1608 grp = sys_getgrnam(name);
1610 return(grp->gr_gid);
1614 /*******************************************************************
1615 Something really nasty happened - panic !
1616 ********************************************************************/
1618 void smb_panic(const char *const why)
1626 if (global_clobber_region_function) {
1627 DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1628 global_clobber_region_function,
1629 global_clobber_region_line));
1634 DEBUG(0,("PANIC (pid %llu): %s\n",
1635 (unsigned long long)sys_getpid(), why));
1638 cmd = lp_panic_action();
1640 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1641 result = system(cmd);
1644 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1647 DEBUG(0, ("smb_panic(): action returned status %d\n",
1648 WEXITSTATUS(result)));
1654 /*******************************************************************
1655 Print a backtrace of the stack to the debug log. This function
1656 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1657 exit shortly after calling it.
1658 ********************************************************************/
1660 #ifdef HAVE_LIBUNWIND_H
1661 #include <libunwind.h>
1664 #ifdef HAVE_EXECINFO_H
1665 #include <execinfo.h>
1668 #ifdef HAVE_LIBEXC_H
1672 void log_stack_trace(void)
1674 #ifdef HAVE_LIBUNWIND
1675 /* Try to use libunwind before any other technique since on ia64
1676 * libunwind correctly walks the stack in more circumstances than
1679 unw_cursor_t cursor;
1684 unw_word_t ip, sp, off;
1686 procname[sizeof(procname) - 1] = '\0';
1688 if (unw_getcontext(&uc) != 0) {
1689 goto libunwind_failed;
1692 if (unw_init_local(&cursor, &uc) != 0) {
1693 goto libunwind_failed;
1696 DEBUG(0, ("BACKTRACE:\n"));
1700 unw_get_reg(&cursor, UNW_REG_IP, &ip);
1701 unw_get_reg(&cursor, UNW_REG_SP, &sp);
1703 switch (unw_get_proc_name(&cursor,
1704 procname, sizeof(procname) - 1, &off) ) {
1708 /* Name truncated. */
1709 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1710 i, procname, (long long)off,
1711 (long long)ip, (long long) sp));
1714 /* case -UNW_ENOINFO: */
1715 /* case -UNW_EUNSPEC: */
1716 /* No symbol name found. */
1717 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1718 i, "<unknown symbol>",
1719 (long long)ip, (long long) sp));
1722 } while (unw_step(&cursor) > 0);
1727 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1729 #elif HAVE_BACKTRACE_SYMBOLS
1730 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1731 size_t backtrace_size;
1732 char **backtrace_strings;
1734 /* get the backtrace (stack frames) */
1735 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1736 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1738 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1739 (unsigned long)backtrace_size));
1741 if (backtrace_strings) {
1744 for (i = 0; i < backtrace_size; i++)
1745 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1747 /* Leak the backtrace_strings, rather than risk what free() might do */
1752 /* The IRIX libexc library provides an API for unwinding the stack. See
1753 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1754 * since we are about to abort anyway, it hardly matters.
1757 #define NAMESIZE 32 /* Arbitrary */
1759 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1760 char * names[BACKTRACE_STACK_SIZE];
1761 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1768 ZERO_ARRAY(namebuf);
1770 /* We need to be root so we can open our /proc entry to walk
1771 * our stack. It also helps when we want to dump core.
1775 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1776 names[i] = namebuf + (i * NAMESIZE);
1779 levels = trace_back_stack(0, addrs, names,
1780 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1782 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1783 for (i = 0; i < levels; i++) {
1784 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1789 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1793 /*******************************************************************
1794 A readdir wrapper which just returns the file name.
1795 ********************************************************************/
1797 const char *readdirname(SMB_STRUCT_DIR *p)
1799 SMB_STRUCT_DIRENT *ptr;
1805 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1809 dname = ptr->d_name;
1816 #ifdef HAVE_BROKEN_READDIR_NAME
1817 /* using /usr/ucb/cc is BAD */
1821 return talloc_strdup(talloc_tos(), dname);
1824 /*******************************************************************
1825 Utility function used to decide if the last component
1826 of a path matches a (possibly wildcarded) entry in a namelist.
1827 ********************************************************************/
1829 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive)
1831 const char *last_component;
1833 /* if we have no list it's obviously not in the path */
1834 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1838 DEBUG(8, ("is_in_path: %s\n", name));
1840 /* Get the last component of the unix name. */
1841 last_component = strrchr_m(name, '/');
1842 if (!last_component) {
1843 last_component = name;
1845 last_component++; /* Go past '/' */
1848 for(; namelist->name != NULL; namelist++) {
1849 if(namelist->is_wild) {
1850 if (mask_match(last_component, namelist->name, case_sensitive)) {
1851 DEBUG(8,("is_in_path: mask match succeeded\n"));
1855 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1856 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1857 DEBUG(8,("is_in_path: match succeeded\n"));
1862 DEBUG(8,("is_in_path: match not found\n"));
1866 /*******************************************************************
1867 Strip a '/' separated list into an array of
1868 name_compare_enties structures suitable for
1869 passing to is_in_path(). We do this for
1870 speed so we can pre-parse all the names in the list
1871 and don't do it for each call to is_in_path().
1872 namelist is modified here and is assumed to be
1873 a copy owned by the caller.
1874 We also check if the entry contains a wildcard to
1875 remove a potentially expensive call to mask_match
1877 ********************************************************************/
1879 void set_namearray(name_compare_entry **ppname_array, char *namelist)
1882 char *nameptr = namelist;
1883 int num_entries = 0;
1886 (*ppname_array) = NULL;
1888 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
1891 /* We need to make two passes over the string. The
1892 first to count the number of elements, the second
1897 if ( *nameptr == '/' ) {
1898 /* cope with multiple (useless) /s) */
1902 /* find the next / */
1903 name_end = strchr_m(nameptr, '/');
1905 /* oops - the last check for a / didn't find one. */
1906 if (name_end == NULL)
1909 /* next segment please */
1910 nameptr = name_end + 1;
1914 if(num_entries == 0)
1917 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1918 DEBUG(0,("set_namearray: malloc fail\n"));
1922 /* Now copy out the names */
1926 if ( *nameptr == '/' ) {
1927 /* cope with multiple (useless) /s) */
1931 /* find the next / */
1932 if ((name_end = strchr_m(nameptr, '/')) != NULL)
1935 /* oops - the last check for a / didn't find one. */
1936 if(name_end == NULL)
1939 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1940 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1941 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1945 /* next segment please */
1946 nameptr = name_end + 1;
1950 (*ppname_array)[i].name = NULL;
1955 /****************************************************************************
1956 Routine to free a namearray.
1957 ****************************************************************************/
1959 void free_namearray(name_compare_entry *name_array)
1963 if(name_array == NULL)
1966 for(i=0; name_array[i].name!=NULL; i++)
1967 SAFE_FREE(name_array[i].name);
1968 SAFE_FREE(name_array);
1972 #define DBGC_CLASS DBGC_LOCKING
1974 /****************************************************************************
1975 Simple routine to do POSIX file locking. Cruft in NFS and 64->32 bit mapping
1976 is dealt with in posix.c
1977 Returns True if the lock was granted, False otherwise.
1978 ****************************************************************************/
1980 bool fcntl_lock(int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type)
1982 SMB_STRUCT_FLOCK lock;
1985 DEBUG(8,("fcntl_lock fd=%d op=%d offset=%.0f count=%.0f type=%d\n",
1986 fd,op,(double)offset,(double)count,type));
1989 lock.l_whence = SEEK_SET;
1990 lock.l_start = offset;
1994 ret = sys_fcntl_ptr(fd,op,&lock);
1998 DEBUG(3,("fcntl_lock: lock failed at offset %.0f count %.0f op %d type %d (%s)\n",
1999 (double)offset,(double)count,op,type,strerror(errno)));
2004 /* everything went OK */
2005 DEBUG(8,("fcntl_lock: Lock call successful\n"));
2010 /****************************************************************************
2011 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
2012 is dealt with in posix.c
2013 Returns True if we have information regarding this lock region (and returns
2014 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
2015 ****************************************************************************/
2017 bool fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
2019 SMB_STRUCT_FLOCK lock;
2022 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
2023 fd,(double)*poffset,(double)*pcount,*ptype));
2025 lock.l_type = *ptype;
2026 lock.l_whence = SEEK_SET;
2027 lock.l_start = *poffset;
2028 lock.l_len = *pcount;
2031 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
2035 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
2036 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
2041 *ptype = lock.l_type;
2042 *poffset = lock.l_start;
2043 *pcount = lock.l_len;
2046 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
2047 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
2052 #define DBGC_CLASS DBGC_ALL
2054 /*******************************************************************
2055 Is the name specified one of my netbios names.
2056 Returns true if it is equal, false otherwise.
2057 ********************************************************************/
2059 bool is_myname(const char *s)
2064 for (n=0; my_netbios_names(n); n++) {
2065 if (strequal(my_netbios_names(n), s)) {
2070 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
2074 /*******************************************************************
2075 Is the name specified our workgroup/domain.
2076 Returns true if it is equal, false otherwise.
2077 ********************************************************************/
2079 bool is_myworkgroup(const char *s)
2083 if (strequal(s, lp_workgroup())) {
2087 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
2091 /*******************************************************************
2092 we distinguish between 2K and XP by the "Native Lan Manager" string
2093 WinXP => "Windows 2002 5.1"
2094 WinXP 64bit => "Windows XP 5.2"
2095 Win2k => "Windows 2000 5.0"
2096 NT4 => "Windows NT 4.0"
2097 Win9x => "Windows 4.0"
2098 Windows 2003 doesn't set the native lan manager string but
2099 they do set the domain to "Windows 2003 5.2" (probably a bug).
2100 ********************************************************************/
2102 void ra_lanman_string( const char *native_lanman )
2104 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
2105 set_remote_arch( RA_WINXP );
2106 else if ( strcmp( native_lanman, "Windows XP 5.2" ) == 0 )
2107 set_remote_arch( RA_WINXP );
2108 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
2109 set_remote_arch( RA_WIN2K3 );
2112 static const char *remote_arch_str;
2114 const char *get_remote_arch_str(void)
2116 if (!remote_arch_str) {
2119 return remote_arch_str;
2122 /*******************************************************************
2123 Set the horrid remote_arch string based on an enum.
2124 ********************************************************************/
2126 void set_remote_arch(enum remote_arch_types type)
2131 remote_arch_str = "WfWg";
2134 remote_arch_str = "OS2";
2137 remote_arch_str = "Win95";
2140 remote_arch_str = "WinNT";
2143 remote_arch_str = "Win2K";
2146 remote_arch_str = "WinXP";
2149 remote_arch_str = "Win2K3";
2152 remote_arch_str = "Vista";
2155 remote_arch_str = "Samba";
2158 remote_arch_str = "CIFSFS";
2161 ra_type = RA_UNKNOWN;
2162 remote_arch_str = "UNKNOWN";
2166 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
2170 /*******************************************************************
2171 Get the remote_arch type.
2172 ********************************************************************/
2174 enum remote_arch_types get_remote_arch(void)
2179 void print_asc(int level, const unsigned char *buf,int len)
2183 DEBUG(level,("%c", isprint(buf[i])?buf[i]:'.'));
2186 void dump_data(int level, const unsigned char *buf1,int len)
2188 const unsigned char *buf = (const unsigned char *)buf1;
2192 if (!DEBUGLVL(level)) return;
2194 DEBUGADD(level,("[%03X] ",i));
2196 DEBUGADD(level,("%02X ",(int)buf[i]));
2198 if (i%8 == 0) DEBUGADD(level,(" "));
2200 print_asc(level,&buf[i-16],8); DEBUGADD(level,(" "));
2201 print_asc(level,&buf[i-8],8); DEBUGADD(level,("\n"));
2202 if (i<len) DEBUGADD(level,("[%03X] ",i));
2208 DEBUGADD(level,(" "));
2209 if (n>8) DEBUGADD(level,(" "));
2210 while (n--) DEBUGADD(level,(" "));
2212 print_asc(level,&buf[i-(i%16)],n); DEBUGADD(level,( " " ));
2214 if (n>0) print_asc(level,&buf[i-n],n);
2215 DEBUGADD(level,("\n"));
2219 void dump_data_pw(const char *msg, const uchar * data, size_t len)
2221 #ifdef DEBUG_PASSWORD
2222 DEBUG(11, ("%s", msg));
2223 if (data != NULL && len > 0)
2225 dump_data(11, data, len);
2230 const char *tab_depth(int level, int depth)
2232 if( DEBUGLVL(level) ) {
2233 dbgtext("%*s", depth*4, "");
2238 /*****************************************************************************
2239 Provide a checksum on a string
2241 Input: s - the null-terminated character string for which the checksum
2244 Output: The checksum value calculated for s.
2245 *****************************************************************************/
2247 int str_checksum(const char *s)
2255 res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
2262 /*****************************************************************
2263 Zero a memory area then free it. Used to catch bugs faster.
2264 *****************************************************************/
2266 void zero_free(void *p, size_t size)
2272 /*****************************************************************
2273 Set our open file limit to a requested max and return the limit.
2274 *****************************************************************/
2276 int set_maxfiles(int requested_max)
2278 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
2280 int saved_current_limit;
2282 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2283 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
2286 return requested_max;
2290 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
2291 * account for the extra fd we need
2292 * as well as the log files and standard
2293 * handles etc. Save the limit we want to set in case
2294 * we are running on an OS that doesn't support this limit (AIX)
2295 * which always returns RLIM_INFINITY for rlp.rlim_max.
2298 /* Try raising the hard (max) limit to the requested amount. */
2300 #if defined(RLIM_INFINITY)
2301 if (rlp.rlim_max != RLIM_INFINITY) {
2302 int orig_max = rlp.rlim_max;
2304 if ( rlp.rlim_max < requested_max )
2305 rlp.rlim_max = requested_max;
2307 /* This failing is not an error - many systems (Linux) don't
2308 support our default request of 10,000 open files. JRA. */
2310 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2311 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
2312 (int)rlp.rlim_max, strerror(errno) ));
2314 /* Set failed - restore original value from get. */
2315 rlp.rlim_max = orig_max;
2320 /* Now try setting the soft (current) limit. */
2322 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
2324 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2325 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
2326 (int)rlp.rlim_cur, strerror(errno) ));
2328 return saved_current_limit;
2331 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2332 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2335 return saved_current_limit;
2338 #if defined(RLIM_INFINITY)
2339 if(rlp.rlim_cur == RLIM_INFINITY)
2340 return saved_current_limit;
2343 if((int)rlp.rlim_cur > saved_current_limit)
2344 return saved_current_limit;
2346 return rlp.rlim_cur;
2347 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2349 * No way to know - just guess...
2351 return requested_max;
2355 /*****************************************************************
2356 Possibly replace mkstemp if it is broken.
2357 *****************************************************************/
2359 int smb_mkstemp(char *name_template)
2361 #if HAVE_SECURE_MKSTEMP
2362 return mkstemp(name_template);
2364 /* have a reasonable go at emulating it. Hope that
2365 the system mktemp() isn't completly hopeless */
2366 char *p = mktemp(name_template);
2369 return open(p, O_CREAT|O_EXCL|O_RDWR, 0600);
2373 /*****************************************************************
2374 malloc that aborts with smb_panic on fail or zero size.
2375 *****************************************************************/
2377 void *smb_xmalloc_array(size_t size, unsigned int count)
2381 smb_panic("smb_xmalloc_array: called with zero size");
2383 if (count >= MAX_ALLOC_SIZE/size) {
2384 smb_panic("smb_xmalloc_array: alloc size too large");
2386 if ((p = SMB_MALLOC(size*count)) == NULL) {
2387 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2388 (unsigned long)size, (unsigned long)count));
2389 smb_panic("smb_xmalloc_array: malloc failed");
2395 Memdup with smb_panic on fail.
2398 void *smb_xmemdup(const void *p, size_t size)
2401 p2 = SMB_XMALLOC_ARRAY(unsigned char,size);
2402 memcpy(p2, p, size);
2407 strdup that aborts on malloc fail.
2410 char *smb_xstrdup(const char *s)
2412 #if defined(PARANOID_MALLOC_CHECKER)
2419 #define strdup rep_strdup
2422 char *s1 = strdup(s);
2423 #if defined(PARANOID_MALLOC_CHECKER)
2427 #define strdup(s) __ERROR_DONT_USE_STRDUP_DIRECTLY
2430 smb_panic("smb_xstrdup: malloc failed");
2437 strndup that aborts on malloc fail.
2440 char *smb_xstrndup(const char *s, size_t n)
2442 #if defined(PARANOID_MALLOC_CHECKER)
2448 #if (defined(BROKEN_STRNDUP) || !defined(HAVE_STRNDUP))
2450 #define strndup rep_strndup
2453 char *s1 = strndup(s, n);
2454 #if defined(PARANOID_MALLOC_CHECKER)
2458 #define strndup(s,n) __ERROR_DONT_USE_STRNDUP_DIRECTLY
2461 smb_panic("smb_xstrndup: malloc failed");
2467 vasprintf that aborts on malloc fail
2470 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
2477 n = vasprintf(ptr, format, ap2);
2478 if (n == -1 || ! *ptr) {
2479 smb_panic("smb_xvasprintf: out of memory");
2484 /*****************************************************************
2485 Like strdup but for memory.
2486 *****************************************************************/
2488 void *memdup(const void *p, size_t size)
2493 p2 = SMB_MALLOC(size);
2496 memcpy(p2, p, size);
2500 /*****************************************************************
2501 Get local hostname and cache result.
2502 *****************************************************************/
2504 char *myhostname(void)
2508 /* This is cached forever so
2509 * use NULL talloc ctx. */
2510 ret = get_myname(NULL);
2515 /*****************************************************************
2516 A useful function for returning a path in the Samba pid directory.
2517 *****************************************************************/
2519 static char *xx_path(const char *name, const char *rootpath)
2523 fname = talloc_strdup(talloc_tos(), rootpath);
2527 trim_string(fname,"","/");
2529 if (!directory_exist(fname,NULL)) {
2533 return talloc_asprintf(talloc_tos(),
2539 /*****************************************************************
2540 A useful function for returning a path in the Samba lock directory.
2541 *****************************************************************/
2543 char *lock_path(const char *name)
2545 return xx_path(name, lp_lockdir());
2548 /*****************************************************************
2549 A useful function for returning a path in the Samba pid directory.
2550 *****************************************************************/
2552 char *pid_path(const char *name)
2554 return xx_path(name, lp_piddir());
2558 * @brief Returns an absolute path to a file in the Samba lib directory.
2560 * @param name File to find, relative to LIBDIR.
2562 * @retval Pointer to a string containing the full path.
2565 char *lib_path(const char *name)
2567 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_LIBDIR(), name);
2571 * @brief Returns an absolute path to a file in the Samba data directory.
2573 * @param name File to find, relative to CODEPAGEDIR.
2575 * @retval Pointer to a talloc'ed string containing the full path.
2578 char *data_path(const char *name)
2580 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_CODEPAGEDIR(), name);
2583 /*****************************************************************
2584 a useful function for returning a path in the Samba state directory
2585 *****************************************************************/
2587 char *state_path(const char *name)
2589 return xx_path(name, get_dyn_STATEDIR());
2593 * @brief Returns the platform specific shared library extension.
2595 * @retval Pointer to a const char * containing the extension.
2598 const char *shlib_ext(void)
2600 return get_dyn_SHLIBEXT();
2603 /*******************************************************************
2604 Given a filename - get its directory name
2605 NB: Returned in static storage. Caveats:
2606 o If caller wishes to preserve, they should copy.
2607 ********************************************************************/
2609 char *parent_dirname(const char *path)
2613 if (!parent_dirname_talloc(talloc_tos(), path, &parent, NULL)) {
2620 bool parent_dirname_talloc(TALLOC_CTX *mem_ctx, const char *dir,
2621 char **parent, const char **name)
2626 p = strrchr_m(dir, '/'); /* Find final '/', if any */
2629 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
2640 if (!(*parent = TALLOC_ARRAY(mem_ctx, char, len+1))) {
2643 memcpy(*parent, dir, len);
2644 (*parent)[len] = '\0';
2652 /*******************************************************************
2653 Determine if a pattern contains any Microsoft wildcard characters.
2654 *******************************************************************/
2656 bool ms_has_wild(const char *s)
2660 if (lp_posix_pathnames()) {
2661 /* With posix pathnames no characters are wild. */
2665 while ((c = *s++)) {
2678 bool ms_has_wild_w(const smb_ucs2_t *s)
2681 if (!s) return False;
2682 while ((c = *s++)) {
2684 case UCS2_CHAR('*'):
2685 case UCS2_CHAR('?'):
2686 case UCS2_CHAR('<'):
2687 case UCS2_CHAR('>'):
2688 case UCS2_CHAR('"'):
2695 /*******************************************************************
2696 A wrapper that handles case sensitivity and the special handling
2698 *******************************************************************/
2700 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
2702 if (strcmp(string,"..") == 0)
2704 if (strcmp(pattern,".") == 0)
2707 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2710 /*******************************************************************
2711 A wrapper that handles case sensitivity and the special handling
2712 of the ".." name. Varient that is only called by old search code which requires
2713 pattern translation.
2714 *******************************************************************/
2716 bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
2718 if (strcmp(string,"..") == 0)
2720 if (strcmp(pattern,".") == 0)
2723 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2726 /*******************************************************************
2727 A wrapper that handles a list of patters and calls mask_match()
2728 on each. Returns True if any of the patterns match.
2729 *******************************************************************/
2731 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive)
2733 while (listLen-- > 0) {
2734 if (mask_match(string, *list++, is_case_sensitive))
2740 /*********************************************************
2741 Recursive routine that is called by unix_wild_match.
2742 *********************************************************/
2744 static bool unix_do_match(const char *regexp, const char *str)
2748 for( p = regexp; *p && *str; ) {
2759 * Look for a character matching
2760 * the one after the '*'.
2764 return true; /* Automatic match */
2767 while(*str && (*p != *str))
2771 * Patch from weidel@multichart.de. In the case of the regexp
2772 * '*XX*' we want to ensure there are at least 2 'X' characters
2773 * in the string after the '*' for a match to be made.
2780 * Eat all the characters that match, but count how many there were.
2783 while(*str && (*p == *str)) {
2789 * Now check that if the regexp had n identical characters that
2790 * matchcount had at least that many matches.
2793 while ( *(p+1) && (*(p+1) == *p)) {
2798 if ( matchcount <= 0 )
2802 str--; /* We've eaten the match char after the '*' */
2804 if(unix_do_match(p, str))
2826 if (!*p && str[0] == '.' && str[1] == 0)
2829 if (!*str && *p == '?') {
2835 if(!*str && (*p == '*' && p[1] == '\0'))
2841 /*******************************************************************
2842 Simple case insensitive interface to a UNIX wildcard matcher.
2843 Returns True if match, False if not.
2844 *******************************************************************/
2846 bool unix_wild_match(const char *pattern, const char *string)
2848 TALLOC_CTX *ctx = talloc_stackframe();
2854 p2 = talloc_strdup(ctx,pattern);
2855 s2 = talloc_strdup(ctx,string);
2863 /* Remove any *? and ** from the pattern as they are meaningless */
2864 for(p = p2; *p; p++) {
2865 while( *p == '*' && (p[1] == '?' ||p[1] == '*')) {
2866 memmove(&p[1], &p[2], strlen(&p[2])+1);
2870 if (strequal(p2,"*")) {
2875 ret = unix_do_match(p2, s2);
2880 /**********************************************************************
2881 Converts a name to a fully qualified domain name.
2882 Returns true if lookup succeeded, false if not (then fqdn is set to name)
2883 Note we deliberately use gethostbyname here, not getaddrinfo as we want
2884 to examine the h_aliases and I don't know how to do that with getaddrinfo.
2885 ***********************************************************************/
2887 bool name_to_fqdn(fstring fqdn, const char *name)
2890 struct hostent *hp = gethostbyname(name);
2892 if (!hp || !hp->h_name || !*hp->h_name) {
2893 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2894 fstrcpy(fqdn, name);
2898 /* Find out if the fqdn is returned as an alias
2899 * to cope with /etc/hosts files where the first
2900 * name is not the fqdn but the short name */
2901 if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2903 for (i = 0; hp->h_aliases[i]; i++) {
2904 if (strchr_m(hp->h_aliases[i], '.')) {
2905 full = hp->h_aliases[i];
2910 if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2911 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2912 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2913 DEBUGADD(1, (" to Kerberos authentication problems as localhost.localdomain\n"));
2914 DEBUGADD(1, (" may end up being used instead of the real machine FQDN.\n"));
2921 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2922 fstrcpy(fqdn, full);
2926 /**********************************************************************
2927 Extension to talloc_get_type: Abort on type mismatch
2928 ***********************************************************************/
2930 void *talloc_check_name_abort(const void *ptr, const char *name)
2934 result = talloc_check_name(ptr, name);
2938 DEBUG(0, ("Talloc type mismatch, expected %s, got %s\n",
2939 name, talloc_get_name(ptr)));
2940 smb_panic("talloc type mismatch");
2941 /* Keep the compiler happy */
2945 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2947 switch (share_access & ~FILE_SHARE_DELETE) {
2948 case FILE_SHARE_NONE:
2950 case FILE_SHARE_READ:
2952 case FILE_SHARE_WRITE:
2954 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2957 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2959 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2966 pid_t procid_to_pid(const struct server_id *proc)
2971 static uint32 my_vnn = NONCLUSTER_VNN;
2973 void set_my_vnn(uint32 vnn)
2975 DEBUG(10, ("vnn pid %d = %u\n", (int)sys_getpid(), (unsigned int)vnn));
2979 uint32 get_my_vnn(void)
2984 struct server_id pid_to_procid(pid_t pid)
2986 struct server_id result;
2988 #ifdef CLUSTER_SUPPORT
2989 result.vnn = my_vnn;
2994 struct server_id procid_self(void)
2996 return pid_to_procid(sys_getpid());
2999 struct server_id server_id_self(void)
3001 return procid_self();
3004 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
3006 if (p1->pid != p2->pid)
3008 #ifdef CLUSTER_SUPPORT
3009 if (p1->vnn != p2->vnn)
3015 bool cluster_id_equal(const struct server_id *id1,
3016 const struct server_id *id2)
3018 return procid_equal(id1, id2);
3021 bool procid_is_me(const struct server_id *pid)
3023 if (pid->pid != sys_getpid())
3025 #ifdef CLUSTER_SUPPORT
3026 if (pid->vnn != my_vnn)
3032 struct server_id interpret_pid(const char *pid_string)
3034 #ifdef CLUSTER_SUPPORT
3035 unsigned int vnn, pid;
3036 struct server_id result;
3037 if (sscanf(pid_string, "%u:%u", &vnn, &pid) == 2) {
3041 else if (sscanf(pid_string, "%u", &pid) == 1) {
3042 result.vnn = NONCLUSTER_VNN;
3046 result.vnn = NONCLUSTER_VNN;
3051 return pid_to_procid(atoi(pid_string));
3055 char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid)
3057 #ifdef CLUSTER_SUPPORT
3058 if (pid->vnn == NONCLUSTER_VNN) {
3059 return talloc_asprintf(mem_ctx,
3064 return talloc_asprintf(mem_ctx,
3070 return talloc_asprintf(mem_ctx,
3076 char *procid_str_static(const struct server_id *pid)
3078 return procid_str(talloc_tos(), pid);
3081 bool procid_valid(const struct server_id *pid)
3083 return (pid->pid != -1);
3086 bool procid_is_local(const struct server_id *pid)
3088 #ifdef CLUSTER_SUPPORT
3089 return pid->vnn == my_vnn;
3095 int this_is_smp(void)
3097 #if defined(HAVE_SYSCONF)
3099 #if defined(SYSCONF_SC_NPROC_ONLN)
3100 return (sysconf(_SC_NPROC_ONLN) > 1) ? 1 : 0;
3101 #elif defined(SYSCONF_SC_NPROCESSORS_ONLN)
3102 return (sysconf(_SC_NPROCESSORS_ONLN) > 1) ? 1 : 0;
3112 /****************************************************************
3113 Check if an offset into a buffer is safe.
3114 If this returns True it's safe to indirect into the byte at
3116 ****************************************************************/
3118 bool is_offset_safe(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3120 const char *end_base = buf_base + buf_len;
3121 char *end_ptr = ptr + off;
3123 if (!buf_base || !ptr) {
3127 if (end_base < buf_base || end_ptr < ptr) {
3128 return False; /* wrap. */
3131 if (end_ptr < end_base) {
3137 /****************************************************************
3138 Return a safe pointer into a buffer, or NULL.
3139 ****************************************************************/
3141 char *get_safe_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3143 return is_offset_safe(buf_base, buf_len, ptr, off) ?
3147 /****************************************************************
3148 Return a safe pointer into a string within a buffer, or NULL.
3149 ****************************************************************/
3151 char *get_safe_str_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
3153 if (!is_offset_safe(buf_base, buf_len, ptr, off)) {
3156 /* Check if a valid string exists at this offset. */
3157 if (skip_string(buf_base,buf_len, ptr + off) == NULL) {
3163 /****************************************************************
3164 Return an SVAL at a pointer, or failval if beyond the end.
3165 ****************************************************************/
3167 int get_safe_SVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
3170 * Note we use off+1 here, not off+2 as SVAL accesses ptr[0] and ptr[1],
3173 if (!is_offset_safe(buf_base, buf_len, ptr, off+1)) {
3176 return SVAL(ptr,off);
3179 /****************************************************************
3180 Return an IVAL at a pointer, or failval if beyond the end.
3181 ****************************************************************/
3183 int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
3186 * Note we use off+3 here, not off+4 as IVAL accesses
3187 * ptr[0] ptr[1] ptr[2] ptr[3] NOT ptr[4].
3189 if (!is_offset_safe(buf_base, buf_len, ptr, off+3)) {
3192 return IVAL(ptr,off);
3195 /****************************************************************
3196 Split DOM\user into DOM and user. Do not mix with winbind variants of that
3197 call (they take care of winbind separator and other winbind specific settings).
3198 ****************************************************************/
3200 void split_domain_user(TALLOC_CTX *mem_ctx,
3201 const char *full_name,
3205 const char *p = NULL;
3207 p = strchr_m(full_name, '\\');
3210 *domain = talloc_strndup(mem_ctx, full_name,
3211 PTR_DIFF(p, full_name));
3212 *user = talloc_strdup(mem_ctx, p+1);
3214 *domain = talloc_strdup(mem_ctx, "");
3215 *user = talloc_strdup(mem_ctx, full_name);
3221 Disable these now we have checked all code paths and ensured
3222 NULL returns on zero request. JRA.
3224 /****************************************************************
3225 talloc wrapper functions that guarentee a null pointer return
3227 ****************************************************************/
3229 #ifndef MAX_TALLOC_SIZE
3230 #define MAX_TALLOC_SIZE 0x10000000
3234 * talloc and zero memory.
3235 * - returns NULL if size is zero.
3238 void *_talloc_zero_zeronull(const void *ctx, size_t size, const char *name)
3246 p = talloc_named_const(ctx, size, name);
3249 memset(p, '\0', size);
3256 * memdup with a talloc.
3257 * - returns NULL if size is zero.
3260 void *_talloc_memdup_zeronull(const void *t, const void *p, size_t size, const char *name)
3268 newp = talloc_named_const(t, size, name);
3270 memcpy(newp, p, size);
3277 * alloc an array, checking for integer overflow in the array size.
3278 * - returns NULL if count or el_size are zero.
3281 void *_talloc_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
3283 if (count >= MAX_TALLOC_SIZE/el_size) {
3287 if (el_size == 0 || count == 0) {
3291 return talloc_named_const(ctx, el_size * count, name);
3295 * alloc an zero array, checking for integer overflow in the array size
3296 * - returns NULL if count or el_size are zero.
3299 void *_talloc_zero_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
3301 if (count >= MAX_TALLOC_SIZE/el_size) {
3305 if (el_size == 0 || count == 0) {
3309 return _talloc_zero(ctx, el_size * count, name);
3313 * Talloc wrapper that returns NULL if size == 0.
3315 void *talloc_zeronull(const void *context, size_t size, const char *name)
3320 return talloc_named_const(context, size, name);