diff options
author | Jelmer Vernooij <jelmer@samba.org> | 2006-02-23 15:52:24 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:52:05 -0500 |
commit | dfc517b05395d925a4d7b1ce9633a849f9468e70 (patch) | |
tree | a81c020c89022980e6fbb68116648da217fbb0fc /source4/lib | |
parent | 80c8a522861068e7b0974986936f65052dd6f70f (diff) | |
download | samba-dfc517b05395d925a4d7b1ce9633a849f9468e70.tar.gz samba-dfc517b05395d925a4d7b1ce9633a849f9468e70.tar.xz samba-dfc517b05395d925a4d7b1ce9633a849f9468e70.zip |
r13658: More moving around of files:
- Collect the generic utility functions into a lib/util/ (a la GLib is
for the GNOME folks)
- Remove even more files from include/
(This used to be commit ba62880f5b05c2a505dc7f54676b231197a7e707)
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/basic.mk | 42 | ||||
-rw-r--r-- | source4/lib/gencache/gencache.c (renamed from source4/lib/gencache.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/README | 296 | ||||
-rw-r--r-- | source4/lib/util/byteorder.h | 224 | ||||
-rw-r--r-- | source4/lib/util/capability.c (renamed from source4/lib/capability.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/config.mk | 34 | ||||
-rw-r--r-- | source4/lib/util/data_blob.c (renamed from source4/lib/data_blob.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/debug.c (renamed from source4/lib/debug.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/debug.h (renamed from source4/lib/debug.h) | 0 | ||||
-rw-r--r-- | source4/lib/util/dprintf.c (renamed from source4/lib/dprintf.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/fault.c (renamed from source4/lib/fault.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/fsusage.c (renamed from source4/lib/fsusage.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/genrand.c (renamed from source4/lib/genrand.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/idtree.c (renamed from source4/lib/idtree.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/module.c (renamed from source4/lib/module.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/ms_fnmatch.c (renamed from source4/lib/ms_fnmatch.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/mutex.c (renamed from source4/lib/mutex.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/mutex.h (renamed from source4/lib/mutex.h) | 2 | ||||
-rw-r--r-- | source4/lib/util/pidfile.c (renamed from source4/lib/pidfile.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/safe_string.h | 55 | ||||
-rw-r--r-- | source4/lib/util/select.c (renamed from source4/lib/select.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/signal.c (renamed from source4/lib/signal.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/substitute.c (renamed from source4/lib/substitute.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/system.c (renamed from source4/lib/system.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/time.c (renamed from source4/lib/time.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/unix_privs.c (renamed from source4/lib/unix_privs.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util.c (renamed from source4/lib/util.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util.h | 81 | ||||
-rw-r--r-- | source4/lib/util/util_file.c (renamed from source4/lib/util_file.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util_getent.c (renamed from source4/lib/util_getent.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util_pw.c (renamed from source4/lib/util_pw.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util_sock.c (renamed from source4/lib/util_sock.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util_str.c (renamed from source4/lib/util_str.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util_strlist.c (renamed from source4/lib/util_strlist.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/util_unistr.c (renamed from source4/lib/util_unistr.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/xfile.c (renamed from source4/lib/xfile.c) | 0 | ||||
-rw-r--r-- | source4/lib/util/xfile.h (renamed from source4/lib/xfile.h) | 0 | ||||
-rw-r--r-- | source4/lib/version.c | 63 |
38 files changed, 695 insertions, 102 deletions
diff --git a/source4/lib/basic.mk b/source4/lib/basic.mk index d5bff95f012..51ca3378a24 100644 --- a/source4/lib/basic.mk +++ b/source4/lib/basic.mk @@ -16,6 +16,7 @@ include socket_wrapper/config.mk include appweb/config.mk include replace/config.mk include stream/config.mk +include util/config.mk ############################## # Start SUBSYSTEM LIBNETIF @@ -57,50 +58,13 @@ OBJ_FILES = \ ################################################ [SUBSYSTEM::GENCACHE] -PRIVATE_PROTO_HEADER = gencache.h +PRIVATE_PROTO_HEADER = gencache/gencache.h OBJ_FILES = \ - gencache.o \ - -############################## -# Start SUBSYSTEM LIBBASIC -[SUBSYSTEM::LIBBASIC] -PRIVATE_PROTO_HEADER = basic.h -OBJ_FILES = version.o \ - xfile.o \ - debug.o \ - fault.o \ - signal.o \ - system.o \ - time.o \ - genrand.o \ - dprintf.o \ - util_str.o \ - util_strlist.o \ - util_unistr.o \ - util_file.o \ - data_blob.o \ - util.o \ - util_sock.o \ - substitute.o \ - fsusage.o \ - ms_fnmatch.o \ - select.o \ - mutex.o \ - idtree.o \ - module.o -REQUIRED_SUBSYSTEMS = \ - CHARSET LIBREPLACE LIBNETIF LIBCRYPTO EXT_LIB_DL LIBTALLOC \ - SOCKET_WRAPPER CONFIG -# End SUBSYSTEM LIBBASIC -############################## + gencache/gencache.o \ [SUBSYSTEM::DB_WRAP] OBJ_FILES = db_wrap.o \ gendb.o REQUIRED_SUBSYSTEMS = LIBLDB LIBTDB -[SUBSYSTEM::PIDFILE] -OBJ_FILES = pidfile.o -[SUBSYSTEM::UNIX_PRIVS] -OBJ_FILES = unix_privs.o diff --git a/source4/lib/gencache.c b/source4/lib/gencache/gencache.c index de8c47ada59..de8c47ada59 100644 --- a/source4/lib/gencache.c +++ b/source4/lib/gencache/gencache.c diff --git a/source4/lib/util/README b/source4/lib/util/README new file mode 100644 index 00000000000..e52e04ed924 --- /dev/null +++ b/source4/lib/util/README @@ -0,0 +1,296 @@ +This directory contains convenience functions that are used heavily +throughout Samba. None of these functions are SMB or Samba-specific. +It's a bit to Samba what GLib is to the GNOME folks. + +(This file should be migrated to doxygen sometime.. ) + +Also TODO: Remove dependency on loadparm + +XFILE wrapper functions +======================= +The XFILE implementation contains a clone of the standard UNIX stdio +functions + +Debug functions +=============== +DEBUG() + +Crash handlers +============== +void smb_panic(const char *why); + +Signal handling +======================== +void BlockSignals(BOOL block,int signum); +void (*CatchSignal(int signum,void (*handler)(int )))(int); +void CatchChild(void); +void CatchChildLeaveStatus(void); + +Wrappers +======== +struct hostent *sys_gethostbyname(const char *name); +const char *sys_inet_ntoa(struct ipv4_addr in); +struct ipv4_addr sys_inet_makeaddr(int net, int host); +void sys_select_signal(void); +int sys_select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval); +int sys_select_intr(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *tval); + +Time datastructures +=================== +time_t get_time_t_max(void); +void GetTimeOfDay(struct timeval *tval); +time_t nt_time_to_unix(NTTIME nt); +void unix_to_nt_time(NTTIME *nt, time_t t); +BOOL null_time(time_t t); +BOOL null_nttime(NTTIME t); +void push_dos_date(uint8_t *buf, int offset, time_t unixdate, int zone_offset); +void push_dos_date2(uint8_t *buf,int offset,time_t unixdate, int zone_offset); +void push_dos_date3(uint8_t *buf,int offset,time_t unixdate, int zone_offset); +time_t pull_dos_date(const uint8_t *date_ptr, int zone_offset); +time_t pull_dos_date2(const uint8_t *date_ptr, int zone_offset); +time_t pull_dos_date3(const uint8_t *date_ptr, int zone_offset); +char *http_timestring(TALLOC_CTX *mem_ctx, time_t t); +char *timestring(TALLOC_CTX *mem_ctx, time_t t); +const char *nt_time_string(TALLOC_CTX *mem_ctx, NTTIME nt); +void push_nttime(uint8_t *base, uint16_t offset, NTTIME t); +NTTIME pull_nttime(uint8_t *base, uint16_t offset); +NTTIME nttime_from_string(const char *s); +int64_t usec_time_diff(struct timeval *tv1, struct timeval *tv2); +struct timeval timeval_zero(void); +BOOL timeval_is_zero(const struct timeval *tv); +struct timeval timeval_current(void); +struct timeval timeval_set(uint32_t secs, uint32_t usecs); +struct timeval timeval_add(const struct timeval *tv, + uint32_t secs, uint32_t usecs); +struct timeval timeval_sum(const struct timeval *tv1, + const struct timeval *tv2); +struct timeval timeval_current_ofs(uint32_t secs, uint32_t usecs); +int timeval_compare(const struct timeval *tv1, const struct timeval *tv2); +BOOL timeval_expired(const struct timeval *tv); +double timeval_elapsed2(const struct timeval *tv1, const struct timeval *tv2); +double timeval_elapsed(const struct timeval *tv); +struct timeval timeval_min(const struct timeval *tv1, + const struct timeval *tv2); +struct timeval timeval_max(const struct timeval *tv1, + const struct timeval *tv2); +struct timeval timeval_until(const struct timeval *tv1, + const struct timeval *tv2); +NTTIME timeval_to_nttime(const struct timeval *tv); +int get_time_zone(time_t t); + +Random number generation +======================== +void set_rand_reseed_callback(void (*fn)(int *)); +void set_need_random_reseed(void); +void generate_random_buffer(uint8_t *out, int len); +uint32_t generate_random(void); +BOOL check_password_quality(const char *s); +char *generate_random_str_list(TALLOC_CTX *mem_ctx, size_t len, const char *list); +char *generate_random_str(TALLOC_CTX *mem_ctx, size_t len); + +String manipulation +=================== +BOOL next_token(const char **ptr,char *buff, const char *sep, size_t bufsize); +int strcasecmp_m(const char *s1, const char *s2); +BOOL strequal(const char *s1, const char *s2); +BOOL strcsequal(const char *s1,const char *s2); +int strwicmp(const char *psz1, const char *psz2); +void string_replace(char *s, char oldc, char newc); +BOOL trim_string(char *s,const char *front,const char *back); +size_t count_chars(const char *s, char c); +char *safe_strcpy(char *dest,const char *src, size_t maxlength); +char *safe_strcat(char *dest, const char *src, size_t maxlength); +char *alpha_strcpy(char *dest, const char *src, const char *other_safe_chars, size_t maxlength); +char *StrnCpy(char *dest,const char *src,size_t n); +size_t strhex_to_str(char *p, size_t len, const char *strhex); +DATA_BLOB strhex_to_data_blob(const char *strhex) ; +void hex_encode(const unsigned char *buff_in, size_t len, char **out_hex_buffer); +BOOL in_list(const char *s, const char *list, BOOL casesensitive); +void string_free(char **s); +BOOL string_set(char **dest, const char *src); +void string_sub(char *s,const char *pattern, const char *insert, size_t len); +void all_string_sub(char *s,const char *pattern,const char *insert, size_t len); +char *strchr_m(const char *s, char c); +char *strrchr_m(const char *s, char c); +BOOL strhaslower(const char *string); +BOOL strhasupper(const char *string); +char *strlower_talloc(TALLOC_CTX *ctx, const char *src); +char *strupper_talloc(TALLOC_CTX *ctx, const char *src); +void strlower_m(char *s); +void strupper_m(char *s); +size_t strlen_m(const char *s); +size_t strlen_m_term(const char *s); +void rfc1738_unescape(char *buf); +DATA_BLOB base64_decode_data_blob(TALLOC_CTX *mem_ctx, const char *s); +void base64_decode_inplace(char *s); +char *base64_encode_data_blob(TALLOC_CTX *mem_ctx, DATA_BLOB data); +size_t valgrind_strlen(const char *s); +const char *str_format_nbt_domain(TALLOC_CTX *mem_ctx, const char *s); +BOOL add_string_to_array(TALLOC_CTX *mem_ctx, + const char *str, const char ***strings, int *num); +int strcmp_safe(const char *s1, const char *s2); +size_t ascii_len_n(const char *src, size_t n); +char *attrib_string(TALLOC_CTX *mem_ctx, uint32_t attrib); +BOOL set_boolean(const char *boolean_string, BOOL *boolean); +BOOL conv_str_bool(const char * str, BOOL * val); +BOOL conv_str_size(const char * str, uint64_t * val); +BOOL conv_str_u64(const char * str, uint64_t * val); + +String list manipulation +======================== +const char **str_list_make(TALLOC_CTX *mem_ctx, const char *string, const char *sep); +const char **str_list_make_shell(TALLOC_CTX *mem_ctx, const char *string, const char *sep); +char *str_list_join(TALLOC_CTX *mem_ctx, const char **list, char seperator); +char *str_list_join_shell(TALLOC_CTX *mem_ctx, const char **list, char sep); +size_t str_list_length(const char **list); +const char **str_list_copy(TALLOC_CTX *mem_ctx, const char **list); +BOOL str_list_equal(const char **list1, const char **list2); +const char **str_list_add(const char **list, const char *s); +void str_list_remove(const char **list, const char *s); +BOOL str_list_check(const char **list, const char *s); +BOOL str_list_check_ci(const char **list, const char *s); + +Unicode string manipulation +=========================== +codepoint_t toupper_w(codepoint_t val); +codepoint_t tolower_w(codepoint_t val); +size_t utf16_len(const void *buf); +size_t utf16_len_n(const void *src, size_t n); +size_t ucs2_align(const void *base_ptr, const void *p, int flags); +int codepoint_cmpi(codepoint_t c1, codepoint_t c2); + +File manipulation +================= +char *fgets_slash(char *s2,int maxlen,XFILE *f); +char *afdgets(int fd, TALLOC_CTX *mem_ctx, size_t hint); +char *fd_load(int fd, size_t *size, TALLOC_CTX *mem_ctx); +char *file_load(const char *fname, size_t *size, TALLOC_CTX *mem_ctx); +void *map_file(const char *fname, size_t size); +char **file_lines_load(const char *fname, int *numlines, TALLOC_CTX *mem_ctx); +char **fd_lines_load(int fd, int *numlines, TALLOC_CTX *mem_ctx); +void file_lines_slashcont(char **lines); +BOOL file_save(const char *fname, const void *packet, size_t length); +BOOL file_exists(const char *path); +int vfdprintf(int fd, const char *format, va_list ap) _PRINTF_ATTRIBUTE(2,0); +int fdprintf(int fd, const char *format, ...) _PRINTF_ATTRIBUTE(2,3); + +Data Blob +========= +DATA_BLOB data_blob_named(const void *p, size_t length, const char *name); +DATA_BLOB data_blob_talloc_named(TALLOC_CTX *mem_ctx, const void *p, size_t length, const char *name); +DATA_BLOB data_blob_talloc_reference(TALLOC_CTX *mem_ctx, DATA_BLOB *blob); +DATA_BLOB data_blob_talloc_zero(TALLOC_CTX *mem_ctx, size_t length); +void data_blob_free(DATA_BLOB *d); +void data_blob_clear(DATA_BLOB *d); +void data_blob_clear_free(DATA_BLOB *d); +BOOL data_blob_equal(const DATA_BLOB *d1, const DATA_BLOB *d2); +char *data_blob_hex_string(TALLOC_CTX *mem_ctx, DATA_BLOB *blob); +DATA_BLOB data_blob_string_const(const char *str); +DATA_BLOB data_blob_const(const void *p, size_t length); +NTSTATUS data_blob_realloc(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, size_t length); +NTSTATUS data_blob_append(TALLOC_CTX *mem_ctx, DATA_BLOB *blob, + const void *p, size_t length); + +Random Utility functions +======================== +const char *tmpdir(void); +BOOL file_exist(const char *fname); +time_t file_modtime(const char *fname); +BOOL directory_exist(const char *dname); +BOOL directory_create_or_exist(const char *dname, uid_t uid, + mode_t dir_perms); +int set_blocking(int fd, BOOL set); +void msleep(uint_t t); +void become_daemon(BOOL Fork); +void safe_free(void *p); +BOOL is_myname(const char *name); +char* get_myname(void); +BOOL is_ipaddress(const char *str); +uint32_t interpret_addr(const char *str); +struct ipv4_addr interpret_addr2(const char *str); +BOOL is_zero_ip(struct ipv4_addr ip); +BOOL same_net(struct ipv4_addr ip1,struct ipv4_addr ip2,struct ipv4_addr mask); +BOOL process_exists(pid_t pid); +BOOL fcntl_lock(int fd, int op, off_t offset, off_t count, int type); +void dump_data(int level, const uint8_t *buf,int len); +void *smb_xmalloc(size_t size); +void *smb_xmemdup(const void *p, size_t size); +char *smb_xstrdup(const char *s); +void *memdup(const void *p, size_t size); +char *lock_path(TALLOC_CTX* mem_ctx, const char *name); +char *lib_path(TALLOC_CTX* mem_ctx, const char *name); +char *private_path(TALLOC_CTX* mem_ctx, const char *name); +char *smbd_tmp_path(TALLOC_CTX *mem_ctx, const char *name); +init_module_fn *load_samba_modules(TALLOC_CTX *mem_ctx, const char *subsystem); +void dump_data_pw(const char *msg, const uint8_t * data, size_t len); +BOOL all_zero(const uint8_t *ptr, uint_t size); +void *realloc_array(void *ptr, size_t el_size, unsigned count); + +/* The following definitions come from lib/util/util_sock.c */ + +void set_socket_options(int fd, const char *options); + +Variable substitution +===================== +void sub_set_context(struct substitute_context *subptr); +void sub_set_remote_proto(const char *str); +void sub_set_remote_arch(const char *str); +void sub_set_user_name(const char *name); +void standard_sub_basic(char *str,size_t len); +char *talloc_sub_basic(TALLOC_CTX *mem_ctx, const char *smb_name, const char *str); +char *alloc_sub_basic(const char *smb_name, const char *str); +char *talloc_sub_specified(TALLOC_CTX *mem_ctx, + const char *input_string, + const char *username, + const char *domain, + uid_t uid, + gid_t gid); +char *alloc_sub_specified(const char *input_string, + const char *username, + const char *domain, + uid_t uid, + gid_t gid); +char *talloc_sub_advanced(TALLOC_CTX *mem_ctx, + int snum, + const char *user, + const char *connectpath, + gid_t gid, + const char *smb_name, + char *str); +char *alloc_sub_advanced(int snum, const char *user, + const char *connectpath, gid_t gid, + const char *smb_name, char *str); +void standard_sub_tcon(struct smbsrv_tcon *tcon, char *str, size_t len); +char *talloc_sub_tcon(TALLOC_CTX *mem_ctx, struct smbsrv_tcon *tcon, char *str); +char *alloc_sub_tcon(struct smbsrv_tcon *tcon, char *str); +void standard_sub_snum(int snum, char *str, size_t len); + +/* The following definitions come from lib/util/fsusage.c */ + +int sys_fsusage(const char *path, uint64_t *dfree, uint64_t *dsize); + +Microsoft-style filename matching +================================= +int ms_fnmatch(const char *pattern, const char *string, enum protocol_types protocol); +int gen_fnmatch(const char *pattern, const char *string); + +Mutexes +======= +BOOL register_mutex_handlers(const char *name, struct mutex_ops *ops); + +Idtree +====== +very efficient functions to manage mapping a id (such as a fnum) to +a pointer. This is used for fnum and search id allocation. + +struct idr_context *idr_init(TALLOC_CTX *mem_ctx); +int idr_get_new(struct idr_context *idp, void *ptr, int limit); +int idr_get_new_above(struct idr_context *idp, void *ptr, int starting_id, int limit); +int idr_get_new_random(struct idr_context *idp, void *ptr, int limit); +void *idr_find(struct idr_context *idp, int id); +int idr_remove(struct idr_context *idp, int id); + +Module loading +============== +init_module_fn *load_modules(TALLOC_CTX *mem_ctx, const char *path); +BOOL run_init_functions(NTSTATUS (**fns) (void)); diff --git a/source4/lib/util/byteorder.h b/source4/lib/util/byteorder.h new file mode 100644 index 00000000000..941dee9e88f --- /dev/null +++ b/source4/lib/util/byteorder.h @@ -0,0 +1,224 @@ +/* + Unix SMB/CIFS implementation. + SMB Byte handling + Copyright (C) Andrew Tridgell 1992-1998 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _BYTEORDER_H +#define _BYTEORDER_H + +/* + This file implements macros for machine independent short and + int manipulation + +Here is a description of this file that I emailed to the samba list once: + +> I am confused about the way that byteorder.h works in Samba. I have +> looked at it, and I would have thought that you might make a distinction +> between LE and BE machines, but you only seem to distinguish between 386 +> and all other architectures. +> +> Can you give me a clue? + +sure. + +The distinction between 386 and other architectures is only there as +an optimisation. You can take it out completely and it will make no +difference. The routines (macros) in byteorder.h are totally byteorder +independent. The 386 optimsation just takes advantage of the fact that +the x86 processors don't care about alignment, so we don't have to +align ints on int boundaries etc. If there are other processors out +there that aren't alignment sensitive then you could also define +CAREFUL_ALIGNMENT=0 on those processors as well. + +Ok, now to the macros themselves. I'll take a simple example, say we +want to extract a 2 byte integer from a SMB packet and put it into a +type called uint16_t that is in the local machines byte order, and you +want to do it with only the assumption that uint16_t is _at_least_ 16 +bits long (this last condition is very important for architectures +that don't have any int types that are 2 bytes long) + +You do this: + +#define CVAL(buf,pos) (((uint8_t *)(buf))[pos]) +#define PVAL(buf,pos) ((uint_t)CVAL(buf,pos)) +#define SVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+1)<<8) + +then to extract a uint16_t value at offset 25 in a buffer you do this: + +char *buffer = foo_bar(); +uint16_t xx = SVAL(buffer,25); + +We are using the byteoder independence of the ANSI C bitshifts to do +the work. A good optimising compiler should turn this into efficient +code, especially if it happens to have the right byteorder :-) + +I know these macros can be made a bit tidier by removing some of the +casts, but you need to look at byteorder.h as a whole to see the +reasoning behind them. byteorder.h defines the following macros: + +SVAL(buf,pos) - extract a 2 byte SMB value +IVAL(buf,pos) - extract a 4 byte SMB value +SVALS(buf,pos) signed version of SVAL() +IVALS(buf,pos) signed version of IVAL() + +SSVAL(buf,pos,val) - put a 2 byte SMB value into a buffer +SIVAL(buf,pos,val) - put a 4 byte SMB value into a buffer +SSVALS(buf,pos,val) - signed version of SSVAL() +SIVALS(buf,pos,val) - signed version of SIVAL() + +RSVAL(buf,pos) - like SVAL() but for NMB byte ordering +RSVALS(buf,pos) - like SVALS() but for NMB byte ordering +RIVAL(buf,pos) - like IVAL() but for NMB byte ordering +RIVALS(buf,pos) - like IVALS() but for NMB byte ordering +RSSVAL(buf,pos,val) - like SSVAL() but for NMB ordering +RSIVAL(buf,pos,val) - like SIVAL() but for NMB ordering +RSIVALS(buf,pos,val) - like SIVALS() but for NMB ordering + +it also defines lots of intermediate macros, just ignore those :-) + +*/ + + +/* + on powerpc we can use the magic instructions to load/store + in little endian +*/ +#if (defined(__powerpc__) && defined(__GNUC__)) +static __inline__ uint16_t ld_le16(const uint16_t *addr) +{ + uint16_t val; + __asm__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); + return val; +} + +static __inline__ void st_le16(uint16_t *addr, const uint16_t val) +{ + __asm__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); +} + +static __inline__ uint32_t ld_le32(const uint32_t *addr) +{ + uint32_t val; + __asm__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); + return val; +} + +static __inline__ void st_le32(uint32_t *addr, const uint32_t val) +{ + __asm__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); +} +#define HAVE_ASM_BYTEORDER 1 +#endif + + + +#undef CAREFUL_ALIGNMENT + +/* we know that the 386 can handle misalignment and has the "right" + byteorder */ +#if defined(__i386__) +#define CAREFUL_ALIGNMENT 0 +#endif + +#ifndef CAREFUL_ALIGNMENT +#define CAREFUL_ALIGNMENT 1 +#endif + +#define CVAL(buf,pos) ((uint_t)(((const uint8_t *)(buf))[pos])) +#define CVAL_NC(buf,pos) (((uint8_t *)(buf))[pos]) /* Non-const version of CVAL */ +#define PVAL(buf,pos) (CVAL(buf,pos)) +#define SCVAL(buf,pos,val) (CVAL_NC(buf,pos) = (val)) + +#if HAVE_ASM_BYTEORDER + +#define _PTRPOS(buf,pos) (((const uint8_t *)buf)+(pos)) +#define SVAL(buf,pos) ld_le16((const uint16_t *)_PTRPOS(buf,pos)) +#define IVAL(buf,pos) ld_le32((const uint32_t *)_PTRPOS(buf,pos)) +#define SSVAL(buf,pos,val) st_le16((uint16_t *)_PTRPOS(buf,pos), val) +#define SIVAL(buf,pos,val) st_le32((uint32_t *)_PTRPOS(buf,pos), val) +#define SVALS(buf,pos) ((int16_t)SVAL(buf,pos)) +#define IVALS(buf,pos) ((int32_t)IVAL(buf,pos)) +#define SSVALS(buf,pos,val) SSVAL((buf),(pos),((int16_t)(val))) +#define SIVALS(buf,pos,val) SIVAL((buf),(pos),((int32_t)(val))) + +#elif CAREFUL_ALIGNMENT + +#define SVAL(buf,pos) (PVAL(buf,pos)|PVAL(buf,(pos)+1)<<8) +#define IVAL(buf,pos) (SVAL(buf,pos)|SVAL(buf,(pos)+2)<<16) +#define SSVALX(buf,pos,val) (CVAL_NC(buf,pos)=(uint8_t)((val)&0xFF),CVAL_NC(buf,pos+1)=(uint8_t)((val)>>8)) +#define SIVALX(buf,pos,val) (SSVALX(buf,pos,val&0xFFFF),SSVALX(buf,pos+2,val>>16)) +#define SVALS(buf,pos) ((int16_t)SVAL(buf,pos)) +#define IVALS(buf,pos) ((int32_t)IVAL(buf,pos)) +#define SSVAL(buf,pos,val) SSVALX((buf),(pos),((uint16_t)(val))) +#define SIVAL(buf,pos,val) SIVALX((buf),(pos),((uint32_t)(val))) +#define SSVALS(buf,pos,val) SSVALX((buf),(pos),((int16_t)(val))) +#define SIVALS(buf,pos,val) SIVALX((buf),(pos),((int32_t)(val))) + +#else /* CAREFUL_ALIGNMENT */ + +/* this handles things for architectures like the 386 that can handle + alignment errors */ +/* + WARNING: This section is dependent on the length of int16_t and int32_t + being correct +*/ + +/* get single value from an SMB buffer */ +#define SVAL(buf,pos) (*(const uint16_t *)((const char *)(buf) + (pos))) +#define SVAL_NC(buf,pos) (*(uint16_t *)((char *)(buf) + (pos))) /* Non const version of above. */ +#define IVAL(buf,pos) (*(const uint32_t *)((const char *)(buf) + (pos))) +#define IVAL_NC(buf,pos) (*(uint32_t *)((char *)(buf) + (pos))) /* Non const version of above. */ +#define SVALS(buf,pos) (*(const int16_t *)((const char *)(buf) + (pos))) +#define SVALS_NC(buf,pos) (*(int16_t *)((char *)(buf) + (pos))) /* Non const version of above. */ +#define IVALS(buf,pos) (*(const int32_t *)((const char *)(buf) + (pos))) +#define IVALS_NC(buf,pos) (*(int32_t *)((char *)(buf) + (pos))) /* Non const version of above. */ + +/* store single value in an SMB buffer */ +#define SSVAL(buf,pos,val) SVAL_NC(buf,pos)=((uint16_t)(val)) +#define SIVAL(buf,pos,val) IVAL_NC(buf,pos)=((uint32_t)(val)) +#define SSVALS(buf,pos,val) SVALS_NC(buf,pos)=((int16_t)(val)) +#define SIVALS(buf,pos,val) IVALS_NC(buf,pos)=((int32_t)(val)) + +#endif /* CAREFUL_ALIGNMENT */ + +/* now the reverse routines - these are used in nmb packets (mostly) */ +#define SREV(x) ((((x)&0xFF)<<8) | (((x)>>8)&0xFF)) +#define IREV(x) ((SREV(x)<<16) | (SREV((x)>>16))) + +#define RSVAL(buf,pos) SREV(SVAL(buf,pos)) +#define RSVALS(buf,pos) SREV(SVALS(buf,pos)) +#define RIVAL(buf,pos) IREV(IVAL(buf,pos)) +#define RIVALS(buf,pos) IREV(IVALS(buf,pos)) +#define RSSVAL(buf,pos,val) SSVAL(buf,pos,SREV(val)) +#define RSSVALS(buf,pos,val) SSVALS(buf,pos,SREV(val)) +#define RSIVAL(buf,pos,val) SIVAL(buf,pos,IREV(val)) +#define RSIVALS(buf,pos,val) SIVALS(buf,pos,IREV(val)) + +/* Alignment macros. */ +#define ALIGN4(p,base) ((p) + ((4 - (PTR_DIFF((p), (base)) & 3)) & 3)) +#define ALIGN2(p,base) ((p) + ((2 - (PTR_DIFF((p), (base)) & 1)) & 1)) + + +/* macros for accessing SMB protocol elements */ +#define VWV(vwv) ((vwv)*2) + +/* 64 bit macros */ +#define SBVAL(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,((uint64_t)(v))>>32)) +#define BVAL(p, ofs) (IVAL(p,ofs) | (((uint64_t)IVAL(p,(ofs)+4)) << 32)) + +#endif /* _BYTEORDER_H */ diff --git a/source4/lib/capability.c b/source4/lib/util/capability.c index 0cebd333032..0cebd333032 100644 --- a/source4/lib/capability.c +++ b/source4/lib/util/capability.c diff --git a/source4/lib/util/config.mk b/source4/lib/util/config.mk new file mode 100644 index 00000000000..79e145775d7 --- /dev/null +++ b/source4/lib/util/config.mk @@ -0,0 +1,34 @@ +[SUBSYSTEM::LIBBASIC] +PRIVATE_PROTO_HEADER = util_proto.h +PUBLIC_HEADERS = util.h +OBJ_FILES = xfile.o \ + debug.o \ + fault.o \ + signal.o \ + system.o \ + time.o \ + genrand.o \ + dprintf.o \ + util_str.o \ + util_strlist.o \ + util_unistr.o \ + util_file.o \ + data_blob.o \ + util.o \ + util_sock.o \ + substitute.o \ + fsusage.o \ + ms_fnmatch.o \ + select.o \ + mutex.o \ + idtree.o \ + module.o +REQUIRED_SUBSYSTEMS = \ + CHARSET LIBREPLACE LIBCRYPTO EXT_LIB_DL LIBTALLOC \ + SOCKET_WRAPPER CONFIG + +[SUBSYSTEM::PIDFILE] +OBJ_FILES = pidfile.o + +[SUBSYSTEM::UNIX_PRIVS] +OBJ_FILES = unix_privs.o diff --git a/source4/lib/data_blob.c b/source4/lib/util/data_blob.c index c6471fbf540..c6471fbf540 100644 --- a/source4/lib/data_blob.c +++ b/source4/lib/util/data_blob.c diff --git a/source4/lib/debug.c b/source4/lib/util/debug.c index 9df6e573b09..9df6e573b09 100644 --- a/source4/lib/debug.c +++ b/source4/lib/util/debug.c diff --git a/source4/lib/debug.h b/source4/lib/util/debug.h index 8ff937e7b93..8ff937e7b93 100644 --- a/source4/lib/debug.h +++ b/source4/lib/util/debug.h diff --git a/source4/lib/dprintf.c b/source4/lib/util/dprintf.c index 64227148fd9..64227148fd9 100644 --- a/source4/lib/dprintf.c +++ b/source4/lib/util/dprintf.c diff --git a/source4/lib/fault.c b/source4/lib/util/fault.c index 3670575dcc7..3670575dcc7 100644 --- a/source4/lib/fault.c +++ b/source4/lib/util/fault.c diff --git a/source4/lib/fsusage.c b/source4/lib/util/fsusage.c index f8176725447..f8176725447 100644 --- a/source4/lib/fsusage.c +++ b/source4/lib/util/fsusage.c diff --git a/source4/lib/genrand.c b/source4/lib/util/genrand.c index 1149314d0b4..1149314d0b4 100644 --- a/source4/lib/genrand.c +++ b/source4/lib/util/genrand.c diff --git a/source4/lib/idtree.c b/source4/lib/util/idtree.c index a67a80940a0..a67a80940a0 100644 --- a/source4/lib/idtree.c +++ b/source4/lib/util/idtree.c diff --git a/source4/lib/module.c b/source4/lib/util/module.c index 672d8df7cef..672d8df7cef 100644 --- a/source4/lib/module.c +++ b/source4/lib/util/module.c diff --git a/source4/lib/ms_fnmatch.c b/source4/lib/util/ms_fnmatch.c index 699341bede5..699341bede5 100644 --- a/source4/lib/ms_fnmatch.c +++ b/source4/lib/util/ms_fnmatch.c diff --git a/source4/lib/mutex.c b/source4/lib/util/mutex.c index 480ba92cc09..480ba92cc09 100644 --- a/source4/lib/mutex.c +++ b/source4/lib/util/mutex.c diff --git a/source4/lib/mutex.h b/source4/lib/util/mutex.h index bb26c84f5dc..018c134bcb8 100644 --- a/source4/lib/mutex.h +++ b/source4/lib/util/mutex.h @@ -21,6 +21,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +struct mutex_ops; + /* To add a new read/write lock, add it to enum rwlock_id */ enum rwlock_id { RWLOCK_SMBD, /* global smbd lock */ diff --git a/source4/lib/pidfile.c b/source4/lib/util/pidfile.c index 9a7c197f700..9a7c197f700 100644 --- a/source4/lib/pidfile.c +++ b/source4/lib/util/pidfile.c diff --git a/source4/lib/util/safe_string.h b/source4/lib/util/safe_string.h new file mode 100644 index 00000000000..43e094467cc --- /dev/null +++ b/source4/lib/util/safe_string.h @@ -0,0 +1,55 @@ +/* + Unix SMB/CIFS implementation. + Safe string handling routines. + Copyright (C) Andrew Tridgell 1994-1998 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _SAFE_STRING_H +#define _SAFE_STRING_H + +#ifndef _SPLINT_ /* http://www.splint.org */ +/* Some macros to ensure people don't use buffer overflow vulnerable string + functions. */ + +#ifdef bcopy +#undef bcopy +#endif /* bcopy */ +#define bcopy(src,dest,size) __ERROR__XX__NEVER_USE_BCOPY___; + +#ifdef strcpy +#undef strcpy +#endif /* strcpy */ +#define strcpy(dest,src) __ERROR__XX__NEVER_USE_STRCPY___; + +#ifdef strcat +#undef strcat +#endif /* strcat */ +#define strcat(dest,src) __ERROR__XX__NEVER_USE_STRCAT___; + +#ifdef sprintf +#undef sprintf +#endif /* sprintf */ +#define sprintf __ERROR__XX__NEVER_USE_SPRINTF__; + +#endif /* !_SPLINT_ */ + +/* replace some string functions with multi-byte + versions */ +#define strlower(s) strlower_m(s) +#define strupper(s) strupper_m(s) + +#endif diff --git a/source4/lib/select.c b/source4/lib/util/select.c index a1b2e04065b..a1b2e04065b 100644 --- a/source4/lib/select.c +++ b/source4/lib/util/select.c diff --git a/source4/lib/signal.c b/source4/lib/util/signal.c index 6c0bb4007a1..6c0bb4007a1 100644 --- a/source4/lib/signal.c +++ b/source4/lib/util/signal.c diff --git a/source4/lib/substitute.c b/source4/lib/util/substitute.c index 34a2ad9f82b..34a2ad9f82b 100644 --- a/source4/lib/substitute.c +++ b/source4/lib/util/substitute.c diff --git a/source4/lib/system.c b/source4/lib/util/system.c index 655b4a1054f..655b4a1054f 100644 --- a/source4/lib/system.c +++ b/source4/lib/util/system.c diff --git a/source4/lib/time.c b/source4/lib/util/time.c index 7721a2c456c..7721a2c456c 100644 --- a/source4/lib/time.c +++ b/source4/lib/util/time.c diff --git a/source4/lib/unix_privs.c b/source4/lib/util/unix_privs.c index 3c0f3197767..3c0f3197767 100644 --- a/source4/lib/unix_privs.c +++ b/source4/lib/util/unix_privs.c diff --git a/source4/lib/util.c b/source4/lib/util/util.c index 17dde332e1a..17dde332e1a 100644 --- a/source4/lib/util.c +++ b/source4/lib/util/util.c diff --git a/source4/lib/util/util.h b/source4/lib/util/util.h new file mode 100644 index 00000000000..55d775e25c6 --- /dev/null +++ b/source4/lib/util/util.h @@ -0,0 +1,81 @@ +/* + Unix SMB/CIFS implementation. + Utility functions for Samba + Copyright (C) Andrew Tridgell 1992-1999 + Copyright (C) John H Terpstra 1996-1999 + Copyright (C) Luke Kenneth Casson Leighton 1996-1999 + Copyright (C) Paul Ashton 1998 - 1999 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef _SAMBA_UTIL_H_ +#define _SAMBA_UTIL_H_ + +struct substitute_context; + +#include "util/xfile.h" +#include "util/debug.h" +#include "util/mutex.h" +#include "util/byteorder.h" +#include "util/util_proto.h" + +/* zero a structure */ +#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x)) + +/* zero a structure given a pointer to the structure */ +#define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0) + +/* zero a structure given a pointer to the structure - no zero check */ +#define ZERO_STRUCTPN(x) memset((char *)(x), 0, sizeof(*(x))) + +/* pointer difference macro */ +#define PTR_DIFF(p1,p2) ((ptrdiff_t)(((const char *)(p1)) - (const char *)(p2))) + +/* work out how many elements there are in a static array */ +#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) + +/* assert macros */ +#define SMB_ASSERT(b) do { if (!(b)) { \ + DEBUG(0,("PANIC: assert failed at %s(%d)\n", __FILE__, __LINE__)); \ + smb_panic("assert failed"); }} while (0) + +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif + +#ifndef ABS +#define ABS(a) ((a)>0?(a):(-(a))) +#endif + +#ifndef SAFE_FREE /* Oh no this is also defined in tdb.h */ +/** + * Free memory if the pointer and zero the pointer. + * + * @note You are explicitly allowed to pass NULL pointers -- they will + * always be ignored. + **/ +#define SAFE_FREE(x) do { if ((x) != NULL) {free(discard_const_p(void *, (x))); (x)=NULL;} } while(0) +#endif + +#define malloc_p(type) (type *)malloc(sizeof(type)) +#define malloc_array_p(type, count) (type *)realloc_array(NULL, sizeof(type), count) +#define realloc_p(p, type, count) (type *)realloc_array(p, sizeof(type), count) + +#endif /* _SAMBA_UTIL_H_ */ diff --git a/source4/lib/util_file.c b/source4/lib/util/util_file.c index 246b03b4aa4..246b03b4aa4 100644 --- a/source4/lib/util_file.c +++ b/source4/lib/util/util_file.c diff --git a/source4/lib/util_getent.c b/source4/lib/util/util_getent.c index 9f58472fb8c..9f58472fb8c 100644 --- a/source4/lib/util_getent.c +++ b/source4/lib/util/util_getent.c diff --git a/source4/lib/util_pw.c b/source4/lib/util/util_pw.c index 19893e396f9..19893e396f9 100644 --- a/source4/lib/util_pw.c +++ b/source4/lib/util/util_pw.c diff --git a/source4/lib/util_sock.c b/source4/lib/util/util_sock.c index 8a65a27d020..8a65a27d020 100644 --- a/source4/lib/util_sock.c +++ b/source4/lib/util/util_sock.c diff --git a/source4/lib/util_str.c b/source4/lib/util/util_str.c index b46787e3ea2..b46787e3ea2 100644 --- a/source4/lib/util_str.c +++ b/source4/lib/util/util_str.c diff --git a/source4/lib/util_strlist.c b/source4/lib/util/util_strlist.c index ec6c58162f7..ec6c58162f7 100644 --- a/source4/lib/util_strlist.c +++ b/source4/lib/util/util_strlist.c diff --git a/source4/lib/util_unistr.c b/source4/lib/util/util_unistr.c index b35822877cc..b35822877cc 100644 --- a/source4/lib/util_unistr.c +++ b/source4/lib/util/util_unistr.c diff --git a/source4/lib/xfile.c b/source4/lib/util/xfile.c index 794e3f0f5e8..794e3f0f5e8 100644 --- a/source4/lib/xfile.c +++ b/source4/lib/util/xfile.c diff --git a/source4/lib/xfile.h b/source4/lib/util/xfile.h index 89fa9d1e118..89fa9d1e118 100644 --- a/source4/lib/xfile.h +++ b/source4/lib/util/xfile.h diff --git a/source4/lib/version.c b/source4/lib/version.c deleted file mode 100644 index b7aa81a0817..00000000000 --- a/source4/lib/version.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - Unix SMB/CIFS implementation. - Samba Version functions - - Copyright (C) Stefan Metzmacher 2003 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#include "includes.h" -#include "version.h" - -const char *samba_version_string(void) -{ - const char *official_string = SAMBA_VERSION_OFFICIAL_STRING; -#ifdef SAMBA_VERSION_RELEASE_NICKNAME - const char *release_nickname = SAMBA_VERSION_RELEASE_NICKNAME; -#else - const char *release_nickname = NULL; -#endif -#ifdef SAMBA_VERSION_VENDOR_SUFFIX - const char *vendor_suffix = SAMBA_VERSION_VENDOR_SUFFIX; -#else - const char *vendor_suffix = NULL; -#endif -#ifdef SAMBA_VERSION_VENDOR_PATCH - const char *vendor_patch = SAMBA_VERSION_VENDOR_PATCH; -#else - const char *vendor_patch = NULL; -#endif - static char *samba_version; - static BOOL init_samba_version; - - if (init_samba_version) { - return samba_version; - } - - samba_version = talloc_asprintf(talloc_autofree_context(), - "%s%s%s%s%s%s%s%s", - official_string, - (vendor_suffix?"-":""), - (vendor_suffix?vendor_suffix:""), - (vendor_patch?"-":""), - (vendor_patch?vendor_patch:""), - (release_nickname?" (":""), - (release_nickname?release_nickname:""), - (release_nickname?")":"")); - - init_samba_version = True; - return samba_version; -} |