s3: Fix some DEBUGs
[samba.git] / source3 / lib / util.c
1 /* 
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
9
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.
14
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.
19
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/>.
22 */
23
24 #include "includes.h"
25 #include "popt_common.h"
26 #include "secrets.h"
27
28 extern char *global_clobber_region_function;
29 extern unsigned int global_clobber_region_line;
30
31 /* Max allowable allococation - 256mb - 0x10000000 */
32 #define MAX_ALLOC_SIZE (1024*1024*256)
33
34 #if (defined(HAVE_NETGROUP) && defined (WITH_AUTOMOUNT))
35 #ifdef WITH_NISPLUS_HOME
36 #ifdef BROKEN_NISPLUS_INCLUDE_FILES
37 /*
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.
43  */
44
45 #if defined(GROUP)
46 #undef GROUP
47 #endif
48
49 #if defined(GROUP_OBJ)
50 #undef GROUP_OBJ
51 #endif
52
53 #endif /* BROKEN_NISPLUS_INCLUDE_FILES */
54
55 #include <rpcsvc/nis.h>
56
57 #endif /* WITH_NISPLUS_HOME */
58 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
59
60 static enum protocol_types Protocol = PROTOCOL_COREPLUS;
61
62 enum protocol_types get_Protocol(void)
63 {
64         return Protocol;
65 }
66
67 void set_Protocol(enum protocol_types  p)
68 {
69         Protocol = p;
70 }
71
72 static enum remote_arch_types ra_type = RA_UNKNOWN;
73
74 /***********************************************************************
75  Definitions for all names.
76 ***********************************************************************/
77
78 static char *smb_scope;
79 static int smb_num_netbios_names;
80 static char **smb_my_netbios_names;
81
82 /***********************************************************************
83  Allocate and set scope. Ensure upper case.
84 ***********************************************************************/
85
86 bool set_global_scope(const char *scope)
87 {
88         SAFE_FREE(smb_scope);
89         smb_scope = SMB_STRDUP(scope);
90         if (!smb_scope)
91                 return False;
92         strupper_m(smb_scope);
93         return True;
94 }
95
96 /*********************************************************************
97  Ensure scope is never null string.
98 *********************************************************************/
99
100 const char *global_scope(void)
101 {
102         if (!smb_scope)
103                 set_global_scope("");
104         return smb_scope;
105 }
106
107 static void free_netbios_names_array(void)
108 {
109         int i;
110
111         for (i = 0; i < smb_num_netbios_names; i++)
112                 SAFE_FREE(smb_my_netbios_names[i]);
113
114         SAFE_FREE(smb_my_netbios_names);
115         smb_num_netbios_names = 0;
116 }
117
118 static bool allocate_my_netbios_names_array(size_t number)
119 {
120         free_netbios_names_array();
121
122         smb_num_netbios_names = number + 1;
123         smb_my_netbios_names = SMB_MALLOC_ARRAY( char *, smb_num_netbios_names );
124
125         if (!smb_my_netbios_names)
126                 return False;
127
128         memset(smb_my_netbios_names, '\0', sizeof(char *) * smb_num_netbios_names);
129         return True;
130 }
131
132 static bool set_my_netbios_names(const char *name, int i)
133 {
134         SAFE_FREE(smb_my_netbios_names[i]);
135
136         smb_my_netbios_names[i] = SMB_STRDUP(name);
137         if (!smb_my_netbios_names[i])
138                 return False;
139         strupper_m(smb_my_netbios_names[i]);
140         return True;
141 }
142
143 /***********************************************************************
144  Free memory allocated to global objects
145 ***********************************************************************/
146
147 void gfree_names(void)
148 {
149         gfree_netbios_names();
150         SAFE_FREE( smb_scope );
151         free_netbios_names_array();
152         free_local_machine_name();
153 }
154
155 void gfree_all( void )
156 {
157         gfree_names();
158         gfree_loadparm();
159         gfree_case_tables();
160         gfree_charcnv();
161         gfree_interfaces();
162         gfree_debugsyms();
163 }
164
165 const char *my_netbios_names(int i)
166 {
167         return smb_my_netbios_names[i];
168 }
169
170 bool set_netbios_aliases(const char **str_array)
171 {
172         size_t namecount;
173
174         /* Work out the max number of netbios aliases that we have */
175         for( namecount=0; str_array && (str_array[namecount] != NULL); namecount++ )
176                 ;
177
178         if ( global_myname() && *global_myname())
179                 namecount++;
180
181         /* Allocate space for the netbios aliases */
182         if (!allocate_my_netbios_names_array(namecount))
183                 return False;
184
185         /* Use the global_myname string first */
186         namecount=0;
187         if ( global_myname() && *global_myname()) {
188                 set_my_netbios_names( global_myname(), namecount );
189                 namecount++;
190         }
191
192         if (str_array) {
193                 size_t i;
194                 for ( i = 0; str_array[i] != NULL; i++) {
195                         size_t n;
196                         bool duplicate = False;
197
198                         /* Look for duplicates */
199                         for( n=0; n<namecount; n++ ) {
200                                 if( strequal( str_array[i], my_netbios_names(n) ) ) {
201                                         duplicate = True;
202                                         break;
203                                 }
204                         }
205                         if (!duplicate) {
206                                 if (!set_my_netbios_names(str_array[i], namecount))
207                                         return False;
208                                 namecount++;
209                         }
210                 }
211         }
212         return True;
213 }
214
215 /****************************************************************************
216   Common name initialization code.
217 ****************************************************************************/
218
219 bool init_names(void)
220 {
221         int n;
222
223         if (global_myname() == NULL || *global_myname() == '\0') {
224                 if (!set_global_myname(myhostname())) {
225                         DEBUG( 0, ( "init_names: malloc fail.\n" ) );
226                         return False;
227                 }
228         }
229
230         if (!set_netbios_aliases(lp_netbios_aliases())) {
231                 DEBUG( 0, ( "init_names: malloc fail.\n" ) );
232                 return False;
233         }
234
235         set_local_machine_name(global_myname(),false);
236
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) ) );
241         }
242
243         return( True );
244 }
245
246 /**************************************************************************n
247   Code to cope with username/password auth options from the commandline.
248   Used mainly in client tools.
249 ****************************************************************************/
250
251 struct user_auth_info *user_auth_info_init(TALLOC_CTX *mem_ctx)
252 {
253         struct user_auth_info *result;
254
255         result = TALLOC_ZERO_P(mem_ctx, struct user_auth_info);
256         if (result == NULL) {
257                 return NULL;
258         }
259
260         result->signing_state = Undefined;
261         return result;
262 }
263
264 const char *get_cmdline_auth_info_username(const struct user_auth_info *auth_info)
265 {
266         if (!auth_info->username) {
267                 return "";
268         }
269         return auth_info->username;
270 }
271
272 void set_cmdline_auth_info_username(struct user_auth_info *auth_info,
273                                     const char *username)
274 {
275         TALLOC_FREE(auth_info->username);
276         auth_info->username = talloc_strdup(auth_info, username);
277         if (!auth_info->username) {
278                 exit(ENOMEM);
279         }
280 }
281
282 const char *get_cmdline_auth_info_domain(const struct user_auth_info *auth_info)
283 {
284         if (!auth_info->domain) {
285                 return "";
286         }
287         return auth_info->domain;
288 }
289
290 void set_cmdline_auth_info_domain(struct user_auth_info *auth_info,
291                                   const char *domain)
292 {
293         TALLOC_FREE(auth_info->domain);
294         auth_info->domain = talloc_strdup(auth_info, domain);
295         if (!auth_info->domain) {
296                 exit(ENOMEM);
297         }
298 }
299
300 const char *get_cmdline_auth_info_password(const struct user_auth_info *auth_info)
301 {
302         if (!auth_info->password) {
303                 return "";
304         }
305         return auth_info->password;
306 }
307
308 void set_cmdline_auth_info_password(struct user_auth_info *auth_info,
309                                     const char *password)
310 {
311         TALLOC_FREE(auth_info->password);
312         if (password == NULL) {
313                 password = "";
314         }
315         auth_info->password = talloc_strdup(auth_info, password);
316         if (!auth_info->password) {
317                 exit(ENOMEM);
318         }
319         auth_info->got_pass = true;
320 }
321
322 bool set_cmdline_auth_info_signing_state(struct user_auth_info *auth_info,
323                                          const char *arg)
324 {
325         auth_info->signing_state = -1;
326         if (strequal(arg, "off") || strequal(arg, "no") ||
327                         strequal(arg, "false")) {
328                 auth_info->signing_state = false;
329         } else if (strequal(arg, "on") || strequal(arg, "yes") ||
330                         strequal(arg, "true") || strequal(arg, "auto")) {
331                 auth_info->signing_state = true;
332         } else if (strequal(arg, "force") || strequal(arg, "required") ||
333                         strequal(arg, "forced")) {
334                 auth_info->signing_state = Required;
335         } else {
336                 return false;
337         }
338         return true;
339 }
340
341 int get_cmdline_auth_info_signing_state(const struct user_auth_info *auth_info)
342 {
343         return auth_info->signing_state;
344 }
345
346 void set_cmdline_auth_info_use_ccache(struct user_auth_info *auth_info, bool b)
347 {
348         auth_info->use_ccache = b;
349 }
350
351 bool get_cmdline_auth_info_use_ccache(const struct user_auth_info *auth_info)
352 {
353         return auth_info->use_ccache;
354 }
355
356 void set_cmdline_auth_info_use_kerberos(struct user_auth_info *auth_info,
357                                         bool b)
358 {
359         auth_info->use_kerberos = b;
360 }
361
362 bool get_cmdline_auth_info_use_kerberos(const struct user_auth_info *auth_info)
363 {
364         return auth_info->use_kerberos;
365 }
366
367 void set_cmdline_auth_info_fallback_after_kerberos(struct user_auth_info *auth_info,
368                                         bool b)
369 {
370         auth_info->fallback_after_kerberos = b;
371 }
372
373 bool get_cmdline_auth_info_fallback_after_kerberos(const struct user_auth_info *auth_info)
374 {
375         return auth_info->fallback_after_kerberos;
376 }
377
378 /* This should only be used by lib/popt_common.c JRA */
379 void set_cmdline_auth_info_use_krb5_ticket(struct user_auth_info *auth_info)
380 {
381         auth_info->use_kerberos = true;
382         auth_info->got_pass = true;
383 }
384
385 /* This should only be used by lib/popt_common.c JRA */
386 void set_cmdline_auth_info_smb_encrypt(struct user_auth_info *auth_info)
387 {
388         auth_info->smb_encrypt = true;
389 }
390
391 void set_cmdline_auth_info_use_machine_account(struct user_auth_info *auth_info)
392 {
393         auth_info->use_machine_account = true;
394 }
395
396 bool get_cmdline_auth_info_got_pass(const struct user_auth_info *auth_info)
397 {
398         return auth_info->got_pass;
399 }
400
401 bool get_cmdline_auth_info_smb_encrypt(const struct user_auth_info *auth_info)
402 {
403         return auth_info->smb_encrypt;
404 }
405
406 bool get_cmdline_auth_info_use_machine_account(const struct user_auth_info *auth_info)
407 {
408         return auth_info->use_machine_account;
409 }
410
411 struct user_auth_info *get_cmdline_auth_info_copy(TALLOC_CTX *mem_ctx,
412                                                   const struct user_auth_info *src)
413 {
414         struct user_auth_info *result;
415
416         result = user_auth_info_init(mem_ctx);
417         if (result == NULL) {
418                 return NULL;
419         }
420
421         *result = *src;
422
423         result->username = talloc_strdup(
424                 result, get_cmdline_auth_info_username(src));
425         result->password = talloc_strdup(
426                 result, get_cmdline_auth_info_password(src));
427         if ((result->username == NULL) || (result->password == NULL)) {
428                 TALLOC_FREE(result);
429                 return NULL;
430         }
431
432         return result;
433 }
434
435 bool set_cmdline_auth_info_machine_account_creds(struct user_auth_info *auth_info)
436 {
437         char *pass = NULL;
438         char *account = NULL;
439
440         if (!get_cmdline_auth_info_use_machine_account(auth_info)) {
441                 return false;
442         }
443
444         if (!secrets_init()) {
445                 d_printf("ERROR: Unable to open secrets database\n");
446                 return false;
447         }
448
449         if (asprintf(&account, "%s$@%s", global_myname(), lp_realm()) < 0) {
450                 return false;
451         }
452
453         pass = secrets_fetch_machine_password(lp_workgroup(), NULL, NULL);
454         if (!pass) {
455                 d_printf("ERROR: Unable to fetch machine password for "
456                         "%s in domain %s\n",
457                         account, lp_workgroup());
458                 SAFE_FREE(account);
459                 return false;
460         }
461
462         set_cmdline_auth_info_username(auth_info, account);
463         set_cmdline_auth_info_password(auth_info, pass);
464
465         SAFE_FREE(account);
466         SAFE_FREE(pass);
467
468         return true;
469 }
470
471 /****************************************************************************
472  Ensure we have a password if one not given.
473 ****************************************************************************/
474
475 void set_cmdline_auth_info_getpass(struct user_auth_info *auth_info)
476 {
477         char *label = NULL;
478         char *pass;
479         TALLOC_CTX *frame;
480
481         if (get_cmdline_auth_info_got_pass(auth_info) ||
482                         get_cmdline_auth_info_use_kerberos(auth_info)) {
483                 /* Already got one... */
484                 return;
485         }
486
487         frame = talloc_stackframe();
488         label = talloc_asprintf(frame, "Enter %s's password: ",
489                         get_cmdline_auth_info_username(auth_info));
490         pass = getpass(label);
491         if (pass) {
492                 set_cmdline_auth_info_password(auth_info, pass);
493         }
494         TALLOC_FREE(frame);
495 }
496
497 /*******************************************************************
498  Check if a file exists - call vfs_file_exist for samba files.
499 ********************************************************************/
500
501 bool file_exist_stat(const char *fname,SMB_STRUCT_STAT *sbuf,
502                      bool fake_dir_create_times)
503 {
504         SMB_STRUCT_STAT st;
505         if (!sbuf)
506                 sbuf = &st;
507
508         if (sys_stat(fname, sbuf, fake_dir_create_times) != 0)
509                 return(False);
510
511         return((S_ISREG(sbuf->st_ex_mode)) || (S_ISFIFO(sbuf->st_ex_mode)));
512 }
513
514 /*******************************************************************
515  Check if a unix domain socket exists - call vfs_file_exist for samba files.
516 ********************************************************************/
517
518 bool socket_exist(const char *fname)
519 {
520         SMB_STRUCT_STAT st;
521         if (sys_stat(fname, &st, false) != 0)
522                 return(False);
523
524         return S_ISSOCK(st.st_ex_mode);
525 }
526
527 /*******************************************************************
528  Returns the size in bytes of the named given the stat struct.
529 ********************************************************************/
530
531 uint64_t get_file_size_stat(const SMB_STRUCT_STAT *sbuf)
532 {
533         return sbuf->st_ex_size;
534 }
535
536 /*******************************************************************
537  Returns the size in bytes of the named file.
538 ********************************************************************/
539
540 SMB_OFF_T get_file_size(char *file_name)
541 {
542         SMB_STRUCT_STAT buf;
543         buf.st_ex_size = 0;
544         if (sys_stat(file_name, &buf, false) != 0)
545                 return (SMB_OFF_T)-1;
546         return get_file_size_stat(&buf);
547 }
548
549 /*******************************************************************
550  Return a string representing an attribute for a file.
551 ********************************************************************/
552
553 char *attrib_string(uint16 mode)
554 {
555         fstring attrstr;
556
557         attrstr[0] = 0;
558
559         if (mode & aVOLID) fstrcat(attrstr,"V");
560         if (mode & aDIR) fstrcat(attrstr,"D");
561         if (mode & aARCH) fstrcat(attrstr,"A");
562         if (mode & aHIDDEN) fstrcat(attrstr,"H");
563         if (mode & aSYSTEM) fstrcat(attrstr,"S");
564         if (mode & aRONLY) fstrcat(attrstr,"R");          
565
566         return talloc_strdup(talloc_tos(), attrstr);
567 }
568
569 /*******************************************************************
570  Show a smb message structure.
571 ********************************************************************/
572
573 void show_msg(char *buf)
574 {
575         int i;
576         int bcc=0;
577
578         if (!DEBUGLVL(5))
579                 return;
580
581         DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
582                         smb_len(buf),
583                         (int)CVAL(buf,smb_com),
584                         (int)CVAL(buf,smb_rcls),
585                         (int)CVAL(buf,smb_reh),
586                         (int)SVAL(buf,smb_err),
587                         (int)CVAL(buf,smb_flg),
588                         (int)SVAL(buf,smb_flg2)));
589         DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
590                         (int)SVAL(buf,smb_tid),
591                         (int)SVAL(buf,smb_pid),
592                         (int)SVAL(buf,smb_uid),
593                         (int)SVAL(buf,smb_mid)));
594         DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf,smb_wct)));
595
596         for (i=0;i<(int)CVAL(buf,smb_wct);i++)
597                 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i,
598                         SVAL(buf,smb_vwv+2*i),SVAL(buf,smb_vwv+2*i)));
599
600         bcc = (int)SVAL(buf,smb_vwv+2*(CVAL(buf,smb_wct)));
601
602         DEBUGADD(5,("smb_bcc=%d\n",bcc));
603
604         if (DEBUGLEVEL < 10)
605                 return;
606
607         if (DEBUGLEVEL < 50)
608                 bcc = MIN(bcc, 512);
609
610         dump_data(10, (uint8 *)smb_buf(buf), bcc);      
611 }
612
613 /*******************************************************************
614  Set the length and marker of an encrypted smb packet.
615 ********************************************************************/
616
617 void smb_set_enclen(char *buf,int len,uint16 enc_ctx_num)
618 {
619         _smb_setlen(buf,len);
620
621         SCVAL(buf,4,0xFF);
622         SCVAL(buf,5,'E');
623         SSVAL(buf,6,enc_ctx_num);
624 }
625
626 /*******************************************************************
627  Set the length and marker of an smb packet.
628 ********************************************************************/
629
630 void smb_setlen(char *buf,int len)
631 {
632         _smb_setlen(buf,len);
633
634         SCVAL(buf,4,0xFF);
635         SCVAL(buf,5,'S');
636         SCVAL(buf,6,'M');
637         SCVAL(buf,7,'B');
638 }
639
640 /*******************************************************************
641  Setup only the byte count for a smb message.
642 ********************************************************************/
643
644 int set_message_bcc(char *buf,int num_bytes)
645 {
646         int num_words = CVAL(buf,smb_wct);
647         SSVAL(buf,smb_vwv + num_words*SIZEOFWORD,num_bytes);
648         _smb_setlen(buf,smb_size + num_words*2 + num_bytes - 4);
649         return (smb_size + num_words*2 + num_bytes);
650 }
651
652 /*******************************************************************
653  Add a data blob to the end of a smb_buf, adjusting bcc and smb_len.
654  Return the bytes added
655 ********************************************************************/
656
657 ssize_t message_push_blob(uint8 **outbuf, DATA_BLOB blob)
658 {
659         size_t newlen = smb_len(*outbuf) + 4 + blob.length;
660         uint8 *tmp;
661
662         if (!(tmp = TALLOC_REALLOC_ARRAY(NULL, *outbuf, uint8, newlen))) {
663                 DEBUG(0, ("talloc failed\n"));
664                 return -1;
665         }
666         *outbuf = tmp;
667
668         memcpy(tmp + smb_len(tmp) + 4, blob.data, blob.length);
669         set_message_bcc((char *)tmp, smb_buflen(tmp) + blob.length);
670         return blob.length;
671 }
672
673 /*******************************************************************
674  Reduce a file name, removing .. elements.
675 ********************************************************************/
676
677 static char *dos_clean_name(TALLOC_CTX *ctx, const char *s)
678 {
679         char *p = NULL;
680         char *str = NULL;
681
682         DEBUG(3,("dos_clean_name [%s]\n",s));
683
684         /* remove any double slashes */
685         str = talloc_all_string_sub(ctx, s, "\\\\", "\\");
686         if (!str) {
687                 return NULL;
688         }
689
690         /* Remove leading .\\ characters */
691         if(strncmp(str, ".\\", 2) == 0) {
692                 trim_string(str, ".\\", NULL);
693                 if(*str == 0) {
694                         str = talloc_strdup(ctx, ".\\");
695                         if (!str) {
696                                 return NULL;
697                         }
698                 }
699         }
700
701         while ((p = strstr_m(str,"\\..\\")) != NULL) {
702                 char *s1;
703
704                 *p = 0;
705                 s1 = p+3;
706
707                 if ((p=strrchr_m(str,'\\')) != NULL) {
708                         *p = 0;
709                 } else {
710                         *str = 0;
711                 }
712                 str = talloc_asprintf(ctx,
713                                 "%s%s",
714                                 str,
715                                 s1);
716                 if (!str) {
717                         return NULL;
718                 }
719         }
720
721         trim_string(str,NULL,"\\..");
722         return talloc_all_string_sub(ctx, str, "\\.\\", "\\");
723 }
724
725 /*******************************************************************
726  Reduce a file name, removing .. elements.
727 ********************************************************************/
728
729 char *unix_clean_name(TALLOC_CTX *ctx, const char *s)
730 {
731         char *p = NULL;
732         char *str = NULL;
733
734         DEBUG(3,("unix_clean_name [%s]\n",s));
735
736         /* remove any double slashes */
737         str = talloc_all_string_sub(ctx, s, "//","/");
738         if (!str) {
739                 return NULL;
740         }
741
742         /* Remove leading ./ characters */
743         if(strncmp(str, "./", 2) == 0) {
744                 trim_string(str, "./", NULL);
745                 if(*str == 0) {
746                         str = talloc_strdup(ctx, "./");
747                         if (!str) {
748                                 return NULL;
749                         }
750                 }
751         }
752
753         while ((p = strstr_m(str,"/../")) != NULL) {
754                 char *s1;
755
756                 *p = 0;
757                 s1 = p+3;
758
759                 if ((p=strrchr_m(str,'/')) != NULL) {
760                         *p = 0;
761                 } else {
762                         *str = 0;
763                 }
764                 str = talloc_asprintf(ctx,
765                                 "%s%s",
766                                 str,
767                                 s1);
768                 if (!str) {
769                         return NULL;
770                 }
771         }
772
773         trim_string(str,NULL,"/..");
774         return talloc_all_string_sub(ctx, str, "/./", "/");
775 }
776
777 char *clean_name(TALLOC_CTX *ctx, const char *s)
778 {
779         char *str = dos_clean_name(ctx, s);
780         if (!str) {
781                 return NULL;
782         }
783         return unix_clean_name(ctx, str);
784 }
785
786 /*******************************************************************
787  Write data into an fd at a given offset. Ignore seek errors.
788 ********************************************************************/
789
790 ssize_t write_data_at_offset(int fd, const char *buffer, size_t N, SMB_OFF_T pos)
791 {
792         size_t total=0;
793         ssize_t ret;
794
795         if (pos == (SMB_OFF_T)-1) {
796                 return write_data(fd, buffer, N);
797         }
798 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
799         while (total < N) {
800                 ret = sys_pwrite(fd,buffer + total,N - total, pos);
801                 if (ret == -1 && errno == ESPIPE) {
802                         return write_data(fd, buffer + total,N - total);
803                 }
804                 if (ret == -1) {
805                         DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno) ));
806                         return -1;
807                 }
808                 if (ret == 0) {
809                         return total;
810                 }
811                 total += ret;
812                 pos += ret;
813         }
814         return (ssize_t)total;
815 #else
816         /* Use lseek and write_data. */
817         if (sys_lseek(fd, pos, SEEK_SET) == -1) {
818                 if (errno != ESPIPE) {
819                         return -1;
820                 }
821         }
822         return write_data(fd, buffer, N);
823 #endif
824 }
825
826 /*******************************************************************
827  Sleep for a specified number of milliseconds.
828 ********************************************************************/
829
830 void smb_msleep(unsigned int t)
831 {
832 #if defined(HAVE_NANOSLEEP)
833         struct timespec tval;
834         int ret;
835
836         tval.tv_sec = t/1000;
837         tval.tv_nsec = 1000000*(t%1000);
838
839         do {
840                 errno = 0;
841                 ret = nanosleep(&tval, &tval);
842         } while (ret < 0 && errno == EINTR && (tval.tv_sec > 0 || tval.tv_nsec > 0));
843 #else
844         unsigned int tdiff=0;
845         struct timeval tval,t1,t2;  
846         fd_set fds;
847
848         GetTimeOfDay(&t1);
849         t2 = t1;
850
851         while (tdiff < t) {
852                 tval.tv_sec = (t-tdiff)/1000;
853                 tval.tv_usec = 1000*((t-tdiff)%1000);
854
855                 /* Never wait for more than 1 sec. */
856                 if (tval.tv_sec > 1) {
857                         tval.tv_sec = 1; 
858                         tval.tv_usec = 0;
859                 }
860
861                 FD_ZERO(&fds);
862                 errno = 0;
863                 sys_select_intr(0,&fds,NULL,NULL,&tval);
864
865                 GetTimeOfDay(&t2);
866                 if (t2.tv_sec < t1.tv_sec) {
867                         /* Someone adjusted time... */
868                         t1 = t2;
869                 }
870
871                 tdiff = TvalDiff(&t1,&t2);
872         }
873 #endif
874 }
875
876 NTSTATUS reinit_after_fork(struct messaging_context *msg_ctx,
877                            struct event_context *ev_ctx,
878                            struct server_id id,
879                            bool parent_longlived)
880 {
881         NTSTATUS status = NT_STATUS_OK;
882
883         /* Reset the state of the random
884          * number generation system, so
885          * children do not get the same random
886          * numbers as each other */
887         set_need_random_reseed();
888
889         /* tdb needs special fork handling */
890         if (tdb_reopen_all(parent_longlived ? 1 : 0) == -1) {
891                 DEBUG(0,("tdb_reopen_all failed.\n"));
892                 status = NT_STATUS_OPEN_FAILED;
893                 goto done;
894         }
895
896         if (ev_ctx && tevent_re_initialise(ev_ctx) != 0) {
897                 smb_panic(__location__ ": Failed to re-initialise event context");
898         }
899
900         if (msg_ctx) {
901                 /*
902                  * For clustering, we need to re-init our ctdbd connection after the
903                  * fork
904                  */
905                 status = messaging_reinit(msg_ctx, id);
906                 if (!NT_STATUS_IS_OK(status)) {
907                         DEBUG(0,("messaging_reinit() failed: %s\n",
908                                  nt_errstr(status)));
909                 }
910         }
911  done:
912         return status;
913 }
914
915 #if defined(PARANOID_MALLOC_CHECKER)
916
917 /****************************************************************************
918  Internal malloc wrapper. Externally visible.
919 ****************************************************************************/
920
921 void *malloc_(size_t size)
922 {
923         if (size == 0) {
924                 return NULL;
925         }
926 #undef malloc
927         return malloc(size);
928 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
929 }
930
931 /****************************************************************************
932  Internal calloc wrapper. Not externally visible.
933 ****************************************************************************/
934
935 static void *calloc_(size_t count, size_t size)
936 {
937         if (size == 0 || count == 0) {
938                 return NULL;
939         }
940 #undef calloc
941         return calloc(count, size);
942 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
943 }
944
945 /****************************************************************************
946  Internal realloc wrapper. Not externally visible.
947 ****************************************************************************/
948
949 static void *realloc_(void *ptr, size_t size)
950 {
951 #undef realloc
952         return realloc(ptr, size);
953 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
954 }
955
956 #endif /* PARANOID_MALLOC_CHECKER */
957
958 /****************************************************************************
959  Type-safe memalign
960 ****************************************************************************/
961
962 void *memalign_array(size_t el_size, size_t align, unsigned int count)
963 {
964         if (count >= MAX_ALLOC_SIZE/el_size) {
965                 return NULL;
966         }
967
968         return sys_memalign(align, el_size*count);
969 }
970
971 /****************************************************************************
972  Type-safe calloc.
973 ****************************************************************************/
974
975 void *calloc_array(size_t size, size_t nmemb)
976 {
977         if (nmemb >= MAX_ALLOC_SIZE/size) {
978                 return NULL;
979         }
980         if (size == 0 || nmemb == 0) {
981                 return NULL;
982         }
983 #if defined(PARANOID_MALLOC_CHECKER)
984         return calloc_(nmemb, size);
985 #else
986         return calloc(nmemb, size);
987 #endif
988 }
989
990 /****************************************************************************
991  Expand a pointer to be a particular size.
992  Note that this version of Realloc has an extra parameter that decides
993  whether to free the passed in storage on allocation failure or if the
994  new size is zero.
995
996  This is designed for use in the typical idiom of :
997
998  p = SMB_REALLOC(p, size)
999  if (!p) {
1000     return error;
1001  }
1002
1003  and not to have to keep track of the old 'p' contents to free later, nor
1004  to worry if the size parameter was zero. In the case where NULL is returned
1005  we guarentee that p has been freed.
1006
1007  If free later semantics are desired, then pass 'free_old_on_error' as False which
1008  guarentees that the old contents are not freed on error, even if size == 0. To use
1009  this idiom use :
1010
1011  tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
1012  if (!tmp) {
1013     SAFE_FREE(p);
1014     return error;
1015  } else {
1016     p = tmp;
1017  }
1018
1019  Changes were instigated by Coverity error checking. JRA.
1020 ****************************************************************************/
1021
1022 void *Realloc(void *p, size_t size, bool free_old_on_error)
1023 {
1024         void *ret=NULL;
1025
1026         if (size == 0) {
1027                 if (free_old_on_error) {
1028                         SAFE_FREE(p);
1029                 }
1030                 DEBUG(2,("Realloc asked for 0 bytes\n"));
1031                 return NULL;
1032         }
1033
1034 #if defined(PARANOID_MALLOC_CHECKER)
1035         if (!p) {
1036                 ret = (void *)malloc_(size);
1037         } else {
1038                 ret = (void *)realloc_(p,size);
1039         }
1040 #else
1041         if (!p) {
1042                 ret = (void *)malloc(size);
1043         } else {
1044                 ret = (void *)realloc(p,size);
1045         }
1046 #endif
1047
1048         if (!ret) {
1049                 if (free_old_on_error && p) {
1050                         SAFE_FREE(p);
1051                 }
1052                 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
1053         }
1054
1055         return(ret);
1056 }
1057
1058 /****************************************************************************
1059  (Hopefully) efficient array append.
1060 ****************************************************************************/
1061
1062 void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
1063                         void *element, void *_array, uint32 *num_elements,
1064                         ssize_t *array_size)
1065 {
1066         void **array = (void **)_array;
1067
1068         if (*array_size < 0) {
1069                 return;
1070         }
1071
1072         if (*array == NULL) {
1073                 if (*array_size == 0) {
1074                         *array_size = 128;
1075                 }
1076
1077                 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1078                         goto error;
1079                 }
1080
1081                 *array = TALLOC(mem_ctx, element_size * (*array_size));
1082                 if (*array == NULL) {
1083                         goto error;
1084                 }
1085         }
1086
1087         if (*num_elements == *array_size) {
1088                 *array_size *= 2;
1089
1090                 if (*array_size >= MAX_ALLOC_SIZE/element_size) {
1091                         goto error;
1092                 }
1093
1094                 *array = TALLOC_REALLOC(mem_ctx, *array,
1095                                         element_size * (*array_size));
1096
1097                 if (*array == NULL) {
1098                         goto error;
1099                 }
1100         }
1101
1102         memcpy((char *)(*array) + element_size*(*num_elements),
1103                element, element_size);
1104         *num_elements += 1;
1105
1106         return;
1107
1108  error:
1109         *num_elements = 0;
1110         *array_size = -1;
1111 }
1112
1113 /****************************************************************************
1114  Get my own domain name, or "" if we have none.
1115 ****************************************************************************/
1116
1117 char *get_mydnsdomname(TALLOC_CTX *ctx)
1118 {
1119         const char *domname;
1120         char *p;
1121
1122         domname = get_mydnsfullname();
1123         if (!domname) {
1124                 return NULL;
1125         }
1126
1127         p = strchr_m(domname, '.');
1128         if (p) {
1129                 p++;
1130                 return talloc_strdup(ctx, p);
1131         } else {
1132                 return talloc_strdup(ctx, "");
1133         }
1134 }
1135
1136 /****************************************************************************
1137  Interpret a protocol description string, with a default.
1138 ****************************************************************************/
1139
1140 int interpret_protocol(const char *str,int def)
1141 {
1142         if (strequal(str,"NT1"))
1143                 return(PROTOCOL_NT1);
1144         if (strequal(str,"LANMAN2"))
1145                 return(PROTOCOL_LANMAN2);
1146         if (strequal(str,"LANMAN1"))
1147                 return(PROTOCOL_LANMAN1);
1148         if (strequal(str,"CORE"))
1149                 return(PROTOCOL_CORE);
1150         if (strequal(str,"COREPLUS"))
1151                 return(PROTOCOL_COREPLUS);
1152         if (strequal(str,"CORE+"))
1153                 return(PROTOCOL_COREPLUS);
1154
1155         DEBUG(0,("Unrecognised protocol level %s\n",str));
1156
1157         return(def);
1158 }
1159
1160
1161 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1162 /******************************************************************
1163  Remove any mount options such as -rsize=2048,wsize=2048 etc.
1164  Based on a fix from <Thomas.Hepper@icem.de>.
1165  Returns a malloc'ed string.
1166 *******************************************************************/
1167
1168 static char *strip_mount_options(TALLOC_CTX *ctx, const char *str)
1169 {
1170         if (*str == '-') {
1171                 const char *p = str;
1172                 while(*p && !isspace(*p))
1173                         p++;
1174                 while(*p && isspace(*p))
1175                         p++;
1176                 if(*p) {
1177                         return talloc_strdup(ctx, p);
1178                 }
1179         }
1180         return NULL;
1181 }
1182
1183 /*******************************************************************
1184  Patch from jkf@soton.ac.uk
1185  Split Luke's automount_server into YP lookup and string splitter
1186  so can easily implement automount_path().
1187  Returns a malloc'ed string.
1188 *******************************************************************/
1189
1190 #ifdef WITH_NISPLUS_HOME
1191 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1192 {
1193         char *value = NULL;
1194
1195         char *nis_map = (char *)lp_nis_home_map_name();
1196
1197         char buffer[NIS_MAXATTRVAL + 1];
1198         nis_result *result;
1199         nis_object *object;
1200         entry_obj  *entry;
1201
1202         snprintf(buffer, sizeof(buffer), "[key=%s],%s", user_name, nis_map);
1203         DEBUG(5, ("NIS+ querystring: %s\n", buffer));
1204
1205         if (result = nis_list(buffer, FOLLOW_PATH|EXPAND_NAME|HARD_LOOKUP, NULL, NULL)) {
1206                 if (result->status != NIS_SUCCESS) {
1207                         DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result->status)));
1208                 } else {
1209                         object = result->objects.objects_val;
1210                         if (object->zo_data.zo_type == ENTRY_OBJ) {
1211                                 entry = &object->zo_data.objdata_u.en_data;
1212                                 DEBUG(5, ("NIS+ entry type: %s\n", entry->en_type));
1213                                 DEBUG(3, ("NIS+ result: %s\n", entry->en_cols.en_cols_val[1].ec_value.ec_value_val));
1214
1215                                 value = talloc_strdup(ctx,
1216                                                 entry->en_cols.en_cols_val[1].ec_value.ec_value_val);
1217                                 if (!value) {
1218                                         nis_freeresult(result);
1219                                         return NULL;
1220                                 }
1221                                 value = talloc_string_sub(ctx,
1222                                                 value,
1223                                                 "&",
1224                                                 user_name);
1225                         }
1226                 }
1227         }
1228         nis_freeresult(result);
1229
1230         if (value) {
1231                 value = strip_mount_options(ctx, value);
1232                 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n",
1233                                         user_name, value));
1234         }
1235         return value;
1236 }
1237 #else /* WITH_NISPLUS_HOME */
1238
1239 char *automount_lookup(TALLOC_CTX *ctx, const char *user_name)
1240 {
1241         char *value = NULL;
1242
1243         int nis_error;        /* returned by yp all functions */
1244         char *nis_result;     /* yp_match inits this */
1245         int nis_result_len;  /* and set this */
1246         char *nis_domain;     /* yp_get_default_domain inits this */
1247         char *nis_map = (char *)lp_nis_home_map_name();
1248
1249         if ((nis_error = yp_get_default_domain(&nis_domain)) != 0) {
1250                 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error)));
1251                 return NULL;
1252         }
1253
1254         DEBUG(5, ("NIS Domain: %s\n", nis_domain));
1255
1256         if ((nis_error = yp_match(nis_domain, nis_map, user_name,
1257                                         strlen(user_name), &nis_result,
1258                                         &nis_result_len)) == 0) {
1259                 if (nis_result_len > 0 && nis_result[nis_result_len] == '\n') {
1260                         nis_result[nis_result_len] = '\0';
1261                 }
1262                 value = talloc_strdup(ctx, nis_result);
1263                 if (!value) {
1264                         return NULL;
1265                 }
1266                 value = strip_mount_options(ctx, value);
1267         } else if(nis_error == YPERR_KEY) {
1268                 DEBUG(3, ("YP Key not found:  while looking up \"%s\" in map \"%s\"\n", 
1269                                 user_name, nis_map));
1270                 DEBUG(3, ("using defaults for server and home directory\n"));
1271         } else {
1272                 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n", 
1273                                 yperr_string(nis_error), user_name, nis_map));
1274         }
1275
1276         if (value) {
1277                 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name, value));
1278         }
1279         return value;
1280 }
1281 #endif /* WITH_NISPLUS_HOME */
1282 #endif
1283
1284 /****************************************************************************
1285  Check if a process exists. Does this work on all unixes?
1286 ****************************************************************************/
1287
1288 bool process_exists(const struct server_id pid)
1289 {
1290         if (procid_is_me(&pid)) {
1291                 return True;
1292         }
1293
1294         if (procid_is_local(&pid)) {
1295                 return (kill(pid.pid,0) == 0 || errno != ESRCH);
1296         }
1297
1298 #ifdef CLUSTER_SUPPORT
1299         return ctdbd_process_exists(messaging_ctdbd_connection(procid_self()),
1300                                     pid.vnn, pid.pid);
1301 #else
1302         return False;
1303 #endif
1304 }
1305
1306 /*******************************************************************
1307  Convert a uid into a user name.
1308 ********************************************************************/
1309
1310 const char *uidtoname(uid_t uid)
1311 {
1312         TALLOC_CTX *ctx = talloc_tos();
1313         char *name = NULL;
1314         struct passwd *pass = NULL;
1315
1316         pass = getpwuid_alloc(ctx,uid);
1317         if (pass) {
1318                 name = talloc_strdup(ctx,pass->pw_name);
1319                 TALLOC_FREE(pass);
1320         } else {
1321                 name = talloc_asprintf(ctx,
1322                                 "%ld",
1323                                 (long int)uid);
1324         }
1325         return name;
1326 }
1327
1328 /*******************************************************************
1329  Convert a gid into a group name.
1330 ********************************************************************/
1331
1332 char *gidtoname(gid_t gid)
1333 {
1334         struct group *grp;
1335
1336         grp = getgrgid(gid);
1337         if (grp) {
1338                 return talloc_strdup(talloc_tos(), grp->gr_name);
1339         }
1340         else {
1341                 return talloc_asprintf(talloc_tos(),
1342                                         "%d",
1343                                         (int)gid);
1344         }
1345 }
1346
1347 /*******************************************************************
1348  Convert a user name into a uid.
1349 ********************************************************************/
1350
1351 uid_t nametouid(const char *name)
1352 {
1353         struct passwd *pass;
1354         char *p;
1355         uid_t u;
1356
1357         pass = getpwnam_alloc(talloc_autofree_context(), name);
1358         if (pass) {
1359                 u = pass->pw_uid;
1360                 TALLOC_FREE(pass);
1361                 return u;
1362         }
1363
1364         u = (uid_t)strtol(name, &p, 0);
1365         if ((p != name) && (*p == '\0'))
1366                 return u;
1367
1368         return (uid_t)-1;
1369 }
1370
1371 /*******************************************************************
1372  Convert a name to a gid_t if possible. Return -1 if not a group. 
1373 ********************************************************************/
1374
1375 gid_t nametogid(const char *name)
1376 {
1377         struct group *grp;
1378         char *p;
1379         gid_t g;
1380
1381         g = (gid_t)strtol(name, &p, 0);
1382         if ((p != name) && (*p == '\0'))
1383                 return g;
1384
1385         grp = sys_getgrnam(name);
1386         if (grp)
1387                 return(grp->gr_gid);
1388         return (gid_t)-1;
1389 }
1390
1391 /*******************************************************************
1392  Something really nasty happened - panic !
1393 ********************************************************************/
1394
1395 void smb_panic(const char *const why)
1396 {
1397         char *cmd;
1398         int result;
1399
1400 #ifdef DEVELOPER
1401         {
1402
1403                 if (global_clobber_region_function) {
1404                         DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1405                                          global_clobber_region_function,
1406                                          global_clobber_region_line));
1407                 } 
1408         }
1409 #endif
1410
1411         DEBUG(0,("PANIC (pid %llu): %s\n",
1412                     (unsigned long long)sys_getpid(), why));
1413         log_stack_trace();
1414
1415         cmd = lp_panic_action();
1416         if (cmd && *cmd) {
1417                 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd));
1418                 result = system(cmd);
1419
1420                 if (result == -1)
1421                         DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1422                                           strerror(errno)));
1423                 else
1424                         DEBUG(0, ("smb_panic(): action returned status %d\n",
1425                                           WEXITSTATUS(result)));
1426         }
1427
1428         dump_core();
1429 }
1430
1431 /*******************************************************************
1432  Print a backtrace of the stack to the debug log. This function
1433  DELIBERATELY LEAKS MEMORY. The expectation is that you should
1434  exit shortly after calling it.
1435 ********************************************************************/
1436
1437 #ifdef HAVE_LIBUNWIND_H
1438 #include <libunwind.h>
1439 #endif
1440
1441 #ifdef HAVE_EXECINFO_H
1442 #include <execinfo.h>
1443 #endif
1444
1445 #ifdef HAVE_LIBEXC_H
1446 #include <libexc.h>
1447 #endif
1448
1449 void log_stack_trace(void)
1450 {
1451 #ifdef HAVE_LIBUNWIND
1452         /* Try to use libunwind before any other technique since on ia64
1453          * libunwind correctly walks the stack in more circumstances than
1454          * backtrace.
1455          */ 
1456         unw_cursor_t cursor;
1457         unw_context_t uc;
1458         unsigned i = 0;
1459
1460         char procname[256];
1461         unw_word_t ip, sp, off;
1462
1463         procname[sizeof(procname) - 1] = '\0';
1464
1465         if (unw_getcontext(&uc) != 0) {
1466                 goto libunwind_failed;
1467         }
1468
1469         if (unw_init_local(&cursor, &uc) != 0) {
1470                 goto libunwind_failed;
1471         }
1472
1473         DEBUG(0, ("BACKTRACE:\n"));
1474
1475         do {
1476             ip = sp = 0;
1477             unw_get_reg(&cursor, UNW_REG_IP, &ip);
1478             unw_get_reg(&cursor, UNW_REG_SP, &sp);
1479
1480             switch (unw_get_proc_name(&cursor,
1481                         procname, sizeof(procname) - 1, &off) ) {
1482             case 0:
1483                     /* Name found. */
1484             case -UNW_ENOMEM:
1485                     /* Name truncated. */
1486                     DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1487                             i, procname, (long long)off,
1488                             (long long)ip, (long long) sp));
1489                     break;
1490             default:
1491             /* case -UNW_ENOINFO: */
1492             /* case -UNW_EUNSPEC: */
1493                     /* No symbol name found. */
1494                     DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1495                             i, "<unknown symbol>",
1496                             (long long)ip, (long long) sp));
1497             }
1498             ++i;
1499         } while (unw_step(&cursor) > 0);
1500
1501         return;
1502
1503 libunwind_failed:
1504         DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1505
1506 #elif HAVE_BACKTRACE_SYMBOLS
1507         void *backtrace_stack[BACKTRACE_STACK_SIZE];
1508         size_t backtrace_size;
1509         char **backtrace_strings;
1510
1511         /* get the backtrace (stack frames) */
1512         backtrace_size = backtrace(backtrace_stack,BACKTRACE_STACK_SIZE);
1513         backtrace_strings = backtrace_symbols(backtrace_stack, backtrace_size);
1514
1515         DEBUG(0, ("BACKTRACE: %lu stack frames:\n", 
1516                   (unsigned long)backtrace_size));
1517
1518         if (backtrace_strings) {
1519                 int i;
1520
1521                 for (i = 0; i < backtrace_size; i++)
1522                         DEBUGADD(0, (" #%u %s\n", i, backtrace_strings[i]));
1523
1524                 /* Leak the backtrace_strings, rather than risk what free() might do */
1525         }
1526
1527 #elif HAVE_LIBEXC
1528
1529         /* The IRIX libexc library provides an API for unwinding the stack. See
1530          * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1531          * since we are about to abort anyway, it hardly matters.
1532          */
1533
1534 #define NAMESIZE 32 /* Arbitrary */
1535
1536         __uint64_t      addrs[BACKTRACE_STACK_SIZE];
1537         char *          names[BACKTRACE_STACK_SIZE];
1538         char            namebuf[BACKTRACE_STACK_SIZE * NAMESIZE];
1539
1540         int             i;
1541         int             levels;
1542
1543         ZERO_ARRAY(addrs);
1544         ZERO_ARRAY(names);
1545         ZERO_ARRAY(namebuf);
1546
1547         /* We need to be root so we can open our /proc entry to walk
1548          * our stack. It also helps when we want to dump core.
1549          */
1550         become_root();
1551
1552         for (i = 0; i < BACKTRACE_STACK_SIZE; i++) {
1553                 names[i] = namebuf + (i * NAMESIZE);
1554         }
1555
1556         levels = trace_back_stack(0, addrs, names,
1557                         BACKTRACE_STACK_SIZE, NAMESIZE - 1);
1558
1559         DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels));
1560         for (i = 0; i < levels; i++) {
1561                 DEBUGADD(0, (" #%d 0x%llx %s\n", i, addrs[i], names[i]));
1562         }
1563 #undef NAMESIZE
1564
1565 #else
1566         DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1567 #endif
1568 }
1569
1570 /*******************************************************************
1571   A readdir wrapper which just returns the file name.
1572  ********************************************************************/
1573
1574 const char *readdirname(SMB_STRUCT_DIR *p)
1575 {
1576         SMB_STRUCT_DIRENT *ptr;
1577         char *dname;
1578
1579         if (!p)
1580                 return(NULL);
1581
1582         ptr = (SMB_STRUCT_DIRENT *)sys_readdir(p);
1583         if (!ptr)
1584                 return(NULL);
1585
1586         dname = ptr->d_name;
1587
1588 #ifdef NEXT2
1589         if (telldir(p) < 0)
1590                 return(NULL);
1591 #endif
1592
1593 #ifdef HAVE_BROKEN_READDIR_NAME
1594         /* using /usr/ucb/cc is BAD */
1595         dname = dname - 2;
1596 #endif
1597
1598         return talloc_strdup(talloc_tos(), dname);
1599 }
1600
1601 /*******************************************************************
1602  Utility function used to decide if the last component 
1603  of a path matches a (possibly wildcarded) entry in a namelist.
1604 ********************************************************************/
1605
1606 bool is_in_path(const char *name, name_compare_entry *namelist, bool case_sensitive)
1607 {
1608         const char *last_component;
1609
1610         /* if we have no list it's obviously not in the path */
1611         if((namelist == NULL ) || ((namelist != NULL) && (namelist[0].name == NULL))) {
1612                 return False;
1613         }
1614
1615         DEBUG(8, ("is_in_path: %s\n", name));
1616
1617         /* Get the last component of the unix name. */
1618         last_component = strrchr_m(name, '/');
1619         if (!last_component) {
1620                 last_component = name;
1621         } else {
1622                 last_component++; /* Go past '/' */
1623         }
1624
1625         for(; namelist->name != NULL; namelist++) {
1626                 if(namelist->is_wild) {
1627                         if (mask_match(last_component, namelist->name, case_sensitive)) {
1628                                 DEBUG(8,("is_in_path: mask match succeeded\n"));
1629                                 return True;
1630                         }
1631                 } else {
1632                         if((case_sensitive && (strcmp(last_component, namelist->name) == 0))||
1633                                                 (!case_sensitive && (StrCaseCmp(last_component, namelist->name) == 0))) {
1634                                 DEBUG(8,("is_in_path: match succeeded\n"));
1635                                 return True;
1636                         }
1637                 }
1638         }
1639         DEBUG(8,("is_in_path: match not found\n"));
1640         return False;
1641 }
1642
1643 /*******************************************************************
1644  Strip a '/' separated list into an array of 
1645  name_compare_enties structures suitable for 
1646  passing to is_in_path(). We do this for
1647  speed so we can pre-parse all the names in the list 
1648  and don't do it for each call to is_in_path().
1649  namelist is modified here and is assumed to be 
1650  a copy owned by the caller.
1651  We also check if the entry contains a wildcard to
1652  remove a potentially expensive call to mask_match
1653  if possible.
1654 ********************************************************************/
1655
1656 void set_namearray(name_compare_entry **ppname_array, const char *namelist)
1657 {
1658         char *name_end;
1659         char *nameptr = (char *)namelist;
1660         int num_entries = 0;
1661         int i;
1662
1663         (*ppname_array) = NULL;
1664
1665         if((nameptr == NULL ) || ((nameptr != NULL) && (*nameptr == '\0'))) 
1666                 return;
1667
1668         /* We need to make two passes over the string. The
1669                 first to count the number of elements, the second
1670                 to split it.
1671         */
1672
1673         while(*nameptr) {
1674                 if ( *nameptr == '/' ) {
1675                         /* cope with multiple (useless) /s) */
1676                         nameptr++;
1677                         continue;
1678                 }
1679                 /* anything left? */
1680                 if ( *nameptr == '\0' )
1681                         break;
1682
1683                 /* find the next '/' or consume remaining */
1684                 name_end = strchr_m(nameptr, '/');
1685                 if (name_end == NULL)
1686                         name_end = (char *)nameptr + strlen(nameptr);
1687
1688                 /* next segment please */
1689                 nameptr = name_end + 1;
1690                 num_entries++;
1691         }
1692
1693         if(num_entries == 0)
1694                 return;
1695
1696         if(( (*ppname_array) = SMB_MALLOC_ARRAY(name_compare_entry, num_entries + 1)) == NULL) {
1697                 DEBUG(0,("set_namearray: malloc fail\n"));
1698                 return;
1699         }
1700
1701         /* Now copy out the names */
1702         nameptr = (char *)namelist;
1703         i = 0;
1704         while(*nameptr) {
1705                 if ( *nameptr == '/' ) {
1706                         /* cope with multiple (useless) /s) */
1707                         nameptr++;
1708                         continue;
1709                 }
1710                 /* anything left? */
1711                 if ( *nameptr == '\0' )
1712                         break;
1713
1714                 /* find the next '/' or consume remaining */
1715                 name_end = strchr_m(nameptr, '/');
1716                 if (name_end)
1717                         *name_end = '\0';
1718                 else
1719                         name_end = nameptr + strlen(nameptr);
1720
1721                 (*ppname_array)[i].is_wild = ms_has_wild(nameptr);
1722                 if(((*ppname_array)[i].name = SMB_STRDUP(nameptr)) == NULL) {
1723                         DEBUG(0,("set_namearray: malloc fail (1)\n"));
1724                         return;
1725                 }
1726
1727                 /* next segment please */
1728                 nameptr = name_end + 1;
1729                 i++;
1730         }
1731
1732         (*ppname_array)[i].name = NULL;
1733
1734         return;
1735 }
1736
1737 /****************************************************************************
1738  Routine to free a namearray.
1739 ****************************************************************************/
1740
1741 void free_namearray(name_compare_entry *name_array)
1742 {
1743         int i;
1744
1745         if(name_array == NULL)
1746                 return;
1747
1748         for(i=0; name_array[i].name!=NULL; i++)
1749                 SAFE_FREE(name_array[i].name);
1750         SAFE_FREE(name_array);
1751 }
1752
1753 #undef DBGC_CLASS
1754 #define DBGC_CLASS DBGC_LOCKING
1755
1756 /****************************************************************************
1757  Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1758  is dealt with in posix.c
1759  Returns True if we have information regarding this lock region (and returns
1760  F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1761 ****************************************************************************/
1762
1763 bool fcntl_getlock(int fd, SMB_OFF_T *poffset, SMB_OFF_T *pcount, int *ptype, pid_t *ppid)
1764 {
1765         SMB_STRUCT_FLOCK lock;
1766         int ret;
1767
1768         DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
1769                     fd,(double)*poffset,(double)*pcount,*ptype));
1770
1771         lock.l_type = *ptype;
1772         lock.l_whence = SEEK_SET;
1773         lock.l_start = *poffset;
1774         lock.l_len = *pcount;
1775         lock.l_pid = 0;
1776
1777         ret = sys_fcntl_ptr(fd,SMB_F_GETLK,&lock);
1778
1779         if (ret == -1) {
1780                 int sav = errno;
1781                 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
1782                         (double)*poffset,(double)*pcount,*ptype,strerror(errno)));
1783                 errno = sav;
1784                 return False;
1785         }
1786
1787         *ptype = lock.l_type;
1788         *poffset = lock.l_start;
1789         *pcount = lock.l_len;
1790         *ppid = lock.l_pid;
1791
1792         DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
1793                         fd, (int)lock.l_type, (unsigned int)lock.l_pid));
1794         return True;
1795 }
1796
1797 #undef DBGC_CLASS
1798 #define DBGC_CLASS DBGC_ALL
1799
1800 /*******************************************************************
1801  Is the name specified one of my netbios names.
1802  Returns true if it is equal, false otherwise.
1803 ********************************************************************/
1804
1805 bool is_myname(const char *s)
1806 {
1807         int n;
1808         bool ret = False;
1809
1810         for (n=0; my_netbios_names(n); n++) {
1811                 if (strequal(my_netbios_names(n), s)) {
1812                         ret=True;
1813                         break;
1814                 }
1815         }
1816         DEBUG(8, ("is_myname(\"%s\") returns %d\n", s, ret));
1817         return(ret);
1818 }
1819
1820 /*******************************************************************
1821  Is the name specified our workgroup/domain.
1822  Returns true if it is equal, false otherwise.
1823 ********************************************************************/
1824
1825 bool is_myworkgroup(const char *s)
1826 {
1827         bool ret = False;
1828
1829         if (strequal(s, lp_workgroup())) {
1830                 ret=True;
1831         }
1832
1833         DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s, ret));
1834         return(ret);
1835 }
1836
1837 /*******************************************************************
1838  we distinguish between 2K and XP by the "Native Lan Manager" string
1839    WinXP => "Windows 2002 5.1"
1840    WinXP 64bit => "Windows XP 5.2"
1841    Win2k => "Windows 2000 5.0"
1842    NT4   => "Windows NT 4.0"
1843    Win9x => "Windows 4.0"
1844  Windows 2003 doesn't set the native lan manager string but
1845  they do set the domain to "Windows 2003 5.2" (probably a bug).
1846 ********************************************************************/
1847
1848 void ra_lanman_string( const char *native_lanman )
1849 {
1850         if ( strcmp( native_lanman, "Windows 2002 5.1" ) == 0 )
1851                 set_remote_arch( RA_WINXP );
1852         else if ( strcmp( native_lanman, "Windows XP 5.2" ) == 0 )
1853                 set_remote_arch( RA_WINXP64 );
1854         else if ( strcmp( native_lanman, "Windows Server 2003 5.2" ) == 0 )
1855                 set_remote_arch( RA_WIN2K3 );
1856 }
1857
1858 static const char *remote_arch_str;
1859
1860 const char *get_remote_arch_str(void)
1861 {
1862         if (!remote_arch_str) {
1863                 return "UNKNOWN";
1864         }
1865         return remote_arch_str;
1866 }
1867
1868 /*******************************************************************
1869  Set the horrid remote_arch string based on an enum.
1870 ********************************************************************/
1871
1872 void set_remote_arch(enum remote_arch_types type)
1873 {
1874         ra_type = type;
1875         switch( type ) {
1876         case RA_WFWG:
1877                 remote_arch_str = "WfWg";
1878                 break;
1879         case RA_OS2:
1880                 remote_arch_str = "OS2";
1881                 break;
1882         case RA_WIN95:
1883                 remote_arch_str = "Win95";
1884                 break;
1885         case RA_WINNT:
1886                 remote_arch_str = "WinNT";
1887                 break;
1888         case RA_WIN2K:
1889                 remote_arch_str = "Win2K";
1890                 break;
1891         case RA_WINXP:
1892                 remote_arch_str = "WinXP";
1893                 break;
1894         case RA_WINXP64:
1895                 remote_arch_str = "WinXP64";
1896                 break;
1897         case RA_WIN2K3:
1898                 remote_arch_str = "Win2K3";
1899                 break;
1900         case RA_VISTA:
1901                 remote_arch_str = "Vista";
1902                 break;
1903         case RA_SAMBA:
1904                 remote_arch_str = "Samba";
1905                 break;
1906         case RA_CIFSFS:
1907                 remote_arch_str = "CIFSFS";
1908                 break;
1909         default:
1910                 ra_type = RA_UNKNOWN;
1911                 remote_arch_str = "UNKNOWN";
1912                 break;
1913         }
1914
1915         DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n",
1916                                 remote_arch_str));
1917 }
1918
1919 /*******************************************************************
1920  Get the remote_arch type.
1921 ********************************************************************/
1922
1923 enum remote_arch_types get_remote_arch(void)
1924 {
1925         return ra_type;
1926 }
1927
1928 const char *tab_depth(int level, int depth)
1929 {
1930         if( CHECK_DEBUGLVL(level) ) {
1931                 dbgtext("%*s", depth*4, "");
1932         }
1933         return "";
1934 }
1935
1936 /*****************************************************************************
1937  Provide a checksum on a string
1938
1939  Input:  s - the null-terminated character string for which the checksum
1940              will be calculated.
1941
1942   Output: The checksum value calculated for s.
1943 *****************************************************************************/
1944
1945 int str_checksum(const char *s)
1946 {
1947         int res = 0;
1948         int c;
1949         int i=0;
1950
1951         while(*s) {
1952                 c = *s;
1953                 res ^= (c << (i % 15)) ^ (c >> (15-(i%15)));
1954                 s++;
1955                 i++;
1956         }
1957         return(res);
1958 }
1959
1960 /*****************************************************************
1961  Zero a memory area then free it. Used to catch bugs faster.
1962 *****************************************************************/  
1963
1964 void zero_free(void *p, size_t size)
1965 {
1966         memset(p, 0, size);
1967         SAFE_FREE(p);
1968 }
1969
1970 /*****************************************************************
1971  Set our open file limit to a requested max and return the limit.
1972 *****************************************************************/  
1973
1974 int set_maxfiles(int requested_max)
1975 {
1976 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
1977         struct rlimit rlp;
1978         int saved_current_limit;
1979
1980         if(getrlimit(RLIMIT_NOFILE, &rlp)) {
1981                 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
1982                         strerror(errno) ));
1983                 /* just guess... */
1984                 return requested_max;
1985         }
1986
1987         /* 
1988          * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
1989          * account for the extra fd we need 
1990          * as well as the log files and standard
1991          * handles etc. Save the limit we want to set in case
1992          * we are running on an OS that doesn't support this limit (AIX)
1993          * which always returns RLIM_INFINITY for rlp.rlim_max.
1994          */
1995
1996         /* Try raising the hard (max) limit to the requested amount. */
1997
1998 #if defined(RLIM_INFINITY)
1999         if (rlp.rlim_max != RLIM_INFINITY) {
2000                 int orig_max = rlp.rlim_max;
2001
2002                 if ( rlp.rlim_max < requested_max )
2003                         rlp.rlim_max = requested_max;
2004
2005                 /* This failing is not an error - many systems (Linux) don't
2006                         support our default request of 10,000 open files. JRA. */
2007
2008                 if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2009                         DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n", 
2010                                 (int)rlp.rlim_max, strerror(errno) ));
2011
2012                         /* Set failed - restore original value from get. */
2013                         rlp.rlim_max = orig_max;
2014                 }
2015         }
2016 #endif
2017
2018         /* Now try setting the soft (current) limit. */
2019
2020         saved_current_limit = rlp.rlim_cur = MIN(requested_max,rlp.rlim_max);
2021
2022         if(setrlimit(RLIMIT_NOFILE, &rlp)) {
2023                 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n", 
2024                         (int)rlp.rlim_cur, strerror(errno) ));
2025                 /* just guess... */
2026                 return saved_current_limit;
2027         }
2028
2029         if(getrlimit(RLIMIT_NOFILE, &rlp)) {
2030                 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2031                         strerror(errno) ));
2032                 /* just guess... */
2033                 return saved_current_limit;
2034     }
2035
2036 #if defined(RLIM_INFINITY)
2037         if(rlp.rlim_cur == RLIM_INFINITY)
2038                 return saved_current_limit;
2039 #endif
2040
2041         if((int)rlp.rlim_cur > saved_current_limit)
2042                 return saved_current_limit;
2043
2044         return rlp.rlim_cur;
2045 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2046         /*
2047          * No way to know - just guess...
2048          */
2049         return requested_max;
2050 #endif
2051 }
2052
2053 /*****************************************************************
2054  malloc that aborts with smb_panic on fail or zero size.
2055  *****************************************************************/  
2056
2057 void *smb_xmalloc_array(size_t size, unsigned int count)
2058 {
2059         void *p;
2060         if (size == 0) {
2061                 smb_panic("smb_xmalloc_array: called with zero size");
2062         }
2063         if (count >= MAX_ALLOC_SIZE/size) {
2064                 smb_panic("smb_xmalloc_array: alloc size too large");
2065         }
2066         if ((p = SMB_MALLOC(size*count)) == NULL) {
2067                 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2068                         (unsigned long)size, (unsigned long)count));
2069                 smb_panic("smb_xmalloc_array: malloc failed");
2070         }
2071         return p;
2072 }
2073
2074 /*
2075   vasprintf that aborts on malloc fail
2076 */
2077
2078  int smb_xvasprintf(char **ptr, const char *format, va_list ap)
2079 {
2080         int n;
2081         va_list ap2;
2082
2083         va_copy(ap2, ap);
2084
2085         n = vasprintf(ptr, format, ap2);
2086         va_end(ap2);
2087         if (n == -1 || ! *ptr) {
2088                 smb_panic("smb_xvasprintf: out of memory");
2089         }
2090         return n;
2091 }
2092
2093 /*****************************************************************
2094  Get local hostname and cache result.
2095 *****************************************************************/
2096
2097 char *myhostname(void)
2098 {
2099         static char *ret;
2100         if (ret == NULL) {
2101                 /* This is cached forever so
2102                  * use talloc_autofree_context() ctx. */
2103                 ret = get_myname(talloc_autofree_context());
2104         }
2105         return ret;
2106 }
2107
2108 /**
2109  * @brief Returns an absolute path to a file concatenating the provided
2110  * @a rootpath and @a basename
2111  *
2112  * @param name Filename, relative to @a rootpath
2113  *
2114  * @retval Pointer to a string containing the full path.
2115  **/
2116
2117 static char *xx_path(const char *name, const char *rootpath)
2118 {
2119         char *fname = NULL;
2120
2121         fname = talloc_strdup(talloc_tos(), rootpath);
2122         if (!fname) {
2123                 return NULL;
2124         }
2125         trim_string(fname,"","/");
2126
2127         if (!directory_exist(fname)) {
2128                 if (!mkdir(fname,0755))
2129                         DEBUG(1, ("Unable to create directory %s for file %s. "
2130                               "Error was %s\n", fname, name, strerror(errno)));
2131         }
2132
2133         return talloc_asprintf(talloc_tos(),
2134                                 "%s/%s",
2135                                 fname,
2136                                 name);
2137 }
2138
2139 /**
2140  * @brief Returns an absolute path to a file in the Samba lock directory.
2141  *
2142  * @param name File to find, relative to LOCKDIR.
2143  *
2144  * @retval Pointer to a talloc'ed string containing the full path.
2145  **/
2146
2147 char *lock_path(const char *name)
2148 {
2149         return xx_path(name, lp_lockdir());
2150 }
2151
2152 /**
2153  * @brief Returns an absolute path to a file in the Samba pid directory.
2154  *
2155  * @param name File to find, relative to PIDDIR.
2156  *
2157  * @retval Pointer to a talloc'ed string containing the full path.
2158  **/
2159
2160 char *pid_path(const char *name)
2161 {
2162         return xx_path(name, lp_piddir());
2163 }
2164
2165 /**
2166  * @brief Returns an absolute path to a file in the Samba lib directory.
2167  *
2168  * @param name File to find, relative to LIBDIR.
2169  *
2170  * @retval Pointer to a string containing the full path.
2171  **/
2172
2173 char *lib_path(const char *name)
2174 {
2175         return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_LIBDIR(), name);
2176 }
2177
2178 /**
2179  * @brief Returns an absolute path to a file in the Samba modules directory.
2180  *
2181  * @param name File to find, relative to MODULESDIR.
2182  *
2183  * @retval Pointer to a string containing the full path.
2184  **/
2185
2186 char *modules_path(const char *name)
2187 {
2188         return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_MODULESDIR(), name);
2189 }
2190
2191 /**
2192  * @brief Returns an absolute path to a file in the Samba data directory.
2193  *
2194  * @param name File to find, relative to CODEPAGEDIR.
2195  *
2196  * @retval Pointer to a talloc'ed string containing the full path.
2197  **/
2198
2199 char *data_path(const char *name)
2200 {
2201         return talloc_asprintf(talloc_tos(), "%s/%s", get_dyn_CODEPAGEDIR(), name);
2202 }
2203
2204 /**
2205  * @brief Returns an absolute path to a file in the Samba state directory.
2206  *
2207  * @param name File to find, relative to STATEDIR.
2208  *
2209  * @retval Pointer to a talloc'ed string containing the full path.
2210  **/
2211
2212 char *state_path(const char *name)
2213 {
2214         return xx_path(name, lp_statedir());
2215 }
2216
2217 /**
2218  * @brief Returns an absolute path to a file in the Samba cache directory.
2219  *
2220  * @param name File to find, relative to CACHEDIR.
2221  *
2222  * @retval Pointer to a talloc'ed string containing the full path.
2223  **/
2224
2225 char *cache_path(const char *name)
2226 {
2227         return xx_path(name, lp_cachedir());
2228 }
2229
2230 /**
2231  * @brief Returns the platform specific shared library extension.
2232  *
2233  * @retval Pointer to a const char * containing the extension.
2234  **/
2235
2236 const char *shlib_ext(void)
2237 {
2238         return get_dyn_SHLIBEXT();
2239 }
2240
2241 /*******************************************************************
2242  Given a filename - get its directory name
2243 ********************************************************************/
2244
2245 bool parent_dirname(TALLOC_CTX *mem_ctx, const char *dir, char **parent,
2246                     const char **name)
2247 {
2248         char *p;
2249         ptrdiff_t len;
2250
2251         p = strrchr_m(dir, '/'); /* Find final '/', if any */
2252
2253         if (p == NULL) {
2254                 if (!(*parent = talloc_strdup(mem_ctx, "."))) {
2255                         return False;
2256                 }
2257                 if (name) {
2258                         *name = dir;
2259                 }
2260                 return True;
2261         }
2262
2263         len = p-dir;
2264
2265         if (!(*parent = (char *)TALLOC_MEMDUP(mem_ctx, dir, len+1))) {
2266                 return False;
2267         }
2268         (*parent)[len] = '\0';
2269
2270         if (name) {
2271                 *name = p+1;
2272         }
2273         return True;
2274 }
2275
2276 /*******************************************************************
2277  Determine if a pattern contains any Microsoft wildcard characters.
2278 *******************************************************************/
2279
2280 bool ms_has_wild(const char *s)
2281 {
2282         char c;
2283
2284         if (lp_posix_pathnames()) {
2285                 /* With posix pathnames no characters are wild. */
2286                 return False;
2287         }
2288
2289         while ((c = *s++)) {
2290                 switch (c) {
2291                 case '*':
2292                 case '?':
2293                 case '<':
2294                 case '>':
2295                 case '"':
2296                         return True;
2297                 }
2298         }
2299         return False;
2300 }
2301
2302 bool ms_has_wild_w(const smb_ucs2_t *s)
2303 {
2304         smb_ucs2_t c;
2305         if (!s) return False;
2306         while ((c = *s++)) {
2307                 switch (c) {
2308                 case UCS2_CHAR('*'):
2309                 case UCS2_CHAR('?'):
2310                 case UCS2_CHAR('<'):
2311                 case UCS2_CHAR('>'):
2312                 case UCS2_CHAR('"'):
2313                         return True;
2314                 }
2315         }
2316         return False;
2317 }
2318
2319 /*******************************************************************
2320  A wrapper that handles case sensitivity and the special handling
2321  of the ".." name.
2322 *******************************************************************/
2323
2324 bool mask_match(const char *string, const char *pattern, bool is_case_sensitive)
2325 {
2326         if (ISDOTDOT(string))
2327                 string = ".";
2328         if (ISDOT(pattern))
2329                 return False;
2330
2331         return ms_fnmatch(pattern, string, Protocol <= PROTOCOL_LANMAN2, is_case_sensitive) == 0;
2332 }
2333
2334 /*******************************************************************
2335  A wrapper that handles case sensitivity and the special handling
2336  of the ".." name. Varient that is only called by old search code which requires
2337  pattern translation.
2338 *******************************************************************/
2339
2340 bool mask_match_search(const char *string, const char *pattern, bool is_case_sensitive)
2341 {
2342         if (ISDOTDOT(string))
2343                 string = ".";
2344         if (ISDOT(pattern))
2345                 return False;
2346
2347         return ms_fnmatch(pattern, string, True, is_case_sensitive) == 0;
2348 }
2349
2350 /*******************************************************************
2351  A wrapper that handles a list of patters and calls mask_match()
2352  on each.  Returns True if any of the patterns match.
2353 *******************************************************************/
2354
2355 bool mask_match_list(const char *string, char **list, int listLen, bool is_case_sensitive)
2356 {
2357        while (listLen-- > 0) {
2358                if (mask_match(string, *list++, is_case_sensitive))
2359                        return True;
2360        }
2361        return False;
2362 }
2363
2364 /*********************************************************
2365  Recursive routine that is called by unix_wild_match.
2366 *********************************************************/
2367
2368 static bool unix_do_match(const char *regexp, const char *str)
2369 {
2370         const char *p;
2371
2372         for( p = regexp; *p && *str; ) {
2373
2374                 switch(*p) {
2375                         case '?':
2376                                 str++;
2377                                 p++;
2378                                 break;
2379
2380                         case '*':
2381
2382                                 /*
2383                                  * Look for a character matching 
2384                                  * the one after the '*'.
2385                                  */
2386                                 p++;
2387                                 if(!*p)
2388                                         return true; /* Automatic match */
2389                                 while(*str) {
2390
2391                                         while(*str && (*p != *str))
2392                                                 str++;
2393
2394                                         /*
2395                                          * Patch from weidel@multichart.de. In the case of the regexp
2396                                          * '*XX*' we want to ensure there are at least 2 'X' characters
2397                                          * in the string after the '*' for a match to be made.
2398                                          */
2399
2400                                         {
2401                                                 int matchcount=0;
2402
2403                                                 /*
2404                                                  * Eat all the characters that match, but count how many there were.
2405                                                  */
2406
2407                                                 while(*str && (*p == *str)) {
2408                                                         str++;
2409                                                         matchcount++;
2410                                                 }
2411
2412                                                 /*
2413                                                  * Now check that if the regexp had n identical characters that
2414                                                  * matchcount had at least that many matches.
2415                                                  */
2416
2417                                                 while ( *(p+1) && (*(p+1) == *p)) {
2418                                                         p++;
2419                                                         matchcount--;
2420                                                 }
2421
2422                                                 if ( matchcount <= 0 )
2423                                                         return false;
2424                                         }
2425
2426                                         str--; /* We've eaten the match char after the '*' */
2427
2428                                         if(unix_do_match(p, str))
2429                                                 return true;
2430
2431                                         if(!*str)
2432                                                 return false;
2433                                         else
2434                                                 str++;
2435                                 }
2436                                 return false;
2437
2438                         default:
2439                                 if(*str != *p)
2440                                         return false;
2441                                 str++;
2442                                 p++;
2443                                 break;
2444                 }
2445         }
2446
2447         if(!*p && !*str)
2448                 return true;
2449
2450         if (!*p && str[0] == '.' && str[1] == 0)
2451                 return true;
2452
2453         if (!*str && *p == '?') {
2454                 while (*p == '?')
2455                         p++;
2456                 return(!*p);
2457         }
2458
2459         if(!*str && (*p == '*' && p[1] == '\0'))
2460                 return true;
2461
2462         return false;
2463 }
2464
2465 /*******************************************************************
2466  Simple case insensitive interface to a UNIX wildcard matcher.
2467  Returns True if match, False if not.
2468 *******************************************************************/
2469
2470 bool unix_wild_match(const char *pattern, const char *string)
2471 {
2472         TALLOC_CTX *ctx = talloc_stackframe();
2473         char *p2;
2474         char *s2;
2475         char *p;
2476         bool ret = false;
2477
2478         p2 = talloc_strdup(ctx,pattern);
2479         s2 = talloc_strdup(ctx,string);
2480         if (!p2 || !s2) {
2481                 TALLOC_FREE(ctx);
2482                 return false;
2483         }
2484         strlower_m(p2);
2485         strlower_m(s2);
2486
2487         /* Remove any *? and ** from the pattern as they are meaningless */
2488         for(p = p2; *p; p++) {
2489                 while( *p == '*' && (p[1] == '?' ||p[1] == '*')) {
2490                         memmove(&p[1], &p[2], strlen(&p[2])+1);
2491                 }
2492         }
2493
2494         if (strequal(p2,"*")) {
2495                 TALLOC_FREE(ctx);
2496                 return true;
2497         }
2498
2499         ret = unix_do_match(p2, s2);
2500         TALLOC_FREE(ctx);
2501         return ret;
2502 }
2503
2504 /**********************************************************************
2505  Converts a name to a fully qualified domain name.
2506  Returns true if lookup succeeded, false if not (then fqdn is set to name)
2507  Note we deliberately use gethostbyname here, not getaddrinfo as we want
2508  to examine the h_aliases and I don't know how to do that with getaddrinfo.
2509 ***********************************************************************/
2510
2511 bool name_to_fqdn(fstring fqdn, const char *name)
2512 {
2513         char *full = NULL;
2514         struct hostent *hp = gethostbyname(name);
2515
2516         if (!hp || !hp->h_name || !*hp->h_name) {
2517                 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name));
2518                 fstrcpy(fqdn, name);
2519                 return false;
2520         }
2521
2522         /* Find out if the fqdn is returned as an alias
2523          * to cope with /etc/hosts files where the first
2524          * name is not the fqdn but the short name */
2525         if (hp->h_aliases && (! strchr_m(hp->h_name, '.'))) {
2526                 int i;
2527                 for (i = 0; hp->h_aliases[i]; i++) {
2528                         if (strchr_m(hp->h_aliases[i], '.')) {
2529                                 full = hp->h_aliases[i];
2530                                 break;
2531                         }
2532                 }
2533         }
2534         if (full && (StrCaseCmp(full, "localhost.localdomain") == 0)) {
2535                 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2536                 DEBUGADD(1, ("    Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2537                 DEBUGADD(1, ("    to Kerberos authentication problems as localhost.localdomain\n"));
2538                 DEBUGADD(1, ("    may end up being used instead of the real machine FQDN.\n"));
2539                 full = hp->h_name;
2540         }
2541         if (!full) {
2542                 full = hp->h_name;
2543         }
2544
2545         DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name, full));
2546         fstrcpy(fqdn, full);
2547         return true;
2548 }
2549
2550 /**********************************************************************
2551  Append a DATA_BLOB to a talloc'ed object
2552 ***********************************************************************/
2553
2554 void *talloc_append_blob(TALLOC_CTX *mem_ctx, void *buf, DATA_BLOB blob)
2555 {
2556         size_t old_size = 0;
2557         char *result;
2558
2559         if (blob.length == 0) {
2560                 return buf;
2561         }
2562
2563         if (buf != NULL) {
2564                 old_size = talloc_get_size(buf);
2565         }
2566
2567         result = (char *)TALLOC_REALLOC(mem_ctx, buf, old_size + blob.length);
2568         if (result == NULL) {
2569                 return NULL;
2570         }
2571
2572         memcpy(result + old_size, blob.data, blob.length);
2573         return result;
2574 }
2575
2576 uint32 map_share_mode_to_deny_mode(uint32 share_access, uint32 private_options)
2577 {
2578         switch (share_access & ~FILE_SHARE_DELETE) {
2579                 case FILE_SHARE_NONE:
2580                         return DENY_ALL;
2581                 case FILE_SHARE_READ:
2582                         return DENY_WRITE;
2583                 case FILE_SHARE_WRITE:
2584                         return DENY_READ;
2585                 case FILE_SHARE_READ|FILE_SHARE_WRITE:
2586                         return DENY_NONE;
2587         }
2588         if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_DOS) {
2589                 return DENY_DOS;
2590         } else if (private_options & NTCREATEX_OPTIONS_PRIVATE_DENY_FCB) {
2591                 return DENY_FCB;
2592         }
2593
2594         return (uint32)-1;
2595 }
2596
2597 pid_t procid_to_pid(const struct server_id *proc)
2598 {
2599         return proc->pid;
2600 }
2601
2602 static uint32 my_vnn = NONCLUSTER_VNN;
2603
2604 void set_my_vnn(uint32 vnn)
2605 {
2606         DEBUG(10, ("vnn pid %d = %u\n", (int)sys_getpid(), (unsigned int)vnn));
2607         my_vnn = vnn;
2608 }
2609
2610 uint32 get_my_vnn(void)
2611 {
2612         return my_vnn;
2613 }
2614
2615 static uint64_t my_unique_id = 0;
2616
2617 void set_my_unique_id(uint64_t unique_id)
2618 {
2619         my_unique_id = unique_id;
2620 }
2621
2622 struct server_id pid_to_procid(pid_t pid)
2623 {
2624         struct server_id result;
2625         result.pid = pid;
2626         result.unique_id = my_unique_id;
2627 #ifdef CLUSTER_SUPPORT
2628         result.vnn = my_vnn;
2629 #endif
2630         return result;
2631 }
2632
2633 struct server_id procid_self(void)
2634 {
2635         return pid_to_procid(sys_getpid());
2636 }
2637
2638 bool procid_equal(const struct server_id *p1, const struct server_id *p2)
2639 {
2640         if (p1->pid != p2->pid)
2641                 return False;
2642 #ifdef CLUSTER_SUPPORT
2643         if (p1->vnn != p2->vnn)
2644                 return False;
2645 #endif
2646         return True;
2647 }
2648
2649 bool cluster_id_equal(const struct server_id *id1,
2650                       const struct server_id *id2)
2651 {
2652         return procid_equal(id1, id2);
2653 }
2654
2655 bool procid_is_me(const struct server_id *pid)
2656 {
2657         if (pid->pid != sys_getpid())
2658                 return False;
2659 #ifdef CLUSTER_SUPPORT
2660         if (pid->vnn != my_vnn)
2661                 return False;
2662 #endif
2663         return True;
2664 }
2665
2666 struct server_id interpret_pid(const char *pid_string)
2667 {
2668         struct server_id result;
2669         int pid;
2670 #ifdef CLUSTER_SUPPORT
2671         unsigned int vnn;
2672         if (sscanf(pid_string, "%u:%d", &vnn, &pid) == 2) {
2673                 result.vnn = vnn;
2674                 result.pid = pid;
2675         }
2676         else if (sscanf(pid_string, "%d", &pid) == 1) {
2677                 result.vnn = get_my_vnn();
2678                 result.pid = pid;
2679         }
2680         else {
2681                 result.vnn = NONCLUSTER_VNN;
2682                 result.pid = -1;
2683         }
2684 #else
2685         if (sscanf(pid_string, "%d", &pid) != 1) {
2686                 result.pid = -1;
2687         } else {
2688                 result.pid = pid;
2689         }
2690 #endif
2691         /* Assigning to result.pid may have overflowed
2692            Map negative pid to -1: i.e. error */
2693         if (result.pid < 0) {
2694                 result.pid = -1;
2695         }
2696         result.unique_id = 0;
2697         return result;
2698 }
2699
2700 char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid)
2701 {
2702 #ifdef CLUSTER_SUPPORT
2703         if (pid->vnn == NONCLUSTER_VNN) {
2704                 return talloc_asprintf(mem_ctx,
2705                                 "%d",
2706                                 (int)pid->pid);
2707         }
2708         else {
2709                 return talloc_asprintf(mem_ctx,
2710                                         "%u:%d",
2711                                         (unsigned)pid->vnn,
2712                                         (int)pid->pid);
2713         }
2714 #else
2715         return talloc_asprintf(mem_ctx,
2716                         "%d",
2717                         (int)pid->pid);
2718 #endif
2719 }
2720
2721 char *procid_str_static(const struct server_id *pid)
2722 {
2723         return procid_str(talloc_tos(), pid);
2724 }
2725
2726 bool procid_valid(const struct server_id *pid)
2727 {
2728         return (pid->pid != -1);
2729 }
2730
2731 bool procid_is_local(const struct server_id *pid)
2732 {
2733 #ifdef CLUSTER_SUPPORT
2734         return pid->vnn == my_vnn;
2735 #else
2736         return True;
2737 #endif
2738 }
2739
2740 int this_is_smp(void)
2741 {
2742 #if defined(HAVE_SYSCONF)
2743
2744 #if defined(SYSCONF_SC_NPROC_ONLN)
2745         return (sysconf(_SC_NPROC_ONLN) > 1) ? 1 : 0;
2746 #elif defined(SYSCONF_SC_NPROCESSORS_ONLN)
2747         return (sysconf(_SC_NPROCESSORS_ONLN) > 1) ? 1 : 0;
2748 #else
2749         return 0;
2750 #endif
2751
2752 #else
2753         return 0;
2754 #endif
2755 }
2756
2757 /****************************************************************
2758  Check if offset/length fit into bufsize. Should probably be
2759  merged with is_offset_safe, but this would require a rewrite
2760  of lanman.c. Later :-)
2761 ****************************************************************/
2762
2763 bool trans_oob(uint32_t bufsize, uint32_t offset, uint32_t length)
2764 {
2765         if ((offset + length < offset) || (offset + length < length)) {
2766                 /* wrap */
2767                 return true;
2768         }
2769         if ((offset > bufsize) || (offset + length > bufsize)) {
2770                 /* overflow */
2771                 return true;
2772         }
2773         return false;
2774 }
2775
2776 /****************************************************************
2777  Check if an offset into a buffer is safe.
2778  If this returns True it's safe to indirect into the byte at
2779  pointer ptr+off.
2780 ****************************************************************/
2781
2782 bool is_offset_safe(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2783 {
2784         const char *end_base = buf_base + buf_len;
2785         char *end_ptr = ptr + off;
2786
2787         if (!buf_base || !ptr) {
2788                 return False;
2789         }
2790
2791         if (end_base < buf_base || end_ptr < ptr) {
2792                 return False; /* wrap. */
2793         }
2794
2795         if (end_ptr < end_base) {
2796                 return True;
2797         }
2798         return False;
2799 }
2800
2801 /****************************************************************
2802  Return a safe pointer into a buffer, or NULL.
2803 ****************************************************************/
2804
2805 char *get_safe_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2806 {
2807         return is_offset_safe(buf_base, buf_len, ptr, off) ?
2808                         ptr + off : NULL;
2809 }
2810
2811 /****************************************************************
2812  Return a safe pointer into a string within a buffer, or NULL.
2813 ****************************************************************/
2814
2815 char *get_safe_str_ptr(const char *buf_base, size_t buf_len, char *ptr, size_t off)
2816 {
2817         if (!is_offset_safe(buf_base, buf_len, ptr, off)) {
2818                 return NULL;
2819         }
2820         /* Check if a valid string exists at this offset. */
2821         if (skip_string(buf_base,buf_len, ptr + off) == NULL) {
2822                 return NULL;
2823         }
2824         return ptr + off;
2825 }
2826
2827 /****************************************************************
2828  Return an SVAL at a pointer, or failval if beyond the end.
2829 ****************************************************************/
2830
2831 int get_safe_SVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2832 {
2833         /*
2834          * Note we use off+1 here, not off+2 as SVAL accesses ptr[0] and ptr[1],
2835          * NOT ptr[2].
2836          */
2837         if (!is_offset_safe(buf_base, buf_len, ptr, off+1)) {
2838                 return failval;
2839         }
2840         return SVAL(ptr,off);
2841 }
2842
2843 /****************************************************************
2844  Return an IVAL at a pointer, or failval if beyond the end.
2845 ****************************************************************/
2846
2847 int get_safe_IVAL(const char *buf_base, size_t buf_len, char *ptr, size_t off, int failval)
2848 {
2849         /*
2850          * Note we use off+3 here, not off+4 as IVAL accesses 
2851          * ptr[0] ptr[1] ptr[2] ptr[3] NOT ptr[4].
2852          */
2853         if (!is_offset_safe(buf_base, buf_len, ptr, off+3)) {
2854                 return failval;
2855         }
2856         return IVAL(ptr,off);
2857 }
2858
2859 /****************************************************************
2860  Split DOM\user into DOM and user. Do not mix with winbind variants of that
2861  call (they take care of winbind separator and other winbind specific settings).
2862 ****************************************************************/
2863
2864 void split_domain_user(TALLOC_CTX *mem_ctx,
2865                        const char *full_name,
2866                        char **domain,
2867                        char **user)
2868 {
2869         const char *p = NULL;
2870
2871         p = strchr_m(full_name, '\\');
2872
2873         if (p != NULL) {
2874                 *domain = talloc_strndup(mem_ctx, full_name,
2875                                          PTR_DIFF(p, full_name));
2876                 *user = talloc_strdup(mem_ctx, p+1);
2877         } else {
2878                 *domain = talloc_strdup(mem_ctx, "");
2879                 *user = talloc_strdup(mem_ctx, full_name);
2880         }
2881 }
2882
2883 #if 0
2884
2885 Disable these now we have checked all code paths and ensured
2886 NULL returns on zero request. JRA.
2887
2888 /****************************************************************
2889  talloc wrapper functions that guarentee a null pointer return
2890  if size == 0.
2891 ****************************************************************/
2892
2893 #ifndef MAX_TALLOC_SIZE
2894 #define MAX_TALLOC_SIZE 0x10000000
2895 #endif
2896
2897 /*
2898  *    talloc and zero memory.
2899  *    - returns NULL if size is zero.
2900  */
2901
2902 void *_talloc_zero_zeronull(const void *ctx, size_t size, const char *name)
2903 {
2904         void *p;
2905
2906         if (size == 0) {
2907                 return NULL;
2908         }
2909
2910         p = talloc_named_const(ctx, size, name);
2911
2912         if (p) {
2913                 memset(p, '\0', size);
2914         }
2915
2916         return p;
2917 }
2918
2919 /*
2920  *   memdup with a talloc.
2921  *   - returns NULL if size is zero.
2922  */
2923
2924 void *_talloc_memdup_zeronull(const void *t, const void *p, size_t size, const char *name)
2925 {
2926         void *newp;
2927
2928         if (size == 0) {
2929                 return NULL;
2930         }
2931
2932         newp = talloc_named_const(t, size, name);
2933         if (newp) {
2934                 memcpy(newp, p, size);
2935         }
2936
2937         return newp;
2938 }
2939
2940 /*
2941  *   alloc an array, checking for integer overflow in the array size.
2942  *   - returns NULL if count or el_size are zero.
2943  */
2944
2945 void *_talloc_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2946 {
2947         if (count >= MAX_TALLOC_SIZE/el_size) {
2948                 return NULL;
2949         }
2950
2951         if (el_size == 0 || count == 0) {
2952                 return NULL;
2953         }
2954
2955         return talloc_named_const(ctx, el_size * count, name);
2956 }
2957
2958 /*
2959  *   alloc an zero array, checking for integer overflow in the array size
2960  *   - returns NULL if count or el_size are zero.
2961  */
2962
2963 void *_talloc_zero_array_zeronull(const void *ctx, size_t el_size, unsigned count, const char *name)
2964 {
2965         if (count >= MAX_TALLOC_SIZE/el_size) {
2966                 return NULL;
2967         }
2968
2969         if (el_size == 0 || count == 0) {
2970                 return NULL;
2971         }
2972
2973         return _talloc_zero(ctx, el_size * count, name);
2974 }
2975
2976 /*
2977  *   Talloc wrapper that returns NULL if size == 0.
2978  */
2979 void *talloc_zeronull(const void *context, size_t size, const char *name)
2980 {
2981         if (size == 0) {
2982                 return NULL;
2983         }
2984         return talloc_named_const(context, size, name);
2985 }
2986 #endif
2987
2988 bool is_valid_policy_hnd(const struct policy_handle *hnd)
2989 {
2990         struct policy_handle tmp;
2991         ZERO_STRUCT(tmp);
2992         return (memcmp(&tmp, hnd, sizeof(tmp)) != 0);
2993 }
2994
2995 bool policy_hnd_equal(const struct policy_handle *hnd1,
2996                       const struct policy_handle *hnd2)
2997 {
2998         if (!hnd1 || !hnd2) {
2999                 return false;
3000         }
3001
3002         return (memcmp(hnd1, hnd2, sizeof(*hnd1)) == 0);
3003 }
3004
3005 /****************************************************************
3006  strip off leading '\\' from a hostname
3007 ****************************************************************/
3008
3009 const char *strip_hostname(const char *s)
3010 {
3011         if (!s) {
3012                 return NULL;
3013         }
3014
3015         if (strlen_m(s) < 3) {
3016                 return s;
3017         }
3018
3019         if (s[0] == '\\') s++;
3020         if (s[0] == '\\') s++;
3021
3022         return s;
3023 }
3024
3025 bool tevent_req_poll_ntstatus(struct tevent_req *req,
3026                               struct tevent_context *ev,
3027                               NTSTATUS *status)
3028 {
3029         bool ret = tevent_req_poll(req, ev);
3030         if (!ret) {
3031                 *status = map_nt_error_from_unix(errno);
3032         }
3033         return ret;
3034 }