diff options
Diffstat (limited to 'src/common/util.h')
-rw-r--r-- | src/common/util.h | 228 |
1 files changed, 17 insertions, 211 deletions
diff --git a/src/common/util.h b/src/common/util.h index 4fd31612a..2c47a46cc 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -1,4 +1,4 @@ -/* Copyright 2003 Roger Dingledine */ +/* Copyright 2003-2004 Roger Dingledine; Copyright 2004 Nick Mathewson */ /* See LICENSE for licensing information */ /* $Id$ */ @@ -13,7 +13,7 @@ #include "orconfig.h" #include "torint.h" #include <stdio.h> -#include <stdarg.h> +#include <assert.h> #ifdef HAVE_SYS_TIME_H #include <sys/time.h> #endif @@ -21,40 +21,6 @@ #include <time.h> #endif -#ifndef NULL_REP_IS_ZERO_BYTES -#error "It seems your platform does not represent NULL as zero. We can't cope." -#endif - -#ifdef MS_WINDOWS -#if (_MSC_VER <= 1300) -#include <winsock.h> -#else -#include <winsock2.h> -#include <ws2tcpip.h> -#endif -#endif - -#if !defined(HAVE_GETTIMEOFDAY) && !defined(HAVE_STRUCT_TIMEVAL_TV_SEC) -struct timeval { - time_t tv_sec; - unsigned int tv_usec; -}; -#endif - -#ifdef MS_WINDOWS -/* Windows names string functions differently from most other platforms. */ -#define strncasecmp strnicmp -#define strcasecmp stricmp -/* "inline" is __inline on windows. " */ -#define INLINE __inline -/* Windows compilers before VC7 don't have __FUNCTION__. */ -#if _MSC_VER < 1300 -#define __FUNCTION__ "???" -#endif -#else -#define INLINE inline -#endif - /** Replace assert() with a variant that sends failures to the log before * calling assert() normally. */ @@ -70,29 +36,19 @@ struct timeval { } } while (0) #endif -#ifdef MS_WINDOWS -/** On windows, you have to call close() on fds returned by open(), - * and closesocket() on fds returned by socket(). On Unix, everything - * gets close()'d. We abstract this difference by always using - * tor_close_socket to close sockets, and always using close() on - * files. - */ -#define tor_close_socket(s) closesocket(s) -#else -#define tor_close_socket(s) close(s) -#endif - -#define HEX_CHARACTERS "0123456789ABCDEFabcdef" - -size_t strlcat(char *dst, const char *src, size_t siz); -size_t strlcpy(char *dst, const char *src, size_t siz); - +/* Memory management */ void *tor_malloc(size_t size); void *tor_malloc_zero(size_t size); void *tor_realloc(void *ptr, size_t size); char *tor_strdup(const char *s); char *tor_strndup(const char *s, size_t n); #define tor_free(p) do {if(p) {free(p); (p)=NULL;}} while(0) + +/* String manipulation */ +#define HEX_CHARACTERS "0123456789ABCDEFabcdef" +size_t strlcat(char *dst, const char *src, size_t siz); +size_t strlcpy(char *dst, const char *src, size_t siz); + void tor_strlower(char *s); int strcmpstart(const char *s1, const char *s2); int tor_strstrip(char *s, const char *strip); @@ -106,106 +62,13 @@ long tor_parse_long(const char *s, int base, long min, long max, int *ok, char **next); unsigned long tor_parse_ulong(const char *s, int base, unsigned long min, unsigned long max, int *ok, char **next); - -/* XXXX duplicated from log.h */ -#ifdef __GNUC__ -#define CHECK_PRINTF(formatIdx, firstArg) \ - __attribute__ ((format (printf, formatIdx, firstArg))) -#else -#define CHECK_PRINTF(formatIdx, firstArg) -#endif - -int tor_snprintf(char *str, size_t size, const char *format, ...) - CHECK_PRINTF(3,4); -int tor_vsnprintf(char *str, size_t size, const char *format, va_list args); - -/* Some platforms segfault when you try to access a multi-byte type - * that isn't aligned to a word boundary. The macros and/or functions - * below can be used to access unaligned data on any platform. - */ -#ifdef UNALIGNED_INT_ACCESS_OK -#define get_uint16(cp) (*(uint16_t*)(cp)) -#define get_uint32(cp) (*(uint32_t*)(cp)) -#define set_uint16(cp,v) do { *(uint16_t*)(cp) = (v); } while (0) -#define set_uint32(cp,v) do { *(uint32_t*)(cp) = (v); } while (0) -#else -uint16_t get_uint16(const char *cp); -uint32_t get_uint32(const char *cp); -void set_uint16(char *cp, uint16_t v); -void set_uint32(char *cp, uint32_t v); -#endif - const char *hex_str(const char *from, size_t fromlen); - -/** Generic resizeable array. */ -typedef struct smartlist_t smartlist_t; - -smartlist_t *smartlist_create(void); -void smartlist_free(smartlist_t *sl); -void smartlist_set_capacity(smartlist_t *sl, int n); -void smartlist_clear(smartlist_t *sl); -void smartlist_truncate(smartlist_t *sl, int n); -void smartlist_add(smartlist_t *sl, void *element); -void smartlist_add_all(smartlist_t *sl, const smartlist_t *s2); -void smartlist_remove(smartlist_t *sl, void *element); -int smartlist_isin(const smartlist_t *sl, void *element); -int smartlist_string_isin(const smartlist_t *sl, const char *element); -int smartlist_overlap(const smartlist_t *sl1, const smartlist_t *sl2); -void smartlist_intersect(smartlist_t *sl1, const smartlist_t *sl2); -void smartlist_subtract(smartlist_t *sl1, const smartlist_t *sl2); -void *smartlist_choose(const smartlist_t *sl); -void *smartlist_get(const smartlist_t *sl, int idx); -void *smartlist_set(smartlist_t *sl, int idx, void *val); -void *smartlist_del(smartlist_t *sl, int idx); -void *smartlist_del_keeporder(smartlist_t *sl, int idx); -void smartlist_insert(smartlist_t *sl, int idx, void *val); -int smartlist_len(const smartlist_t *sl); -#define SPLIT_SKIP_SPACE 0x01 -#define SPLIT_IGNORE_BLANK 0x02 -int smartlist_split_string(smartlist_t *sl, const char *str, const char *sep, - int flags, int max); -char *smartlist_join_strings(smartlist_t *sl, const char *join, int terminate); - -#define SMARTLIST_FOREACH(sl, type, var, cmd) \ - do { \ - int var ## _sl_idx, var ## _sl_len=smartlist_len(sl); \ - type var; \ - for(var ## _sl_idx = 0; var ## _sl_idx < var ## _sl_len; \ - ++var ## _sl_idx) { \ - var = smartlist_get((sl),var ## _sl_idx); \ - cmd; \ - } } while (0) - -/* Map from const char * to void*. Implemented with a splay tree. */ -typedef struct strmap_t strmap_t; -typedef struct strmap_entry_t strmap_entry_t; -typedef struct strmap_entry_t strmap_iter_t; -strmap_t* strmap_new(void); -void* strmap_set(strmap_t *map, const char *key, void *val); -void* strmap_get(strmap_t *map, const char *key); -void* strmap_remove(strmap_t *map, const char *key); -void* strmap_set_lc(strmap_t *map, const char *key, void *val); -void* strmap_get_lc(strmap_t *map, const char *key); -void* strmap_remove_lc(strmap_t *map, const char *key); -typedef void* (*strmap_foreach_fn)(const char *key, void *val, void *data); -void strmap_foreach(strmap_t *map, strmap_foreach_fn fn, void *data); -void strmap_free(strmap_t *map, void (*free_val)(void*)); -int strmap_isempty(strmap_t *map); - -strmap_iter_t *strmap_iter_init(strmap_t *map); -strmap_iter_t *strmap_iter_next(strmap_t *map, strmap_iter_t *iter); -strmap_iter_t *strmap_iter_next_rmv(strmap_t *map, strmap_iter_t *iter); -void strmap_iter_get(strmap_iter_t *iter, const char **keyp, void **valp); - -int strmap_iter_done(strmap_iter_t *iter); - -/* String manipulation */ const char *eat_whitespace(const char *s); const char *eat_whitespace_no_nl(const char *s); const char *find_whitespace(const char *s); + /* Time helpers */ -void tor_gettimeofday(struct timeval *timeval); long tv_udiff(struct timeval *start, struct timeval *end); void tv_addms(struct timeval *a, long ms); void tv_add(struct timeval *a, struct timeval *b); @@ -218,92 +81,35 @@ int parse_rfc1123_time(const char *buf, time_t *t); void format_iso_time(char *buf, time_t t); int parse_iso_time(const char *buf, time_t *t); +/* File helpers */ int write_all(int fd, const char *buf, size_t count, int isSocket); int read_all(int fd, char *buf, size_t count, int isSocket); -void set_socket_nonblocking(int socket); - typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR} file_status_t; - file_status_t file_status(const char *filename); + int check_private_dir(const char *dirname, int create); int write_str_to_file(const char *fname, const char *str, int bin); char *read_file_to_str(const char *filename, int bin); int parse_line_from_file(char *line, size_t maxlen, FILE *f, char **key_out, char **value_out); char *expand_filename(const char *filename); -int replace_file(const char *from, const char *to); - -int spawn_func(int (*func)(void *), void *data); -void spawn_exit(void); - -/* Because we use threads instead of processes on Windows, we need locking on Windows. - * On Unixy platforms, these functions are no-ops. */ -typedef struct tor_mutex_t tor_mutex_t; -tor_mutex_t *tor_mutex_new(void); -void tor_mutex_acquire(tor_mutex_t *m); -void tor_mutex_release(tor_mutex_t *m); -void tor_mutex_free(tor_mutex_t *m); - -int tor_socketpair(int family, int type, int protocol, int fd[2]); +/* Net helpers */ int is_internal_IP(uint32_t ip); int is_local_IP(uint32_t ip); - -const char *get_uname(void); - -void start_daemon(const char *desired_cwd); -void finish_daemon(void); - -void write_pidfile(char *filename); -int set_max_file_descriptors(int required_min); -int switch_id(char *user, char *group); - -struct in_addr; -int tor_inet_aton(const char *cp, struct in_addr *addr); int tor_lookup_hostname(const char *name, uint32_t *addr); int parse_addr_port(const char *addrport, char **address, uint32_t *addr, uint16_t *port); - int parse_addr_and_port_range(const char *s, uint32_t *addr_out, uint32_t *mask_out, uint16_t *port_min_out, uint16_t *port_max_out); -/* For stupid historical reasons, windows sockets have an independent - * set of errnos, and an independent way to get them. Also, you can't - * always believe WSAEWOULDBLOCK. Use the macros below to compare - * errnos against expected values, and use tor_socket_errno to find - * the actual errno after a socket operation fails. - */ -#ifdef MS_WINDOWS -/** Return true if e is EAGAIN or the local equivalent. */ -#define ERRNO_IS_EAGAIN(e) ((e) == EAGAIN || (e) == WSAEWOULDBLOCK) -/** Return true if e is EINPROGRESS or the local equivalent. */ -#define ERRNO_IS_EINPROGRESS(e) ((e) == WSAEINPROGRESS) -/** Return true if e is EINPROGRESS or the local equivalent as returned by - * a call to connect(). */ -#define ERRNO_IS_CONN_EINPROGRESS(e) ((e) == WSAEINPROGRESS || (e)== WSAEINVAL) -/** Return true if e is EAGAIN or another error indicating that a call to - * accept() has no pending connections to return. */ -#define ERRNO_IS_ACCEPT_EAGAIN(e) ERRNO_IS_EAGAIN(e) -/** Return true if e is EMFILE or another error indicating that a call to - * accept() has failed because we're out of fds or something. */ -#define ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e) \ - ((e) == WSAEMFILE || (e) == WSAENOBUFS) -int tor_socket_errno(int sock); -const char *tor_socket_strerror(int e); -#else -#define ERRNO_IS_EAGAIN(e) ((e) == EAGAIN) -#define ERRNO_IS_EINPROGRESS(e) ((e) == EINPROGRESS) -#define ERRNO_IS_CONN_EINPROGRESS(e) ((e) == EINPROGRESS) -#define ERRNO_IS_ACCEPT_EAGAIN(e) ((e) == EAGAIN || (e) == ECONNABORTED) -#define ERRNO_IS_ACCEPT_RESOURCE_LIMIT(e) \ - ((e) == EMFILE || (e) == ENFILE || (e) == ENOBUFS || (e) == ENOMEM) -#define tor_socket_errno(sock) (errno) -#define tor_socket_strerror(e) strerror(e) -#endif +/* Process helpers */ +void start_daemon(const char *desired_cwd); +void finish_daemon(void); +void write_pidfile(char *filename); #endif - /* Local Variables: mode:c |