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 static enum protocol_types Protocol = PROTOCOL_COREPLUS;
60 enum protocol_types get_Protocol(void)
65 void set_Protocol(enum protocol_types p)
70 static enum remote_arch_types ra_type = RA_UNKNOWN;
72 /***********************************************************************
73 Definitions for all names.
74 ***********************************************************************/
76 static char *smb_myname;
77 static char *smb_myworkgroup;
78 static char *smb_scope;
79 static int smb_num_netbios_names;
80 static char **smb_my_netbios_names;
82 /***********************************************************************
83 Allocate and set myname. Ensure upper case.
84 ***********************************************************************/
86 bool set_global_myname(const char *myname)
88 SAFE_FREE(smb_myname);
89 smb_myname = SMB_STRDUP(myname);
92 strupper_m(smb_myname);
96 const char *global_myname(void)
101 /***********************************************************************
102 Allocate and set myworkgroup. Ensure upper case.
103 ***********************************************************************/
105 bool set_global_myworkgroup(const char *myworkgroup)
107 SAFE_FREE(smb_myworkgroup);
108 smb_myworkgroup = SMB_STRDUP(myworkgroup);
109 if (!smb_myworkgroup)
111 strupper_m(smb_myworkgroup);
115 const char *lp_workgroup(void)
117 return smb_myworkgroup;
120 /***********************************************************************
121 Allocate and set scope. Ensure upper case.
122 ***********************************************************************/
124 bool set_global_scope(const char *scope)
126 SAFE_FREE(smb_scope);
127 smb_scope = SMB_STRDUP(scope);
130 strupper_m(smb_scope);
134 /*********************************************************************
135 Ensure scope is never null string.
136 *********************************************************************/
138 const char *global_scope(void)
141 set_global_scope("");
145 static void free_netbios_names_array(void)
149 for (i = 0; i < smb_num_netbios_names; i++)
150 SAFE_FREE(smb_my_netbios_names[i]);
152 SAFE_FREE(smb_my_netbios_names);
153 smb_num_netbios_names = 0;
156 static bool allocate_my_netbios_names_array(size_t number)
158 free_netbios_names_array();
160 smb_num_netbios_names = number + 1;
161 smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
163 if (!smb_my_netbios_names)
166 memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
170 static bool set_my_netbios_names(const char *name, int i)
172 SAFE_FREE(smb_my_netbios_names[i]);
174 smb_my_netbios_names[i] = SMB_STRDUP(name);
175 if (!smb_my_netbios_names[i])
177 strupper_m(smb_my_netbios_names[i]);
181 /***********************************************************************
182 Free memory allocated to global objects
183 ***********************************************************************/
185 void gfree_names(void)
187 SAFE_FREE( smb_myname );
188 SAFE_FREE( smb_myworkgroup );
189 SAFE_FREE( smb_scope );
190 free_netbios_names_array();
191 free_local_machine_name();
194 void gfree_all( void )
204 const char *my_netbios_names(int i)
206 return smb_my_netbios_names[i];
209 bool set_netbios_aliases(const char **str_array)
213 /* Work out the max number of netbios aliases that we have */
214 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
217 if ( global_myname() && *global_myname())
220 /* Allocate space for the netbios aliases */
221 if (!allocate_my_netbios_names_array(namecount))
224 /* Use the global_myname string first */
226 if ( global_myname() && *global_myname()) {
227 set_my_netbios_names( global_myname(), namecount );
233 for ( i = 0; str_array[i] != NULL; i++) {
235 bool duplicate = False;
237 /* Look for duplicates */
238 for( n=0; n<namecount; n++ ) {
239 if( strequal( str_array[i], my_netbios_names(n) ) ) {
245 if (!set_my_netbios_names(str_array[i], namecount))
254 /****************************************************************************
255 Common name initialization code.
256 ****************************************************************************/
258 bool init_names(void)
262 if (global_myname() == NULL || *global_myname() == '\0') {
263 if (!set_global_myname(myhostname())) {
264 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
269 if (!set_netbios_aliases(lp_netbios_aliases())) {
270 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
274 set_local_machine_name(global_myname(),false);
276 DEBUG( 5, ("Netbios name list:-\n") );
277 for( n=0; my_netbios_names(n); n++ ) {
278 DEBUGADD( 5, ("my_netbios_names[%d]=\"%s\"\n",
279 n, my_netbios_names(n) ) );
285 /**************************************************************************n
286 Code to cope with username/password auth options from the commandline.
287 Used mainly in client tools.
288 ****************************************************************************/
290 struct user_auth_info *user_auth_info_init(TALLOC_CTX *mem_ctx)
292 struct user_auth_info *result;
294 result = TALLOC_ZERO_P(mem_ctx, struct user_auth_info);
295 if (result == NULL) {
299 result->signing_state = Undefined;
303 const char *get_cmdline_auth_info_username(const struct user_auth_info *auth_info)
305 if (!auth_info->username) {
308 return auth_info->username;
311 void set_cmdline_auth_info_username(struct user_auth_info *auth_info,
312 const char *username)
314 TALLOC_FREE(auth_info->username);
315 auth_info->username = talloc_strdup(auth_info, username);
316 if (!auth_info->username) {
321 const char *get_cmdline_auth_info_domain(const struct user_auth_info *auth_info)
323 if (!auth_info->domain) {
326 return auth_info->domain;
329 void set_cmdline_auth_info_domain(struct user_auth_info *auth_info,
332 TALLOC_FREE(auth_info->domain);
333 auth_info->domain = talloc_strdup(auth_info, domain);
334 if (!auth_info->domain) {
339 const char *get_cmdline_auth_info_password(const struct user_auth_info *auth_info)
341 if (!auth_info->password) {
344 return auth_info->password;
347 void set_cmdline_auth_info_password(struct user_auth_info *auth_info,
348 const char *password)
350 TALLOC_FREE(auth_info->password);
351 if (password == NULL) {
354 auth_info->password = talloc_strdup(auth_info, password);
355 if (!auth_info->password) {
358 auth_info->got_pass = true;
361 bool set_cmdline_auth_info_signing_state(struct user_auth_info *auth_info,
364 auth_info->signing_state = -1;
365 if (strequal(arg, "off") || strequal(arg, "no") ||
366 strequal(arg, "false")) {
367 auth_info->signing_state = false;
368 } else if (strequal(arg, "on") || strequal(arg, "yes") ||
369 strequal(arg, "true") || strequal(arg, "auto")) {
370 auth_info->signing_state = true;
371 } else if (strequal(arg, "force") || strequal(arg, "required") ||
372 strequal(arg, "forced")) {
373 auth_info->signing_state = Required;
380 int get_cmdline_auth_info_signing_state(const struct user_auth_info *auth_info)
382 return auth_info->signing_state;
385 void set_cmdline_auth_info_use_kerberos(struct user_auth_info *auth_info,
388 auth_info->use_kerberos = b;
391 bool get_cmdline_auth_info_use_kerberos(const struct user_auth_info *auth_info)
393 return auth_info->use_kerberos;
396 void set_cmdline_auth_info_fallback_after_kerberos(struct user_auth_info *auth_info,
399 auth_info->fallback_after_kerberos = b;
402 bool get_cmdline_auth_info_fallback_after_kerberos(const struct user_auth_info *auth_info)
404 return auth_info->fallback_after_kerberos;
407 /* This should only be used by lib/popt_common.c JRA */
408 void set_cmdline_auth_info_use_krb5_ticket(struct user_auth_info *auth_info)
410 auth_info->use_kerberos = true;
411 auth_info->got_pass = true;
414 /* This should only be used by lib/popt_common.c JRA */
415 void set_cmdline_auth_info_smb_encrypt(struct user_auth_info *auth_info)
417 auth_info->smb_encrypt = true;
420 void set_cmdline_auth_info_use_machine_account(struct user_auth_info *auth_info)
422 auth_info->use_machine_account = true;
425 bool get_cmdline_auth_info_got_pass(const struct user_auth_info *auth_info)
427 return auth_info->got_pass;
430 bool get_cmdline_auth_info_smb_encrypt(const struct user_auth_info *auth_info)
432 return auth_info->smb_encrypt;
435 bool get_cmdline_auth_info_use_machine_account(const struct user_auth_info *auth_info)
437 return auth_info->use_machine_account;
440 struct user_auth_info *get_cmdline_auth_info_copy(TALLOC_CTX *mem_ctx,
441 const struct user_auth_info *src)
443 struct user_auth_info *result;
445 result = user_auth_info_init(mem_ctx);
446 if (result == NULL) {
452 result->username = talloc_strdup(
453 result, get_cmdline_auth_info_username(src));
454 result->password = talloc_strdup(
455 result, get_cmdline_auth_info_password(src));
456 if ((result->username == NULL) || (result->password == NULL)) {
464 bool set_cmdline_auth_info_machine_account_creds(struct user_auth_info *auth_info)
467 char *account = NULL;
469 if (!get_cmdline_auth_info_use_machine_account(auth_info)) {
473 if (!secrets_init()) {
474 d_printf("ERROR: Unable to open secrets database\n");
478 if (asprintf(&account, "%s$@%s", global_myname(), lp_realm()) < 0) {
482 pass = secrets_fetch_machine_password(lp_workgroup(), NULL, NULL);
484 d_printf("ERROR: Unable to fetch machine password for "
486 account, lp_workgroup());
491 set_cmdline_auth_info_username(auth_info, account);
492 set_cmdline_auth_info_password(auth_info, pass);
500 /****************************************************************************
501 Ensure we have a password if one not given.
502 ****************************************************************************/
504 void set_cmdline_auth_info_getpass(struct user_auth_info *auth_info)
510 if (get_cmdline_auth_info_got_pass(auth_info) ||
511 get_cmdline_auth_info_use_kerberos(auth_info)) {
512 /* Already got one... */
516 frame = talloc_stackframe();
517 label = talloc_asprintf(frame, "Enter %s's password: ",
518 get_cmdline_auth_info_username(auth_info));
519 pass = getpass(label);
521 set_cmdline_auth_info_password(auth_info, pass);
526 /*******************************************************************
527 Check if a file exists - call vfs_file_exist for samba files.
528 ********************************************************************/
530 bool file_exist_stat(const char *fname,SMB_STRUCT_STAT *sbuf,
531 bool fake_dir_create_times)
537 if (sys_stat(fname, sbuf, fake_dir_create_times) != 0)
540 return((S_ISREG(sbuf->st_ex_mode)) || (S_ISFIFO(sbuf->st_ex_mode)));
543 /*******************************************************************
544 Check if a unix domain socket exists - call vfs_file_exist for samba files.
545 ********************************************************************/
547 bool socket_exist(const char *fname)
550 if (sys_stat(fname, &st, false) != 0)
553 return S_ISSOCK(st.st_ex_mode);
556 /*******************************************************************
557 Returns the size in bytes of the named given the stat struct.
558 ********************************************************************/
560 uint64_t get_file_size_stat(const SMB_STRUCT_STAT *sbuf)
562 return sbuf->st_ex_size;
565 /*******************************************************************
566 Returns the size in bytes of the named file.
567 ********************************************************************/
569 SMB_OFF_T get_file_size(char *file_name)
573 if (sys_stat(file_name, &buf, false) != 0)
574 return (SMB_OFF_T)-1;
575 return get_file_size_stat(&buf);
578 /*******************************************************************
579 Return a string representing an attribute for a file.
580 ********************************************************************/
582 char *attrib_string(uint16 mode)
588 if (mode & aVOLID) fstrcat(attrstr,"V");
589 if (mode & aDIR) fstrcat(attrstr,"D");
590 if (mode & aARCH) fstrcat(attrstr,"A");
591 if (mode & aHIDDEN) fstrcat(attrstr,"H");
592 if (mode & aSYSTEM) fstrcat(attrstr,"S");
593 if (mode & aRONLY) fstrcat(attrstr,"R");
595 return talloc_strdup(talloc_tos(), attrstr);
598 /*******************************************************************
599 Show a smb message structure.
600 ********************************************************************/
602 void show_msg(char *buf)
610 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
612 (int)CVAL(buf,smb_com),
613 (int)CVAL(buf,smb_rcls),
614 (int)CVAL(buf,smb_reh),
615 (int)SVAL(buf,smb_err),
616 (int)CVAL(buf,smb_flg),
617 (int)SVAL(buf,smb_flg2)));
618 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
619 (int)SVAL(buf,smb_tid),
620 (int)SVAL(buf,smb_pid),
621 (int)SVAL(buf,smb_uid),
622 (int)SVAL(buf,smb_mid)));
623 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
625 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
626 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
627 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
629 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
631 DEBUGADD(5,("smb_bcc=%d\n",bcc));
639 dump_data(10, (uint8 *)smb_buf(buf), bcc);
642 /*******************************************************************
643 Set the length and marker of an encrypted smb packet.
644 ********************************************************************/
646 void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)
648 _smb_setlen(buf,len);
652 SSVAL(buf,6,enc_ctx_num);
655 /*******************************************************************
656 Set the length and marker of an smb packet.
657 ********************************************************************/
659 void smb_setlen(char *buf,int len)
661 _smb_setlen(buf,len);
669 /*******************************************************************
670 Setup only the byte count for a smb message.
671 ********************************************************************/
673 int set_message_bcc(char *buf,int num_bytes)
675 int num_words = CVAL(buf,smb_wct);
676 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
677 _smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
678 return (smb_size + num_words*2 + num_bytes);
681 /*******************************************************************
682 Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
683 Return the bytes added
684 ********************************************************************/
686 ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
688 size_t newlen = smb_len(*outbuf) + 4 + blob.length;
691 if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
692 DEBUG(0, ("talloc failed\n"));
697 memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
698 set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
702 /*******************************************************************
703 Reduce a file name, removing .. elements.
704 ********************************************************************/
706 static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
711 DEBUG(3,("dos_clean_name [%s]\n",s));
713 /* remove any double slashes */
714 str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
719 /* Remove leading .\\ characters */
720 if(strncmp(str, ".\\", 2) == 0) {
721 trim_string(str, ".\\", NULL);
723 str = talloc_strdup(ctx, ".\\");
730 while ((p = strstr_m(str,"\\..\\")) != NULL) {
736 if ((p=strrchr_m(str,'\\')) != NULL) {
741 str = talloc_asprintf(ctx,
750 trim_string(str,NULL,"\\..");
751 return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
754 /*******************************************************************
755 Reduce a file name, removing .. elements.
756 ********************************************************************/
758 char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
763 DEBUG(3,("unix_clean_name [%s]\n",s));
765 /* remove any double slashes */
766 str = talloc_all_string_sub(ctx, s, "//","/");
771 /* Remove leading ./ characters */
772 if(strncmp(str, "./", 2) == 0) {
773 trim_string(str, "./", NULL);
775 str = talloc_strdup(ctx, "./");
782 while ((p = strstr_m(str,"/../")) != NULL) {
788 if ((p=strrchr_m(str,'/')) != NULL) {
793 str = talloc_asprintf(ctx,
802 trim_string(str,NULL,"/..");
803 return talloc_all_string_sub(ctx, str, "/./", "/");
806 char *clean_name(TALLOC_CTX *ctx, const char *s)
808 char *str = dos_clean_name(ctx, s);
812 return unix_clean_name(ctx, str);
815 /*******************************************************************
816 Write data into an fd at a given offset. Ignore seek errors.
817 ********************************************************************/
819 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
824 if (pos == (SMB_OFF_T)-1) {
825 return write_data(fd, buffer, N);
827 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
829 ret = sys_pwrite(fd,buffer + total,N - total, pos);
830 if (ret == -1 && errno == ESPIPE) {
831 return write_data(fd, buffer + total,N - total);
834 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
843 return (ssize_t)total;
845 /* Use lseek and write_data. */
846 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
847 if (errno != ESPIPE) {
851 return write_data(fd, buffer, N);
855 /*******************************************************************
856 Sleep for a specified number of milliseconds.
857 ********************************************************************/
859 void smb_msleep(unsigned int t)
861 #if defined(HAVE_NANOSLEEP)
862 struct timespec tval;
865 tval.tv_sec = t/1000;
866 tval.tv_nsec = 1000000*(t%1000);
870 ret = nanosleep(&tval, &tval);
871 } while (ret < 0 && errno == EINTR && (tval.tv_sec > 0 || tval.tv_nsec > 0));
873 unsigned int tdiff=0;
874 struct timeval tval,t1,t2;
881 tval.tv_sec = (t-tdiff)/1000;
882 tval.tv_usec = 1000*((t-tdiff)%1000);
884 /* Never wait for more than 1 sec. */
885 if (tval.tv_sec > 1) {
892 sys_select_intr(0,&fds,NULL,NULL,&tval);
895 if (t2.tv_sec < t1.tv_sec) {
896 /* Someone adjusted time... */
900 tdiff = TvalDiff(&t1,&t2);
905 NTSTATUS reinit_after_fork(struct messaging_context *msg_ctx,
906 struct event_context *ev_ctx,
907 bool parent_longlived)
909 NTSTATUS status = NT_STATUS_OK;
911 /* Reset the state of the random
912 * number generation system, so
913 * children do not get the same random
914 * numbers as each other */
915 set_need_random_reseed();
917 /* tdb needs special fork handling */
918 if (tdb_reopen_all(parent_longlived ? 1 : 0) == -1) {
919 DEBUG(0,("tdb_reopen_all failed.\n"));
920 status = NT_STATUS_OPEN_FAILED;
925 event_context_reinit(ev_ctx);
930 * For clustering, we need to re-init our ctdbd connection after the
933 status = messaging_reinit(msg_ctx);
934 if (!NT_STATUS_IS_OK(status)) {
935 DEBUG(0,("messaging_reinit() failed: %s\n",
943 #if defined(PARANOID_MALLOC_CHECKER)
945 /****************************************************************************
946 Internal malloc wrapper. Externally visible.
947 ****************************************************************************/
949 void *malloc_(size_t size)
956 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
959 /****************************************************************************
960 Internal calloc wrapper. Not externally visible.
961 ****************************************************************************/
963 static void *calloc_(size_t count, size_t size)
965 if (size == 0 || count == 0) {
969 return calloc(count, size);
970 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
973 /****************************************************************************
974 Internal realloc wrapper. Not externally visible.
975 ****************************************************************************/
977 static void *realloc_(void *ptr, size_t size)
980 return realloc(ptr, size);
981 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
984 #endif /* PARANOID_MALLOC_CHECKER */
986 /****************************************************************************
988 ****************************************************************************/
990 void *memalign_array(size_t el_size, size_t align, unsigned int count)
992 if (count >= MAX_ALLOC_SIZE/el_size) {
996 return sys_memalign(align, el_size*count);
999 /****************************************************************************
1001 ****************************************************************************/
1003 void *calloc_array(size_t size, size_t nmemb)
1005 if (nmemb >= MAX_ALLOC_SIZE/size) {
1008 if (size == 0 || nmemb == 0) {
1011 #if defined(PARANOID_MALLOC_CHECKER)
1012 return calloc_(nmemb, size);
1014 return calloc(nmemb, size);
1018 /****************************************************************************
1019 Expand a pointer to be a particular size.
1020 Note that this version of Realloc has an extra parameter that decides
1021 whether to free the passed in storage on allocation failure or if the
1024 This is designed for use in the typical idiom of :
1026 p = SMB_REALLOC(p, size)
1031 and not to have to keep track of the old 'p' contents to free later, nor
1032 to worry if the size parameter was zero. In the case where NULL is returned
1033 we guarentee that p has been freed.
1035 If free later semantics are desired, then pass 'free_old_on_error' as False which
1036 guarentees that the old contents are not freed on error, even if size == 0. To use
1039 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
1047 Changes were instigated by Coverity error checking. JRA.
1048 ****************************************************************************/
1050 void *Realloc(void *p, size_t size, bool free_old_on_error)
1055 if (free_old_on_error) {
1058 DEBUG(2,("Realloc asked for 0 bytes\n"));
1062 #if defined(PARANOID_MALLOC_CHECKER)
1064 ret = (void *)malloc_(size);
1066 ret = (void *)realloc_(p,size);
1070 ret = (void *)malloc(size);
1072 ret = (void *)realloc(p,size);
1077 if (free_old_on_error && p) {
1080 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
1086 /****************************************************************************
1087 (Hopefully) efficient array append.
1088 ****************************************************************************/
1090 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
1091 void *element, void *_array, uint32 *num_elements,
1092 ssize_t *array_size)
1094 void **array = (void **)_array;
1096 if (*array_size < 0) {
1100 if (*array == NULL) {
1101 if (*array_size == 0) {
1105 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1109 *array = TALLOC(mem_ctx, element_size * (*array_size));
1110 if (*array == NULL) {
1115 if (*num_elements == *array_size) {
1118 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1122 *array = TALLOC_REALLOC(mem_ctx, *array,
1123 element_size * (*array_size));
1125 if (*array == NULL) {
1130 memcpy((char *)(*array) + element_size*(*num_elements),
1131 element, element_size);
1141 /****************************************************************************
1142 Get my own domain name, or "" if we have none.
1143 ****************************************************************************/
1145 char *get_mydnsdomname(TALLOC_CTX *ctx)
1147 const char *domname;
1150 domname = get_mydnsfullname();
1155 p = strchr_m(domname, '.');
1158 return talloc_strdup(ctx, p);
1160 return talloc_strdup(ctx, "");
1164 /****************************************************************************
1165 Interpret a protocol description string, with a default.
1166 ****************************************************************************/
1168 int interpret_protocol(const char *str,int def)
1170 if (strequal(str,"NT1"))
1171 return(PROTOCOL_NT1);
1172 if (strequal(str,"LANMAN2"))
1173 return(PROTOCOL_LANMAN2);
1174 if (strequal(str,"LANMAN1"))
1175 return(PROTOCOL_LANMAN1);
1176 if (strequal(str,"CORE"))
1177 return(PROTOCOL_CORE);
1178 if (strequal(str,"COREPLUS"))
1179 return(PROTOCOL_COREPLUS);
1180 if (strequal(str,"CORE+"))
1181 return(PROTOCOL_COREPLUS);
1183 DEBUG(0,("Unrecognised protocol level %s\n",str));
1189 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1190 /******************************************************************
1191 Remove any mount options such as -rsize=2048,wsize=2048 etc.
1192 Based on a fix from <Thomas.Hepper@icem.de>.
1193 Returns a malloc'ed string.
1194 *******************************************************************/
1196 static char *strip_mount_options(TALLOC_CTX *ctx, const char *str)
1199 const char *p = str;
1200 while(*p && !isspace(*p))
1202 while(*p && isspace(*p))
1205 return talloc_strdup(ctx, p);
1211 /*******************************************************************
1212 Patch from jkf@soton.ac.uk
1213 Split Luke's automount_server into YP lookup and string splitter
1214 so can easily implement automount_path().
1215 Returns a malloc'ed string.
1216 *******************************************************************/
1218 #ifdef WITH_NISPLUS_HOME
1219 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1223 char *nis_map = (char *)lp_nis_home_map_name();
1225 char buffer[NIS_MAXATTRVAL + 1];
1230 snprintf(buffer, sizeof(buffer), "[key=%s],%s", user_name, nis_map);
1231 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
1233 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
1234 if (result->status != NIS_SUCCESS) {
1235 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
1237 object = result->objects.objects_val;
1238 if (object->zo_data.zo_type == ENTRY_OBJ) {
1239 entry = &object->zo_data.objdata_u.en_data;
1240 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
1241 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
1243 value = talloc_strdup(ctx,
1244 entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
1246 nis_freeresult(result);
1249 value = talloc_string_sub(ctx,
1256 nis_freeresult(result);
1259 value = strip_mount_options(ctx, value);
1260 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n",
1265 #else /* WITH_NISPLUS_HOME */
1267 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1271 int nis_error; /* returned by yp all functions */
1272 char *nis_result; /* yp_match inits this */
1273 int nis_result_len; /* and set this */
1274 char *nis_domain; /* yp_get_default_domain inits this */
1275 char *nis_map = (char *)lp_nis_home_map_name();
1277 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
1278 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
1282 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
1284 if ((nis_error = yp_match(nis_domain, nis_map, user_name,
1285 strlen(user_name), &nis_result,
1286 &nis_result_len)) == 0) {
1287 value = talloc_strdup(ctx, nis_result);
1291 value = strip_mount_options(ctx, value);
1292 } else if(nis_error == YPERR_KEY) {
1293 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
1294 user_name, nis_map));
1295 DEBUG(3, ("using defaults for server and home directory\n"));
1297 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
1298 yperr_string(nis_error), user_name, nis_map));
1302 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, value));
1306 #endif /* WITH_NISPLUS_HOME */
1309 /****************************************************************************
1310 Check if a process exists. Does this work on all unixes?
1311 ****************************************************************************/
1313 bool process_exists(const struct server_id pid)
1315 if (procid_is_me(&pid)) {
1319 if (procid_is_local(&pid)) {
1320 return (kill(pid.pid,0) == 0 || errno != ESRCH);
1323 #ifdef CLUSTER_SUPPORT
1324 return ctdbd_process_exists(messaging_ctdbd_connection(), pid.vnn,
1331 /*******************************************************************
1332 Convert a uid into a user name.
1333 ********************************************************************/
1335 const char *uidtoname(uid_t uid)
1337 TALLOC_CTX *ctx = talloc_tos();
1339 struct passwd *pass = NULL;
1341 pass = getpwuid_alloc(ctx,uid);
1343 name = talloc_strdup(ctx,pass->pw_name);
1346 name = talloc_asprintf(ctx,
1353 /*******************************************************************
1354 Convert a gid into a group name.
1355 ********************************************************************/
1357 char *gidtoname(gid_t gid)
1361 grp = getgrgid(gid);
1363 return talloc_strdup(talloc_tos(), grp->gr_name);
1366 return talloc_asprintf(talloc_tos(),
1372 /*******************************************************************
1373 Convert a user name into a uid.
1374 ********************************************************************/
1376 uid_t nametouid(const char *name)
1378 struct passwd *pass;
1382 pass = getpwnam_alloc(talloc_autofree_context(), name);
1389 u = (uid_t)strtol(name, &p, 0);
1390 if ((p != name) && (*p == '\0'))
1396 /*******************************************************************
1397 Convert a name to a gid_t if possible. Return -1 if not a group.
1398 ********************************************************************/
1400 gid_t nametogid(const char *name)
1406 g = (gid_t)strtol(name, &p, 0);
1407 if ((p != name) && (*p == '\0'))
1410 grp = sys_getgrnam(name);
1412 return(grp->gr_gid);
1416 /*******************************************************************
1417 Something really nasty happened - panic !
1418 ********************************************************************/
1420 void smb_panic(const char *const why)
1428 if (global_clobber_region_function) {
1429 DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1430 global_clobber_region_function,
1431 global_clobber_region_line));
1436 DEBUG(0,("PANIC (pid %llu): %s\n",
1437 (unsigned long long)sys_getpid(), why));
1440 cmd = lp_panic_action();
1442 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1443 result = system(cmd);
1446 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1449 DEBUG(0, ("smb_panic(): action returned status %d\n",
1450 WEXITSTATUS(result)));
1456 /*******************************************************************
1457 Print a backtrace of the stack to the debug log. This function
1458 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1459 exit shortly after calling it.
1460 ********************************************************************/
1462 #ifdef HAVE_LIBUNWIND_H
1463 #include <libunwind.h>
1466 #ifdef HAVE_EXECINFO_H
1467 #include <execinfo.h>
1470 #ifdef HAVE_LIBEXC_H
1474 void log_stack_trace(void)
1476 #ifdef HAVE_LIBUNWIND
1477 /* Try to use libunwind before any other technique since on ia64
1478 * libunwind correctly walks the stack in more circumstances than
1481 unw_cursor_t cursor;
1486 unw_word_t ip, sp, off;
1488 procname[sizeof(procname) - 1] = '\0';
1490 if (unw_getcontext(&uc) != 0) {
1491 goto libunwind_failed;
1494 if (unw_init_local(&cursor, &uc) != 0) {
1495 goto libunwind_failed;
1498 DEBUG(0, ("BACKTRACE:\n"));
1502 unw_get_reg(&cursor, UNW_REG_IP, &ip);
1503 unw_get_reg(&cursor, UNW_REG_SP, &sp);
1505 switch (unw_get_proc_name(&cursor,
1506 procname, sizeof(procname) - 1, &off) ) {
1510 /* Name truncated. */
1511 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1512 i, procname, (long long)off,
1513 (long long)ip, (long long) sp));
1516 /* case -UNW_ENOINFO: */
1517 /* case -UNW_EUNSPEC: */
1518 /* No symbol name found. */
1519 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1520 i, "<unknown symbol>",
1521 (long long)ip, (long long) sp));
1524 } while (unw_step(&cursor) > 0);
1529 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1531 #elif HAVE_BACKTRACE_SYMBOLS
1532 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1533 size_t backtrace_size;
1534 char **backtrace_strings;
1536 /* get the backtrace (stack frames) */
1537 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1538 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1540 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1541 (unsigned long)backtrace_size));
1543 if (backtrace_strings) {
1546 for (i = 0; i < backtrace_size; i++)
1547 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1549 /* Leak the backtrace_strings, rather than risk what free() might do */
1554 /* The IRIX libexc library provides an API for unwinding the stack. See
1555 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1556 * since we are about to abort anyway, it hardly matters.
1559 #define NAMESIZE 32 /* Arbitrary */
1561 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1562 char * names[BACKTRACE_STACK_SIZE];
1563 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1570 ZERO_ARRAY(namebuf);
1572 /* We need to be root so we can open our /proc entry to walk
1573 * our stack. It also helps when we want to dump core.
1577 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1578 names[i] = namebuf + (i * NAMESIZE);
1581 levels = trace_back_stack(0, addrs, names,
1582 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1584 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1585 for (i = 0; i < levels; i++) {
1586 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1591 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1595 /*******************************************************************
1596 A readdir wrapper which just returns the file name.
1597 ********************************************************************/
1599 const char *readdirname(SMB_STRUCT_DIR *p)
1601 SMB_STRUCT_DIRENT *ptr;
1607 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1611 dname = ptr->d_name;
1618 #ifdef HAVE_BROKEN_READDIR_NAME
1619 /* using /usr/ucb/cc is BAD */
1623 return talloc_strdup(talloc_tos(), dname);
1626 /*******************************************************************
1627 Utility function used to decide if the last component
1628 of a path matches a (possibly wildcarded) entry in a namelist.
1629 ********************************************************************/
1631 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive)
1633 const char *last_component;
1635 /* if we have no list it's obviously not in the path */
1636 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1640 DEBUG(8, ("is_in_path: %s\n", name));
1642 /* Get the last component of the unix name. */
1643 last_component = strrchr_m(name, '/');
1644 if (!last_component) {
1645 last_component = name;
1647 last_component++; /* Go past '/' */
1650 for(; namelist->name != NULL; namelist++) {
1651 if(namelist->is_wild) {
1652 if (mask_match(last_component, namelist->name, case_sensitive)) {
1653 DEBUG(8,("is_in_path: mask match succeeded\n"));
1657 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1658 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1659 DEBUG(8,("is_in_path: match succeeded\n"));
1664 DEBUG(8,("is_in_path: match not found\n"));
1668 /*******************************************************************
1669 Strip a '/' separated list into an array of
1670 name_compare_enties structures suitable for
1671 passing to is_in_path(). We do this for
1672 speed so we can pre-parse all the names in the list
1673 and don't do it for each call to is_in_path().
1674 namelist is modified here and is assumed to be
1675 a copy owned by the caller.
1676 We also check if the entry contains a wildcard to
1677 remove a potentially expensive call to mask_match
1679 ********************************************************************/
1681 void set_namearray(name_compare_entry **ppname_array, const char *namelist)
1684 char *nameptr = (char *)namelist;
1685 int num_entries = 0;
1688 (*ppname_array) = NULL;
1690 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
1693 /* We need to make two passes over the string. The
1694 first to count the number of elements, the second
1699 if ( *nameptr == '/' ) {
1700 /* cope with multiple (useless) /s) */
1704 /* anything left? */
1705 if ( *nameptr == '\0' )
1708 /* find the next '/' or consume remaining */
1709 name_end = strchr_m(nameptr, '/');
1710 if (name_end == NULL)
1711 name_end = (char *)nameptr + strlen(nameptr);
1713 /* next segment please */
1714 nameptr = name_end + 1;
1718 if(num_entries == 0)
1721 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1722 DEBUG(0,("set_namearray: malloc fail\n"));
1726 /* Now copy out the names */
1727 nameptr = (char *)namelist;
1730 if ( *nameptr == '/' ) {
1731 /* cope with multiple (useless) /s) */
1735 /* anything left? */
1736 if ( *nameptr == '\0' )
1739 /* find the next '/' or consume remaining */
1740 name_end = strchr_m(nameptr, '/');
1744 name_end = nameptr + strlen(nameptr);
1746 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1747 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1748 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1752 /* next segment please */
1753 nameptr = name_end + 1;
1757 (*ppname_array)[i].name = NULL;
1762 /****************************************************************************
1763 Routine to free a namearray.
1764 ****************************************************************************/
1766 void free_namearray(name_compare_entry *name_array)
1770 if(name_array == NULL)
1773 for(i=0; name_array[i].name!=NULL; i++)
1774 SAFE_FREE(name_array[i].name);
1775 SAFE_FREE(name_array);
1779 #define DBGC_CLASS DBGC_LOCKING
1781 /****************************************************************************
1782 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1783 is dealt with in posix.c
1784 Returns True if we have information regarding this lock region (and returns
1785 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1786 ****************************************************************************/
1788 bool fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1790 SMB_STRUCT_FLOCK lock;
1793 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
1794 fd,(double)*poffset,(double)*pcount,*ptype));
1796 lock.l_type = *ptype;
1797 lock.l_whence = SEEK_SET;
1798 lock.l_start = *poffset;
1799 lock.l_len = *pcount;
1802 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
1806 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
1807 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
1812 *ptype = lock.l_type;
1813 *poffset = lock.l_start;
1814 *pcount = lock.l_len;
1817 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
1818 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
1823 #define DBGC_CLASS DBGC_ALL
1825 /*******************************************************************
1826 Is the name specified one of my netbios names.
1827 Returns true if it is equal, false otherwise.
1828 ********************************************************************/
1830 bool is_myname(const char *s)
1835 for (n=0; my_netbios_names(n); n++) {
1836 if (strequal(my_netbios_names(n), s)) {
1841 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
1845 /*******************************************************************
1846 Is the name specified our workgroup/domain.
1847 Returns true if it is equal, false otherwise.
1848 ********************************************************************/
1850 bool is_myworkgroup(const char *s)
1854 if (strequal(s, lp_workgroup())) {
1858 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
1862 /*******************************************************************
1863 we distinguish between 2K and XP by the "Native Lan Manager" string
1864 WinXP => "Windows 2002 5.1"
1865 WinXP 64bit => "Windows XP 5.2"
1866 Win2k => "Windows 2000 5.0"
1867 NT4 => "Windows NT 4.0"
1868 Win9x => "Windows 4.0"
1869 Windows 2003 doesn't set the native lan manager string but
1870 they do set the domain to "Windows 2003 5.2" (probably a bug).
1871 ********************************************************************/
1873 void ra_lanman_string( const char *native_lanman )
1875 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
1876 set_remote_arch( RA_WINXP );
1877 else if ( strcmp( native_lanman, "Windows XP 5.2" ) == 0 )
1878 set_remote_arch( RA_WINXP64 );
1879 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
1880 set_remote_arch( RA_WIN2K3 );
1883 static const char *remote_arch_str;
1885 const char *get_remote_arch_str(void)
1887 if (!remote_arch_str) {
1890 return remote_arch_str;
1893 /*******************************************************************
1894 Set the horrid remote_arch string based on an enum.
1895 ********************************************************************/
1897 void set_remote_arch(enum remote_arch_types type)
1902 remote_arch_str = "WfWg";
1905 remote_arch_str = "OS2";
1908 remote_arch_str = "Win95";
1911 remote_arch_str = "WinNT";
1914 remote_arch_str = "Win2K";
1917 remote_arch_str = "WinXP";
1920 remote_arch_str = "WinXP64";
1923 remote_arch_str = "Win2K3";
1926 remote_arch_str = "Vista";
1929 remote_arch_str = "Samba";
1932 remote_arch_str = "CIFSFS";
1935 ra_type = RA_UNKNOWN;
1936 remote_arch_str = "UNKNOWN";
1940 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
1944 /*******************************************************************
1945 Get the remote_arch type.
1946 ********************************************************************/
1948 enum remote_arch_types get_remote_arch(void)
1953 const char *tab_depth(int level, int depth)
1955 if( CHECK_DEBUGLVL(level) ) {
1956 dbgtext("%*s", depth*4, "");
1961 /*****************************************************************************
1962 Provide a checksum on a string
1964 Input: s - the null-terminated character string for which the checksum
1967 Output: The checksum value calculated for s.
1968 *****************************************************************************/
1970 int str_checksum(const char *s)
1978 res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
1985 /*****************************************************************
1986 Zero a memory area then free it. Used to catch bugs faster.
1987 *****************************************************************/
1989 void zero_free(void *p, size_t size)
1995 /*****************************************************************
1996 Set our open file limit to a requested max and return the limit.
1997 *****************************************************************/
1999 int set_maxfiles(int requested_max)
2001 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
2003 int saved_current_limit;
2005 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2006 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
2009 return requested_max;
2013 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
2014 * account for the extra fd we need
2015 * as well as the log files and standard
2016 * handles etc. Save the limit we want to set in case
2017 * we are running on an OS that doesn't support this limit (AIX)
2018 * which always returns RLIM_INFINITY for rlp.rlim_max.
2021 /* Try raising the hard (max) limit to the requested amount. */
2023 #if defined(RLIM_INFINITY)
2024 if (rlp.rlim_max != RLIM_INFINITY) {
2025 int orig_max = rlp.rlim_max;
2027 if ( rlp.rlim_max < requested_max )
2028 rlp.rlim_max = requested_max;
2030 /* This failing is not an error - many systems (Linux) don't
2031 support our default request of 10,000 open files. JRA. */
2033 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2034 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
2035 (int)rlp.rlim_max, strerror(errno) ));
2037 /* Set failed - restore original value from get. */
2038 rlp.rlim_max = orig_max;
2043 /* Now try setting the soft (current) limit. */
2045 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
2047 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2048 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
2049 (int)rlp.rlim_cur, strerror(errno) ));
2051 return saved_current_limit;
2054 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2055 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2058 return saved_current_limit;
2061 #if defined(RLIM_INFINITY)
2062 if(rlp.rlim_cur == RLIM_INFINITY)
2063 return saved_current_limit;
2066 if((int)rlp.rlim_cur > saved_current_limit)
2067 return saved_current_limit;
2069 return rlp.rlim_cur;
2070 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2072 * No way to know - just guess...
2074 return requested_max;
2078 /*****************************************************************
2079 malloc that aborts with smb_panic on fail or zero size.
2080 *****************************************************************/
2082 void *smb_xmalloc_array(size_t size, unsigned int count)
2086 smb_panic("smb_xmalloc_array: called with zero size");
2088 if (count >= MAX_ALLOC_SIZE/size) {
2089 smb_panic("smb_xmalloc_array: alloc size too large");
2091 if ((p = SMB_MALLOC(size*count)) == NULL) {
2092 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2093 (unsigned long)size, (unsigned long)count));
2094 smb_panic("smb_xmalloc_array: malloc failed");
2100 vasprintf that aborts on malloc fail
2103 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
2110 n = vasprintf(ptr, format, ap2);
2112 if (n == -1 || ! *ptr) {
2113 smb_panic("smb_xvasprintf: out of memory");
2118 /*****************************************************************
2119 Get local hostname and cache result.
2120 *****************************************************************/
2122 char *myhostname(void)
2126 /* This is cached forever so
2127 * use talloc_autofree_context() ctx. */
2128 ret = get_myname(talloc_autofree_context());
2134 * @brief Returns an absolute path to a file concatenating the provided
2135 * @a rootpath and @a basename
2137 * @param name Filename, relative to @a rootpath
2139 * @retval Pointer to a string containing the full path.
2142 static char *xx_path(const char *name, const char *rootpath)
2146 fname = talloc_strdup(talloc_tos(), rootpath);
2150 trim_string(fname,"","/");
2152 if (!directory_exist(fname)) {
2153 if (!mkdir(fname,0755))
2154 DEBUG(1, ("Unable to create directory %s for file %s. "
2155 "Error was %s\n", fname, name, strerror(errno)));
2158 return talloc_asprintf(talloc_tos(),
2165 * @brief Returns an absolute path to a file in the Samba lock directory.
2167 * @param name File to find, relative to LOCKDIR.
2169 * @retval Pointer to a talloc'ed string containing the full path.
2172 char *lock_path(const char *name)
2174 return xx_path(name, lp_lockdir());
2178 * @brief Returns an absolute path to a file in the Samba pid directory.
2180 * @param name File to find, relative to PIDDIR.
2182 * @retval Pointer to a talloc'ed string containing the full path.
2185 char *pid_path(const char *name)
2187 return xx_path(name, lp_piddir());
2191 * @brief Returns an absolute path to a file in the Samba lib directory.
2193 * @param name File to find, relative to LIBDIR.
2195 * @retval Pointer to a string containing the full path.
2198 char *lib_path(const char *name)
2200 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_LIBDIR(), name);
2204 * @brief Returns an absolute path to a file in the Samba modules directory.
2206 * @param name File to find, relative to MODULESDIR.
2208 * @retval Pointer to a string containing the full path.
2211 char *modules_path(const char *name)
2213 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_MODULESDIR(), name);
2217 * @brief Returns an absolute path to a file in the Samba data directory.
2219 * @param name File to find, relative to CODEPAGEDIR.
2221 * @retval Pointer to a talloc'ed string containing the full path.
2224 char *data_path(const char *name)
2226 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_CODEPAGEDIR(), name);
2230 * @brief Returns an absolute path to a file in the Samba state directory.
2232 * @param name File to find, relative to STATEDIR.
2234 * @retval Pointer to a talloc'ed string containing the full path.
2237 char *state_path(const char *name)
2239 return xx_path(name, lp_statedir());
2243 * @brief Returns an absolute path to a file in the Samba cache directory.
2245 * @param name File to find, relative to CACHEDIR.
2247 * @retval Pointer to a talloc'ed string containing the full path.
2250 char *cache_path(const char *name)
2252 return xx_path(name, lp_cachedir());
2256 * @brief Returns the platform specific shared library extension.
2258 * @retval Pointer to a const char * containing the extension.
2261 const char *shlib_ext(void)
2263 return get_dyn_SHLIBEXT();
2266 /*******************************************************************
2267 Given a filename - get its directory name
2268 ********************************************************************/
2270 bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent,
2276 p = strrchr_m(dir, '/'); /* Find final '/', if any */
2279 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
2290 if (!(*parent = (char *)TALLOC_MEMDUP(mem_ctx, dir, len+1))) {
2293 (*parent)[len] = '\0';
2301 /*******************************************************************
2302 Determine if a pattern contains any Microsoft wildcard characters.
2303 *******************************************************************/
2305 bool ms_has_wild(const char *s)
2309 if (lp_posix_pathnames()) {
2310 /* With posix pathnames no characters are wild. */
2314 while ((c = *s++)) {
2327 bool ms_has_wild_w(const smb_ucs2_t *s)
2330 if (!s) return False;
2331 while ((c = *s++)) {
2333 case UCS2_CHAR('*'):
2334 case UCS2_CHAR('?'):
2335 case UCS2_CHAR('<'):
2336 case UCS2_CHAR('>'):
2337 case UCS2_CHAR('"'):
2344 /*******************************************************************
2345 A wrapper that handles case sensitivity and the special handling
2347 *******************************************************************/
2349 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
2351 if (ISDOTDOT(string))
2356 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2359 /*******************************************************************
2360 A wrapper that handles case sensitivity and the special handling
2361 of the ".." name. Varient that is only called by old search code which requires
2362 pattern translation.
2363 *******************************************************************/
2365 bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
2367 if (ISDOTDOT(string))
2372 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2375 /*******************************************************************
2376 A wrapper that handles a list of patters and calls mask_match()
2377 on each. Returns True if any of the patterns match.
2378 *******************************************************************/
2380 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive)
2382 while (listLen-- > 0) {
2383 if (mask_match(string, *list++, is_case_sensitive))
2389 /*********************************************************
2390 Recursive routine that is called by unix_wild_match.
2391 *********************************************************/
2393 static bool unix_do_match(const char *regexp, const char *str)
2397 for( p = regexp; *p && *str; ) {
2408 * Look for a character matching
2409 * the one after the '*'.
2413 return true; /* Automatic match */
2416 while(*str && (*p != *str))
2420 * Patch from weidel@multichart.de. In the case of the regexp
2421 * '*XX*' we want to ensure there are at least 2 'X' characters
2422 * in the string after the '*' for a match to be made.
2429 * Eat all the characters that match, but count how many there were.
2432 while(*str && (*p == *str)) {
2438 * Now check that if the regexp had n identical characters that
2439 * matchcount had at least that many matches.
2442 while ( *(p+1) && (*(p+1) == *p)) {
2447 if ( matchcount <= 0 )
2451 str--; /* We've eaten the match char after the '*' */
2453 if(unix_do_match(p, str))
2475 if (!*p && str[0] == '.' && str[1] == 0)
2478 if (!*str && *p == '?') {
2484 if(!*str && (*p == '*' && p[1] == '\0'))
2490 /*******************************************************************
2491 Simple case insensitive interface to a UNIX wildcard matcher.
2492 Returns True if match, False if not.
2493 *******************************************************************/
2495 bool unix_wild_match(const char *pattern, const char *string)
2497 TALLOC_CTX *ctx = talloc_stackframe();
2503 p2 = talloc_strdup(ctx,pattern);
2504 s2 = talloc_strdup(ctx,string);
2512 /* Remove any *? and ** from the pattern as they are meaningless */
2513 for(p = p2; *p; p++) {
2514 while( *p == '*' && (p[1] == '?' ||p[1] == '*')) {
2515 memmove(&p[1], &p[2], strlen(&p[2])+1);
2519 if (strequal(p2,"*")) {
2524 ret = unix_do_match(p2, s2);
2529 /**********************************************************************
2530 Converts a name to a fully qualified domain name.
2531 Returns true if lookup succeeded, false if not (then fqdn is set to name)
2532 Note we deliberately use gethostbyname here, not getaddrinfo as we want
2533 to examine the h_aliases and I don't know how to do that with getaddrinfo.
2534 ***********************************************************************/
2536 bool name_to_fqdn(fstring fqdn, const char *name)
2539 struct hostent *hp = gethostbyname(name);
2541 if (!hp || !hp->h_name || !*hp->h_name) {
2542 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2543 fstrcpy(fqdn, name);
2547 /* Find out if the fqdn is returned as an alias
2548 * to cope with /etc/hosts files where the first
2549 * name is not the fqdn but the short name */
2550 if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2552 for (i = 0; hp->h_aliases[i]; i++) {
2553 if (strchr_m(hp->h_aliases[i], '.')) {
2554 full = hp->h_aliases[i];
2559 if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2560 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2561 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2562 DEBUGADD(1, (" to Kerberos authentication problems as localhost.localdomain\n"));
2563 DEBUGADD(1, (" may end up being used instead of the real machine FQDN.\n"));
2570 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2571 fstrcpy(fqdn, full);
2575 /**********************************************************************
2576 Append a DATA_BLOB to a talloc'ed object
2577 ***********************************************************************/
2579 void *talloc_append_blob(TALLOC_CTX *mem_ctx, void *buf, DATA_BLOB blob)
2581 size_t old_size = 0;
2584 if (blob.length == 0) {
2589 old_size = talloc_get_size(buf);
2592 result = (char *)TALLOC_REALLOC(mem_ctx, buf, old_size + blob.length);
2593 if (result == NULL) {
2597 memcpy(result + old_size, blob.data, blob.length);
2601 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2603 switch (share_access & ~FILE_SHARE_DELETE) {
2604 case FILE_SHARE_NONE:
2606 case FILE_SHARE_READ:
2608 case FILE_SHARE_WRITE:
2610 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2613 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2615 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2622 pid_t procid_to_pid(const struct server_id *proc)
2627 static uint32 my_vnn = NONCLUSTER_VNN;
2629 void set_my_vnn(uint32 vnn)
2631 DEBUG(10, ("vnn pid %d = %u\n", (int)sys_getpid(), (unsigned int)vnn));
2635 uint32 get_my_vnn(void)
2640 struct server_id pid_to_procid(pid_t pid)
2642 struct server_id result;
2644 #ifdef CLUSTER_SUPPORT
2645 result.vnn = my_vnn;
2650 struct server_id procid_self(void)
2652 return pid_to_procid(sys_getpid());
2655 struct server_id server_id_self(void)
2657 return procid_self();
2660 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
2662 if (p1->pid != p2->pid)
2664 #ifdef CLUSTER_SUPPORT
2665 if (p1->vnn != p2->vnn)
2671 bool cluster_id_equal(const struct server_id *id1,
2672 const struct server_id *id2)
2674 return procid_equal(id1, id2);
2677 bool procid_is_me(const struct server_id *pid)
2679 if (pid->pid != sys_getpid())
2681 #ifdef CLUSTER_SUPPORT
2682 if (pid->vnn != my_vnn)
2688 struct server_id interpret_pid(const char *pid_string)
2690 struct server_id result;
2692 #ifdef CLUSTER_SUPPORT
2694 if (sscanf(pid_string, "%u:%d", &vnn, &pid) == 2) {
2698 else if (sscanf(pid_string, "%d", &pid) == 1) {
2699 result.vnn = get_my_vnn();
2703 result.vnn = NONCLUSTER_VNN;
2707 if (sscanf(pid_string, "%d", &pid) != 1) {
2713 /* Assigning to result.pid may have overflowed
2714 Map negative pid to -1: i.e. error */
2715 if (result.pid < 0) {
2721 char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid)
2723 #ifdef CLUSTER_SUPPORT
2724 if (pid->vnn == NONCLUSTER_VNN) {
2725 return talloc_asprintf(mem_ctx,
2730 return talloc_asprintf(mem_ctx,
2736 return talloc_asprintf(mem_ctx,
2742 char *procid_str_static(const struct server_id *pid)
2744 return procid_str(talloc_tos(), pid);
2747 bool procid_valid(const struct server_id *pid)
2749 return (pid->pid != -1);
2752 bool procid_is_local(const struct server_id *pid)
2754 #ifdef CLUSTER_SUPPORT
2755 return pid->vnn == my_vnn;
2761 int this_is_smp(void)
2763 #if defined(HAVE_SYSCONF)
2765 #if defined(SYSCONF_SC_NPROC_ONLN)
2766 return (sysconf(_SC_NPROC_ONLN) > 1) ? 1 : 0;
2767 #elif defined(SYSCONF_SC_NPROCESSORS_ONLN)
2768 return (sysconf(_SC_NPROCESSORS_ONLN) > 1) ? 1 : 0;
2778 /****************************************************************
2779 Check if offset/length fit into bufsize. Should probably be
2780 merged with is_offset_safe, but this would require a rewrite
2781 of lanman.c. Later :-)
2782 ****************************************************************/
2784 bool trans_oob(uint32_t bufsize, uint32_t offset, uint32_t length)
2786 if ((offset + length < offset) || (offset + length < length)) {
2790 if ((offset > bufsize) || (offset + length > bufsize)) {
2797 /****************************************************************
2798 Check if an offset into a buffer is safe.
2799 If this returns True it's safe to indirect into the byte at
2801 ****************************************************************/
2803 bool is_offset_safe(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2805 const char *end_base = buf_base + buf_len;
2806 char *end_ptr = ptr + off;
2808 if (!buf_base || !ptr) {
2812 if (end_base < buf_base || end_ptr < ptr) {
2813 return False; /* wrap. */
2816 if (end_ptr < end_base) {
2822 /****************************************************************
2823 Return a safe pointer into a buffer, or NULL.
2824 ****************************************************************/
2826 char *get_safe_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2828 return is_offset_safe(buf_base, buf_len, ptr, off) ?
2832 /****************************************************************
2833 Return a safe pointer into a string within a buffer, or NULL.
2834 ****************************************************************/
2836 char *get_safe_str_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2838 if (!is_offset_safe(buf_base, buf_len, ptr, off)) {
2841 /* Check if a valid string exists at this offset. */
2842 if (skip_string(buf_base,buf_len, ptr + off) == NULL) {
2848 /****************************************************************
2849 Return an SVAL at a pointer, or failval if beyond the end.
2850 ****************************************************************/
2852 int get_safe_SVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2855 * Note we use off+1 here, not off+2 as SVAL accesses ptr[0] and ptr[1],
2858 if (!is_offset_safe(buf_base, buf_len, ptr, off+1)) {
2861 return SVAL(ptr,off);
2864 /****************************************************************
2865 Return an IVAL at a pointer, or failval if beyond the end.
2866 ****************************************************************/
2868 int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2871 * Note we use off+3 here, not off+4 as IVAL accesses
2872 * ptr[0] ptr[1] ptr[2] ptr[3] NOT ptr[4].
2874 if (!is_offset_safe(buf_base, buf_len, ptr, off+3)) {
2877 return IVAL(ptr,off);
2880 /****************************************************************
2881 Split DOM\user into DOM and user. Do not mix with winbind variants of that
2882 call (they take care of winbind separator and other winbind specific settings).
2883 ****************************************************************/
2885 void split_domain_user(TALLOC_CTX *mem_ctx,
2886 const char *full_name,
2890 const char *p = NULL;
2892 p = strchr_m(full_name, '\\');
2895 *domain = talloc_strndup(mem_ctx, full_name,
2896 PTR_DIFF(p, full_name));
2897 *user = talloc_strdup(mem_ctx, p+1);
2899 *domain = talloc_strdup(mem_ctx, "");
2900 *user = talloc_strdup(mem_ctx, full_name);
2906 Disable these now we have checked all code paths and ensured
2907 NULL returns on zero request. JRA.
2909 /****************************************************************
2910 talloc wrapper functions that guarentee a null pointer return
2912 ****************************************************************/
2914 #ifndef MAX_TALLOC_SIZE
2915 #define MAX_TALLOC_SIZE 0x10000000
2919 * talloc and zero memory.
2920 * - returns NULL if size is zero.
2923 void *_talloc_zero_zeronull(const void *ctx, size_t size, const char *name)
2931 p = talloc_named_const(ctx, size, name);
2934 memset(p, '\0', size);
2941 * memdup with a talloc.
2942 * - returns NULL if size is zero.
2945 void *_talloc_memdup_zeronull(const void *t, const void *p, size_t size, const char *name)
2953 newp = talloc_named_const(t, size, name);
2955 memcpy(newp, p, size);
2962 * alloc an array, checking for integer overflow in the array size.
2963 * - returns NULL if count or el_size are zero.
2966 void *_talloc_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2968 if (count >= MAX_TALLOC_SIZE/el_size) {
2972 if (el_size == 0 || count == 0) {
2976 return talloc_named_const(ctx, el_size * count, name);
2980 * alloc an zero array, checking for integer overflow in the array size
2981 * - returns NULL if count or el_size are zero.
2984 void *_talloc_zero_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2986 if (count >= MAX_TALLOC_SIZE/el_size) {
2990 if (el_size == 0 || count == 0) {
2994 return _talloc_zero(ctx, el_size * count, name);
2998 * Talloc wrapper that returns NULL if size == 0.
3000 void *talloc_zeronull(const void *context, size_t size, const char *name)
3005 return talloc_named_const(context, size, name);
3009 bool is_valid_policy_hnd(const struct policy_handle *hnd)
3011 struct policy_handle tmp;
3013 return (memcmp(&tmp, hnd, sizeof(tmp)) != 0);
3016 bool policy_hnd_equal(const struct policy_handle *hnd1,
3017 const struct policy_handle *hnd2)
3019 if (!hnd1 || !hnd2) {
3023 return (memcmp(hnd1, hnd2, sizeof(*hnd1)) == 0);
3026 /****************************************************************
3027 strip off leading '\\' from a hostname
3028 ****************************************************************/
3030 const char *strip_hostname(const char *s)
3036 if (strlen_m(s) < 3) {
3040 if (s[0] == '\\') s++;
3041 if (s[0] == '\\') s++;
3046 bool tevent_req_poll_ntstatus(struct tevent_req *req,
3047 struct tevent_context *ev,
3050 bool ret = tevent_req_poll(req, ev);
3052 *status = map_nt_error_from_unix(errno);