2 Unix SMB/CIFS implementation.
3 Utility functions for Samba
4 Copyright (C) Andrew Tridgell 1992-1999
5 Copyright (C) Jelmer Vernooij 2005
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
21 #ifndef _SAMBA_UTIL_H_
22 #define _SAMBA_UTIL_H_
26 * @brief Helpful macros
32 extern const char *logfile
;
34 extern const char *panic_action
;
35 extern void (*pre_panic_action_hook
)(void);
36 extern void (*post_panic_action_hook
)(void);
42 #define SMB_ASSERT(b) do { if (!(b)) { \
43 DEBUG(0,("PANIC: assert failed at %s(%d): %s\n", \
44 __FILE__, __LINE__, #b)); smb_panic("assert failed: " #b); }} while(0)
46 /* redefine the assert macro for non-developer builds */
47 #define SMB_ASSERT(b) do { if (!(b)) { \
48 DEBUG(0,("PANIC: assert failed at %s(%d): %s\n", \
49 __FILE__, __LINE__, #b)); }} while (0)
52 #if _SAMBA_BUILD_ == 4
54 #define strlen(x) valgrind_strlen(x)
55 size_t valgrind_strlen(const char *s
);
60 #define ABS(a) ((a)>0?(a):(-(a)))
64 * Write backtrace to debug log
66 _PUBLIC_
void call_backtrace(void);
69 Something really nasty happened - panic !
71 _PUBLIC_ _NORETURN_
void smb_panic(const char *why
);
74 setup our fault handlers
76 _PUBLIC_
void fault_setup(const char *pname
);
79 register a fault handler.
80 Should only be called once in the execution of smbd.
82 _PUBLIC_
bool register_fault_handler(const char *name
, void (*fault_handler
)(int sig
));
84 /* The following definitions come from lib/util/signal.c */
90 void BlockSignals(bool block
, int signum
);
93 Catch a signal. This should implement the following semantics:
95 1) The handler remains installed after being called.
96 2) The signal should be blocked during handler execution.
98 void (*CatchSignal(int signum
,void (*handler
)(int )))(int);
101 Ignore SIGCLD via whatever means is necessary for this OS.
103 void CatchChild(void);
106 Catch SIGCLD but leave the child around so it's status can be reaped.
108 void CatchChildLeaveStatus(void);
111 /* The following definitions come from lib/util/util_str.c */
115 Trim the specified elements off the front and back of a string.
117 _PUBLIC_
bool trim_string(char *s
, const char *front
, const char *back
);
120 Find the number of 'c' chars in a string
122 _PUBLIC_ _PURE_
size_t count_chars(const char *s
, char c
);
125 Safe string copy into a known length string. maxlength does not
126 include the terminating zero.
128 _PUBLIC_
char *safe_strcpy(char *dest
,const char *src
, size_t maxlength
);
131 Safe string cat into a string. maxlength does not
132 include the terminating zero.
134 _PUBLIC_
char *safe_strcat(char *dest
, const char *src
, size_t maxlength
);
137 Routine to get hex characters and turn them into a 16 byte array.
138 the array can be variable length, and any non-hex-numeric
139 characters are skipped. "0xnn" or "0Xnn" is specially catered
142 valid examples: "0A5D15"; "0x15, 0x49, 0xa2"; "59\ta9\te3\n"
146 _PUBLIC_
size_t strhex_to_str(char *p
, size_t p_len
, const char *strhex
, size_t strhex_len
);
150 * Parse a hex string and return a data blob.
152 _PUBLIC_ _PURE_ DATA_BLOB
strhex_to_data_blob(TALLOC_CTX
*mem_ctx
, const char *strhex
) ;
156 * Routine to print a buffer as HEX digits, into an allocated string.
158 _PUBLIC_
void hex_encode(const unsigned char *buff_in
, size_t len
, char **out_hex_buffer
);
161 * talloc version of hex_encode()
163 _PUBLIC_
char *hex_encode_talloc(TALLOC_CTX
*mem_ctx
, const unsigned char *buff_in
, size_t len
);
166 Substitute a string for a pattern in another string. Make sure there is
169 This routine looks for pattern in s and replaces it with
170 insert. It may do multiple replacements.
172 Any of " ; ' $ or ` in the insert string are replaced with _
173 if len==0 then the string cannot be extended. This is different from the old
174 use of len==0 which was for no length checks to be done.
176 _PUBLIC_
void string_sub(char *s
,const char *pattern
, const char *insert
, size_t len
);
179 _PUBLIC_
char *string_sub_talloc(TALLOC_CTX
*mem_ctx
, const char *s
,
180 const char *pattern
, const char *insert
);
183 Similar to string_sub() but allows for any character to be substituted.
185 if len==0 then the string cannot be extended. This is different from the old
186 use of len==0 which was for no length checks to be done.
188 _PUBLIC_
void all_string_sub(char *s
,const char *pattern
,const char *insert
, size_t len
);
191 Unescape a URL encoded string, in place.
193 _PUBLIC_
void rfc1738_unescape(char *buf
);
196 format a string into length-prefixed dotted domain format, as used in NBT
197 and in some ADS structures
199 _PUBLIC_
const char *str_format_nbt_domain(TALLOC_CTX
*mem_ctx
, const char *s
);
202 * Add a string to an array of strings.
204 * num should be a pointer to an integer that holds the current
205 * number of elements in strings. It will be updated by this function.
207 _PUBLIC_
bool add_string_to_array(TALLOC_CTX
*mem_ctx
,
208 const char *str
, const char ***strings
, int *num
);
211 varient of strcmp() that handles NULL ptrs
213 _PUBLIC_
int strcmp_safe(const char *s1
, const char *s2
);
216 return the number of bytes occupied by a buffer in ASCII format
217 the result includes the null termination
220 _PUBLIC_
size_t ascii_len_n(const char *src
, size_t n
);
223 Set a boolean variable from the text value stored in the passed string.
224 Returns true in success, false if the passed string does not correctly
227 _PUBLIC_
bool set_boolean(const char *boolean_string
, bool *boolean
);
230 * Parse a string containing a boolean value.
232 * val will be set to the read value.
234 * @retval true if a boolean value was parsed, false otherwise.
236 _PUBLIC_
bool conv_str_bool(const char * str
, bool * val
);
238 #if _SAMBA_BUILD_ == 4
240 * Convert a size specification like 16K into an integral number of bytes.
242 _PUBLIC_
bool conv_str_size(const char * str
, uint64_t * val
);
246 * Parse a uint64_t value from a string
248 * val will be set to the value read.
250 * @retval true if parsing was successful, false otherwise
252 _PUBLIC_
bool conv_str_u64(const char * str
, uint64_t * val
);
255 return the number of bytes occupied by a buffer in CH_UTF16 format
256 the result includes the null termination
258 _PUBLIC_
size_t utf16_len(const void *buf
);
261 return the number of bytes occupied by a buffer in CH_UTF16 format
262 the result includes the null termination
265 _PUBLIC_
size_t utf16_len_n(const void *src
, size_t n
);
266 _PUBLIC_
size_t ucs2_align(const void *base_ptr
, const void *p
, int flags
);
269 Do a case-insensitive, whitespace-ignoring string compare.
271 _PUBLIC_
int strwicmp(const char *psz1
, const char *psz2
);
276 _PUBLIC_
void string_replace(char *s
, char oldc
, char newc
);
281 * @note The comparison is case-insensitive.
283 _PUBLIC_
bool strequal(const char *s1
, const char *s2
);
285 /* The following definitions come from lib/util/util_strlist.c */
288 /* separators for lists */
290 #define LIST_SEP " \t,\n\r"
294 build a null terminated list of strings from a input string and a
295 separator list. The separator list must contain characters less than
296 or equal to 0x2f for this to work correctly on multi-byte strings
298 _PUBLIC_
char **str_list_make(TALLOC_CTX
*mem_ctx
, const char *string
, const char *sep
);
301 * build a null terminated list of strings from an argv-like input string
302 * Entries are seperated by spaces and can be enclosed by quotes.
303 * Does NOT support escaping
305 _PUBLIC_
const char **str_list_make_shell(TALLOC_CTX
*mem_ctx
, const char *string
, const char *sep
);
308 * join a list back to one string
310 _PUBLIC_
char *str_list_join(TALLOC_CTX
*mem_ctx
, const char **list
, char seperator
);
312 /** join a list back to one (shell-like) string; entries
313 * seperated by spaces, using quotes where necessary */
314 _PUBLIC_
char *str_list_join_shell(TALLOC_CTX
*mem_ctx
, const char **list
, char sep
);
317 return the number of elements in a string list
319 _PUBLIC_
size_t str_list_length(const char * const *list
);
324 _PUBLIC_
char **str_list_copy(TALLOC_CTX
*mem_ctx
, const char **list
);
327 Return true if all the elements of the list match exactly.
329 _PUBLIC_
bool str_list_equal(const char **list1
, const char **list2
);
332 add an entry to a string list
334 _PUBLIC_
const char **str_list_add(const char **list
, const char *s
);
337 remove an entry from a string list
339 _PUBLIC_
void str_list_remove(const char **list
, const char *s
);
342 return true if a string is in a list
344 _PUBLIC_
bool str_list_check(const char **list
, const char *s
);
347 return true if a string is in a list, case insensitively
349 _PUBLIC_
bool str_list_check_ci(const char **list
, const char *s
);
352 /* The following definitions come from lib/util/util_file.c */
357 read a line from a file with possible \ continuation chars.
358 Blanks at the start or end of a line are stripped.
359 The string will be allocated if s2 is NULL
361 _PUBLIC_
char *fgets_slash(char *s2
,int maxlen
,XFILE
*f
);
365 * Read one line (data until next newline or eof) and allocate it
367 _PUBLIC_
char *afdgets(int fd
, TALLOC_CTX
*mem_ctx
, size_t hint
);
371 load a file into memory from a fd.
373 _PUBLIC_
char *fd_load(int fd
, size_t *size
, size_t maxsize
, TALLOC_CTX
*mem_ctx
);
376 char **file_lines_parse(char *p
, size_t size
, int *numlines
, TALLOC_CTX
*mem_ctx
);
379 load a file into memory
381 _PUBLIC_
char *file_load(const char *fname
, size_t *size
, size_t maxsize
, TALLOC_CTX
*mem_ctx
);
385 mmap (if possible) or read a file
387 _PUBLIC_
void *map_file(const char *fname
, size_t size
);
391 load a file into memory and return an array of pointers to lines in the file
392 must be freed with talloc_free().
394 _PUBLIC_
char **file_lines_load(const char *fname
, int *numlines
, size_t maxsize
, TALLOC_CTX
*mem_ctx
);
398 load a fd into memory and return an array of pointers to lines in the file
399 must be freed with talloc_free(). If convert is true calls unix_to_dos on
402 _PUBLIC_
char **fd_lines_load(int fd
, int *numlines
, size_t maxsize
, TALLOC_CTX
*mem_ctx
);
405 take a list of lines and modify them to produce a list where \ continues
408 _PUBLIC_
void file_lines_slashcont(char **lines
);
411 save a lump of data into a file. Mostly used for debugging
413 _PUBLIC_
bool file_save(const char *fname
, const void *packet
, size_t length
);
414 _PUBLIC_
int vfdprintf(int fd
, const char *format
, va_list ap
) PRINTF_ATTRIBUTE(2,0);
415 _PUBLIC_
int fdprintf(int fd
, const char *format
, ...) PRINTF_ATTRIBUTE(2,3);
416 _PUBLIC_
bool large_file_support(const char *path
);
418 /* The following definitions come from lib/util/util.c */
422 Find a suitable temporary directory. The result should be copied immediately
423 as it may be overwritten by a subsequent call.
425 _PUBLIC_
const char *tmpdir(void);
428 Check if a file exists - call vfs_file_exist for samba files.
430 _PUBLIC_
bool file_exist(const char *fname
);
433 Check a files mod time.
435 _PUBLIC_
time_t file_modtime(const char *fname
);
438 Check if a directory exists.
440 _PUBLIC_
bool directory_exist(const char *dname
);
443 * Try to create the specified directory if it didn't exist.
445 * @retval true if the directory already existed and has the right permissions
446 * or was successfully created.
448 _PUBLIC_
bool directory_create_or_exist(const char *dname
, uid_t uid
,
452 Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
457 _PUBLIC_
int set_blocking(int fd
, bool set
);
460 Sleep for a specified number of milliseconds.
462 _PUBLIC_
void msleep(unsigned int t
);
465 Get my own name, return in malloc'ed storage.
467 _PUBLIC_
char* get_myname(void);
470 Return true if a string could be a pure IP address.
472 _PUBLIC_
bool is_ipaddress(const char *str
);
475 Interpret an internet address or name into an IP address in 4 byte form.
477 _PUBLIC_
uint32_t interpret_addr(const char *str
);
480 A convenient addition to interpret_addr().
482 _PUBLIC_
struct in_addr
interpret_addr2(const char *str
);
485 Check if an IP is the 0.0.0.0.
487 _PUBLIC_
bool is_zero_ip_v4(struct in_addr ip
);
490 Are two IPs on the same subnet?
492 _PUBLIC_
bool same_net_v4(struct in_addr ip1
,struct in_addr ip2
,struct in_addr mask
);
494 _PUBLIC_
bool is_ipaddress_v4(const char *str
);
497 Check if a process exists. Does this work on all unixes?
499 _PUBLIC_
bool process_exists_by_pid(pid_t pid
);
502 Simple routine to do POSIX file locking. Cruft in NFS and 64->32 bit mapping
503 is dealt with in posix.c
505 _PUBLIC_
bool fcntl_lock(int fd
, int op
, off_t offset
, off_t count
, int type
);
508 malloc that aborts with smb_panic on fail or zero size.
510 _PUBLIC_
void *smb_xmalloc(size_t size
);
513 Memdup with smb_panic on fail.
515 _PUBLIC_
void *smb_xmemdup(const void *p
, size_t size
);
518 strdup that aborts on malloc fail.
520 _PUBLIC_
char *smb_xstrdup(const char *s
);
522 char *smb_xstrndup(const char *s
, size_t n
);
525 Like strdup but for memory.
527 _PUBLIC_
void *smb_memdup(const void *p
, size_t size
);
530 * see if a range of memory is all zero. A NULL pointer is considered
533 _PUBLIC_
bool all_zero(const uint8_t *ptr
, size_t size
);
536 realloc an array, checking for integer overflow in the array size
538 _PUBLIC_
void *realloc_array(void *ptr
, size_t el_size
, unsigned count
, bool free_on_fail
);
540 void *malloc_array(size_t el_size
, unsigned int count
);
542 /* The following definitions come from lib/util/fsusage.c */
546 * Retrieve amount of free disk space.
547 * this does all of the system specific guff to get the free disk space.
548 * It is derived from code in the GNU fileutils package, but has been
549 * considerably mangled for use here
551 * results are returned in *dfree and *dsize, in 512 byte units
553 _PUBLIC_
int sys_fsusage(const char *path
, uint64_t *dfree
, uint64_t *dsize
);
555 /* The following definitions come from lib/util/ms_fnmatch.c */
560 * @brief MS-style Filename matching
563 #if _SAMBA_BUILD_ == 4
564 /* protocol types. It assumes that higher protocols include lower protocols
565 as subsets. FIXME: Move to one of the smb-specific headers */
566 enum protocol_types
{
576 int ms_fnmatch(const char *pattern
, const char *string
, enum protocol_types protocol
);
578 /** a generic fnmatch function - uses for non-CIFS pattern matching */
579 int gen_fnmatch(const char *pattern
, const char *string
);
582 /* The following definitions come from lib/util/mutex.c */
587 register a set of mutex/rwlock handlers.
588 Should only be called once in the execution of smbd.
590 _PUBLIC_
bool register_mutex_handlers(const char *name
, struct mutex_ops
*ops
);
593 /* The following definitions come from lib/util/idtree.c */
597 initialise a idr tree. The context return value must be passed to
598 all subsequent idr calls. To destroy the idr tree use talloc_free()
601 _PUBLIC_
struct idr_context
*idr_init(TALLOC_CTX
*mem_ctx
);
604 allocate the next available id, and assign 'ptr' into its slot.
605 you can retrieve later this pointer using idr_find()
607 _PUBLIC_
int idr_get_new(struct idr_context
*idp
, void *ptr
, int limit
);
610 allocate a new id, giving the first available value greater than or
611 equal to the given starting id
613 _PUBLIC_
int idr_get_new_above(struct idr_context
*idp
, void *ptr
, int starting_id
, int limit
);
616 allocate a new id randomly in the given range
618 _PUBLIC_
int idr_get_new_random(struct idr_context
*idp
, void *ptr
, int limit
);
621 find a pointer value previously set with idr_get_new given an id
623 _PUBLIC_
void *idr_find(struct idr_context
*idp
, int id
);
626 remove an id from the idr tree
628 _PUBLIC_
int idr_remove(struct idr_context
*idp
, int id
);
630 /* The following definitions come from lib/util/become_daemon.c */
632 #if _SAMBA_BUILD_ == 4
634 Become a daemon, discarding the controlling terminal.
636 _PUBLIC_
void become_daemon(bool fork
);
640 * Load a ini-style file.
642 bool pm_process( const char *fileName
,
643 bool (*sfunc
)(const char *, void *),
644 bool (*pfunc
)(const char *, const char *, void *),
647 bool unmap_file(void *start
, size_t size
);
649 #define CONST_DISCARD(type, ptr) ((type) ((void *) (ptr)))
651 #endif /* _SAMBA_UTIL_H_ */