mirror of
https://github.com/darkk/redsocks.git
synced 2025-08-25 11:15:30 +00:00
Statement expression is GNU C extension, not present in ISO standard. Type checking works now via implicit conversion performed for compound literal (compound literals are available since C99). typeof is only used on GNUC compilers like gcc or clang.
78 lines
2.6 KiB
C
78 lines
2.6 KiB
C
#ifndef UTILS_H_SAT_FEB__2_02_24_05_2008
|
|
#define UTILS_H_SAT_FEB__2_02_24_05_2008
|
|
|
|
#include <stddef.h>
|
|
#include <time.h>
|
|
#include <event.h>
|
|
|
|
struct sockaddr_in;
|
|
|
|
#define SIZEOF_ARRAY(arr) (sizeof(arr) / sizeof(arr[0]))
|
|
#define FOREACH(ptr, array) for (ptr = array; ptr < array + SIZEOF_ARRAY(array); ptr++)
|
|
#define FOREACH_REV(ptr, array) for (ptr = array + SIZEOF_ARRAY(array) - 1; ptr >= array; ptr--)
|
|
|
|
#define UNUSED(x) ((void)(x))
|
|
|
|
#if defined __GNUC__
|
|
#define PACKED __attribute__((packed))
|
|
#else
|
|
#error Unknown compiler, modify utils.h for it
|
|
#endif
|
|
|
|
|
|
#ifdef __GNUC__
|
|
#define member_type(type, member) __typeof(((type *)0)->member)
|
|
#else
|
|
#define member_type(type, member) const void
|
|
#endif
|
|
|
|
/**
|
|
* container_of - cast a member of a structure out to the containing structure
|
|
* @ptr: the pointer to the member.
|
|
* @type: the type of the container struct this is embedded in.
|
|
* @member: the name of the member within the struct.
|
|
*
|
|
*/
|
|
#define container_of(ptr, type, member) \
|
|
((type *)( \
|
|
(char *)(member_type(type, member) *){ ptr } - offsetof(type, member) \
|
|
))
|
|
|
|
|
|
#define clamp_value(value, min_val, max_val) do { \
|
|
if (value < min_val) \
|
|
value = min_val; \
|
|
if (value > max_val) \
|
|
value = max_val; \
|
|
} while (0)
|
|
|
|
|
|
time_t redsocks_time(time_t *t);
|
|
char *redsocks_evbuffer_readline(struct evbuffer *buf);
|
|
struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb writecb, everrorcb errorcb, void *cbarg);
|
|
int red_socket_geterrno(struct bufferevent *buffev);
|
|
int red_is_socket_connected_ok(struct bufferevent *buffev);
|
|
int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *fromaddr, struct sockaddr_in *toaddr);
|
|
|
|
int fcntl_nonblock(int fd);
|
|
|
|
#define event_fmt_str "%s|%s|%s|%s|%s|0x%x"
|
|
#define event_fmt(what) \
|
|
(what) & EVBUFFER_READ ? "EVBUFFER_READ" : "0", \
|
|
(what) & EVBUFFER_WRITE ? "EVBUFFER_WRITE" : "0", \
|
|
(what) & EVBUFFER_EOF ? "EVBUFFER_EOF" : "0", \
|
|
(what) & EVBUFFER_ERROR ? "EVBUFFER_ERROR" : "0", \
|
|
(what) & EVBUFFER_TIMEOUT ? "EVBUFFER_TIMEOUT" : "0", \
|
|
(what) & ~(EVBUFFER_READ|EVBUFFER_WRITE|EVBUFFER_EOF|EVBUFFER_ERROR|EVBUFFER_TIMEOUT)
|
|
|
|
#if INET6_ADDRSTRLEN < INET_ADDRSTRLEN
|
|
# error Impossible happens: INET6_ADDRSTRLEN < INET_ADDRSTRLEN
|
|
#else
|
|
# define RED_INET_ADDRSTRLEN (INET6_ADDRSTRLEN + 1 + 5 + 1) // addr + : + port + \0
|
|
#endif
|
|
char *red_inet_ntop(const struct sockaddr_in* sa, char* buffer, size_t buffer_size);
|
|
|
|
/* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */
|
|
/* vim:set foldmethod=marker foldlevel=32 foldmarker={,}: */
|
|
#endif /* UTILS_H_SAT_FEB__2_02_24_05_2008 */
|