2 Unix SMB/CIFS implementation.
3 Samba utility functions
4 Copyright (C) Andrew Tridgell 1992-1998
5 Copyright (C) Jeremy Allison 2001-2002
6 Copyright (C) Simo Sorce 2001
7 Copyright (C) Jim McDonough <jmcd@us.ibm.com> 2003
8 Copyright (C) James Peach 2006
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27 extern fstring local_machine
;
28 extern char *global_clobber_region_function
;
29 extern unsigned int global_clobber_region_line
;
30 extern fstring remote_arch
;
32 /* Max allowable allococation - 256mb - 0x10000000 */
33 #define MAX_ALLOC_SIZE (1024*1024*256)
35 #if (defined(HAVE_NETGROUP) && defined (WITH_AUTOMOUNT))
36 #ifdef WITH_NISPLUS_HOME
37 #ifdef BROKEN_NISPLUS_INCLUDE_FILES
39 * The following lines are needed due to buggy include files
40 * in Solaris 2.6 which define GROUP in both /usr/include/sys/acl.h and
41 * also in /usr/include/rpcsvc/nis.h. The definitions conflict. JRA.
42 * Also GROUP_OBJ is defined as 0x4 in /usr/include/sys/acl.h and as
43 * an enum in /usr/include/rpcsvc/nis.h.
50 #if defined(GROUP_OBJ)
54 #endif /* BROKEN_NISPLUS_INCLUDE_FILES */
56 #include <rpcsvc/nis.h>
58 #endif /* WITH_NISPLUS_HOME */
59 #endif /* HAVE_NETGROUP && WITH_AUTOMOUNT */
61 enum protocol_types Protocol
= PROTOCOL_COREPLUS
;
63 /* a default finfo structure to ensure all fields are sensible */
66 /* this is used by the chaining code */
71 static enum remote_arch_types ra_type
= RA_UNKNOWN
;
72 pstring user_socket_options
=DEFAULT_SOCKET_OPTIONS
;
74 /***********************************************************************
75 Definitions for all names.
76 ***********************************************************************/
78 static char *smb_myname
;
79 static char *smb_myworkgroup
;
80 static char *smb_scope
;
81 static int smb_num_netbios_names
;
82 static char **smb_my_netbios_names
;
84 /***********************************************************************
85 Allocate and set myname. Ensure upper case.
86 ***********************************************************************/
88 BOOL
set_global_myname(const char *myname
)
90 SAFE_FREE(smb_myname
);
91 smb_myname
= SMB_STRDUP(myname
);
94 strupper_m(smb_myname
);
98 const char *global_myname(void)
103 /***********************************************************************
104 Allocate and set myworkgroup. Ensure upper case.
105 ***********************************************************************/
107 BOOL
set_global_myworkgroup(const char *myworkgroup
)
109 SAFE_FREE(smb_myworkgroup
);
110 smb_myworkgroup
= SMB_STRDUP(myworkgroup
);
111 if (!smb_myworkgroup
)
113 strupper_m(smb_myworkgroup
);
117 const char *lp_workgroup(void)
119 return smb_myworkgroup
;
122 /***********************************************************************
123 Allocate and set scope. Ensure upper case.
124 ***********************************************************************/
126 BOOL
set_global_scope(const char *scope
)
128 SAFE_FREE(smb_scope
);
129 smb_scope
= SMB_STRDUP(scope
);
132 strupper_m(smb_scope
);
136 /*********************************************************************
137 Ensure scope is never null string.
138 *********************************************************************/
140 const char *global_scope(void)
143 set_global_scope("");
147 static void free_netbios_names_array(void)
151 for (i
= 0; i
< smb_num_netbios_names
; i
++)
152 SAFE_FREE(smb_my_netbios_names
[i
]);
154 SAFE_FREE(smb_my_netbios_names
);
155 smb_num_netbios_names
= 0;
158 static BOOL
allocate_my_netbios_names_array(size_t number
)
160 free_netbios_names_array();
162 smb_num_netbios_names
= number
+ 1;
163 smb_my_netbios_names
= SMB_MALLOC_ARRAY( char *, smb_num_netbios_names
);
165 if (!smb_my_netbios_names
)
168 memset(smb_my_netbios_names
, '\0', sizeof(char *) * smb_num_netbios_names
);
172 static BOOL
set_my_netbios_names(const char *name
, int i
)
174 SAFE_FREE(smb_my_netbios_names
[i
]);
176 smb_my_netbios_names
[i
] = SMB_STRDUP(name
);
177 if (!smb_my_netbios_names
[i
])
179 strupper_m(smb_my_netbios_names
[i
]);
183 /***********************************************************************
184 Free memory allocated to global objects
185 ***********************************************************************/
187 void gfree_names(void)
189 SAFE_FREE( smb_myname
);
190 SAFE_FREE( smb_myworkgroup
);
191 SAFE_FREE( smb_scope
);
192 free_netbios_names_array();
195 void gfree_all( void )
204 /* release the talloc null_context memory last */
205 talloc_disable_null_tracking();
208 const char *my_netbios_names(int i
)
210 return smb_my_netbios_names
[i
];
213 BOOL
set_netbios_aliases(const char **str_array
)
217 /* Work out the max number of netbios aliases that we have */
218 for( namecount
=0; str_array
&& (str_array
[namecount
] != NULL
); namecount
++ )
221 if ( global_myname() && *global_myname())
224 /* Allocate space for the netbios aliases */
225 if (!allocate_my_netbios_names_array(namecount
))
228 /* Use the global_myname string first */
230 if ( global_myname() && *global_myname()) {
231 set_my_netbios_names( global_myname(), namecount
);
237 for ( i
= 0; str_array
[i
] != NULL
; i
++) {
239 BOOL duplicate
= False
;
241 /* Look for duplicates */
242 for( n
=0; n
<namecount
; n
++ ) {
243 if( strequal( str_array
[i
], my_netbios_names(n
) ) ) {
249 if (!set_my_netbios_names(str_array
[i
], namecount
))
258 /****************************************************************************
259 Common name initialization code.
260 ****************************************************************************/
262 BOOL
init_names(void)
267 if (global_myname() == NULL
|| *global_myname() == '\0') {
268 if (!set_global_myname(myhostname())) {
269 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
274 if (!set_netbios_aliases(lp_netbios_aliases())) {
275 DEBUG( 0, ( "init_structs: malloc fail.\n" ) );
279 fstrcpy( local_machine
, global_myname() );
280 trim_char( local_machine
, ' ', ' ' );
281 p
= strchr( local_machine
, ' ' );
284 strlower_m( local_machine
);
286 DEBUG( 5, ("Netbios name list:-\n") );
287 for( n
=0; my_netbios_names(n
); n
++ )
288 DEBUGADD( 5, ( "my_netbios_names[%d]=\"%s\"\n", n
, my_netbios_names(n
) ) );
293 /**************************************************************************n
294 Find a suitable temporary directory. The result should be copied immediately
295 as it may be overwritten by a subsequent call.
296 ****************************************************************************/
298 const char *tmpdir(void)
301 if ((p
= getenv("TMPDIR")))
306 /****************************************************************************
307 Add a gid to an array of gids if it's not already there.
308 ****************************************************************************/
310 void add_gid_to_array_unique(TALLOC_CTX
*mem_ctx
, gid_t gid
,
311 gid_t
**gids
, size_t *num_gids
)
315 for (i
=0; i
<*num_gids
; i
++) {
316 if ((*gids
)[i
] == gid
)
320 if (mem_ctx
!= NULL
) {
321 *gids
= TALLOC_REALLOC_ARRAY(mem_ctx
, *gids
, gid_t
, *num_gids
+1);
323 *gids
= SMB_REALLOC_ARRAY(*gids
, gid_t
, *num_gids
+1);
330 (*gids
)[*num_gids
] = gid
;
334 /****************************************************************************
335 Like atoi but gets the value up to the separator character.
336 ****************************************************************************/
338 static const char *Atoic(const char *p
, int *n
, const char *c
)
340 if (!isdigit((int)*p
)) {
341 DEBUG(5, ("Atoic: malformed number\n"));
347 while ((*p
) && isdigit((int)*p
))
350 if (strchr_m(c
, *p
) == NULL
) {
351 DEBUG(5, ("Atoic: no separator characters (%s) not found\n", c
));
358 /*************************************************************************
359 Reads a list of numbers.
360 *************************************************************************/
362 const char *get_numlist(const char *p
, uint32
**num
, int *count
)
366 if (num
== NULL
|| count
== NULL
)
372 while ((p
= Atoic(p
, &val
, ":,")) != NULL
&& (*p
) != ':') {
373 *num
= SMB_REALLOC_ARRAY((*num
), uint32
, (*count
)+1);
377 (*num
)[(*count
)] = val
;
385 /*******************************************************************
386 Check if a file exists - call vfs_file_exist for samba files.
387 ********************************************************************/
389 BOOL
file_exist(const char *fname
,SMB_STRUCT_STAT
*sbuf
)
395 if (sys_stat(fname
,sbuf
) != 0)
398 return((S_ISREG(sbuf
->st_mode
)) || (S_ISFIFO(sbuf
->st_mode
)));
401 /*******************************************************************
402 Check a files mod time.
403 ********************************************************************/
405 time_t file_modtime(const char *fname
)
409 if (sys_stat(fname
,&st
) != 0)
415 /*******************************************************************
416 Check if a directory exists.
417 ********************************************************************/
419 BOOL
directory_exist(char *dname
,SMB_STRUCT_STAT
*st
)
427 if (sys_stat(dname
,st
) != 0)
430 ret
= S_ISDIR(st
->st_mode
);
436 /*******************************************************************
437 Returns the size in bytes of the named file.
438 ********************************************************************/
440 SMB_OFF_T
get_file_size(char *file_name
)
444 if(sys_stat(file_name
,&buf
) != 0)
445 return (SMB_OFF_T
)-1;
449 /*******************************************************************
450 Return a string representing an attribute for a file.
451 ********************************************************************/
453 char *attrib_string(uint16 mode
)
455 static fstring attrstr
;
459 if (mode
& aVOLID
) fstrcat(attrstr
,"V");
460 if (mode
& aDIR
) fstrcat(attrstr
,"D");
461 if (mode
& aARCH
) fstrcat(attrstr
,"A");
462 if (mode
& aHIDDEN
) fstrcat(attrstr
,"H");
463 if (mode
& aSYSTEM
) fstrcat(attrstr
,"S");
464 if (mode
& aRONLY
) fstrcat(attrstr
,"R");
469 /*******************************************************************
470 Show a smb message structure.
471 ********************************************************************/
473 void show_msg(char *buf
)
481 DEBUG(5,("size=%d\nsmb_com=0x%x\nsmb_rcls=%d\nsmb_reh=%d\nsmb_err=%d\nsmb_flg=%d\nsmb_flg2=%d\n",
483 (int)CVAL(buf
,smb_com
),
484 (int)CVAL(buf
,smb_rcls
),
485 (int)CVAL(buf
,smb_reh
),
486 (int)SVAL(buf
,smb_err
),
487 (int)CVAL(buf
,smb_flg
),
488 (int)SVAL(buf
,smb_flg2
)));
489 DEBUGADD(5,("smb_tid=%d\nsmb_pid=%d\nsmb_uid=%d\nsmb_mid=%d\n",
490 (int)SVAL(buf
,smb_tid
),
491 (int)SVAL(buf
,smb_pid
),
492 (int)SVAL(buf
,smb_uid
),
493 (int)SVAL(buf
,smb_mid
)));
494 DEBUGADD(5,("smt_wct=%d\n",(int)CVAL(buf
,smb_wct
)));
496 for (i
=0;i
<(int)CVAL(buf
,smb_wct
);i
++)
497 DEBUGADD(5,("smb_vwv[%2d]=%5d (0x%X)\n",i
,
498 SVAL(buf
,smb_vwv
+2*i
),SVAL(buf
,smb_vwv
+2*i
)));
500 bcc
= (int)SVAL(buf
,smb_vwv
+2*(CVAL(buf
,smb_wct
)));
502 DEBUGADD(5,("smb_bcc=%d\n",bcc
));
510 dump_data(10, smb_buf(buf
), bcc
);
513 /*******************************************************************
514 Set the length and marker of an smb packet.
515 ********************************************************************/
517 void smb_setlen(char *buf
,int len
)
519 _smb_setlen(buf
,len
);
527 /*******************************************************************
528 Setup the word count and byte count for a smb message.
529 ********************************************************************/
531 int set_message(char *buf
,int num_words
,int num_bytes
,BOOL zero
)
533 if (zero
&& (num_words
|| num_bytes
)) {
534 memset(buf
+ smb_size
,'\0',num_words
*2 + num_bytes
);
536 SCVAL(buf
,smb_wct
,num_words
);
537 SSVAL(buf
,smb_vwv
+ num_words
*SIZEOFWORD
,num_bytes
);
538 smb_setlen(buf
,smb_size
+ num_words
*2 + num_bytes
- 4);
539 return (smb_size
+ num_words
*2 + num_bytes
);
542 /*******************************************************************
543 Setup only the byte count for a smb message.
544 ********************************************************************/
546 int set_message_bcc(char *buf
,int num_bytes
)
548 int num_words
= CVAL(buf
,smb_wct
);
549 SSVAL(buf
,smb_vwv
+ num_words
*SIZEOFWORD
,num_bytes
);
550 smb_setlen(buf
,smb_size
+ num_words
*2 + num_bytes
- 4);
551 return (smb_size
+ num_words
*2 + num_bytes
);
554 /*******************************************************************
555 Setup only the byte count for a smb message, using the end of the
557 ********************************************************************/
559 int set_message_end(void *outbuf
,void *end_ptr
)
561 return set_message_bcc((char *)outbuf
,PTR_DIFF(end_ptr
,smb_buf((char *)outbuf
)));
564 /*******************************************************************
565 Reduce a file name, removing .. elements.
566 ********************************************************************/
568 void dos_clean_name(char *s
)
572 DEBUG(3,("dos_clean_name [%s]\n",s
));
574 /* remove any double slashes */
575 all_string_sub(s
, "\\\\", "\\", 0);
577 while ((p
= strstr_m(s
,"\\..\\")) != NULL
) {
583 if ((p
=strrchr_m(s
,'\\')) != NULL
)
590 trim_string(s
,NULL
,"\\..");
592 all_string_sub(s
, "\\.\\", "\\", 0);
595 /*******************************************************************
596 Reduce a file name, removing .. elements.
597 ********************************************************************/
599 void unix_clean_name(char *s
)
603 DEBUG(3,("unix_clean_name [%s]\n",s
));
605 /* remove any double slashes */
606 all_string_sub(s
, "//","/", 0);
608 /* Remove leading ./ characters */
609 if(strncmp(s
, "./", 2) == 0) {
610 trim_string(s
, "./", NULL
);
615 while ((p
= strstr_m(s
,"/../")) != NULL
) {
621 if ((p
=strrchr_m(s
,'/')) != NULL
)
628 trim_string(s
,NULL
,"/..");
631 /*******************************************************************
632 Close the low 3 fd's and open dev/null in their place.
633 ********************************************************************/
635 void close_low_fds(BOOL stderr_too
)
647 /* try and use up these file descriptors, so silly
648 library routines writing to stdout etc won't cause havoc */
650 if (i
== 2 && !stderr_too
)
653 fd
= sys_open("/dev/null",O_RDWR
,0);
655 fd
= sys_open("/dev/null",O_WRONLY
,0);
657 DEBUG(0,("Can't open /dev/null\n"));
661 DEBUG(0,("Didn't get file descriptor %d\n",i
));
668 /*******************************************************************
669 Write data into an fd at a given offset. Ignore seek errors.
670 ********************************************************************/
672 ssize_t
write_data_at_offset(int fd
, const char *buffer
, size_t N
, SMB_OFF_T pos
)
677 if (pos
== (SMB_OFF_T
)-1) {
678 return write_data(fd
, buffer
, N
);
680 #if defined(HAVE_PWRITE) || defined(HAVE_PRWITE64)
682 ret
= sys_pwrite(fd
,buffer
+ total
,N
- total
, pos
);
683 if (ret
== -1 && errno
== ESPIPE
) {
684 return write_data(fd
, buffer
+ total
,N
- total
);
687 DEBUG(0,("write_data_at_offset: write failure. Error = %s\n", strerror(errno
) ));
696 return (ssize_t
)total
;
698 /* Use lseek and write_data. */
699 if (sys_lseek(fd
, pos
, SEEK_SET
) == -1) {
700 if (errno
!= ESPIPE
) {
704 return write_data(fd
, buffer
, N
);
708 /****************************************************************************
709 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
713 ****************************************************************************/
715 int set_blocking(int fd
, BOOL set
)
719 #define FLAG_TO_SET O_NONBLOCK
722 #define FLAG_TO_SET O_NDELAY
724 #define FLAG_TO_SET FNDELAY
728 if((val
= sys_fcntl_long(fd
, F_GETFL
, 0)) == -1)
730 if(set
) /* Turn blocking on - ie. clear nonblock flag */
734 return sys_fcntl_long( fd
, F_SETFL
, val
);
738 /****************************************************************************
739 Transfer some data between two fd's.
740 ****************************************************************************/
742 #ifndef TRANSFER_BUF_SIZE
743 #define TRANSFER_BUF_SIZE 65536
746 ssize_t
transfer_file_internal(int infd
, int outfd
, size_t n
, ssize_t (*read_fn
)(int, void *, size_t),
747 ssize_t (*write_fn
)(int, const void *, size_t))
753 size_t num_to_read_thistime
;
754 size_t num_written
= 0;
756 if ((buf
= SMB_MALLOC_ARRAY(char, TRANSFER_BUF_SIZE
)) == NULL
)
760 num_to_read_thistime
= MIN((n
- total
), TRANSFER_BUF_SIZE
);
762 read_ret
= (*read_fn
)(infd
, buf
, num_to_read_thistime
);
763 if (read_ret
== -1) {
764 DEBUG(0,("transfer_file_internal: read failure. Error = %s\n", strerror(errno
) ));
773 while (num_written
< read_ret
) {
774 write_ret
= (*write_fn
)(outfd
,buf
+ num_written
, read_ret
- num_written
);
776 if (write_ret
== -1) {
777 DEBUG(0,("transfer_file_internal: write failure. Error = %s\n", strerror(errno
) ));
782 return (ssize_t
)total
;
784 num_written
+= (size_t)write_ret
;
787 total
+= (size_t)read_ret
;
791 return (ssize_t
)total
;
794 SMB_OFF_T
transfer_file(int infd
,int outfd
,SMB_OFF_T n
)
796 return (SMB_OFF_T
)transfer_file_internal(infd
, outfd
, (size_t)n
, sys_read
, sys_write
);
799 /*******************************************************************
800 Sleep for a specified number of milliseconds.
801 ********************************************************************/
803 void smb_msleep(unsigned int t
)
805 #if defined(HAVE_NANOSLEEP)
806 struct timespec tval
;
809 tval
.tv_sec
= t
/1000;
810 tval
.tv_nsec
= 1000000*(t
%1000);
814 ret
= nanosleep(&tval
, &tval
);
815 } while (ret
< 0 && errno
== EINTR
&& (tval
.tv_sec
> 0 || tval
.tv_nsec
> 0));
817 unsigned int tdiff
=0;
818 struct timeval tval
,t1
,t2
;
825 tval
.tv_sec
= (t
-tdiff
)/1000;
826 tval
.tv_usec
= 1000*((t
-tdiff
)%1000);
828 /* Never wait for more than 1 sec. */
829 if (tval
.tv_sec
> 1) {
836 sys_select_intr(0,&fds
,NULL
,NULL
,&tval
);
839 if (t2
.tv_sec
< t1
.tv_sec
) {
840 /* Someone adjusted time... */
844 tdiff
= TvalDiff(&t1
,&t2
);
849 /****************************************************************************
850 Become a daemon, discarding the controlling terminal.
851 ****************************************************************************/
853 void become_daemon(BOOL Fork
, BOOL no_process_group
)
861 /* detach from the terminal */
863 if (!no_process_group
) setsid();
864 #elif defined(TIOCNOTTY)
865 if (!no_process_group
) {
866 int i
= sys_open("/dev/tty", O_RDWR
, 0);
868 ioctl(i
, (int) TIOCNOTTY
, (char *)0);
872 #endif /* HAVE_SETSID */
874 /* Close fd's 0,1,2. Needed if started by rsh */
875 close_low_fds(False
); /* Don't close stderr, let the debug system
876 attach it to the logfile */
879 /****************************************************************************
880 Put up a yes/no prompt.
881 ****************************************************************************/
888 if (!fgets(ans
,sizeof(ans
)-1,stdin
))
891 if (*ans
== 'y' || *ans
== 'Y')
897 #if defined(PARANOID_MALLOC_CHECKER)
899 /****************************************************************************
900 Internal malloc wrapper. Externally visible.
901 ****************************************************************************/
903 void *malloc_(size_t size
)
907 #define malloc(s) __ERROR_DONT_USE_MALLOC_DIRECTLY
910 /****************************************************************************
911 Internal calloc wrapper. Not externally visible.
912 ****************************************************************************/
914 static void *calloc_(size_t count
, size_t size
)
917 return calloc(count
, size
);
918 #define calloc(n,s) __ERROR_DONT_USE_CALLOC_DIRECTLY
921 /****************************************************************************
922 Internal realloc wrapper. Not externally visible.
923 ****************************************************************************/
925 static void *realloc_(void *ptr
, size_t size
)
928 return realloc(ptr
, size
);
929 #define realloc(p,s) __ERROR_DONT_USE_RELLOC_DIRECTLY
932 #endif /* PARANOID_MALLOC_CHECKER */
934 /****************************************************************************
936 ****************************************************************************/
938 void *malloc_array(size_t el_size
, unsigned int count
)
940 if (count
>= MAX_ALLOC_SIZE
/el_size
) {
944 #if defined(PARANOID_MALLOC_CHECKER)
945 return malloc_(el_size
*count
);
947 return malloc(el_size
*count
);
951 /****************************************************************************
953 ****************************************************************************/
955 void *calloc_array(size_t size
, size_t nmemb
)
957 if (nmemb
>= MAX_ALLOC_SIZE
/size
) {
960 #if defined(PARANOID_MALLOC_CHECKER)
961 return calloc_(nmemb
, size
);
963 return calloc(nmemb
, size
);
967 /****************************************************************************
968 Expand a pointer to be a particular size.
969 Note that this version of Realloc has an extra parameter that decides
970 whether to free the passed in storage on allocation failure or if the
973 This is designed for use in the typical idiom of :
975 p = SMB_REALLOC(p, size)
980 and not to have to keep track of the old 'p' contents to free later, nor
981 to worry if the size parameter was zero. In the case where NULL is returned
982 we guarentee that p has been freed.
984 If free later semantics are desired, then pass 'free_old_on_error' as False which
985 guarentees that the old contents are not freed on error, even if size == 0. To use
988 tmp = SMB_REALLOC_KEEP_OLD_ON_ERROR(p, size);
996 Changes were instigated by Coverity error checking. JRA.
997 ****************************************************************************/
999 void *Realloc(void *p
, size_t size
, BOOL free_old_on_error
)
1004 if (free_old_on_error
) {
1007 DEBUG(2,("Realloc asked for 0 bytes\n"));
1011 #if defined(PARANOID_MALLOC_CHECKER)
1013 ret
= (void *)malloc_(size
);
1015 ret
= (void *)realloc_(p
,size
);
1019 ret
= (void *)malloc(size
);
1021 ret
= (void *)realloc(p
,size
);
1026 if (free_old_on_error
&& p
) {
1029 DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size
));
1035 /****************************************************************************
1037 ****************************************************************************/
1039 void *realloc_array(void *p
, size_t el_size
, unsigned int count
, BOOL free_old_on_error
)
1041 if (count
>= MAX_ALLOC_SIZE
/el_size
) {
1042 if (free_old_on_error
) {
1047 return Realloc(p
, el_size
*count
, free_old_on_error
);
1050 /****************************************************************************
1051 (Hopefully) efficient array append.
1052 ****************************************************************************/
1054 void add_to_large_array(TALLOC_CTX
*mem_ctx
, size_t element_size
,
1055 void *element
, void *_array
, uint32
*num_elements
,
1056 ssize_t
*array_size
)
1058 void **array
= (void **)_array
;
1060 if (*array_size
< 0) {
1064 if (*array
== NULL
) {
1065 if (*array_size
== 0) {
1069 if (*array_size
>= MAX_ALLOC_SIZE
/element_size
) {
1073 if (mem_ctx
!= NULL
) {
1074 *array
= TALLOC(mem_ctx
, element_size
* (*array_size
));
1076 *array
= SMB_MALLOC(element_size
* (*array_size
));
1079 if (*array
== NULL
) {
1084 if (*num_elements
== *array_size
) {
1087 if (*array_size
>= MAX_ALLOC_SIZE
/element_size
) {
1091 if (mem_ctx
!= NULL
) {
1092 *array
= TALLOC_REALLOC(mem_ctx
, *array
,
1093 element_size
* (*array_size
));
1095 *array
= SMB_REALLOC(*array
,
1096 element_size
* (*array_size
));
1099 if (*array
== NULL
) {
1104 memcpy((char *)(*array
) + element_size
*(*num_elements
),
1105 element
, element_size
);
1115 /****************************************************************************
1116 Free memory, checks for NULL.
1117 Use directly SAFE_FREE()
1118 Exists only because we need to pass a function pointer somewhere --SSS
1119 ****************************************************************************/
1121 void safe_free(void *p
)
1126 /****************************************************************************
1127 Get my own name and IP.
1128 ****************************************************************************/
1130 BOOL
get_myname(char *my_name
)
1136 /* get my host name */
1137 if (gethostname(hostname
, sizeof(hostname
)) == -1) {
1138 DEBUG(0,("gethostname failed\n"));
1142 /* Ensure null termination. */
1143 hostname
[sizeof(hostname
)-1] = '\0';
1146 /* split off any parts after an initial . */
1147 char *p
= strchr_m(hostname
,'.');
1152 fstrcpy(my_name
,hostname
);
1158 /****************************************************************************
1159 Get my own canonical name, including domain.
1160 ****************************************************************************/
1162 BOOL
get_mydnsfullname(fstring my_dnsname
)
1164 static fstring dnshostname
;
1167 if (!*dnshostname
) {
1168 /* get my host name */
1169 if (gethostname(dnshostname
, sizeof(dnshostname
)) == -1) {
1170 *dnshostname
= '\0';
1171 DEBUG(0,("gethostname failed\n"));
1175 /* Ensure null termination. */
1176 dnshostname
[sizeof(dnshostname
)-1] = '\0';
1178 /* Ensure we get the cannonical name. */
1179 if (!(hp
= sys_gethostbyname(dnshostname
))) {
1180 *dnshostname
= '\0';
1183 fstrcpy(dnshostname
, hp
->h_name
);
1185 fstrcpy(my_dnsname
, dnshostname
);
1189 /****************************************************************************
1190 Get my own domain name.
1191 ****************************************************************************/
1193 BOOL
get_mydnsdomname(fstring my_domname
)
1199 if (!get_mydnsfullname(domname
)) {
1202 p
= strchr_m(domname
, '.');
1205 fstrcpy(my_domname
, p
);
1211 /****************************************************************************
1212 Interpret a protocol description string, with a default.
1213 ****************************************************************************/
1215 int interpret_protocol(const char *str
,int def
)
1217 if (strequal(str
,"NT1"))
1218 return(PROTOCOL_NT1
);
1219 if (strequal(str
,"LANMAN2"))
1220 return(PROTOCOL_LANMAN2
);
1221 if (strequal(str
,"LANMAN1"))
1222 return(PROTOCOL_LANMAN1
);
1223 if (strequal(str
,"CORE"))
1224 return(PROTOCOL_CORE
);
1225 if (strequal(str
,"COREPLUS"))
1226 return(PROTOCOL_COREPLUS
);
1227 if (strequal(str
,"CORE+"))
1228 return(PROTOCOL_COREPLUS
);
1230 DEBUG(0,("Unrecognised protocol level %s\n",str
));
1235 /****************************************************************************
1236 Return true if a string could be a pure IP address.
1237 ****************************************************************************/
1239 BOOL
is_ipaddress(const char *str
)
1241 BOOL pure_address
= True
;
1244 for (i
=0; pure_address
&& str
[i
]; i
++)
1245 if (!(isdigit((int)str
[i
]) || str
[i
] == '.'))
1246 pure_address
= False
;
1248 /* Check that a pure number is not misinterpreted as an IP */
1249 pure_address
= pure_address
&& (strchr_m(str
, '.') != NULL
);
1251 return pure_address
;
1254 /****************************************************************************
1255 Interpret an internet address or name into an IP address in 4 byte form.
1256 ****************************************************************************/
1258 uint32
interpret_addr(const char *str
)
1263 if (strcmp(str
,"0.0.0.0") == 0)
1265 if (strcmp(str
,"255.255.255.255") == 0)
1268 /* if it's in the form of an IP address then get the lib to interpret it */
1269 if (is_ipaddress(str
)) {
1270 res
= inet_addr(str
);
1272 /* otherwise assume it's a network name of some sort and use
1273 sys_gethostbyname */
1274 if ((hp
= sys_gethostbyname(str
)) == 0) {
1275 DEBUG(3,("sys_gethostbyname: Unknown host. %s\n",str
));
1279 if(hp
->h_addr
== NULL
) {
1280 DEBUG(3,("sys_gethostbyname: host address is invalid for host %s\n",str
));
1283 putip((char *)&res
,(char *)hp
->h_addr
);
1286 if (res
== (uint32
)-1)
1292 /*******************************************************************
1293 A convenient addition to interpret_addr().
1294 ******************************************************************/
1296 struct in_addr
*interpret_addr2(const char *str
)
1298 static struct in_addr ret
;
1299 uint32 a
= interpret_addr(str
);
1304 /*******************************************************************
1305 Check if an IP is the 0.0.0.0.
1306 ******************************************************************/
1308 BOOL
is_zero_ip(struct in_addr ip
)
1311 putip((char *)&a
,(char *)&ip
);
1315 /*******************************************************************
1316 Set an IP to 0.0.0.0.
1317 ******************************************************************/
1319 void zero_ip(struct in_addr
*ip
)
1322 static struct in_addr ipzero
;
1325 ipzero
= *interpret_addr2("0.0.0.0");
1332 #if (defined(HAVE_NETGROUP) && defined(WITH_AUTOMOUNT))
1333 /******************************************************************
1334 Remove any mount options such as -rsize=2048,wsize=2048 etc.
1335 Based on a fix from <Thomas.Hepper@icem.de>.
1336 *******************************************************************/
1338 static void strip_mount_options( pstring
*str
)
1342 while(*p
&& !isspace(*p
))
1344 while(*p
&& isspace(*p
))
1349 pstrcpy(tmp_str
, p
);
1350 pstrcpy(*str
, tmp_str
);
1355 /*******************************************************************
1356 Patch from jkf@soton.ac.uk
1357 Split Luke's automount_server into YP lookup and string splitter
1358 so can easily implement automount_path().
1359 As we may end up doing both, cache the last YP result.
1360 *******************************************************************/
1362 #ifdef WITH_NISPLUS_HOME
1363 char *automount_lookup(const char *user_name
)
1365 static fstring last_key
= "";
1366 static pstring last_value
= "";
1368 char *nis_map
= (char *)lp_nis_home_map_name();
1370 char buffer
[NIS_MAXATTRVAL
+ 1];
1375 if (strcmp(user_name
, last_key
)) {
1376 slprintf(buffer
, sizeof(buffer
)-1, "[key=%s],%s", user_name
, nis_map
);
1377 DEBUG(5, ("NIS+ querystring: %s\n", buffer
));
1379 if (result
= nis_list(buffer
, FOLLOW_PATH
|EXPAND_NAME
|HARD_LOOKUP
, NULL
, NULL
)) {
1380 if (result
->status
!= NIS_SUCCESS
) {
1381 DEBUG(3, ("NIS+ query failed: %s\n", nis_sperrno(result
->status
)));
1382 fstrcpy(last_key
, ""); pstrcpy(last_value
, "");
1384 object
= result
->objects
.objects_val
;
1385 if (object
->zo_data
.zo_type
== ENTRY_OBJ
) {
1386 entry
= &object
->zo_data
.objdata_u
.en_data
;
1387 DEBUG(5, ("NIS+ entry type: %s\n", entry
->en_type
));
1388 DEBUG(3, ("NIS+ result: %s\n", entry
->en_cols
.en_cols_val
[1].ec_value
.ec_value_val
));
1390 pstrcpy(last_value
, entry
->en_cols
.en_cols_val
[1].ec_value
.ec_value_val
);
1391 pstring_sub(last_value
, "&", user_name
);
1392 fstrcpy(last_key
, user_name
);
1396 nis_freeresult(result
);
1399 strip_mount_options(&last_value
);
1401 DEBUG(4, ("NIS+ Lookup: %s resulted in %s\n", user_name
, last_value
));
1404 #else /* WITH_NISPLUS_HOME */
1406 char *automount_lookup(const char *user_name
)
1408 static fstring last_key
= "";
1409 static pstring last_value
= "";
1411 int nis_error
; /* returned by yp all functions */
1412 char *nis_result
; /* yp_match inits this */
1413 int nis_result_len
; /* and set this */
1414 char *nis_domain
; /* yp_get_default_domain inits this */
1415 char *nis_map
= (char *)lp_nis_home_map_name();
1417 if ((nis_error
= yp_get_default_domain(&nis_domain
)) != 0) {
1418 DEBUG(3, ("YP Error: %s\n", yperr_string(nis_error
)));
1422 DEBUG(5, ("NIS Domain: %s\n", nis_domain
));
1424 if (!strcmp(user_name
, last_key
)) {
1425 nis_result
= last_value
;
1426 nis_result_len
= strlen(last_value
);
1429 if ((nis_error
= yp_match(nis_domain
, nis_map
, user_name
, strlen(user_name
),
1430 &nis_result
, &nis_result_len
)) == 0) {
1431 fstrcpy(last_key
, user_name
);
1432 pstrcpy(last_value
, nis_result
);
1433 strip_mount_options(&last_value
);
1435 } else if(nis_error
== YPERR_KEY
) {
1437 /* If Key lookup fails user home server is not in nis_map
1438 use default information for server, and home directory */
1440 DEBUG(3, ("YP Key not found: while looking up \"%s\" in map \"%s\"\n",
1441 user_name
, nis_map
));
1442 DEBUG(3, ("using defaults for server and home directory\n"));
1444 DEBUG(3, ("YP Error: \"%s\" while looking up \"%s\" in map \"%s\"\n",
1445 yperr_string(nis_error
), user_name
, nis_map
));
1449 DEBUG(4, ("YP Lookup: %s resulted in %s\n", user_name
, last_value
));
1452 #endif /* WITH_NISPLUS_HOME */
1455 /*******************************************************************
1456 Are two IPs on the same subnet?
1457 ********************************************************************/
1459 BOOL
same_net(struct in_addr ip1
,struct in_addr ip2
,struct in_addr mask
)
1461 uint32 net1
,net2
,nmask
;
1463 nmask
= ntohl(mask
.s_addr
);
1464 net1
= ntohl(ip1
.s_addr
);
1465 net2
= ntohl(ip2
.s_addr
);
1467 return((net1
& nmask
) == (net2
& nmask
));
1471 /****************************************************************************
1472 Check if a process exists. Does this work on all unixes?
1473 ****************************************************************************/
1475 BOOL
process_exists(const struct process_id pid
)
1477 if (procid_is_me(&pid
)) {
1481 if (!procid_is_local(&pid
)) {
1482 /* This *SEVERELY* needs fixing. */
1486 /* Doing kill with a non-positive pid causes messages to be
1487 * sent to places we don't want. */
1488 SMB_ASSERT(pid
.pid
> 0);
1489 return(kill(pid
.pid
,0) == 0 || errno
!= ESRCH
);
1492 BOOL
process_exists_by_pid(pid_t pid
)
1494 return process_exists(pid_to_procid(pid
));
1497 /*******************************************************************
1498 Convert a uid into a user name.
1499 ********************************************************************/
1501 const char *uidtoname(uid_t uid
)
1503 static fstring name
;
1504 struct passwd
*pass
;
1506 pass
= getpwuid_alloc(NULL
, uid
);
1508 fstrcpy(name
, pass
->pw_name
);
1511 slprintf(name
, sizeof(name
) - 1, "%ld",(long int)uid
);
1517 /*******************************************************************
1518 Convert a gid into a group name.
1519 ********************************************************************/
1521 char *gidtoname(gid_t gid
)
1523 static fstring name
;
1526 grp
= getgrgid(gid
);
1528 return(grp
->gr_name
);
1529 slprintf(name
,sizeof(name
) - 1, "%d",(int)gid
);
1533 /*******************************************************************
1534 Convert a user name into a uid.
1535 ********************************************************************/
1537 uid_t
nametouid(const char *name
)
1539 struct passwd
*pass
;
1543 pass
= getpwnam_alloc(NULL
, name
);
1550 u
= (uid_t
)strtol(name
, &p
, 0);
1551 if ((p
!= name
) && (*p
== '\0'))
1557 /*******************************************************************
1558 Convert a name to a gid_t if possible. Return -1 if not a group.
1559 ********************************************************************/
1561 gid_t
nametogid(const char *name
)
1567 g
= (gid_t
)strtol(name
, &p
, 0);
1568 if ((p
!= name
) && (*p
== '\0'))
1571 grp
= sys_getgrnam(name
);
1573 return(grp
->gr_gid
);
1577 /*******************************************************************
1578 Something really nasty happened - panic !
1579 ********************************************************************/
1581 void smb_panic(const char *const why
)
1589 if (global_clobber_region_function
) {
1590 DEBUG(0,("smb_panic: clobber_region() last called from [%s(%u)]\n",
1591 global_clobber_region_function
,
1592 global_clobber_region_line
));
1597 DEBUG(0,("PANIC (pid %llu): %s\n",
1598 (unsigned long long)sys_getpid(), why
));
1601 cmd
= lp_panic_action();
1603 DEBUG(0, ("smb_panic(): calling panic action [%s]\n", cmd
));
1604 result
= system(cmd
);
1607 DEBUG(0, ("smb_panic(): fork failed in panic action: %s\n",
1610 DEBUG(0, ("smb_panic(): action returned status %d\n",
1611 WEXITSTATUS(result
)));
1617 /*******************************************************************
1618 Print a backtrace of the stack to the debug log. This function
1619 DELIBERATELY LEAKS MEMORY. The expectation is that you should
1620 exit shortly after calling it.
1621 ********************************************************************/
1623 #ifdef HAVE_LIBUNWIND_H
1624 #include <libunwind.h>
1627 #ifdef HAVE_EXECINFO_H
1628 #include <execinfo.h>
1631 #ifdef HAVE_LIBEXC_H
1635 void log_stack_trace(void)
1637 #ifdef HAVE_LIBUNWIND
1638 /* Try to use libunwind before any other technique since on ia64
1639 * libunwind correctly walks the stack in more circumstances than
1642 unw_cursor_t cursor
;
1647 unw_word_t ip
, sp
, off
;
1649 procname
[sizeof(procname
) - 1] = '\0';
1651 if (unw_getcontext(&uc
) != 0) {
1652 goto libunwind_failed
;
1655 if (unw_init_local(&cursor
, &uc
) != 0) {
1656 goto libunwind_failed
;
1659 DEBUG(0, ("BACKTRACE:\n"));
1663 unw_get_reg(&cursor
, UNW_REG_IP
, &ip
);
1664 unw_get_reg(&cursor
, UNW_REG_SP
, &sp
);
1666 switch (unw_get_proc_name(&cursor
,
1667 procname
, sizeof(procname
) - 1, &off
) ) {
1671 /* Name truncated. */
1672 DEBUGADD(0, (" #%u %s + %#llx [ip=%#llx] [sp=%#llx]\n",
1673 i
, procname
, (long long)off
,
1674 (long long)ip
, (long long) sp
));
1677 /* case -UNW_ENOINFO: */
1678 /* case -UNW_EUNSPEC: */
1679 /* No symbol name found. */
1680 DEBUGADD(0, (" #%u %s [ip=%#llx] [sp=%#llx]\n",
1681 i
, "<unknown symbol>",
1682 (long long)ip
, (long long) sp
));
1685 } while (unw_step(&cursor
) > 0);
1690 DEBUG(0, ("unable to produce a stack trace with libunwind\n"));
1692 #elif HAVE_BACKTRACE_SYMBOLS
1693 void *backtrace_stack
[BACKTRACE_STACK_SIZE
];
1694 size_t backtrace_size
;
1695 char **backtrace_strings
;
1697 /* get the backtrace (stack frames) */
1698 backtrace_size
= backtrace(backtrace_stack
,BACKTRACE_STACK_SIZE
);
1699 backtrace_strings
= backtrace_symbols(backtrace_stack
, backtrace_size
);
1701 DEBUG(0, ("BACKTRACE: %lu stack frames:\n",
1702 (unsigned long)backtrace_size
));
1704 if (backtrace_strings
) {
1707 for (i
= 0; i
< backtrace_size
; i
++)
1708 DEBUGADD(0, (" #%u %s\n", i
, backtrace_strings
[i
]));
1710 /* Leak the backtrace_strings, rather than risk what free() might do */
1715 /* The IRIX libexc library provides an API for unwinding the stack. See
1716 * libexc(3) for details. Apparantly trace_back_stack leaks memory, but
1717 * since we are about to abort anyway, it hardly matters.
1720 #define NAMESIZE 32 /* Arbitrary */
1722 __uint64_t addrs
[BACKTRACE_STACK_SIZE
];
1723 char * names
[BACKTRACE_STACK_SIZE
];
1724 char namebuf
[BACKTRACE_STACK_SIZE
* NAMESIZE
];
1731 ZERO_ARRAY(namebuf
);
1733 /* We need to be root so we can open our /proc entry to walk
1734 * our stack. It also helps when we want to dump core.
1738 for (i
= 0; i
< BACKTRACE_STACK_SIZE
; i
++) {
1739 names
[i
] = namebuf
+ (i
* NAMESIZE
);
1742 levels
= trace_back_stack(0, addrs
, names
,
1743 BACKTRACE_STACK_SIZE
, NAMESIZE
- 1);
1745 DEBUG(0, ("BACKTRACE: %d stack frames:\n", levels
));
1746 for (i
= 0; i
< levels
; i
++) {
1747 DEBUGADD(0, (" #%d 0x%llx %s\n", i
, addrs
[i
], names
[i
]));
1752 DEBUG(0, ("unable to produce a stack trace on this platform\n"));
1756 /*******************************************************************
1757 A readdir wrapper which just returns the file name.
1758 ********************************************************************/
1760 const char *readdirname(SMB_STRUCT_DIR
*p
)
1762 SMB_STRUCT_DIRENT
*ptr
;
1768 ptr
= (SMB_STRUCT_DIRENT
*)sys_readdir(p
);
1772 dname
= ptr
->d_name
;
1779 #ifdef HAVE_BROKEN_READDIR_NAME
1780 /* using /usr/ucb/cc is BAD */
1786 int len
= NAMLEN(ptr
);
1787 memcpy(buf
, dname
, len
);
1795 /*******************************************************************
1796 Utility function used to decide if the last component
1797 of a path matches a (possibly wildcarded) entry in a namelist.
1798 ********************************************************************/
1800 BOOL
is_in_path(const char *name
, name_compare_entry
*namelist
, BOOL case_sensitive
)
1802 pstring last_component
;
1805 /* if we have no list it's obviously not in the path */
1806 if((namelist
== NULL
) || ((namelist
!= NULL
) && (namelist
[0].name
== NULL
))) {
1810 DEBUG(8, ("is_in_path: %s\n", name
));
1812 /* Get the last component of the unix name. */
1813 p
= strrchr_m(name
, '/');
1814 pstrcpy(last_component
, p
? ++p
: name
);
1816 for(; namelist
->name
!= NULL
; namelist
++) {
1817 if(namelist
->is_wild
) {
1818 if (mask_match(last_component
, namelist
->name
, case_sensitive
)) {
1819 DEBUG(8,("is_in_path: mask match succeeded\n"));
1823 if((case_sensitive
&& (strcmp(last_component
, namelist
->name
) == 0))||
1824 (!case_sensitive
&& (StrCaseCmp(last_component
, namelist
->name
) == 0))) {
1825 DEBUG(8,("is_in_path: match succeeded\n"));
1830 DEBUG(8,("is_in_path: match not found\n"));
1835 /*******************************************************************
1836 Strip a '/' separated list into an array of
1837 name_compare_enties structures suitable for
1838 passing to is_in_path(). We do this for
1839 speed so we can pre-parse all the names in the list
1840 and don't do it for each call to is_in_path().
1841 namelist is modified here and is assumed to be
1842 a copy owned by the caller.
1843 We also check if the entry contains a wildcard to
1844 remove a potentially expensive call to mask_match
1846 ********************************************************************/
1848 void set_namearray(name_compare_entry
**ppname_array
, char *namelist
)
1851 char *nameptr
= namelist
;
1852 int num_entries
= 0;
1855 (*ppname_array
) = NULL
;
1857 if((nameptr
== NULL
) || ((nameptr
!= NULL
) && (*nameptr
== '\0')))
1860 /* We need to make two passes over the string. The
1861 first to count the number of elements, the second
1866 if ( *nameptr
== '/' ) {
1867 /* cope with multiple (useless) /s) */
1871 /* find the next / */
1872 name_end
= strchr_m(nameptr
, '/');
1874 /* oops - the last check for a / didn't find one. */
1875 if (name_end
== NULL
)
1878 /* next segment please */
1879 nameptr
= name_end
+ 1;
1883 if(num_entries
== 0)
1886 if(( (*ppname_array
) = SMB_MALLOC_ARRAY(name_compare_entry
, num_entries
+ 1)) == NULL
) {
1887 DEBUG(0,("set_namearray: malloc fail\n"));
1891 /* Now copy out the names */
1895 if ( *nameptr
== '/' ) {
1896 /* cope with multiple (useless) /s) */
1900 /* find the next / */
1901 if ((name_end
= strchr_m(nameptr
, '/')) != NULL
)
1904 /* oops - the last check for a / didn't find one. */
1905 if(name_end
== NULL
)
1908 (*ppname_array
)[i
].is_wild
= ms_has_wild(nameptr
);
1909 if(((*ppname_array
)[i
].name
= SMB_STRDUP(nameptr
)) == NULL
) {
1910 DEBUG(0,("set_namearray: malloc fail (1)\n"));
1914 /* next segment please */
1915 nameptr
= name_end
+ 1;
1919 (*ppname_array
)[i
].name
= NULL
;
1924 /****************************************************************************
1925 Routine to free a namearray.
1926 ****************************************************************************/
1928 void free_namearray(name_compare_entry
*name_array
)
1932 if(name_array
== NULL
)
1935 for(i
=0; name_array
[i
].name
!=NULL
; i
++)
1936 SAFE_FREE(name_array
[i
].name
);
1937 SAFE_FREE(name_array
);
1941 #define DBGC_CLASS DBGC_LOCKING
1943 /****************************************************************************
1944 Simple routine to do POSIX file locking. Cruft in NFS and 64->32 bit mapping
1945 is dealt with in posix.c
1946 Returns True if the lock was granted, False otherwise.
1947 ****************************************************************************/
1949 BOOL
fcntl_lock(int fd
, int op
, SMB_OFF_T offset
, SMB_OFF_T count
, int type
)
1951 SMB_STRUCT_FLOCK lock
;
1954 DEBUG(8,("fcntl_lock fd=%d op=%d offset=%.0f count=%.0f type=%d\n",
1955 fd
,op
,(double)offset
,(double)count
,type
));
1958 lock
.l_whence
= SEEK_SET
;
1959 lock
.l_start
= offset
;
1963 ret
= sys_fcntl_ptr(fd
,op
,&lock
);
1967 DEBUG(3,("fcntl_lock: lock failed at offset %.0f count %.0f op %d type %d (%s)\n",
1968 (double)offset
,(double)count
,op
,type
,strerror(errno
)));
1973 /* everything went OK */
1974 DEBUG(8,("fcntl_lock: Lock call successful\n"));
1979 /****************************************************************************
1980 Simple routine to query existing file locks. Cruft in NFS and 64->32 bit mapping
1981 is dealt with in posix.c
1982 Returns True if we have information regarding this lock region (and returns
1983 F_UNLCK in *ptype if the region is unlocked). False if the call failed.
1984 ****************************************************************************/
1986 BOOL
fcntl_getlock(int fd
, SMB_OFF_T
*poffset
, SMB_OFF_T
*pcount
, int *ptype
, pid_t
*ppid
)
1988 SMB_STRUCT_FLOCK lock
;
1991 DEBUG(8,("fcntl_getlock fd=%d offset=%.0f count=%.0f type=%d\n",
1992 fd
,(double)*poffset
,(double)*pcount
,*ptype
));
1994 lock
.l_type
= *ptype
;
1995 lock
.l_whence
= SEEK_SET
;
1996 lock
.l_start
= *poffset
;
1997 lock
.l_len
= *pcount
;
2000 ret
= sys_fcntl_ptr(fd
,SMB_F_GETLK
,&lock
);
2004 DEBUG(3,("fcntl_getlock: lock request failed at offset %.0f count %.0f type %d (%s)\n",
2005 (double)*poffset
,(double)*pcount
,*ptype
,strerror(errno
)));
2010 *ptype
= lock
.l_type
;
2011 *poffset
= lock
.l_start
;
2012 *pcount
= lock
.l_len
;
2015 DEBUG(3,("fcntl_getlock: fd %d is returned info %d pid %u\n",
2016 fd
, (int)lock
.l_type
, (unsigned int)lock
.l_pid
));
2021 #define DBGC_CLASS DBGC_ALL
2023 /*******************************************************************
2024 Is the name specified one of my netbios names.
2025 Returns true if it is equal, false otherwise.
2026 ********************************************************************/
2028 BOOL
is_myname(const char *s
)
2033 for (n
=0; my_netbios_names(n
); n
++) {
2034 if (strequal(my_netbios_names(n
), s
)) {
2039 DEBUG(8, ("is_myname(\"%s\") returns %d\n", s
, ret
));
2043 BOOL
is_myname_or_ipaddr(const char *s
)
2045 fstring name
, dnsname
;
2051 /* santize the string from '\\name' */
2055 servername
= strrchr_m( name
, '\\' );
2061 /* optimize for the common case */
2063 if (strequal(servername
, global_myname()))
2066 /* check for an alias */
2068 if (is_myname(servername
))
2071 /* check for loopback */
2073 if (strequal(servername
, "localhost"))
2076 /* maybe it's my dns name */
2078 if ( get_mydnsfullname( dnsname
) )
2079 if ( strequal( servername
, dnsname
) )
2082 /* handle possible CNAME records */
2084 if ( !is_ipaddress( servername
) ) {
2085 /* use DNS to resolve the name, but only the first address */
2088 if (((hp
= sys_gethostbyname(name
)) != NULL
) && (hp
->h_addr
!= NULL
)) {
2089 struct in_addr return_ip
;
2090 putip( (char*)&return_ip
, (char*)hp
->h_addr
);
2091 fstrcpy( name
, inet_ntoa( return_ip
) );
2096 /* maybe its an IP address? */
2097 if (is_ipaddress(servername
)) {
2098 struct iface_struct nics
[MAX_INTERFACES
];
2102 ip
= interpret_addr(servername
);
2103 if ((ip
==0) || (ip
==0xffffffff))
2106 n
= get_interfaces(nics
, MAX_INTERFACES
);
2107 for (i
=0; i
<n
; i
++) {
2108 if (ip
== nics
[i
].ip
.s_addr
)
2117 /*******************************************************************
2118 Is the name specified our workgroup/domain.
2119 Returns true if it is equal, false otherwise.
2120 ********************************************************************/
2122 BOOL
is_myworkgroup(const char *s
)
2126 if (strequal(s
, lp_workgroup())) {
2130 DEBUG(8, ("is_myworkgroup(\"%s\") returns %d\n", s
, ret
));
2134 /*******************************************************************
2135 we distinguish between 2K and XP by the "Native Lan Manager" string
2136 WinXP => "Windows 2002 5.1"
2137 Win2k => "Windows 2000 5.0"
2138 NT4 => "Windows NT 4.0"
2139 Win9x => "Windows 4.0"
2140 Windows 2003 doesn't set the native lan manager string but
2141 they do set the domain to "Windows 2003 5.2" (probably a bug).
2142 ********************************************************************/
2144 void ra_lanman_string( const char *native_lanman
)
2146 if ( strcmp( native_lanman
, "Windows 2002 5.1" ) == 0 )
2147 set_remote_arch( RA_WINXP
);
2148 else if ( strcmp( native_lanman
, "Windows Server 2003 5.2" ) == 0 )
2149 set_remote_arch( RA_WIN2K3
);
2152 /*******************************************************************
2153 Set the horrid remote_arch string based on an enum.
2154 ********************************************************************/
2156 void set_remote_arch(enum remote_arch_types type
)
2161 fstrcpy(remote_arch
, "WfWg");
2164 fstrcpy(remote_arch
, "OS2");
2167 fstrcpy(remote_arch
, "Win95");
2170 fstrcpy(remote_arch
, "WinNT");
2173 fstrcpy(remote_arch
, "Win2K");
2176 fstrcpy(remote_arch
, "WinXP");
2179 fstrcpy(remote_arch
, "Win2K3");
2182 fstrcpy(remote_arch
,"Samba");
2185 fstrcpy(remote_arch
,"CIFSFS");
2188 ra_type
= RA_UNKNOWN
;
2189 fstrcpy(remote_arch
, "UNKNOWN");
2193 DEBUG(10,("set_remote_arch: Client arch is \'%s\'\n", remote_arch
));
2196 /*******************************************************************
2197 Get the remote_arch type.
2198 ********************************************************************/
2200 enum remote_arch_types
get_remote_arch(void)
2205 void print_asc(int level
, const unsigned char *buf
,int len
)
2209 DEBUG(level
,("%c", isprint(buf
[i
])?buf
[i
]:'.'));
2212 void dump_data(int level
, const char *buf1
,int len
)
2214 const unsigned char *buf
= (const unsigned char *)buf1
;
2218 if (!DEBUGLVL(level
)) return;
2220 DEBUGADD(level
,("[%03X] ",i
));
2222 DEBUGADD(level
,("%02X ",(int)buf
[i
]));
2224 if (i
%8 == 0) DEBUGADD(level
,(" "));
2226 print_asc(level
,&buf
[i
-16],8); DEBUGADD(level
,(" "));
2227 print_asc(level
,&buf
[i
-8],8); DEBUGADD(level
,("\n"));
2228 if (i
<len
) DEBUGADD(level
,("[%03X] ",i
));
2234 DEBUGADD(level
,(" "));
2235 if (n
>8) DEBUGADD(level
,(" "));
2236 while (n
--) DEBUGADD(level
,(" "));
2238 print_asc(level
,&buf
[i
-(i
%16)],n
); DEBUGADD(level
,( " " ));
2240 if (n
>0) print_asc(level
,&buf
[i
-n
],n
);
2241 DEBUGADD(level
,("\n"));
2245 void dump_data_pw(const char *msg
, const uchar
* data
, size_t len
)
2247 #ifdef DEBUG_PASSWORD
2248 DEBUG(11, ("%s", msg
));
2249 if (data
!= NULL
&& len
> 0)
2251 dump_data(11, (const char *)data
, len
);
2256 char *tab_depth(int depth
)
2258 static pstring spaces
;
2259 memset(spaces
, ' ', depth
* 4);
2260 spaces
[depth
* 4] = 0;
2264 /*****************************************************************************
2265 Provide a checksum on a string
2267 Input: s - the null-terminated character string for which the checksum
2270 Output: The checksum value calculated for s.
2271 *****************************************************************************/
2273 int str_checksum(const char *s
)
2281 res
^= (c
<< (i
% 15)) ^ (c
>> (15-(i
%15)));
2288 /*****************************************************************
2289 Zero a memory area then free it. Used to catch bugs faster.
2290 *****************************************************************/
2292 void zero_free(void *p
, size_t size
)
2298 /*****************************************************************
2299 Set our open file limit to a requested max and return the limit.
2300 *****************************************************************/
2302 int set_maxfiles(int requested_max
)
2304 #if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE))
2306 int saved_current_limit
;
2308 if(getrlimit(RLIMIT_NOFILE
, &rlp
)) {
2309 DEBUG(0,("set_maxfiles: getrlimit (1) for RLIMIT_NOFILE failed with error %s\n",
2312 return requested_max
;
2316 * Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to
2317 * account for the extra fd we need
2318 * as well as the log files and standard
2319 * handles etc. Save the limit we want to set in case
2320 * we are running on an OS that doesn't support this limit (AIX)
2321 * which always returns RLIM_INFINITY for rlp.rlim_max.
2324 /* Try raising the hard (max) limit to the requested amount. */
2326 #if defined(RLIM_INFINITY)
2327 if (rlp
.rlim_max
!= RLIM_INFINITY
) {
2328 int orig_max
= rlp
.rlim_max
;
2330 if ( rlp
.rlim_max
< requested_max
)
2331 rlp
.rlim_max
= requested_max
;
2333 /* This failing is not an error - many systems (Linux) don't
2334 support our default request of 10,000 open files. JRA. */
2336 if(setrlimit(RLIMIT_NOFILE
, &rlp
)) {
2337 DEBUG(3,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d max files failed with error %s\n",
2338 (int)rlp
.rlim_max
, strerror(errno
) ));
2340 /* Set failed - restore original value from get. */
2341 rlp
.rlim_max
= orig_max
;
2346 /* Now try setting the soft (current) limit. */
2348 saved_current_limit
= rlp
.rlim_cur
= MIN(requested_max
,rlp
.rlim_max
);
2350 if(setrlimit(RLIMIT_NOFILE
, &rlp
)) {
2351 DEBUG(0,("set_maxfiles: setrlimit for RLIMIT_NOFILE for %d files failed with error %s\n",
2352 (int)rlp
.rlim_cur
, strerror(errno
) ));
2354 return saved_current_limit
;
2357 if(getrlimit(RLIMIT_NOFILE
, &rlp
)) {
2358 DEBUG(0,("set_maxfiles: getrlimit (2) for RLIMIT_NOFILE failed with error %s\n",
2361 return saved_current_limit
;
2364 #if defined(RLIM_INFINITY)
2365 if(rlp
.rlim_cur
== RLIM_INFINITY
)
2366 return saved_current_limit
;
2369 if((int)rlp
.rlim_cur
> saved_current_limit
)
2370 return saved_current_limit
;
2372 return rlp
.rlim_cur
;
2373 #else /* !defined(HAVE_GETRLIMIT) || !defined(RLIMIT_NOFILE) */
2375 * No way to know - just guess...
2377 return requested_max
;
2381 /*****************************************************************
2382 Possibly replace mkstemp if it is broken.
2383 *****************************************************************/
2385 int smb_mkstemp(char *name_template
)
2387 #if HAVE_SECURE_MKSTEMP
2388 return mkstemp(name_template
);
2390 /* have a reasonable go at emulating it. Hope that
2391 the system mktemp() isn't completly hopeless */
2392 char *p
= mktemp(name_template
);
2395 return open(p
, O_CREAT
|O_EXCL
|O_RDWR
, 0600);
2399 /*****************************************************************
2400 malloc that aborts with smb_panic on fail or zero size.
2401 *****************************************************************/
2403 void *smb_xmalloc_array(size_t size
, unsigned int count
)
2407 smb_panic("smb_xmalloc_array: called with zero size.\n");
2408 if (count
>= MAX_ALLOC_SIZE
/size
) {
2409 smb_panic("smb_xmalloc: alloc size too large.\n");
2411 if ((p
= SMB_MALLOC(size
*count
)) == NULL
) {
2412 DEBUG(0, ("smb_xmalloc_array failed to allocate %lu * %lu bytes\n",
2413 (unsigned long)size
, (unsigned long)count
));
2414 smb_panic("smb_xmalloc_array: malloc fail.\n");
2420 Memdup with smb_panic on fail.
2423 void *smb_xmemdup(const void *p
, size_t size
)
2426 p2
= SMB_XMALLOC_ARRAY(unsigned char,size
);
2427 memcpy(p2
, p
, size
);
2432 strdup that aborts on malloc fail.
2435 char *smb_xstrdup(const char *s
)
2437 #if defined(PARANOID_MALLOC_CHECKER)
2442 char *s1
= strdup(s
);
2443 #if defined(PARANOID_MALLOC_CHECKER)
2444 #define strdup(s) __ERROR_DONT_USE_STRDUP_DIRECTLY
2447 smb_panic("smb_xstrdup: malloc fail\n");
2453 strndup that aborts on malloc fail.
2456 char *smb_xstrndup(const char *s
, size_t n
)
2458 #if defined(PARANOID_MALLOC_CHECKER)
2463 char *s1
= strndup(s
, n
);
2464 #if defined(PARANOID_MALLOC_CHECKER)
2465 #define strndup(s,n) __ERROR_DONT_USE_STRNDUP_DIRECTLY
2468 smb_panic("smb_xstrndup: malloc fail\n");
2473 vasprintf that aborts on malloc fail
2476 int smb_xvasprintf(char **ptr
, const char *format
, va_list ap
)
2483 n
= vasprintf(ptr
, format
, ap2
);
2484 if (n
== -1 || ! *ptr
)
2485 smb_panic("smb_xvasprintf: out of memory");
2489 /*****************************************************************
2490 Like strdup but for memory.
2491 *****************************************************************/
2493 void *memdup(const void *p
, size_t size
)
2498 p2
= SMB_MALLOC(size
);
2501 memcpy(p2
, p
, size
);
2505 /*****************************************************************
2506 Get local hostname and cache result.
2507 *****************************************************************/
2509 char *myhostname(void)
2517 /*****************************************************************
2518 A useful function for returning a path in the Samba lock directory.
2519 *****************************************************************/
2521 char *lock_path(const char *name
)
2523 static pstring fname
;
2525 pstrcpy(fname
,lp_lockdir());
2526 trim_char(fname
,'\0','/');
2528 if (!directory_exist(fname
,NULL
))
2532 pstrcat(fname
,name
);
2537 /*****************************************************************
2538 A useful function for returning a path in the Samba pid directory.
2539 *****************************************************************/
2541 char *pid_path(const char *name
)
2543 static pstring fname
;
2545 pstrcpy(fname
,lp_piddir());
2546 trim_char(fname
,'\0','/');
2548 if (!directory_exist(fname
,NULL
))
2552 pstrcat(fname
,name
);
2558 * @brief Returns an absolute path to a file in the Samba lib directory.
2560 * @param name File to find, relative to LIBDIR.
2562 * @retval Pointer to a static #pstring containing the full path.
2565 char *lib_path(const char *name
)
2567 static pstring fname
;
2568 fstr_sprintf(fname
, "%s/%s", dyn_LIBDIR
, name
);
2573 * @brief Returns the platform specific shared library extension.
2575 * @retval Pointer to a static #fstring containing the extension.
2578 const char *shlib_ext(void)
2580 return dyn_SHLIBEXT
;
2583 /*******************************************************************
2584 Given a filename - get its directory name
2585 NB: Returned in static storage. Caveats:
2586 o Not safe in thread environment.
2587 o Caller must not free.
2588 o If caller wishes to preserve, they should copy.
2589 ********************************************************************/
2591 char *parent_dirname(const char *path
)
2593 static pstring dirpath
;
2599 pstrcpy(dirpath
, path
);
2600 p
= strrchr_m(dirpath
, '/'); /* Find final '/', if any */
2602 pstrcpy(dirpath
, "."); /* No final "/", so dir is "." */
2605 ++p
; /* For root "/", leave "/" in place */
2612 /*******************************************************************
2613 Determine if a pattern contains any Microsoft wildcard characters.
2614 *******************************************************************/
2616 BOOL
ms_has_wild(const char *s
)
2620 if (lp_posix_pathnames()) {
2621 /* With posix pathnames no characters are wild. */
2625 while ((c
= *s
++)) {
2638 BOOL
ms_has_wild_w(const smb_ucs2_t
*s
)
2641 if (!s
) return False
;
2642 while ((c
= *s
++)) {
2644 case UCS2_CHAR('*'):
2645 case UCS2_CHAR('?'):
2646 case UCS2_CHAR('<'):
2647 case UCS2_CHAR('>'):
2648 case UCS2_CHAR('"'):
2655 /*******************************************************************
2656 A wrapper that handles case sensitivity and the special handling
2658 *******************************************************************/
2660 BOOL
mask_match(const char *string
, char *pattern
, BOOL is_case_sensitive
)
2662 if (strcmp(string
,"..") == 0)
2664 if (strcmp(pattern
,".") == 0)
2667 return ms_fnmatch(pattern
, string
, Protocol
<= PROTOCOL_LANMAN2
, is_case_sensitive
) == 0;
2670 /*******************************************************************
2671 A wrapper that handles case sensitivity and the special handling
2672 of the ".." name. Varient that is only called by old search code which requires
2673 pattern translation.
2674 *******************************************************************/
2676 BOOL
mask_match_search(const char *string
, char *pattern
, BOOL is_case_sensitive
)
2678 if (strcmp(string
,"..") == 0)
2680 if (strcmp(pattern
,".") == 0)
2683 return ms_fnmatch(pattern
, string
, True
, is_case_sensitive
) == 0;
2686 /*******************************************************************
2687 A wrapper that handles a list of patters and calls mask_match()
2688 on each. Returns True if any of the patterns match.
2689 *******************************************************************/
2691 BOOL
mask_match_list(const char *string
, char **list
, int listLen
, BOOL is_case_sensitive
)
2693 while (listLen
-- > 0) {
2694 if (mask_match(string
, *list
++, is_case_sensitive
))
2700 /*********************************************************
2701 Recursive routine that is called by unix_wild_match.
2702 *********************************************************/
2704 static BOOL
unix_do_match(const char *regexp
, const char *str
)
2708 for( p
= regexp
; *p
&& *str
; ) {
2719 * Look for a character matching
2720 * the one after the '*'.
2724 return True
; /* Automatic match */
2727 while(*str
&& (*p
!= *str
))
2731 * Patch from weidel@multichart.de. In the case of the regexp
2732 * '*XX*' we want to ensure there are at least 2 'X' characters
2733 * in the string after the '*' for a match to be made.
2740 * Eat all the characters that match, but count how many there were.
2743 while(*str
&& (*p
== *str
)) {
2749 * Now check that if the regexp had n identical characters that
2750 * matchcount had at least that many matches.
2753 while ( *(p
+1) && (*(p
+1) == *p
)) {
2758 if ( matchcount
<= 0 )
2762 str
--; /* We've eaten the match char after the '*' */
2764 if(unix_do_match(p
, str
))
2786 if (!*p
&& str
[0] == '.' && str
[1] == 0)
2789 if (!*str
&& *p
== '?') {
2795 if(!*str
&& (*p
== '*' && p
[1] == '\0'))
2801 /*******************************************************************
2802 Simple case insensitive interface to a UNIX wildcard matcher.
2803 Returns True if match, False if not.
2804 *******************************************************************/
2806 BOOL
unix_wild_match(const char *pattern
, const char *string
)
2811 pstrcpy(p2
, pattern
);
2812 pstrcpy(s2
, string
);
2816 /* Remove any *? and ** from the pattern as they are meaningless */
2817 for(p
= p2
; *p
; p
++)
2818 while( *p
== '*' && (p
[1] == '?' ||p
[1] == '*'))
2819 pstrcpy( &p
[1], &p
[2]);
2821 if (strequal(p2
,"*"))
2824 return unix_do_match(p2
, s2
);
2827 /**********************************************************************
2828 Converts a name to a fully qalified domain name.
2829 ***********************************************************************/
2831 void name_to_fqdn(fstring fqdn
, const char *name
)
2833 struct hostent
*hp
= sys_gethostbyname(name
);
2835 if ( hp
&& hp
->h_name
&& *hp
->h_name
) {
2838 /* find out if the fqdn is returned as an alias
2839 * to cope with /etc/hosts files where the first
2840 * name is not the fqdn but the short name */
2841 if (hp
->h_aliases
&& (! strchr_m(hp
->h_name
, '.'))) {
2843 for (i
= 0; hp
->h_aliases
[i
]; i
++) {
2844 if (strchr_m(hp
->h_aliases
[i
], '.')) {
2845 full
= hp
->h_aliases
[i
];
2850 if (full
&& (StrCaseCmp(full
, "localhost.localdomain") == 0)) {
2851 DEBUG(1, ("WARNING: your /etc/hosts file may be broken!\n"));
2852 DEBUGADD(1, (" Specifing the machine hostname for address 127.0.0.1 may lead\n"));
2853 DEBUGADD(1, (" to Kerberos authentication probelms as localhost.localdomain\n"));
2854 DEBUGADD(1, (" may end up to be used instead of the real machine FQDN.\n"));
2862 DEBUG(10,("name_to_fqdn: lookup for %s -> %s.\n", name
, full
));
2863 fstrcpy(fqdn
, full
);
2865 DEBUG(10,("name_to_fqdn: lookup for %s failed.\n", name
));
2866 fstrcpy(fqdn
, name
);
2870 /**********************************************************************
2871 Extension to talloc_get_type: Abort on type mismatch
2872 ***********************************************************************/
2874 void *talloc_check_name_abort(const void *ptr
, const char *name
)
2878 result
= talloc_check_name(ptr
, name
);
2882 DEBUG(0, ("Talloc type mismatch, expected %s, got %s\n",
2883 name
, talloc_get_name(ptr
)));
2884 smb_panic("aborting");
2885 /* Keep the compiler happy */
2892 /*******************************************************************
2893 This routine is a trick to immediately catch errors when debugging
2894 with insure. A xterm with a gdb is popped up when insure catches
2895 a error. It is Linux specific.
2896 ********************************************************************/
2898 int _Insure_trap_error(int a1
, int a2
, int a3
, int a4
, int a5
, int a6
)
2903 /* you can get /usr/bin/backtrace from
2904 http://samba.org/ftp/unpacked/junkcode/backtrace */
2905 pstring cmd
= "/usr/bin/backtrace %d";
2907 slprintf(pidstr
, sizeof(pidstr
)-1, "%d", sys_getpid());
2908 pstring_sub(cmd
, "%d", pidstr
);
2912 h
= dlopen("/usr/local/parasoft/insure++lite/lib.linux2/libinsure.so", RTLD_LAZY
);
2913 fn
= dlsym(h
, "_Insure_trap_error");
2915 if (!h
|| h
== _Insure_trap_error
) {
2916 h
= dlopen("/usr/local/parasoft/lib.linux2/libinsure.so", RTLD_LAZY
);
2917 fn
= dlsym(h
, "_Insure_trap_error");
2921 ret
= fn(a1
, a2
, a3
, a4
, a5
, a6
);
2929 uint32
map_share_mode_to_deny_mode(uint32 share_access
, uint32 private_options
)
2931 switch (share_access
& ~FILE_SHARE_DELETE
) {
2932 case FILE_SHARE_NONE
:
2934 case FILE_SHARE_READ
:
2936 case FILE_SHARE_WRITE
:
2938 case FILE_SHARE_READ
|FILE_SHARE_WRITE
:
2941 if (private_options
& NTCREATEX_OPTIONS_PRIVATE_DENY_DOS
) {
2943 } else if (private_options
& NTCREATEX_OPTIONS_PRIVATE_DENY_FCB
) {
2950 pid_t
procid_to_pid(const struct process_id
*proc
)
2955 struct process_id
pid_to_procid(pid_t pid
)
2957 struct process_id result
;
2962 struct process_id
procid_self(void)
2964 return pid_to_procid(sys_getpid());
2967 BOOL
procid_equal(const struct process_id
*p1
, const struct process_id
*p2
)
2969 return (p1
->pid
== p2
->pid
);
2972 BOOL
procid_is_me(const struct process_id
*pid
)
2974 return (pid
->pid
== sys_getpid());
2977 struct process_id
interpret_pid(const char *pid_string
)
2979 return pid_to_procid(atoi(pid_string
));
2982 char *procid_str_static(const struct process_id
*pid
)
2985 fstr_sprintf(str
, "%d", pid
->pid
);
2989 char *procid_str(TALLOC_CTX
*mem_ctx
, const struct process_id
*pid
)
2991 return talloc_strdup(mem_ctx
, procid_str_static(pid
));
2994 BOOL
procid_valid(const struct process_id
*pid
)
2996 return (pid
->pid
!= -1);
2999 BOOL
procid_is_local(const struct process_id
*pid
)
3004 int this_is_smp(void)
3006 #if defined(HAVE_SYSCONF)
3008 #if defined(SYSCONF_SC_NPROC_ONLN)
3009 return (sysconf(_SC_NPROC_ONLN
) > 1) ? 1 : 0;
3010 #elif defined(SYSCONF_SC_NPROCESSORS_ONLN)
3011 return (sysconf(_SC_NPROCESSORS_ONLN
) > 1) ? 1 : 0;