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"
28 #include "ctdbd_conn.h"
29 #include "../lib/util/util_pw.h"
32 /* Max allowable allococation - 256mb - 0x10000000 */
33 #define MAX_ALLOC_SIZE (1024*1024*256)
35 #if (defined(HAVE_NETGROUP) && defined (WITH_AUTOMOUNT))
36 #ifdef WITH_NISPLUS_HOME
37 #ifdef BROKEN_NISPLUS_INCLUDE_FILES
39 * The following lines are needed due to buggy include files
40 * in Solaris 2.6 which define GROUP in both /usr/include/sys/acl.h and
41 * also in /usr/include/rpcsvc/nis.h. The definitions conflict. JRA.
42 * Also GROUP_OBJ is defined as 0x4 in /usr/include/sys/acl.h and as
43 * an enum in /usr/include/rpcsvc/nis.h.
50 #if defined(GROUP_OBJ)
54 #endif /* BROKEN_NISPLUS_INCLUDE_FILES */
56 #include <rpcsvc/nis.h>
58 #endif /* WITH_NISPLUS_HOME */
59 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
61 static enum protocol_types Protocol = PROTOCOL_COREPLUS;
63 enum protocol_types get_Protocol(void)
68 void set_Protocol(enum protocol_types p)
73 static enum remote_arch_types ra_type = RA_UNKNOWN;
75 /***********************************************************************
76 Definitions for all names.
77 ***********************************************************************/
79 static char *smb_scope;
80 static int smb_num_netbios_names;
81 static char **smb_my_netbios_names;
83 /***********************************************************************
84 Allocate and set scope. Ensure upper case.
85 ***********************************************************************/
87 bool set_global_scope(const char *scope)
90 smb_scope = SMB_STRDUP(scope);
93 strupper_m(smb_scope);
97 /*********************************************************************
98 Ensure scope is never null string.
99 *********************************************************************/
101 const char *global_scope(void)
104 set_global_scope("");
108 static void free_netbios_names_array(void)
112 for (i = 0; i < smb_num_netbios_names; i++)
113 SAFE_FREE(smb_my_netbios_names[i]);
115 SAFE_FREE(smb_my_netbios_names);
116 smb_num_netbios_names = 0;
119 static bool allocate_my_netbios_names_array(size_t number)
121 free_netbios_names_array();
123 smb_num_netbios_names = number + 1;
124 smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
126 if (!smb_my_netbios_names)
129 memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
133 static bool set_my_netbios_names(const char *name, int i)
135 SAFE_FREE(smb_my_netbios_names[i]);
137 smb_my_netbios_names[i] = SMB_STRDUP(name);
138 if (!smb_my_netbios_names[i])
140 strupper_m(smb_my_netbios_names[i]);
144 /***********************************************************************
145 Free memory allocated to global objects
146 ***********************************************************************/
148 void gfree_names(void)
150 gfree_netbios_names();
151 SAFE_FREE( smb_scope );
152 free_netbios_names_array();
153 free_local_machine_name();
156 void gfree_all( void )
165 const char *my_netbios_names(int i)
167 return smb_my_netbios_names[i];
170 bool set_netbios_aliases(const char **str_array)
174 /* Work out the max number of netbios aliases that we have */
175 for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
178 if ( global_myname() && *global_myname())
181 /* Allocate space for the netbios aliases */
182 if (!allocate_my_netbios_names_array(namecount))
185 /* Use the global_myname string first */
187 if ( global_myname() && *global_myname()) {
188 set_my_netbios_names( global_myname(), namecount );
194 for ( i = 0; str_array[i] != NULL; i++) {
196 bool duplicate = False;
198 /* Look for duplicates */
199 for( n=0; n<namecount; n++ ) {
200 if( strequal( str_array[i], my_netbios_names(n) ) ) {
206 if (!set_my_netbios_names(str_array[i], namecount))
215 /****************************************************************************
216 Common name initialization code.
217 ****************************************************************************/
219 bool init_names(void)
223 if (global_myname() == NULL || *global_myname() == '\0') {
224 if (!set_global_myname(myhostname())) {
225 DEBUG( 0, ( "init_names: malloc fail.\n" ) );
230 if (!set_netbios_aliases(lp_netbios_aliases())) {
231 DEBUG( 0, ( "init_names: malloc fail.\n" ) );
235 set_local_machine_name(global_myname(),false);
237 DEBUG( 5, ("Netbios name list:-\n") );
238 for( n=0; my_netbios_names(n); n++ ) {
239 DEBUGADD( 5, ("my_netbios_names[%d]=\"%s\"\n",
240 n, my_netbios_names(n) ) );
246 /*******************************************************************
247 Check if a file exists - call vfs_file_exist for samba files.
248 ********************************************************************/
250 bool file_exist_stat(const char *fname,SMB_STRUCT_STAT *sbuf,
251 bool fake_dir_create_times)
257 if (sys_stat(fname, sbuf, fake_dir_create_times) != 0)
260 return((S_ISREG(sbuf->st_ex_mode)) || (S_ISFIFO(sbuf->st_ex_mode)));
263 /*******************************************************************
264 Check if a unix domain socket exists - call vfs_file_exist for samba files.
265 ********************************************************************/
267 bool socket_exist(const char *fname)
270 if (sys_stat(fname, &st, false) != 0)
273 return S_ISSOCK(st.st_ex_mode);
276 /*******************************************************************
277 Returns the size in bytes of the named given the stat struct.
278 ********************************************************************/
280 uint64_t get_file_size_stat(const SMB_STRUCT_STAT *sbuf)
282 return sbuf->st_ex_size;
285 /*******************************************************************
286 Returns the size in bytes of the named file.
287 ********************************************************************/
289 SMB_OFF_T get_file_size(char *file_name)
293 if (sys_stat(file_name, &buf, false) != 0)
294 return (SMB_OFF_T)-1;
295 return get_file_size_stat(&buf);
298 /*******************************************************************
299 Show a smb message structure.
300 ********************************************************************/
302 void show_msg(const char *buf)
310 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
312 (int)CVAL(buf,smb_com),
313 (int)CVAL(buf,smb_rcls),
314 (int)CVAL(buf,smb_reh),
315 (int)SVAL(buf,smb_err),
316 (int)CVAL(buf,smb_flg),
317 (int)SVAL(buf,smb_flg2)));
318 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
319 (int)SVAL(buf,smb_tid),
320 (int)SVAL(buf,smb_pid),
321 (int)SVAL(buf,smb_uid),
322 (int)SVAL(buf,smb_mid)));
323 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
325 for (i=0;i<(int)CVAL(buf,smb_wct);i++)
326 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
327 SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
329 bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
331 DEBUGADD(5,("smb_bcc=%d\n",bcc));
339 dump_data(10, (const uint8 *)smb_buf_const(buf), bcc);
342 /*******************************************************************
343 Set the length and marker of an encrypted smb packet.
344 ********************************************************************/
346 void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)
348 _smb_setlen(buf,len);
352 SSVAL(buf,6,enc_ctx_num);
355 /*******************************************************************
356 Set the length and marker of an smb packet.
357 ********************************************************************/
359 void smb_setlen(char *buf,int len)
361 _smb_setlen(buf,len);
369 /*******************************************************************
370 Setup only the byte count for a smb message.
371 ********************************************************************/
373 int set_message_bcc(char *buf,int num_bytes)
375 int num_words = CVAL(buf,smb_wct);
376 SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
377 _smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
378 return (smb_size + num_words*2 + num_bytes);
381 /*******************************************************************
382 Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
383 Return the bytes added
384 ********************************************************************/
386 ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
388 size_t newlen = smb_len(*outbuf) + 4 + blob.length;
391 if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
392 DEBUG(0, ("talloc failed\n"));
397 memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
398 set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
402 /*******************************************************************
403 Reduce a file name, removing .. elements.
404 ********************************************************************/
406 static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
411 DEBUG(3,("dos_clean_name [%s]\n",s));
413 /* remove any double slashes */
414 str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
419 /* Remove leading .\\ characters */
420 if(strncmp(str, ".\\", 2) == 0) {
421 trim_string(str, ".\\", NULL);
423 str = talloc_strdup(ctx, ".\\");
430 while ((p = strstr_m(str,"\\..\\")) != NULL) {
436 if ((p=strrchr_m(str,'\\')) != NULL) {
441 str = talloc_asprintf(ctx,
450 trim_string(str,NULL,"\\..");
451 return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
454 /*******************************************************************
455 Reduce a file name, removing .. elements.
456 ********************************************************************/
458 char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
463 DEBUG(3,("unix_clean_name [%s]\n",s));
465 /* remove any double slashes */
466 str = talloc_all_string_sub(ctx, s, "//","/");
471 /* Remove leading ./ characters */
472 if(strncmp(str, "./", 2) == 0) {
473 trim_string(str, "./", NULL);
475 str = talloc_strdup(ctx, "./");
482 while ((p = strstr_m(str,"/../")) != NULL) {
488 if ((p=strrchr_m(str,'/')) != NULL) {
493 str = talloc_asprintf(ctx,
502 trim_string(str,NULL,"/..");
503 return talloc_all_string_sub(ctx, str, "/./", "/");
506 char *clean_name(TALLOC_CTX *ctx, const char *s)
508 char *str = dos_clean_name(ctx, s);
512 return unix_clean_name(ctx, str);
515 /*******************************************************************
516 Write data into an fd at a given offset. Ignore seek errors.
517 ********************************************************************/
519 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
524 if (pos == (SMB_OFF_T)-1) {
525 return write_data(fd, buffer, N);
527 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
529 ret = sys_pwrite(fd,buffer + total,N - total, pos);
530 if (ret == -1 && errno == ESPIPE) {
531 return write_data(fd, buffer + total,N - total);
534 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
543 return (ssize_t)total;
545 /* Use lseek and write_data. */
546 if (sys_lseek(fd, pos, SEEK_SET) == -1) {
547 if (errno != ESPIPE) {
551 return write_data(fd, buffer, N);
556 NTSTATUS reinit_after_fork(struct messaging_context *msg_ctx,
557 struct event_context *ev_ctx,
559 bool parent_longlived)
561 NTSTATUS status = NT_STATUS_OK;
563 /* Reset the state of the random
564 * number generation system, so
565 * children do not get the same random
566 * numbers as each other */
567 set_need_random_reseed();
569 /* tdb needs special fork handling */
570 if (tdb_reopen_all(parent_longlived ? 1 : 0) == -1) {
571 DEBUG(0,("tdb_reopen_all failed.\n"));
572 status = NT_STATUS_OPEN_FAILED;
576 if (ev_ctx && tevent_re_initialise(ev_ctx) != 0) {
577 smb_panic(__location__ ": Failed to re-initialise event context");
582 * For clustering, we need to re-init our ctdbd connection after the
585 status = messaging_reinit(msg_ctx, id);
586 if (!NT_STATUS_IS_OK(status)) {
587 DEBUG(0,("messaging_reinit() failed: %s\n",
595 #if defined(PARANOID_MALLOC_CHECKER)
597 /****************************************************************************
598 Internal malloc wrapper. Externally visible.
599 ****************************************************************************/
601 void *malloc_(size_t size)
608 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
611 /****************************************************************************
612 Internal calloc wrapper. Not externally visible.
613 ****************************************************************************/
615 static void *calloc_(size_t count, size_t size)
617 if (size == 0 || count == 0) {
621 return calloc(count, size);
622 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
625 /****************************************************************************
626 Internal realloc wrapper. Not externally visible.
627 ****************************************************************************/
629 static void *realloc_(void *ptr, size_t size)
632 return realloc(ptr, size);
633 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
636 #endif /* PARANOID_MALLOC_CHECKER */
638 /****************************************************************************
640 ****************************************************************************/
642 void *memalign_array(size_t el_size, size_t align, unsigned int count)
644 if (count >= MAX_ALLOC_SIZE/el_size) {
648 return sys_memalign(align, el_size*count);
651 /****************************************************************************
653 ****************************************************************************/
655 void *calloc_array(size_t size, size_t nmemb)
657 if (nmemb >= MAX_ALLOC_SIZE/size) {
660 if (size == 0 || nmemb == 0) {
663 #if defined(PARANOID_MALLOC_CHECKER)
664 return calloc_(nmemb, size);
666 return calloc(nmemb, size);
670 /****************************************************************************
671 Expand a pointer to be a particular size.
672 Note that this version of Realloc has an extra parameter that decides
673 whether to free the passed in storage on allocation failure or if the
676 This is designed for use in the typical idiom of :
678 p = SMB_REALLOC(p, size)
683 and not to have to keep track of the old 'p' contents to free later, nor
684 to worry if the size parameter was zero. In the case where NULL is returned
685 we guarentee that p has been freed.
687 If free later semantics are desired, then pass 'free_old_on_error' as False which
688 guarentees that the old contents are not freed on error, even if size == 0. To use
691 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
699 Changes were instigated by Coverity error checking. JRA.
700 ****************************************************************************/
702 void *Realloc(void *p, size_t size, bool free_old_on_error)
707 if (free_old_on_error) {
710 DEBUG(2,("Realloc asked for 0 bytes\n"));
714 #if defined(PARANOID_MALLOC_CHECKER)
716 ret = (void *)malloc_(size);
718 ret = (void *)realloc_(p,size);
722 ret = (void *)malloc(size);
724 ret = (void *)realloc(p,size);
729 if (free_old_on_error && p) {
732 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
738 /****************************************************************************
739 (Hopefully) efficient array append.
740 ****************************************************************************/
742 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
743 void *element, void *_array, uint32 *num_elements,
746 void **array = (void **)_array;
748 if (*array_size < 0) {
752 if (*array == NULL) {
753 if (*array_size == 0) {
757 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
761 *array = TALLOC(mem_ctx, element_size * (*array_size));
762 if (*array == NULL) {
767 if (*num_elements == *array_size) {
770 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
774 *array = TALLOC_REALLOC(mem_ctx, *array,
775 element_size * (*array_size));
777 if (*array == NULL) {
782 memcpy((char *)(*array) + element_size*(*num_elements),
783 element, element_size);
793 /****************************************************************************
794 Get my own domain name, or "" if we have none.
795 ****************************************************************************/
797 char *get_mydnsdomname(TALLOC_CTX *ctx)
802 domname = get_mydnsfullname();
807 p = strchr_m(domname, '.');
810 return talloc_strdup(ctx, p);
812 return talloc_strdup(ctx, "");
816 /****************************************************************************
817 Interpret a protocol description string, with a default.
818 ****************************************************************************/
820 int interpret_protocol(const char *str,int def)
822 if (strequal(str,"NT1"))
823 return(PROTOCOL_NT1);
824 if (strequal(str,"LANMAN2"))
825 return(PROTOCOL_LANMAN2);
826 if (strequal(str,"LANMAN1"))
827 return(PROTOCOL_LANMAN1);
828 if (strequal(str,"CORE"))
829 return(PROTOCOL_CORE);
830 if (strequal(str,"COREPLUS"))
831 return(PROTOCOL_COREPLUS);
832 if (strequal(str,"CORE+"))
833 return(PROTOCOL_COREPLUS);
835 DEBUG(0,("Unrecognised protocol level %s\n",str));
841 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
842 /******************************************************************
843 Remove any mount options such as -rsize=2048,wsize=2048 etc.
844 Based on a fix from <Thomas.Hepper@icem.de>.
845 Returns a malloc'ed string.
846 *******************************************************************/
848 static char *strip_mount_options(TALLOC_CTX *ctx, const char *str)
852 while(*p && !isspace(*p))
854 while(*p && isspace(*p))
857 return talloc_strdup(ctx, p);
863 /*******************************************************************
864 Patch from jkf@soton.ac.uk
865 Split Luke's automount_server into YP lookup and string splitter
866 so can easily implement automount_path().
867 Returns a malloc'ed string.
868 *******************************************************************/
870 #ifdef WITH_NISPLUS_HOME
871 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
875 char *nis_map = (char *)lp_nis_home_map_name();
877 char buffer[NIS_MAXATTRVAL + 1];
882 snprintf(buffer, sizeof(buffer), "[key=%s],%s", user_name, nis_map);
883 DEBUG(5, ("NIS+ querystring: %s\n", buffer));
885 if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
886 if (result->status != NIS_SUCCESS) {
887 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
889 object = result->objects.objects_val;
890 if (object->zo_data.zo_type == ENTRY_OBJ) {
891 entry = &object->zo_data.objdata_u.en_data;
892 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
893 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
895 value = talloc_strdup(ctx,
896 entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
898 nis_freeresult(result);
901 value = talloc_string_sub(ctx,
908 nis_freeresult(result);
911 value = strip_mount_options(ctx, value);
912 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n",
917 #else /* WITH_NISPLUS_HOME */
919 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
923 int nis_error; /* returned by yp all functions */
924 char *nis_result; /* yp_match inits this */
925 int nis_result_len; /* and set this */
926 char *nis_domain; /* yp_get_default_domain inits this */
927 char *nis_map = (char *)lp_nis_home_map_name();
929 if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
930 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
934 DEBUG(5, ("NIS Domain: %s\n", nis_domain));
936 if ((nis_error = yp_match(nis_domain, nis_map, user_name,
937 strlen(user_name), &nis_result,
938 &nis_result_len)) == 0) {
939 if (nis_result_len > 0 && nis_result[nis_result_len] == '\n') {
940 nis_result[nis_result_len] = '\0';
942 value = talloc_strdup(ctx, nis_result);
946 value = strip_mount_options(ctx, value);
947 } else if(nis_error == YPERR_KEY) {
948 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
949 user_name, nis_map));
950 DEBUG(3, ("using defaults for server and home directory\n"));
952 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
953 yperr_string(nis_error), user_name, nis_map));
957 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, value));
961 #endif /* WITH_NISPLUS_HOME */
964 /****************************************************************************
965 Check if a process exists. Does this work on all unixes?
966 ****************************************************************************/
968 bool process_exists(const struct server_id pid)
970 if (procid_is_me(&pid)) {
974 if (procid_is_local(&pid)) {
975 return (kill(pid.pid,0) == 0 || errno != ESRCH);
978 #ifdef CLUSTER_SUPPORT
979 return ctdbd_process_exists(messaging_ctdbd_connection(),
986 /*******************************************************************
987 Convert a uid into a user name.
988 ********************************************************************/
990 const char *uidtoname(uid_t uid)
992 TALLOC_CTX *ctx = talloc_tos();
994 struct passwd *pass = NULL;
996 pass = getpwuid_alloc(ctx,uid);
998 name = talloc_strdup(ctx,pass->pw_name);
1001 name = talloc_asprintf(ctx,
1008 /*******************************************************************
1009 Convert a gid into a group name.
1010 ********************************************************************/
1012 char *gidtoname(gid_t gid)
1016 grp = getgrgid(gid);
1018 return talloc_strdup(talloc_tos(), grp->gr_name);
1021 return talloc_asprintf(talloc_tos(),
1027 /*******************************************************************
1028 Convert a user name into a uid.
1029 ********************************************************************/
1031 uid_t nametouid(const char *name)
1033 struct passwd *pass;
1037 pass = Get_Pwnam_alloc(talloc_tos(), name);
1044 u = (uid_t)strtol(name, &p, 0);
1045 if ((p != name) && (*p == '\0'))
1051 /*******************************************************************
1052 Convert a name to a gid_t if possible. Return -1 if not a group.
1053 ********************************************************************/
1055 gid_t nametogid(const char *name)
1061 g = (gid_t)strtol(name, &p, 0);
1062 if ((p != name) && (*p == '\0'))
1065 grp = sys_getgrnam(name);
1067 return(grp->gr_gid);
1071 /*******************************************************************
1072 Something really nasty happened - panic !
1073 ********************************************************************/
1075 void smb_panic_s3(const char *why)
1080 DEBUG(0,("PANIC (pid %llu): %s\n",
1081 (unsigned long long)sys_getpid(), why));
1084 cmd = lp_panic_action();
1086 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1087 result = system(cmd);
1090 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1093 DEBUG(0, ("smb_panic(): action returned status %d\n",
1094 WEXITSTATUS(result)));
1100 /*******************************************************************
1101 Print a backtrace of the stack to the debug log. This function
1102 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1103 exit shortly after calling it.
1104 ********************************************************************/
1106 #ifdef HAVE_LIBUNWIND_H
1107 #include <libunwind.h>
1110 #ifdef HAVE_EXECINFO_H
1111 #include <execinfo.h>
1114 #ifdef HAVE_LIBEXC_H
1118 void log_stack_trace(void)
1120 #ifdef HAVE_LIBUNWIND
1121 /* Try to use libunwind before any other technique since on ia64
1122 * libunwind correctly walks the stack in more circumstances than
1125 unw_cursor_t cursor;
1130 unw_word_t ip, sp, off;
1132 procname[sizeof(procname) - 1] = '\0';
1134 if (unw_getcontext(&uc) != 0) {
1135 goto libunwind_failed;
1138 if (unw_init_local(&cursor, &uc) != 0) {
1139 goto libunwind_failed;
1142 DEBUG(0, ("BACKTRACE:\n"));
1146 unw_get_reg(&cursor, UNW_REG_IP, &ip);
1147 unw_get_reg(&cursor, UNW_REG_SP, &sp);
1149 switch (unw_get_proc_name(&cursor,
1150 procname, sizeof(procname) - 1, &off) ) {
1154 /* Name truncated. */
1155 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1156 i, procname, (long long)off,
1157 (long long)ip, (long long) sp));
1160 /* case -UNW_ENOINFO: */
1161 /* case -UNW_EUNSPEC: */
1162 /* No symbol name found. */
1163 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1164 i, "<unknown symbol>",
1165 (long long)ip, (long long) sp));
1168 } while (unw_step(&cursor) > 0);
1173 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1175 #elif HAVE_BACKTRACE_SYMBOLS
1176 void *backtrace_stack[BACKTRACE_STACK_SIZE];
1177 size_t backtrace_size;
1178 char **backtrace_strings;
1180 /* get the backtrace (stack frames) */
1181 backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1182 backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1184 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1185 (unsigned long)backtrace_size));
1187 if (backtrace_strings) {
1190 for (i = 0; i < backtrace_size; i++)
1191 DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1193 /* Leak the backtrace_strings, rather than risk what free() might do */
1198 /* The IRIX libexc library provides an API for unwinding the stack. See
1199 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1200 * since we are about to abort anyway, it hardly matters.
1203 #define NAMESIZE 32 /* Arbitrary */
1205 __uint64_t addrs[BACKTRACE_STACK_SIZE];
1206 char * names[BACKTRACE_STACK_SIZE];
1207 char namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1214 ZERO_ARRAY(namebuf);
1216 /* We need to be root so we can open our /proc entry to walk
1217 * our stack. It also helps when we want to dump core.
1221 for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1222 names[i] = namebuf + (i * NAMESIZE);
1225 levels = trace_back_stack(0, addrs, names,
1226 BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1228 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1229 for (i = 0; i < levels; i++) {
1230 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1235 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1239 /*******************************************************************
1240 A readdir wrapper which just returns the file name.
1241 ********************************************************************/
1243 const char *readdirname(SMB_STRUCT_DIR *p)
1245 SMB_STRUCT_DIRENT *ptr;
1251 ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1255 dname = ptr->d_name;
1262 #ifdef HAVE_BROKEN_READDIR_NAME
1263 /* using /usr/ucb/cc is BAD */
1267 return talloc_strdup(talloc_tos(), dname);
1270 /*******************************************************************
1271 Utility function used to decide if the last component
1272 of a path matches a (possibly wildcarded) entry in a namelist.
1273 ********************************************************************/
1275 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive)
1277 const char *last_component;
1279 /* if we have no list it's obviously not in the path */
1280 if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1284 DEBUG(8, ("is_in_path: %s\n", name));
1286 /* Get the last component of the unix name. */
1287 last_component = strrchr_m(name, '/');
1288 if (!last_component) {
1289 last_component = name;
1291 last_component++; /* Go past '/' */
1294 for(; namelist->name != NULL; namelist++) {
1295 if(namelist->is_wild) {
1296 if (mask_match(last_component, namelist->name, case_sensitive)) {
1297 DEBUG(8,("is_in_path: mask match succeeded\n"));
1301 if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1302 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1303 DEBUG(8,("is_in_path: match succeeded\n"));
1308 DEBUG(8,("is_in_path: match not found\n"));
1312 /*******************************************************************
1313 Strip a '/' separated list into an array of
1314 name_compare_enties structures suitable for
1315 passing to is_in_path(). We do this for
1316 speed so we can pre-parse all the names in the list
1317 and don't do it for each call to is_in_path().
1318 We also check if the entry contains a wildcard to
1319 remove a potentially expensive call to mask_match
1321 ********************************************************************/
1323 void set_namearray(name_compare_entry **ppname_array, const char *namelist_in)
1328 int num_entries = 0;
1331 (*ppname_array) = NULL;
1333 if((namelist_in == NULL ) || ((namelist_in != NULL) && (*namelist_in == '\0')))
1336 namelist = talloc_strdup(talloc_tos(), namelist_in);
1337 if (namelist == NULL) {
1338 DEBUG(0,("set_namearray: talloc fail\n"));
1343 /* We need to make two passes over the string. The
1344 first to count the number of elements, the second
1349 if ( *nameptr == '/' ) {
1350 /* cope with multiple (useless) /s) */
1354 /* anything left? */
1355 if ( *nameptr == '\0' )
1358 /* find the next '/' or consume remaining */
1359 name_end = strchr_m(nameptr, '/');
1360 if (name_end == NULL)
1361 name_end = (char *)nameptr + strlen(nameptr);
1363 /* next segment please */
1364 nameptr = name_end + 1;
1368 if(num_entries == 0) {
1369 talloc_free(namelist);
1373 if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1374 DEBUG(0,("set_namearray: malloc fail\n"));
1375 talloc_free(namelist);
1379 /* Now copy out the names */
1383 if ( *nameptr == '/' ) {
1384 /* cope with multiple (useless) /s) */
1388 /* anything left? */
1389 if ( *nameptr == '\0' )
1392 /* find the next '/' or consume remaining */
1393 name_end = strchr_m(nameptr, '/');
1397 name_end = nameptr + strlen(nameptr);
1399 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1400 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1401 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1402 talloc_free(namelist);
1406 /* next segment please */
1407 nameptr = name_end + 1;
1411 (*ppname_array)[i].name = NULL;
1413 talloc_free(namelist);
1417 /****************************************************************************
1418 Routine to free a namearray.
1419 ****************************************************************************/
1421 void free_namearray(name_compare_entry *name_array)
1425 if(name_array == NULL)
1428 for(i=0; name_array[i].name!=NULL; i++)
1429 SAFE_FREE(name_array[i].name);
1430 SAFE_FREE(name_array);
1434 #define DBGC_CLASS DBGC_LOCKING
1436 /****************************************************************************
1437 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1438 is dealt with in posix.c
1439 Returns True if we have information regarding this lock region (and returns
1440 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1441 ****************************************************************************/
1443 bool fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1445 SMB_STRUCT_FLOCK lock;
1448 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
1449 fd,(double)*poffset,(double)*pcount,*ptype));
1451 lock.l_type = *ptype;
1452 lock.l_whence = SEEK_SET;
1453 lock.l_start = *poffset;
1454 lock.l_len = *pcount;
1457 ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
1461 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
1462 (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
1467 *ptype = lock.l_type;
1468 *poffset = lock.l_start;
1469 *pcount = lock.l_len;
1472 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
1473 fd, (int)lock.l_type, (unsigned int)lock.l_pid));
1478 #define DBGC_CLASS DBGC_ALL
1480 /*******************************************************************
1481 Is the name specified one of my netbios names.
1482 Returns true if it is equal, false otherwise.
1483 ********************************************************************/
1485 bool is_myname(const char *s)
1490 for (n=0; my_netbios_names(n); n++) {
1491 if (strequal(my_netbios_names(n), s)) {
1496 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
1500 /*******************************************************************
1501 Is the name specified our workgroup/domain.
1502 Returns true if it is equal, false otherwise.
1503 ********************************************************************/
1505 bool is_myworkgroup(const char *s)
1509 if (strequal(s, lp_workgroup())) {
1513 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
1517 /*******************************************************************
1518 we distinguish between 2K and XP by the "Native Lan Manager" string
1519 WinXP => "Windows 2002 5.1"
1520 WinXP 64bit => "Windows XP 5.2"
1521 Win2k => "Windows 2000 5.0"
1522 NT4 => "Windows NT 4.0"
1523 Win9x => "Windows 4.0"
1524 Windows 2003 doesn't set the native lan manager string but
1525 they do set the domain to "Windows 2003 5.2" (probably a bug).
1526 ********************************************************************/
1528 void ra_lanman_string( const char *native_lanman )
1530 if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
1531 set_remote_arch( RA_WINXP );
1532 else if ( strcmp( native_lanman, "Windows XP 5.2" ) == 0 )
1533 set_remote_arch( RA_WINXP64 );
1534 else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
1535 set_remote_arch( RA_WIN2K3 );
1538 static const char *remote_arch_str;
1540 const char *get_remote_arch_str(void)
1542 if (!remote_arch_str) {
1545 return remote_arch_str;
1548 /*******************************************************************
1549 Set the horrid remote_arch string based on an enum.
1550 ********************************************************************/
1552 void set_remote_arch(enum remote_arch_types type)
1557 remote_arch_str = "WfWg";
1560 remote_arch_str = "OS2";
1563 remote_arch_str = "Win95";
1566 remote_arch_str = "WinNT";
1569 remote_arch_str = "Win2K";
1572 remote_arch_str = "WinXP";
1575 remote_arch_str = "WinXP64";
1578 remote_arch_str = "Win2K3";
1581 remote_arch_str = "Vista";
1584 remote_arch_str = "Samba";
1587 remote_arch_str = "CIFSFS";
1590 remote_arch_str = "OSX";
1593 ra_type = RA_UNKNOWN;
1594 remote_arch_str = "UNKNOWN";
1598 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
1602 /*******************************************************************
1603 Get the remote_arch type.
1604 ********************************************************************/
1606 enum remote_arch_types get_remote_arch(void)
1611 const char *tab_depth(int level, int depth)
1613 if( CHECK_DEBUGLVL(level) ) {
1614 dbgtext("%*s", depth*4, "");
1619 /*****************************************************************************
1620 Provide a checksum on a string
1622 Input: s - the null-terminated character string for which the checksum
1625 Output: The checksum value calculated for s.
1626 *****************************************************************************/
1628 int str_checksum(const char *s)
1630 TDB_DATA key = string_tdb_data(s);
1631 return tdb_jenkins_hash(&key);
1634 /*****************************************************************
1635 Zero a memory area then free it. Used to catch bugs faster.
1636 *****************************************************************/
1638 void zero_free(void *p, size_t size)
1644 /*****************************************************************
1645 Set our open file limit to a requested max and return the limit.
1646 *****************************************************************/
1648 int set_maxfiles(int requested_max)
1650 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
1652 int saved_current_limit;
1654 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
1655 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
1658 return requested_max;
1662 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
1663 * account for the extra fd we need
1664 * as well as the log files and standard
1665 * handles etc. Save the limit we want to set in case
1666 * we are running on an OS that doesn't support this limit (AIX)
1667 * which always returns RLIM_INFINITY for rlp.rlim_max.
1670 /* Try raising the hard (max) limit to the requested amount. */
1672 #if defined(RLIM_INFINITY)
1673 if (rlp.rlim_max != RLIM_INFINITY) {
1674 int orig_max = rlp.rlim_max;
1676 if ( rlp.rlim_max < requested_max )
1677 rlp.rlim_max = requested_max;
1679 /* This failing is not an error - many systems (Linux) don't
1680 support our default request of 10,000 open files. JRA. */
1682 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
1683 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
1684 (int)rlp.rlim_max, strerror(errno) ));
1686 /* Set failed - restore original value from get. */
1687 rlp.rlim_max = orig_max;
1692 /* Now try setting the soft (current) limit. */
1694 saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
1696 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
1697 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
1698 (int)rlp.rlim_cur, strerror(errno) ));
1700 return saved_current_limit;
1703 if(getrlimit(RLIMIT_NOFILE, &rlp)) {
1704 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
1707 return saved_current_limit;
1710 #if defined(RLIM_INFINITY)
1711 if(rlp.rlim_cur == RLIM_INFINITY)
1712 return saved_current_limit;
1715 if((int)rlp.rlim_cur > saved_current_limit)
1716 return saved_current_limit;
1718 return rlp.rlim_cur;
1719 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
1721 * No way to know - just guess...
1723 return requested_max;
1727 /*****************************************************************
1728 malloc that aborts with smb_panic on fail or zero size.
1729 *****************************************************************/
1731 void *smb_xmalloc_array(size_t size, unsigned int count)
1735 smb_panic("smb_xmalloc_array: called with zero size");
1737 if (count >= MAX_ALLOC_SIZE/size) {
1738 smb_panic("smb_xmalloc_array: alloc size too large");
1740 if ((p = SMB_MALLOC(size*count)) == NULL) {
1741 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
1742 (unsigned long)size, (unsigned long)count));
1743 smb_panic("smb_xmalloc_array: malloc failed");
1749 vasprintf that aborts on malloc fail
1752 int smb_xvasprintf(char **ptr, const char *format, va_list ap)
1759 n = vasprintf(ptr, format, ap2);
1761 if (n == -1 || ! *ptr) {
1762 smb_panic("smb_xvasprintf: out of memory");
1767 /*****************************************************************
1768 Get local hostname and cache result.
1769 *****************************************************************/
1771 char *myhostname(void)
1775 ret = get_myname(NULL);
1781 * @brief Returns an absolute path to a file concatenating the provided
1782 * @a rootpath and @a basename
1784 * @param name Filename, relative to @a rootpath
1786 * @retval Pointer to a string containing the full path.
1789 static char *xx_path(const char *name, const char *rootpath)
1793 fname = talloc_strdup(talloc_tos(), rootpath);
1797 trim_string(fname,"","/");
1799 if (!directory_exist(fname)) {
1800 if (!mkdir(fname,0755))
1801 DEBUG(1, ("Unable to create directory %s for file %s. "
1802 "Error was %s\n", fname, name, strerror(errno)));
1805 return talloc_asprintf(talloc_tos(),
1812 * @brief Returns an absolute path to a file in the Samba lock directory.
1814 * @param name File to find, relative to LOCKDIR.
1816 * @retval Pointer to a talloc'ed string containing the full path.
1819 char *lock_path(const char *name)
1821 return xx_path(name, lp_lockdir());
1825 * @brief Returns an absolute path to a file in the Samba pid directory.
1827 * @param name File to find, relative to PIDDIR.
1829 * @retval Pointer to a talloc'ed string containing the full path.
1832 char *pid_path(const char *name)
1834 return xx_path(name, lp_piddir());
1838 * @brief Returns an absolute path to a file in the Samba lib directory.
1840 * @param name File to find, relative to LIBDIR.
1842 * @retval Pointer to a string containing the full path.
1845 char *lib_path(const char *name)
1847 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_LIBDIR(), name);
1851 * @brief Returns an absolute path to a file in the Samba modules directory.
1853 * @param name File to find, relative to MODULESDIR.
1855 * @retval Pointer to a string containing the full path.
1858 char *modules_path(const char *name)
1860 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_MODULESDIR(), name);
1864 * @brief Returns an absolute path to a file in the Samba data directory.
1866 * @param name File to find, relative to CODEPAGEDIR.
1868 * @retval Pointer to a talloc'ed string containing the full path.
1871 char *data_path(const char *name)
1873 return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_CODEPAGEDIR(), name);
1877 * @brief Returns an absolute path to a file in the Samba state directory.
1879 * @param name File to find, relative to STATEDIR.
1881 * @retval Pointer to a talloc'ed string containing the full path.
1884 char *state_path(const char *name)
1886 return xx_path(name, lp_statedir());
1890 * @brief Returns an absolute path to a file in the Samba cache directory.
1892 * @param name File to find, relative to CACHEDIR.
1894 * @retval Pointer to a talloc'ed string containing the full path.
1897 char *cache_path(const char *name)
1899 return xx_path(name, lp_cachedir());
1903 * @brief Returns the platform specific shared library extension.
1905 * @retval Pointer to a const char * containing the extension.
1908 const char *shlib_ext(void)
1910 return get_dyn_SHLIBEXT();
1913 /*******************************************************************
1914 Given a filename - get its directory name
1915 ********************************************************************/
1917 bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent,
1923 p = strrchr_m(dir, '/'); /* Find final '/', if any */
1926 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
1937 if (!(*parent = (char *)TALLOC_MEMDUP(mem_ctx, dir, len+1))) {
1940 (*parent)[len] = '\0';
1948 /*******************************************************************
1949 Determine if a pattern contains any Microsoft wildcard characters.
1950 *******************************************************************/
1952 bool ms_has_wild(const char *s)
1956 if (lp_posix_pathnames()) {
1957 /* With posix pathnames no characters are wild. */
1961 while ((c = *s++)) {
1974 bool ms_has_wild_w(const smb_ucs2_t *s)
1977 if (!s) return False;
1978 while ((c = *s++)) {
1980 case UCS2_CHAR('*'):
1981 case UCS2_CHAR('?'):
1982 case UCS2_CHAR('<'):
1983 case UCS2_CHAR('>'):
1984 case UCS2_CHAR('"'):
1991 /*******************************************************************
1992 A wrapper that handles case sensitivity and the special handling
1994 *******************************************************************/
1996 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
1998 if (ISDOTDOT(string))
2003 return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2006 /*******************************************************************
2007 A wrapper that handles case sensitivity and the special handling
2008 of the ".." name. Varient that is only called by old search code which requires
2009 pattern translation.
2010 *******************************************************************/
2012 bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
2014 if (ISDOTDOT(string))
2019 return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2022 /*******************************************************************
2023 A wrapper that handles a list of patters and calls mask_match()
2024 on each. Returns True if any of the patterns match.
2025 *******************************************************************/
2027 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive)
2029 while (listLen-- > 0) {
2030 if (mask_match(string, *list++, is_case_sensitive))
2036 /*********************************************************
2037 Recursive routine that is called by unix_wild_match.
2038 *********************************************************/
2040 static bool unix_do_match(const char *regexp, const char *str)
2044 for( p = regexp; *p && *str; ) {
2055 * Look for a character matching
2056 * the one after the '*'.
2060 return true; /* Automatic match */
2063 while(*str && (*p != *str))
2067 * Patch from weidel@multichart.de. In the case of the regexp
2068 * '*XX*' we want to ensure there are at least 2 'X' characters
2069 * in the string after the '*' for a match to be made.
2076 * Eat all the characters that match, but count how many there were.
2079 while(*str && (*p == *str)) {
2085 * Now check that if the regexp had n identical characters that
2086 * matchcount had at least that many matches.
2089 while ( *(p+1) && (*(p+1) == *p)) {
2094 if ( matchcount <= 0 )
2098 str--; /* We've eaten the match char after the '*' */
2100 if(unix_do_match(p, str))
2122 if (!*p && str[0] == '.' && str[1] == 0)
2125 if (!*str && *p == '?') {
2131 if(!*str && (*p == '*' && p[1] == '\0'))
2137 /*******************************************************************
2138 Simple case insensitive interface to a UNIX wildcard matcher.
2139 Returns True if match, False if not.
2140 *******************************************************************/
2142 bool unix_wild_match(const char *pattern, const char *string)
2144 TALLOC_CTX *ctx = talloc_stackframe();
2150 p2 = talloc_strdup(ctx,pattern);
2151 s2 = talloc_strdup(ctx,string);
2159 /* Remove any *? and ** from the pattern as they are meaningless */
2160 for(p = p2; *p; p++) {
2161 while( *p == '*' && (p[1] == '?' ||p[1] == '*')) {
2162 memmove(&p[1], &p[2], strlen(&p[2])+1);
2166 if (strequal(p2,"*")) {
2171 ret = unix_do_match(p2, s2);
2176 /**********************************************************************
2177 Converts a name to a fully qualified domain name.
2178 Returns true if lookup succeeded, false if not (then fqdn is set to name)
2179 Note we deliberately use gethostbyname here, not getaddrinfo as we want
2180 to examine the h_aliases and I don't know how to do that with getaddrinfo.
2181 ***********************************************************************/
2183 bool name_to_fqdn(fstring fqdn, const char *name)
2186 struct hostent *hp = gethostbyname(name);
2188 if (!hp || !hp->h_name || !*hp->h_name) {
2189 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2190 fstrcpy(fqdn, name);
2194 /* Find out if the fqdn is returned as an alias
2195 * to cope with /etc/hosts files where the first
2196 * name is not the fqdn but the short name */
2197 if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2199 for (i = 0; hp->h_aliases[i]; i++) {
2200 if (strchr_m(hp->h_aliases[i], '.')) {
2201 full = hp->h_aliases[i];
2206 if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2207 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2208 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2209 DEBUGADD(1, (" to Kerberos authentication problems as localhost.localdomain\n"));
2210 DEBUGADD(1, (" may end up being used instead of the real machine FQDN.\n"));
2217 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2218 fstrcpy(fqdn, full);
2222 /**********************************************************************
2223 Append a DATA_BLOB to a talloc'ed object
2224 ***********************************************************************/
2226 void *talloc_append_blob(TALLOC_CTX *mem_ctx, void *buf, DATA_BLOB blob)
2228 size_t old_size = 0;
2231 if (blob.length == 0) {
2236 old_size = talloc_get_size(buf);
2239 result = (char *)TALLOC_REALLOC(mem_ctx, buf, old_size + blob.length);
2240 if (result == NULL) {
2244 memcpy(result + old_size, blob.data, blob.length);
2248 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2250 switch (share_access & ~FILE_SHARE_DELETE) {
2251 case FILE_SHARE_NONE:
2253 case FILE_SHARE_READ:
2255 case FILE_SHARE_WRITE:
2257 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2260 if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2262 } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2269 pid_t procid_to_pid(const struct server_id *proc)
2274 static uint32 my_vnn = NONCLUSTER_VNN;
2276 void set_my_vnn(uint32 vnn)
2278 DEBUG(10, ("vnn pid %d = %u\n", (int)sys_getpid(), (unsigned int)vnn));
2282 uint32 get_my_vnn(void)
2287 static uint64_t my_unique_id = 0;
2289 void set_my_unique_id(uint64_t unique_id)
2291 my_unique_id = unique_id;
2294 struct server_id pid_to_procid(pid_t pid)
2296 struct server_id result;
2298 result.unique_id = my_unique_id;
2299 result.vnn = my_vnn;
2303 struct server_id procid_self(void)
2305 return pid_to_procid(sys_getpid());
2308 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
2310 if (p1->pid != p2->pid)
2312 if (p1->vnn != p2->vnn)
2317 bool cluster_id_equal(const struct server_id *id1,
2318 const struct server_id *id2)
2320 return procid_equal(id1, id2);
2323 bool procid_is_me(const struct server_id *pid)
2325 if (pid->pid != sys_getpid())
2327 if (pid->vnn != my_vnn)
2332 struct server_id interpret_pid(const char *pid_string)
2334 struct server_id result;
2337 if (sscanf(pid_string, "%u:%d", &vnn, &pid) == 2) {
2341 else if (sscanf(pid_string, "%d", &pid) == 1) {
2342 result.vnn = get_my_vnn();
2346 result.vnn = NONCLUSTER_VNN;
2349 /* Assigning to result.pid may have overflowed
2350 Map negative pid to -1: i.e. error */
2351 if (result.pid < 0) {
2354 result.unique_id = 0;
2358 char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid)
2360 if (pid->vnn == NONCLUSTER_VNN) {
2361 return talloc_asprintf(mem_ctx,
2366 return talloc_asprintf(mem_ctx,
2373 char *procid_str_static(const struct server_id *pid)
2375 return procid_str(talloc_tos(), pid);
2378 bool procid_valid(const struct server_id *pid)
2380 return (pid->pid != -1);
2383 bool procid_is_local(const struct server_id *pid)
2385 return pid->vnn == my_vnn;
2388 /****************************************************************
2389 Check if offset/length fit into bufsize. Should probably be
2390 merged with is_offset_safe, but this would require a rewrite
2391 of lanman.c. Later :-)
2392 ****************************************************************/
2394 bool trans_oob(uint32_t bufsize, uint32_t offset, uint32_t length)
2396 if ((offset + length < offset) || (offset + length < length)) {
2400 if ((offset > bufsize) || (offset + length > bufsize)) {
2407 /****************************************************************
2408 Check if an offset into a buffer is safe.
2409 If this returns True it's safe to indirect into the byte at
2411 ****************************************************************/
2413 bool is_offset_safe(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2415 const char *end_base = buf_base + buf_len;
2416 char *end_ptr = ptr + off;
2418 if (!buf_base || !ptr) {
2422 if (end_base < buf_base || end_ptr < ptr) {
2423 return False; /* wrap. */
2426 if (end_ptr < end_base) {
2432 /****************************************************************
2433 Return a safe pointer into a buffer, or NULL.
2434 ****************************************************************/
2436 char *get_safe_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2438 return is_offset_safe(buf_base, buf_len, ptr, off) ?
2442 /****************************************************************
2443 Return a safe pointer into a string within a buffer, or NULL.
2444 ****************************************************************/
2446 char *get_safe_str_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2448 if (!is_offset_safe(buf_base, buf_len, ptr, off)) {
2451 /* Check if a valid string exists at this offset. */
2452 if (skip_string(buf_base,buf_len, ptr + off) == NULL) {
2458 /****************************************************************
2459 Return an SVAL at a pointer, or failval if beyond the end.
2460 ****************************************************************/
2462 int get_safe_SVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2465 * Note we use off+1 here, not off+2 as SVAL accesses ptr[0] and ptr[1],
2468 if (!is_offset_safe(buf_base, buf_len, ptr, off+1)) {
2471 return SVAL(ptr,off);
2474 /****************************************************************
2475 Return an IVAL at a pointer, or failval if beyond the end.
2476 ****************************************************************/
2478 int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2481 * Note we use off+3 here, not off+4 as IVAL accesses
2482 * ptr[0] ptr[1] ptr[2] ptr[3] NOT ptr[4].
2484 if (!is_offset_safe(buf_base, buf_len, ptr, off+3)) {
2487 return IVAL(ptr,off);
2490 /****************************************************************
2491 Split DOM\user into DOM and user. Do not mix with winbind variants of that
2492 call (they take care of winbind separator and other winbind specific settings).
2493 ****************************************************************/
2495 void split_domain_user(TALLOC_CTX *mem_ctx,
2496 const char *full_name,
2500 const char *p = NULL;
2502 p = strchr_m(full_name, '\\');
2505 *domain = talloc_strndup(mem_ctx, full_name,
2506 PTR_DIFF(p, full_name));
2507 *user = talloc_strdup(mem_ctx, p+1);
2509 *domain = talloc_strdup(mem_ctx, "");
2510 *user = talloc_strdup(mem_ctx, full_name);
2516 Disable these now we have checked all code paths and ensured
2517 NULL returns on zero request. JRA.
2519 /****************************************************************
2520 talloc wrapper functions that guarentee a null pointer return
2522 ****************************************************************/
2524 #ifndef MAX_TALLOC_SIZE
2525 #define MAX_TALLOC_SIZE 0x10000000
2529 * talloc and zero memory.
2530 * - returns NULL if size is zero.
2533 void *_talloc_zero_zeronull(const void *ctx, size_t size, const char *name)
2541 p = talloc_named_const(ctx, size, name);
2544 memset(p, '\0', size);
2551 * memdup with a talloc.
2552 * - returns NULL if size is zero.
2555 void *_talloc_memdup_zeronull(const void *t, const void *p, size_t size, const char *name)
2563 newp = talloc_named_const(t, size, name);
2565 memcpy(newp, p, size);
2572 * alloc an array, checking for integer overflow in the array size.
2573 * - returns NULL if count or el_size are zero.
2576 void *_talloc_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2578 if (count >= MAX_TALLOC_SIZE/el_size) {
2582 if (el_size == 0 || count == 0) {
2586 return talloc_named_const(ctx, el_size * count, name);
2590 * alloc an zero array, checking for integer overflow in the array size
2591 * - returns NULL if count or el_size are zero.
2594 void *_talloc_zero_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2596 if (count >= MAX_TALLOC_SIZE/el_size) {
2600 if (el_size == 0 || count == 0) {
2604 return _talloc_zero(ctx, el_size * count, name);
2608 * Talloc wrapper that returns NULL if size == 0.
2610 void *talloc_zeronull(const void *context, size_t size, const char *name)
2615 return talloc_named_const(context, size, name);
2619 /****************************************************************
2620 strip off leading '\\' from a hostname
2621 ****************************************************************/
2623 const char *strip_hostname(const char *s)
2629 if (strlen_m(s) < 3) {
2633 if (s[0] == '\\') s++;
2634 if (s[0] == '\\') s++;
2639 bool tevent_req_poll_ntstatus(struct tevent_req *req,
2640 struct tevent_context *ev,
2643 bool ret = tevent_req_poll(req, ev);
2645 *status = map_nt_error_from_unix(errno);
2650 bool any_nt_status_not_ok(NTSTATUS err1, NTSTATUS err2, NTSTATUS *result)
2652 if (!NT_STATUS_IS_OK(err1)) {
2656 if (!NT_STATUS_IS_OK(err2)) {
2663 int timeval_to_msec(struct timeval t)
2665 return t.tv_sec * 1000 + (t.tv_usec+999) / 1000;
2668 /*******************************************************************
2669 Check a given DOS pathname is valid for a share.
2670 ********************************************************************/
2672 char *valid_share_pathname(TALLOC_CTX *ctx, const char *dos_pathname)
2676 if (!dos_pathname) {
2680 ptr = talloc_strdup(ctx, dos_pathname);
2684 /* Convert any '\' paths to '/' */
2686 ptr = unix_clean_name(ctx, ptr);
2691 /* NT is braindead - it wants a C: prefix to a pathname ! So strip it. */
2692 if (strlen(ptr) > 2 && ptr[1] == ':' && ptr[0] != '/')
2695 /* Only absolute paths allowed. */