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/>.
25 #include "system/passwd.h"
26 #include "system/filesys.h"
27 #include "ctdbd_conn.h"
28 #include "../lib/util/util_pw.h"
31 /* Max allowable allococation - 256mb - 0x10000000 */
32 #define MAX_ALLOC_SIZE (1024*1024*256)
34 #if (defined(HAVE_NETGROUP) && defined (WITH_AUTOMOUNT))
35 #ifdef WITH_NISPLUS_HOME
36 #ifdef BROKEN_NISPLUS_INCLUDE_FILES
38 * The following lines are needed due to buggy include files
39 * in Solaris 2.6 which define GROUP in both /usr/include/sys/acl.h and
40 * also in /usr/include/rpcsvc/nis.h. The definitions conflict. JRA.
41 * Also GROUP_OBJ is defined as 0x4 in /usr/include/sys/acl.h and as
42 * an enum in /usr/include/rpcsvc/nis.h.
49 #if defined(GROUP_OBJ)
53 #endif /* BROKEN_NISPLUS_INCLUDE_FILES */
55 #include <rpcsvc/nis.h>
57 #endif /* WITH_NISPLUS_HOME */
58 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
60 static enum protocol_types Protocol = PROTOCOL_COREPLUS;
62 enum protocol_types get_Protocol(void)
67 void set_Protocol(enum protocol_types p)
72 static enum remote_arch_types ra_type = RA_UNKNOWN;
74 /***********************************************************************
75 Definitions for all names.
76 ***********************************************************************/
78 static char *smb_scope;
79 static int smb_num_netbios_names;
80 static char **smb_my_netbios_names;
82 /***********************************************************************
83 Allocate and set scope. Ensure upper case.
84 ***********************************************************************/
86 bool set_global_scope(const char *scope)
89 smb_scope = SMB_STRDUP(scope);
92 strupper_m(smb_scope);
96 /*********************************************************************
97 Ensure scope is never null string.
98 *********************************************************************/
100 const char *global_scope(void)
103 set_global_scope("");
107 static void free_netbios_names_array(void)
111 for (i = 0; i < smb_num_netbios_names; i++)
112 SAFE_FREE(smb_my_netbios_names[i]);
114 SAFE_FREE(smb_my_netbios_names);
115 smb_num_netbios_names = 0;
118 static bool allocate_my_netbios_names_array(size_t number)
120 free_netbios_names_array();
122 smb_num_netbios_names = number + 1;
123 smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
125 if (!smb_my_netbios_names)
128 memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
132 static bool set_my_netbios_names(const char *name, int i)
134 SAFE_FREE(smb_my_netbios_names[i]);
136 smb_my_netbios_names[i] = SMB_STRDUP(name);
137 if (!smb_my_netbios_names[i])
139 strupper_m(smb_my_netbios_names[i]);
143 /***********************************************************************
144 Free memory allocated to global objects
145 ***********************************************************************/
147 void gfree_names(void)
149 gfree_netbios_names();
150 SAFE_FREE( smb_scope );
151 free_netbios_names_array();
152 free_local_machine_name();
155 void gfree_all( void )
164 const char *my_netbios_names(int i)
166 return smb_my_netbios_names[i];
169 bool set_netbios_aliases(const char **str_array)
173 /* Work out the max number of netbios aliases that we have */
174 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
177 if ( global_myname() && *global_myname())
180 /* Allocate space for the netbios aliases */
181 if (!allocate_my_netbios_names_array(namecount))
184 /* Use the global_myname string first */
186 if ( global_myname() && *global_myname()) {
187 set_my_netbios_names( global_myname(), namecount );
193 for ( i = 0; str_array[i] != NULL; i++) {
195 bool duplicate = False;
197 /* Look for duplicates */
198 for( n=0; n<namecount; n++ ) {
199 if( strequal( str_array[i], my_netbios_names(n) ) ) {
205 if (!set_my_netbios_names(str_array[i], namecount))
214 /****************************************************************************
215 Common name initialization code.
216 ****************************************************************************/
218 bool init_names(void)
222 if (global_myname() == NULL || *global_myname() == '\0') {
223 if (!set_global_myname(myhostname())) {
224 DEBUG( 0, ( "init_names: malloc fail.\n" ) );
229 if (!set_netbios_aliases(lp_netbios_aliases())) {
230 DEBUG( 0, ( "init_names: malloc fail.\n" ) );
234 set_local_machine_name(global_myname(),false);
236 DEBUG( 5, ("Netbios name list:-\n") );
237 for( n=0; my_netbios_names(n); n++ ) {
238 DEBUGADD( 5, ("my_netbios_names[%d]=\"%s\"\n",
239 n, my_netbios_names(n) ) );
245 /*******************************************************************
246 Check if a file exists - call vfs_file_exist for samba files.
247 ********************************************************************/
249 bool file_exist_stat(const char *fname,SMB_STRUCT_STAT *sbuf,
250 bool fake_dir_create_times)
256 if (sys_stat(fname, sbuf, fake_dir_create_times) != 0)
259 return((S_ISREG(sbuf->st_ex_mode)) || (S_ISFIFO(sbuf->st_ex_mode)));
262 /*******************************************************************
263 Check if a unix domain socket exists - call vfs_file_exist for samba files.
264 ********************************************************************/
266 bool socket_exist(const char *fname)
269 if (sys_stat(fname, &st, false) != 0)
272 return S_ISSOCK(st.st_ex_mode);
275 /*******************************************************************
276 Returns the size in bytes of the named given the stat struct.
277 ********************************************************************/
279 uint64_t get_file_size_stat(const SMB_STRUCT_STAT *sbuf)
281 return sbuf->st_ex_size;
284 /*******************************************************************
285 Returns the size in bytes of the named file.
286 ********************************************************************/
288 SMB_OFF_T get_file_size(char *file_name)
292 if (sys_stat(file_name, &buf, false) != 0)
293 return (SMB_OFF_T)-1;
294 return get_file_size_stat(&buf);
297 /*******************************************************************
298 Show a smb message structure.
299 ********************************************************************/
301 void show_msg(char *buf)
309 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
311 (int)CVAL(buf,smb_com),
312 (int)CVAL(buf,smb_rcls),
313 (int)CVAL(buf,smb_reh),
314 (int)SVAL(buf,smb_err),
315 (int)CVAL(buf,smb_flg),
316 (int)SVAL(buf,smb_flg2)));
317 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
318 (int)SVAL(buf,smb_tid),
319 (int)SVAL(buf,smb_pid),
320 (int)SVAL(buf,smb_uid),
321 (int)SVAL(buf,smb_mid)));
322 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
324 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
325 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
326 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
328 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
330 DEBUGADD(5,("smb_bcc=%d\n",bcc));
338 dump_data(10, (uint8 *)smb_buf(buf), bcc);
341 /*******************************************************************
342 Set the length and marker of an encrypted smb packet.
343 ********************************************************************/
345 void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)
347 _smb_setlen(buf,len);
351 SSVAL(buf,6,enc_ctx_num);
354 /*******************************************************************
355 Set the length and marker of an smb packet.
356 ********************************************************************/
358 void smb_setlen(char *buf,int len)
360 _smb_setlen(buf,len);
368 /*******************************************************************
369 Setup only the byte count for a smb message.
370 ********************************************************************/
372 int set_message_bcc(char *buf,int num_bytes)
374 int num_words = CVAL(buf,smb_wct);
375 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
376 _smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
377 return (smb_size + num_words*2 + num_bytes);
380 /*******************************************************************
381 Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
382 Return the bytes added
383 ********************************************************************/
385 ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
387 size_t newlen = smb_len(*outbuf) + 4 + blob.length;
390 if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
391 DEBUG(0, ("talloc failed\n"));
396 memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
397 set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
401 /*******************************************************************
402 Reduce a file name, removing .. elements.
403 ********************************************************************/
405 static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
410 DEBUG(3,("dos_clean_name [%s]\n",s));
412 /* remove any double slashes */
413 str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
418 /* Remove leading .\\ characters */
419 if(strncmp(str, ".\\", 2) == 0) {
420 trim_string(str, ".\\", NULL);
422 str = talloc_strdup(ctx, ".\\");
429 while ((p = strstr_m(str,"\\..\\")) != NULL) {
435 if ((p=strrchr_m(str,'\\')) != NULL) {
440 str = talloc_asprintf(ctx,
449 trim_string(str,NULL,"\\..");
450 return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
453 /*******************************************************************
454 Reduce a file name, removing .. elements.
455 ********************************************************************/
457 char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
462 DEBUG(3,("unix_clean_name [%s]\n",s));
464 /* remove any double slashes */
465 str = talloc_all_string_sub(ctx, s, "//","/");
470 /* Remove leading ./ characters */
471 if(strncmp(str, "./", 2) == 0) {
472 trim_string(str, "./", NULL);
474 str = talloc_strdup(ctx, "./");
481 while ((p = strstr_m(str,"/../")) != NULL) {
487 if ((p=strrchr_m(str,'/')) != NULL) {
492 str = talloc_asprintf(ctx,
501 trim_string(str,NULL,"/..");
502 return talloc_all_string_sub(ctx, str, "/./", "/");
505 char *clean_name(TALLOC_CTX *ctx, const char *s)
507 char *str = dos_clean_name(ctx, s);
511 return unix_clean_name(ctx, str);
514 /*******************************************************************
515 Write data into an fd at a given offset. Ignore seek errors.
516 ********************************************************************/
518 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
523 if (pos == (SMB_OFF_T)-1) {
524 return write_data(fd, buffer, N);
526 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
528 ret = sys_pwrite(fd,buffer + total,N - total, pos);
529 if (ret == -1 && errno == ESPIPE) {
530 return write_data(fd, buffer + total,N - total);
533 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
542 return (ssize_t)total;
544 /* Use lseek and write_data. */
545 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
546 if (errno != ESPIPE) {
550 return write_data(fd, buffer, N);
555 NTSTATUS reinit_after_fork(struct messaging_context *msg_ctx,
556 struct event_context *ev_ctx,
558 bool parent_longlived)
560 NTSTATUS status = NT_STATUS_OK;
562 /* Reset the state of the random
563 * number generation system, so
564 * children do not get the same random
565 * numbers as each other */
566 set_need_random_reseed();
568 /* tdb needs special fork handling */
569 if (tdb_reopen_all(parent_longlived ? 1 : 0) == -1) {
570 DEBUG(0,("tdb_reopen_all failed.\n"));
571 status = NT_STATUS_OPEN_FAILED;
575 if (ev_ctx && tevent_re_initialise(ev_ctx) != 0) {
576 smb_panic(__location__ ": Failed to re-initialise event context");
581 * For clustering, we need to re-init our ctdbd connection after the
584 status = messaging_reinit(msg_ctx, id);
585 if (!NT_STATUS_IS_OK(status)) {
586 DEBUG(0,("messaging_reinit() failed: %s\n",
594 #if defined(PARANOID_MALLOC_CHECKER)
596 /****************************************************************************
597 Internal malloc wrapper. Externally visible.
598 ****************************************************************************/
600 void *malloc_(size_t size)
607 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
610 /****************************************************************************
611 Internal calloc wrapper. Not externally visible.
612 ****************************************************************************/
614 static void *calloc_(size_t count, size_t size)
616 if (size == 0 || count == 0) {
620 return calloc(count, size);
621 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
624 /****************************************************************************
625 Internal realloc wrapper. Not externally visible.
626 ****************************************************************************/
628 static void *realloc_(void *ptr, size_t size)
631 return realloc(ptr, size);
632 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
635 #endif /* PARANOID_MALLOC_CHECKER */
637 /****************************************************************************
639 ****************************************************************************/
641 void *memalign_array(size_t el_size, size_t align, unsigned int count)
643 if (count >= MAX_ALLOC_SIZE/el_size) {
647 return sys_memalign(align, el_size*count);
650 /****************************************************************************
652 ****************************************************************************/
654 void *calloc_array(size_t size, size_t nmemb)
656 if (nmemb >= MAX_ALLOC_SIZE/size) {
659 if (size == 0 || nmemb == 0) {
662 #if defined(PARANOID_MALLOC_CHECKER)
663 return calloc_(nmemb, size);
665 return calloc(nmemb, size);
669 /****************************************************************************
670 Expand a pointer to be a particular size.
671 Note that this version of Realloc has an extra parameter that decides
672 whether to free the passed in storage on allocation failure or if the
675 This is designed for use in the typical idiom of :
677 p = SMB_REALLOC(p, size)
682 and not to have to keep track of the old 'p' contents to free later, nor
683 to worry if the size parameter was zero. In the case where NULL is returned
684 we guarentee that p has been freed.
686 If free later semantics are desired, then pass 'free_old_on_error' as False which
687 guarentees that the old contents are not freed on error, even if size == 0. To use
690 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
698 Changes were instigated by Coverity error checking. JRA.
699 ****************************************************************************/
701 void *Realloc(void *p, size_t size, bool free_old_on_error)
706 if (free_old_on_error) {
709 DEBUG(2,("Realloc asked for 0 bytes\n"));
713 #if defined(PARANOID_MALLOC_CHECKER)
715 ret = (void *)malloc_(size);
717 ret = (void *)realloc_(p,size);
721 ret = (void *)malloc(size);
723 ret = (void *)realloc(p,size);
728 if (free_old_on_error && p) {
731 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
737 /****************************************************************************
738 (Hopefully) efficient array append.
739 ****************************************************************************/
741 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
742 void *element, void *_array, uint32 *num_elements,
745 void **array = (void **)_array;
747 if (*array_size < 0) {
751 if (*array == NULL) {
752 if (*array_size == 0) {
756 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
760 *array = TALLOC(mem_ctx, element_size * (*array_size));
761 if (*array == NULL) {
766 if (*num_elements == *array_size) {
769 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
773 *array = TALLOC_REALLOC(mem_ctx, *array,
774 element_size * (*array_size));
776 if (*array == NULL) {
781 memcpy((char *)(*array) + element_size*(*num_elements),
782 element, element_size);
792 /****************************************************************************
793 Get my own domain name, or "" if we have none.
794 ****************************************************************************/
796 char *get_mydnsdomname(TALLOC_CTX *ctx)
801 domname = get_mydnsfullname();
806 p = strchr_m(domname, '.');
809 return talloc_strdup(ctx, p);
811 return talloc_strdup(ctx, "");
815 /****************************************************************************
816 Interpret a protocol description string, with a default.
817 ****************************************************************************/
819 int interpret_protocol(const char *str,int def)
821 if (strequal(str,"NT1"))
822 return(PROTOCOL_NT1);
823 if (strequal(str,"LANMAN2"))
824 return(PROTOCOL_LANMAN2);
825 if (strequal(str,"LANMAN1"))
826 return(PROTOCOL_LANMAN1);
827 if (strequal(str,"CORE"))
828 return(PROTOCOL_CORE);
829 if (strequal(str,"COREPLUS"))
830 return(PROTOCOL_COREPLUS);
831 if (strequal(str,"CORE+"))
832 return(PROTOCOL_COREPLUS);
834 DEBUG(0,("Unrecognised protocol level %s\n",str));
840 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
841 /******************************************************************
842 Remove any mount options such as -rsize=2048,wsize=2048 etc.
843 Based on a fix from <Thomas.Hepper@icem.de>.
844 Returns a malloc'ed string.
845 *******************************************************************/
847 static char *strip_mount_options(TALLOC_CTX *ctx, const char *str)
851 while(*p && !isspace(*p))
853 while(*p && isspace(*p))
856 return talloc_strdup(ctx, p);
862 /*******************************************************************
863 Patch from jkf@soton.ac.uk
864 Split Luke's automount_server into YP lookup and string splitter
865 so can easily implement automount_path().
866 Returns a malloc'ed string.
867 *******************************************************************/
869 #ifdef WITH_NISPLUS_HOME
870 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
874 char *nis_map = (char *)lp_nis_home_map_name();
876 char buffer[NIS_MAXATTRVAL + 1];
881 snprintf(buffer, sizeof(buffer), "[key=%s],%s", user_name, nis_map);
882 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
884 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
885 if (result->status != NIS_SUCCESS) {
886 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
888 object = result->objects.objects_val;
889 if (object->zo_data.zo_type == ENTRY_OBJ) {
890 entry = &object->zo_data.objdata_u.en_data;
891 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
892 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
894 value = talloc_strdup(ctx,
895 entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
897 nis_freeresult(result);
900 value = talloc_string_sub(ctx,
907 nis_freeresult(result);
910 value = strip_mount_options(ctx, value);
911 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n",
916 #else /* WITH_NISPLUS_HOME */
918 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
922 int nis_error; /* returned by yp all functions */
923 char *nis_result; /* yp_match inits this */
924 int nis_result_len; /* and set this */
925 char *nis_domain; /* yp_get_default_domain inits this */
926 char *nis_map = (char *)lp_nis_home_map_name();
928 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
929 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
933 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
935 if ((nis_error = yp_match(nis_domain, nis_map, user_name,
936 strlen(user_name), &nis_result,
937 &nis_result_len)) == 0) {
938 if (nis_result_len > 0 && nis_result[nis_result_len] == '\n') {
939 nis_result[nis_result_len] = '\0';
941 value = talloc_strdup(ctx, nis_result);
945 value = strip_mount_options(ctx, value);
946 } else if(nis_error == YPERR_KEY) {
947 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
948 user_name, nis_map));
949 DEBUG(3, ("using defaults for server and home directory\n"));
951 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
952 yperr_string(nis_error), user_name, nis_map));
956 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, value));
960 #endif /* WITH_NISPLUS_HOME */
963 /****************************************************************************
964 Check if a process exists. Does this work on all unixes?
965 ****************************************************************************/
967 bool process_exists(const struct server_id pid)
969 if (procid_is_me(&pid)) {
973 if (procid_is_local(&pid)) {
974 return (kill(pid.pid,0) == 0 || errno != ESRCH);
977 #ifdef CLUSTER_SUPPORT
978 return ctdbd_process_exists(messaging_ctdbd_connection(),
985 /*******************************************************************
986 Convert a uid into a user name.
987 ********************************************************************/
989 const char *uidtoname(uid_t uid)
991 TALLOC_CTX *ctx = talloc_tos();
993 struct passwd *pass = NULL;
995 pass = getpwuid_alloc(ctx,uid);
997 name = talloc_strdup(ctx,pass->pw_name);
1000 name = talloc_asprintf(ctx,
1007 /*******************************************************************
1008 Convert a gid into a group name.
1009 ********************************************************************/
1011 char *gidtoname(gid_t gid)
1015 grp = getgrgid(gid);
1017 return talloc_strdup(talloc_tos(), grp->gr_name);
1020 return talloc_asprintf(talloc_tos(),
1026 /*******************************************************************
1027 Convert a user name into a uid.
1028 ********************************************************************/
1030 uid_t nametouid(const char *name)
1032 struct passwd *pass;
1036 pass = Get_Pwnam_alloc(talloc_tos(), name);
1043 u = (uid_t)strtol(name, &p, 0);
1044 if ((p != name) && (*p == '\0'))
1050 /*******************************************************************
1051 Convert a name to a gid_t if possible. Return -1 if not a group.
1052 ********************************************************************/
1054 gid_t nametogid(const char *name)
1060 g = (gid_t)strtol(name, &p, 0);
1061 if ((p != name) && (*p == '\0'))
1064 grp = sys_getgrnam(name);
1066 return(grp->gr_gid);
1070 /*******************************************************************
1071 Something really nasty happened - panic !
1072 ********************************************************************/
1074 void smb_panic_s3(const char *why)
1079 DEBUG(0,("PANIC (pid %llu): %s\n",
1080 (unsigned long long)sys_getpid(), why));
1083 cmd = lp_panic_action();
1085 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1086 result = system(cmd);
1089 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1092 DEBUG(0, ("smb_panic(): action returned status %d\n",
1093 WEXITSTATUS(result)));
1099 /*******************************************************************
1100 Print a backtrace of the stack to the debug log. This function
1101 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1102 exit shortly after calling it.
1103 ********************************************************************/
1105 #ifdef HAVE_LIBUNWIND_H
1106 #include <libunwind.h>
1109 #ifdef HAVE_EXECINFO_H
1110 #include <execinfo.h>
1113 #ifdef HAVE_LIBEXC_H
1117 void log_stack_trace(void)
1119 #ifdef HAVE_LIBUNWIND
1120 /* Try to use libunwind before any other technique since on ia64
1121 * libunwind correctly walks the stack in more circumstances than
1124 unw_cursor_t cursor;
1129 unw_word_t ip, sp, off;
1131 procname[sizeof(procname) - 1] = '\0';
1133 if (unw_getcontext(&uc) != 0) {
1134 goto libunwind_failed;
1137 if (unw_init_local(&cursor, &uc) != 0) {
1138 goto libunwind_failed;
1141 DEBUG(0, ("BACKTRACE:\n"));
1145 unw_get_reg(&cursor, UNW_REG_IP, &ip);
1146 unw_get_reg(&cursor, UNW_REG_SP, &sp);
1148 switch (unw_get_proc_name(&cursor,
1149 procname, sizeof(procname) - 1, &off) ) {
1153 /* Name truncated. */
1154 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1155 i, procname, (long long)off,
1156 (long long)ip, (long long) sp));
1159 /* case -UNW_ENOINFO: */
1160 /* case -UNW_EUNSPEC: */
1161 /* No symbol name found. */
1162 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1163 i, "<unknown symbol>",
1164 (long long)ip, (long long) sp));
1167 } while (unw_step(&cursor) > 0);
1172 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1174 #elif HAVE_BACKTRACE_SYMBOLS
1175 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1176 size_t backtrace_size;
1177 char **backtrace_strings;
1179 /* get the backtrace (stack frames) */
1180 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1181 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1183 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1184 (unsigned long)backtrace_size));
1186 if (backtrace_strings) {
1189 for (i = 0; i < backtrace_size; i++)
1190 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1192 /* Leak the backtrace_strings, rather than risk what free() might do */
1197 /* The IRIX libexc library provides an API for unwinding the stack. See
1198 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1199 * since we are about to abort anyway, it hardly matters.
1202 #define NAMESIZE 32 /* Arbitrary */
1204 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1205 char * names[BACKTRACE_STACK_SIZE];
1206 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1213 ZERO_ARRAY(namebuf);
1215 /* We need to be root so we can open our /proc entry to walk
1216 * our stack. It also helps when we want to dump core.
1220 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1221 names[i] = namebuf + (i * NAMESIZE);
1224 levels = trace_back_stack(0, addrs, names,
1225 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1227 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1228 for (i = 0; i < levels; i++) {
1229 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1234 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1238 /*******************************************************************
1239 A readdir wrapper which just returns the file name.
1240 ********************************************************************/
1242 const char *readdirname(SMB_STRUCT_DIR *p)
1244 SMB_STRUCT_DIRENT *ptr;
1250 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1254 dname = ptr->d_name;
1261 #ifdef HAVE_BROKEN_READDIR_NAME
1262 /* using /usr/ucb/cc is BAD */
1266 return talloc_strdup(talloc_tos(), dname);
1269 /*******************************************************************
1270 Utility function used to decide if the last component
1271 of a path matches a (possibly wildcarded) entry in a namelist.
1272 ********************************************************************/
1274 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive)
1276 const char *last_component;
1278 /* if we have no list it's obviously not in the path */
1279 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1283 DEBUG(8, ("is_in_path: %s\n", name));
1285 /* Get the last component of the unix name. */
1286 last_component = strrchr_m(name, '/');
1287 if (!last_component) {
1288 last_component = name;
1290 last_component++; /* Go past '/' */
1293 for(; namelist->name != NULL; namelist++) {
1294 if(namelist->is_wild) {
1295 if (mask_match(last_component, namelist->name, case_sensitive)) {
1296 DEBUG(8,("is_in_path: mask match succeeded\n"));
1300 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1301 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1302 DEBUG(8,("is_in_path: match succeeded\n"));
1307 DEBUG(8,("is_in_path: match not found\n"));
1311 /*******************************************************************
1312 Strip a '/' separated list into an array of
1313 name_compare_enties structures suitable for
1314 passing to is_in_path(). We do this for
1315 speed so we can pre-parse all the names in the list
1316 and don't do it for each call to is_in_path().
1317 namelist is modified here and is assumed to be
1318 a copy owned by the caller.
1319 We also check if the entry contains a wildcard to
1320 remove a potentially expensive call to mask_match
1322 ********************************************************************/
1324 void set_namearray(name_compare_entry **ppname_array, const char *namelist)
1327 char *nameptr = (char *)namelist;
1328 int num_entries = 0;
1331 (*ppname_array) = NULL;
1333 if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0')))
1336 /* We need to make two passes over the string. The
1337 first to count the number of elements, the second
1342 if ( *nameptr == '/' ) {
1343 /* cope with multiple (useless) /s) */
1347 /* anything left? */
1348 if ( *nameptr == '\0' )
1351 /* find the next '/' or consume remaining */
1352 name_end = strchr_m(nameptr, '/');
1353 if (name_end == NULL)
1354 name_end = (char *)nameptr + strlen(nameptr);
1356 /* next segment please */
1357 nameptr = name_end + 1;
1361 if(num_entries == 0)
1364 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1365 DEBUG(0,("set_namearray: malloc fail\n"));
1369 /* Now copy out the names */
1370 nameptr = (char *)namelist;
1373 if ( *nameptr == '/' ) {
1374 /* cope with multiple (useless) /s) */
1378 /* anything left? */
1379 if ( *nameptr == '\0' )
1382 /* find the next '/' or consume remaining */
1383 name_end = strchr_m(nameptr, '/');
1387 name_end = nameptr + strlen(nameptr);
1389 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1390 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1391 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1395 /* next segment please */
1396 nameptr = name_end + 1;
1400 (*ppname_array)[i].name = NULL;
1405 /****************************************************************************
1406 Routine to free a namearray.
1407 ****************************************************************************/
1409 void free_namearray(name_compare_entry *name_array)
1413 if(name_array == NULL)
1416 for(i=0; name_array[i].name!=NULL; i++)
1417 SAFE_FREE(name_array[i].name);
1418 SAFE_FREE(name_array);
1422 #define DBGC_CLASS DBGC_LOCKING
1424 /****************************************************************************
1425 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1426 is dealt with in posix.c
1427 Returns True if we have information regarding this lock region (and returns
1428 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1429 ****************************************************************************/
1431 bool fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1433 SMB_STRUCT_FLOCK lock;
1436 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
1437 fd,(double)*poffset,(double)*pcount,*ptype));
1439 lock.l_type = *ptype;
1440 lock.l_whence = SEEK_SET;
1441 lock.l_start = *poffset;
1442 lock.l_len = *pcount;
1445 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
1449 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
1450 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
1455 *ptype = lock.l_type;
1456 *poffset = lock.l_start;
1457 *pcount = lock.l_len;
1460 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
1461 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
1466 #define DBGC_CLASS DBGC_ALL
1468 /*******************************************************************
1469 Is the name specified one of my netbios names.
1470 Returns true if it is equal, false otherwise.
1471 ********************************************************************/
1473 bool is_myname(const char *s)
1478 for (n=0; my_netbios_names(n); n++) {
1479 if (strequal(my_netbios_names(n), s)) {
1484 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
1488 /*******************************************************************
1489 Is the name specified our workgroup/domain.
1490 Returns true if it is equal, false otherwise.
1491 ********************************************************************/
1493 bool is_myworkgroup(const char *s)
1497 if (strequal(s, lp_workgroup())) {
1501 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
1505 /*******************************************************************
1506 we distinguish between 2K and XP by the "Native Lan Manager" string
1507 WinXP => "Windows 2002 5.1"
1508 WinXP 64bit => "Windows XP 5.2"
1509 Win2k => "Windows 2000 5.0"
1510 NT4 => "Windows NT 4.0"
1511 Win9x => "Windows 4.0"
1512 Windows 2003 doesn't set the native lan manager string but
1513 they do set the domain to "Windows 2003 5.2" (probably a bug).
1514 ********************************************************************/
1516 void ra_lanman_string( const char *native_lanman )
1518 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
1519 set_remote_arch( RA_WINXP );
1520 else if ( strcmp( native_lanman, "Windows XP 5.2" ) == 0 )
1521 set_remote_arch( RA_WINXP64 );
1522 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
1523 set_remote_arch( RA_WIN2K3 );
1526 static const char *remote_arch_str;
1528 const char *get_remote_arch_str(void)
1530 if (!remote_arch_str) {
1533 return remote_arch_str;
1536 /*******************************************************************
1537 Set the horrid remote_arch string based on an enum.
1538 ********************************************************************/
1540 void set_remote_arch(enum remote_arch_types type)
1545 remote_arch_str = "WfWg";
1548 remote_arch_str = "OS2";
1551 remote_arch_str = "Win95";
1554 remote_arch_str = "WinNT";
1557 remote_arch_str = "Win2K";
1560 remote_arch_str = "WinXP";
1563 remote_arch_str = "WinXP64";
1566 remote_arch_str = "Win2K3";
1569 remote_arch_str = "Vista";
1572 remote_arch_str = "Samba";
1575 remote_arch_str = "CIFSFS";
1578 remote_arch_str = "OSX";
1581 ra_type = RA_UNKNOWN;
1582 remote_arch_str = "UNKNOWN";
1586 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
1590 /*******************************************************************
1591 Get the remote_arch type.
1592 ********************************************************************/
1594 enum remote_arch_types get_remote_arch(void)
1599 const char *tab_depth(int level, int depth)
1601 if( CHECK_DEBUGLVL(level) ) {
1602 dbgtext("%*s", depth*4, "");
1607 /*****************************************************************************
1608 Provide a checksum on a string
1610 Input: s - the null-terminated character string for which the checksum
1613 Output: The checksum value calculated for s.
1614 *****************************************************************************/
1616 int str_checksum(const char *s)
1618 TDB_DATA key = string_tdb_data(s);
1619 return tdb_jenkins_hash(&key);
1622 /*****************************************************************
1623 Zero a memory area then free it. Used to catch bugs faster.
1624 *****************************************************************/
1626 void zero_free(void *p, size_t size)
1632 /*****************************************************************
1633 Set our open file limit to a requested max and return the limit.
1634 *****************************************************************/
1636 int set_maxfiles(int requested_max)
1638 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
1640 int saved_current_limit;
1642 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
1643 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
1646 return requested_max;
1650 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
1651 * account for the extra fd we need
1652 * as well as the log files and standard
1653 * handles etc. Save the limit we want to set in case
1654 * we are running on an OS that doesn't support this limit (AIX)
1655 * which always returns RLIM_INFINITY for rlp.rlim_max.
1658 /* Try raising the hard (max) limit to the requested amount. */
1660 #if defined(RLIM_INFINITY)
1661 if (rlp.rlim_max != RLIM_INFINITY) {
1662 int orig_max = rlp.rlim_max;
1664 if ( rlp.rlim_max < requested_max )
1665 rlp.rlim_max = requested_max;
1667 /* This failing is not an error - many systems (Linux) don't
1668 support our default request of 10,000 open files. JRA. */
1670 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
1671 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
1672 (int)rlp.rlim_max, strerror(errno) ));
1674 /* Set failed - restore original value from get. */
1675 rlp.rlim_max = orig_max;
1680 /* Now try setting the soft (current) limit. */
1682 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
1684 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
1685 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
1686 (int)rlp.rlim_cur, strerror(errno) ));
1688 return saved_current_limit;
1691 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
1692 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
1695 return saved_current_limit;
1698 #if defined(RLIM_INFINITY)
1699 if(rlp.rlim_cur == RLIM_INFINITY)
1700 return saved_current_limit;
1703 if((int)rlp.rlim_cur > saved_current_limit)
1704 return saved_current_limit;
1706 return rlp.rlim_cur;
1707 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
1709 * No way to know - just guess...
1711 return requested_max;
1715 /*****************************************************************
1716 malloc that aborts with smb_panic on fail or zero size.
1717 *****************************************************************/
1719 void *smb_xmalloc_array(size_t size, unsigned int count)
1723 smb_panic("smb_xmalloc_array: called with zero size");
1725 if (count >= MAX_ALLOC_SIZE/size) {
1726 smb_panic("smb_xmalloc_array: alloc size too large");
1728 if ((p = SMB_MALLOC(size*count)) == NULL) {
1729 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
1730 (unsigned long)size, (unsigned long)count));
1731 smb_panic("smb_xmalloc_array: malloc failed");
1737 vasprintf that aborts on malloc fail
1740 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
1747 n = vasprintf(ptr, format, ap2);
1749 if (n == -1 || ! *ptr) {
1750 smb_panic("smb_xvasprintf: out of memory");
1755 /*****************************************************************
1756 Get local hostname and cache result.
1757 *****************************************************************/
1759 char *myhostname(void)
1763 ret = get_myname(NULL);
1769 * @brief Returns an absolute path to a file concatenating the provided
1770 * @a rootpath and @a basename
1772 * @param name Filename, relative to @a rootpath
1774 * @retval Pointer to a string containing the full path.
1777 static char *xx_path(const char *name, const char *rootpath)
1781 fname = talloc_strdup(talloc_tos(), rootpath);
1785 trim_string(fname,"","/");
1787 if (!directory_exist(fname)) {
1788 if (!mkdir(fname,0755))
1789 DEBUG(1, ("Unable to create directory %s for file %s. "
1790 "Error was %s\n", fname, name, strerror(errno)));
1793 return talloc_asprintf(talloc_tos(),
1800 * @brief Returns an absolute path to a file in the Samba lock directory.
1802 * @param name File to find, relative to LOCKDIR.
1804 * @retval Pointer to a talloc'ed string containing the full path.
1807 char *lock_path(const char *name)
1809 return xx_path(name, lp_lockdir());
1813 * @brief Returns an absolute path to a file in the Samba pid directory.
1815 * @param name File to find, relative to PIDDIR.
1817 * @retval Pointer to a talloc'ed string containing the full path.
1820 char *pid_path(const char *name)
1822 return xx_path(name, lp_piddir());
1826 * @brief Returns an absolute path to a file in the Samba lib directory.
1828 * @param name File to find, relative to LIBDIR.
1830 * @retval Pointer to a string containing the full path.
1833 char *lib_path(const char *name)
1835 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_LIBDIR(), name);
1839 * @brief Returns an absolute path to a file in the Samba modules directory.
1841 * @param name File to find, relative to MODULESDIR.
1843 * @retval Pointer to a string containing the full path.
1846 char *modules_path(const char *name)
1848 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_MODULESDIR(), name);
1852 * @brief Returns an absolute path to a file in the Samba data directory.
1854 * @param name File to find, relative to CODEPAGEDIR.
1856 * @retval Pointer to a talloc'ed string containing the full path.
1859 char *data_path(const char *name)
1861 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_CODEPAGEDIR(), name);
1865 * @brief Returns an absolute path to a file in the Samba state directory.
1867 * @param name File to find, relative to STATEDIR.
1869 * @retval Pointer to a talloc'ed string containing the full path.
1872 char *state_path(const char *name)
1874 return xx_path(name, lp_statedir());
1878 * @brief Returns an absolute path to a file in the Samba cache directory.
1880 * @param name File to find, relative to CACHEDIR.
1882 * @retval Pointer to a talloc'ed string containing the full path.
1885 char *cache_path(const char *name)
1887 return xx_path(name, lp_cachedir());
1891 * @brief Returns the platform specific shared library extension.
1893 * @retval Pointer to a const char * containing the extension.
1896 const char *shlib_ext(void)
1898 return get_dyn_SHLIBEXT();
1901 /*******************************************************************
1902 Given a filename - get its directory name
1903 ********************************************************************/
1905 bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent,
1911 p = strrchr_m(dir, '/'); /* Find final '/', if any */
1914 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
1925 if (!(*parent = (char *)TALLOC_MEMDUP(mem_ctx, dir, len+1))) {
1928 (*parent)[len] = '\0';
1936 /*******************************************************************
1937 Determine if a pattern contains any Microsoft wildcard characters.
1938 *******************************************************************/
1940 bool ms_has_wild(const char *s)
1944 if (lp_posix_pathnames()) {
1945 /* With posix pathnames no characters are wild. */
1949 while ((c = *s++)) {
1962 bool ms_has_wild_w(const smb_ucs2_t *s)
1965 if (!s) return False;
1966 while ((c = *s++)) {
1968 case UCS2_CHAR('*'):
1969 case UCS2_CHAR('?'):
1970 case UCS2_CHAR('<'):
1971 case UCS2_CHAR('>'):
1972 case UCS2_CHAR('"'):
1979 /*******************************************************************
1980 A wrapper that handles case sensitivity and the special handling
1982 *******************************************************************/
1984 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
1986 if (ISDOTDOT(string))
1991 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
1994 /*******************************************************************
1995 A wrapper that handles case sensitivity and the special handling
1996 of the ".." name. Varient that is only called by old search code which requires
1997 pattern translation.
1998 *******************************************************************/
2000 bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
2002 if (ISDOTDOT(string))
2007 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2010 /*******************************************************************
2011 A wrapper that handles a list of patters and calls mask_match()
2012 on each. Returns True if any of the patterns match.
2013 *******************************************************************/
2015 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive)
2017 while (listLen-- > 0) {
2018 if (mask_match(string, *list++, is_case_sensitive))
2024 /*********************************************************
2025 Recursive routine that is called by unix_wild_match.
2026 *********************************************************/
2028 static bool unix_do_match(const char *regexp, const char *str)
2032 for( p = regexp; *p && *str; ) {
2043 * Look for a character matching
2044 * the one after the '*'.
2048 return true; /* Automatic match */
2051 while(*str && (*p != *str))
2055 * Patch from weidel@multichart.de. In the case of the regexp
2056 * '*XX*' we want to ensure there are at least 2 'X' characters
2057 * in the string after the '*' for a match to be made.
2064 * Eat all the characters that match, but count how many there were.
2067 while(*str && (*p == *str)) {
2073 * Now check that if the regexp had n identical characters that
2074 * matchcount had at least that many matches.
2077 while ( *(p+1) && (*(p+1) == *p)) {
2082 if ( matchcount <= 0 )
2086 str--; /* We've eaten the match char after the '*' */
2088 if(unix_do_match(p, str))
2110 if (!*p && str[0] == '.' && str[1] == 0)
2113 if (!*str && *p == '?') {
2119 if(!*str && (*p == '*' && p[1] == '\0'))
2125 /*******************************************************************
2126 Simple case insensitive interface to a UNIX wildcard matcher.
2127 Returns True if match, False if not.
2128 *******************************************************************/
2130 bool unix_wild_match(const char *pattern, const char *string)
2132 TALLOC_CTX *ctx = talloc_stackframe();
2138 p2 = talloc_strdup(ctx,pattern);
2139 s2 = talloc_strdup(ctx,string);
2147 /* Remove any *? and ** from the pattern as they are meaningless */
2148 for(p = p2; *p; p++) {
2149 while( *p == '*' && (p[1] == '?' ||p[1] == '*')) {
2150 memmove(&p[1], &p[2], strlen(&p[2])+1);
2154 if (strequal(p2,"*")) {
2159 ret = unix_do_match(p2, s2);
2164 /**********************************************************************
2165 Converts a name to a fully qualified domain name.
2166 Returns true if lookup succeeded, false if not (then fqdn is set to name)
2167 Note we deliberately use gethostbyname here, not getaddrinfo as we want
2168 to examine the h_aliases and I don't know how to do that with getaddrinfo.
2169 ***********************************************************************/
2171 bool name_to_fqdn(fstring fqdn, const char *name)
2174 struct hostent *hp = gethostbyname(name);
2176 if (!hp || !hp->h_name || !*hp->h_name) {
2177 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2178 fstrcpy(fqdn, name);
2182 /* Find out if the fqdn is returned as an alias
2183 * to cope with /etc/hosts files where the first
2184 * name is not the fqdn but the short name */
2185 if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2187 for (i = 0; hp->h_aliases[i]; i++) {
2188 if (strchr_m(hp->h_aliases[i], '.')) {
2189 full = hp->h_aliases[i];
2194 if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2195 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2196 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2197 DEBUGADD(1, (" to Kerberos authentication problems as localhost.localdomain\n"));
2198 DEBUGADD(1, (" may end up being used instead of the real machine FQDN.\n"));
2205 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2206 fstrcpy(fqdn, full);
2210 /**********************************************************************
2211 Append a DATA_BLOB to a talloc'ed object
2212 ***********************************************************************/
2214 void *talloc_append_blob(TALLOC_CTX *mem_ctx, void *buf, DATA_BLOB blob)
2216 size_t old_size = 0;
2219 if (blob.length == 0) {
2224 old_size = talloc_get_size(buf);
2227 result = (char *)TALLOC_REALLOC(mem_ctx, buf, old_size + blob.length);
2228 if (result == NULL) {
2232 memcpy(result + old_size, blob.data, blob.length);
2236 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2238 switch (share_access & ~FILE_SHARE_DELETE) {
2239 case FILE_SHARE_NONE:
2241 case FILE_SHARE_READ:
2243 case FILE_SHARE_WRITE:
2245 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2248 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2250 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2257 pid_t procid_to_pid(const struct server_id *proc)
2262 static uint32 my_vnn = NONCLUSTER_VNN;
2264 void set_my_vnn(uint32 vnn)
2266 DEBUG(10, ("vnn pid %d = %u\n", (int)sys_getpid(), (unsigned int)vnn));
2270 uint32 get_my_vnn(void)
2275 static uint64_t my_unique_id = 0;
2277 void set_my_unique_id(uint64_t unique_id)
2279 my_unique_id = unique_id;
2282 struct server_id pid_to_procid(pid_t pid)
2284 struct server_id result;
2287 result.unique_id = my_unique_id;
2288 result.vnn = my_vnn;
2292 struct server_id procid_self(void)
2294 return pid_to_procid(sys_getpid());
2297 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
2299 if (p1->pid != p2->pid)
2301 if (p1->id2 != p2->id2)
2303 if (p1->vnn != p2->vnn)
2308 bool cluster_id_equal(const struct server_id *id1,
2309 const struct server_id *id2)
2311 return procid_equal(id1, id2);
2314 bool procid_is_me(const struct server_id *pid)
2316 if (pid->pid != sys_getpid())
2320 if (pid->vnn != my_vnn)
2325 struct server_id interpret_pid(const char *pid_string)
2327 struct server_id result;
2330 if (sscanf(pid_string, "%u:%d", &vnn, &pid) == 2) {
2334 else if (sscanf(pid_string, "%d", &pid) == 1) {
2335 result.vnn = get_my_vnn();
2339 result.vnn = NONCLUSTER_VNN;
2342 /* Assigning to result.pid may have overflowed
2343 Map negative pid to -1: i.e. error */
2344 if (result.pid < 0) {
2347 result.unique_id = 0;
2351 char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid)
2353 if (pid->vnn == NONCLUSTER_VNN) {
2354 return talloc_asprintf(mem_ctx,
2359 return talloc_asprintf(mem_ctx,
2366 char *procid_str_static(const struct server_id *pid)
2368 return procid_str(talloc_tos(), pid);
2371 bool procid_valid(const struct server_id *pid)
2373 return (pid->pid != -1);
2376 bool procid_is_local(const struct server_id *pid)
2378 return pid->vnn == my_vnn;
2381 /****************************************************************
2382 Check if offset/length fit into bufsize. Should probably be
2383 merged with is_offset_safe, but this would require a rewrite
2384 of lanman.c. Later :-)
2385 ****************************************************************/
2387 bool trans_oob(uint32_t bufsize, uint32_t offset, uint32_t length)
2389 if ((offset + length < offset) || (offset + length < length)) {
2393 if ((offset > bufsize) || (offset + length > bufsize)) {
2400 /****************************************************************
2401 Check if an offset into a buffer is safe.
2402 If this returns True it's safe to indirect into the byte at
2404 ****************************************************************/
2406 bool is_offset_safe(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2408 const char *end_base = buf_base + buf_len;
2409 char *end_ptr = ptr + off;
2411 if (!buf_base || !ptr) {
2415 if (end_base < buf_base || end_ptr < ptr) {
2416 return False; /* wrap. */
2419 if (end_ptr < end_base) {
2425 /****************************************************************
2426 Return a safe pointer into a buffer, or NULL.
2427 ****************************************************************/
2429 char *get_safe_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2431 return is_offset_safe(buf_base, buf_len, ptr, off) ?
2435 /****************************************************************
2436 Return a safe pointer into a string within a buffer, or NULL.
2437 ****************************************************************/
2439 char *get_safe_str_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2441 if (!is_offset_safe(buf_base, buf_len, ptr, off)) {
2444 /* Check if a valid string exists at this offset. */
2445 if (skip_string(buf_base,buf_len, ptr + off) == NULL) {
2451 /****************************************************************
2452 Return an SVAL at a pointer, or failval if beyond the end.
2453 ****************************************************************/
2455 int get_safe_SVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2458 * Note we use off+1 here, not off+2 as SVAL accesses ptr[0] and ptr[1],
2461 if (!is_offset_safe(buf_base, buf_len, ptr, off+1)) {
2464 return SVAL(ptr,off);
2467 /****************************************************************
2468 Return an IVAL at a pointer, or failval if beyond the end.
2469 ****************************************************************/
2471 int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2474 * Note we use off+3 here, not off+4 as IVAL accesses
2475 * ptr[0] ptr[1] ptr[2] ptr[3] NOT ptr[4].
2477 if (!is_offset_safe(buf_base, buf_len, ptr, off+3)) {
2480 return IVAL(ptr,off);
2483 /****************************************************************
2484 Split DOM\user into DOM and user. Do not mix with winbind variants of that
2485 call (they take care of winbind separator and other winbind specific settings).
2486 ****************************************************************/
2488 void split_domain_user(TALLOC_CTX *mem_ctx,
2489 const char *full_name,
2493 const char *p = NULL;
2495 p = strchr_m(full_name, '\\');
2498 *domain = talloc_strndup(mem_ctx, full_name,
2499 PTR_DIFF(p, full_name));
2500 *user = talloc_strdup(mem_ctx, p+1);
2502 *domain = talloc_strdup(mem_ctx, "");
2503 *user = talloc_strdup(mem_ctx, full_name);
2509 Disable these now we have checked all code paths and ensured
2510 NULL returns on zero request. JRA.
2512 /****************************************************************
2513 talloc wrapper functions that guarentee a null pointer return
2515 ****************************************************************/
2517 #ifndef MAX_TALLOC_SIZE
2518 #define MAX_TALLOC_SIZE 0x10000000
2522 * talloc and zero memory.
2523 * - returns NULL if size is zero.
2526 void *_talloc_zero_zeronull(const void *ctx, size_t size, const char *name)
2534 p = talloc_named_const(ctx, size, name);
2537 memset(p, '\0', size);
2544 * memdup with a talloc.
2545 * - returns NULL if size is zero.
2548 void *_talloc_memdup_zeronull(const void *t, const void *p, size_t size, const char *name)
2556 newp = talloc_named_const(t, size, name);
2558 memcpy(newp, p, size);
2565 * alloc an array, checking for integer overflow in the array size.
2566 * - returns NULL if count or el_size are zero.
2569 void *_talloc_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2571 if (count >= MAX_TALLOC_SIZE/el_size) {
2575 if (el_size == 0 || count == 0) {
2579 return talloc_named_const(ctx, el_size * count, name);
2583 * alloc an zero array, checking for integer overflow in the array size
2584 * - returns NULL if count or el_size are zero.
2587 void *_talloc_zero_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2589 if (count >= MAX_TALLOC_SIZE/el_size) {
2593 if (el_size == 0 || count == 0) {
2597 return _talloc_zero(ctx, el_size * count, name);
2601 * Talloc wrapper that returns NULL if size == 0.
2603 void *talloc_zeronull(const void *context, size_t size, const char *name)
2608 return talloc_named_const(context, size, name);
2612 /****************************************************************
2613 strip off leading '\\' from a hostname
2614 ****************************************************************/
2616 const char *strip_hostname(const char *s)
2622 if (strlen_m(s) < 3) {
2626 if (s[0] == '\\') s++;
2627 if (s[0] == '\\') s++;
2632 bool tevent_req_poll_ntstatus(struct tevent_req *req,
2633 struct tevent_context *ev,
2636 bool ret = tevent_req_poll(req, ev);
2638 *status = map_nt_error_from_unix(errno);
2643 bool any_nt_status_not_ok(NTSTATUS err1, NTSTATUS err2, NTSTATUS *result)
2645 if (!NT_STATUS_IS_OK(err1)) {
2649 if (!NT_STATUS_IS_OK(err2)) {
2656 int timeval_to_msec(struct timeval t)
2658 return t.tv_sec * 1000 + (t.tv_usec+999) / 1000;