From c50dd8b2b4bb89afa12aaffffc91af6c12d14051 Mon Sep 17 00:00:00 2001 From: Leonid Evdokimov Date: Sat, 27 Nov 2010 21:57:43 +0200 Subject: [PATCH] Some source code cleanup. --- Makefile | 2 +- redsocks.c | 94 ++++------------------------------------------- utils.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 7 ++++ 4 files changed, 122 insertions(+), 87 deletions(-) create mode 100644 utils.c diff --git a/Makefile b/Makefile index 3411476..0bdb83e 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ CFLAGS=-std=gnu99 -Wall -g -O0 .PHONY: all all: redsocks -obj = parser.o main.o redsocks.o log.o http-connect.o socks4.o socks5.o http-relay.o base.o +obj = parser.o main.o redsocks.o log.o http-connect.o socks4.o socks5.o http-relay.o base.o utils.o src = $(patsubst %.o,%.c,$(obj)) redsocks: $(obj) diff --git a/redsocks.c b/redsocks.c index abb551c..0969094 100644 --- a/redsocks.c +++ b/redsocks.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include @@ -41,26 +40,6 @@ static void redsocks_shutdown(redsocks_client *client, struct bufferevent *buffev, int how); -/** simple fcntl(2) wrapper, provides errno and all logging to caller - * I have to use it in event-driven code because of accept(2) (see NOTES) - * and connect(2) (see ERRORS about EINPROGRESS) - */ -static int fcntl_nonblock(int fd) -{ - int error; - int flags; - - flags = fcntl(fd, F_GETFL); - if (flags == -1) - return -1; - - error = fcntl(fd, F_SETFL, flags | O_NONBLOCK); - if (error) - return -1; - - return 0; -} - extern relay_subsys http_connect_subsys; extern relay_subsys http_relay_subsys; extern relay_subsys socks4_subsys; @@ -73,7 +52,7 @@ static relay_subsys *relay_subsystems[] = &socks5_subsys, }; -list_head instances = LIST_HEAD_INIT(instances); +static list_head instances = LIST_HEAD_INIT(instances); static parser_entry redsocks_entries[] = { @@ -197,16 +176,6 @@ void redsocks_log_write( va_end(ap); } -static time_t redsocks_time(time_t *t) -{ - time_t retval; - retval = time(t); - if (retval == ((time_t) -1)) - log_errno(LOG_WARNING, "time"); - return retval; -} - - void redsocks_touch_client(redsocks_client *client) { redsocks_time(&client->last_event); @@ -375,15 +344,9 @@ static void redsocks_shutdown(redsocks_client *client, struct bufferevent *buffe // I assume that -1 is invalid errno value static int redsocks_socket_geterrno(redsocks_client *client, struct bufferevent *buffev) { - int error; - int pseudo_errno; - size_t optlen = sizeof(pseudo_errno); - - assert(EVENT_FD(&buffev->ev_read) == EVENT_FD(&buffev->ev_write)); - - error = getsockopt(EVENT_FD(&buffev->ev_read), SOL_SOCKET, SO_ERROR, &pseudo_errno, &optlen); - if (error) { - redsocks_log_errno(client, LOG_ERR, "getsockopt"); + int pseudo_errno = red_socket_geterrno(buffev); + if (pseudo_errno == -1) { + redsocks_log_errno(client, LOG_ERR, "red_socket_geterrno"); return -1; } return pseudo_errno; @@ -543,53 +506,12 @@ fail: void redsocks_connect_relay(redsocks_client *client) { - int on = 1; - int relay_fd = -1; - int error; - - relay_fd = socket(AF_INET, SOCK_STREAM, 0); - if (relay_fd == -1) { - redsocks_log_errno(client, LOG_ERR, "socket"); - goto fail; - } - - error = fcntl_nonblock(relay_fd); - if (error) { - redsocks_log_errno(client, LOG_ERR, "fcntl"); - goto fail; - } - - error = setsockopt(relay_fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)); - if (error) { - redsocks_log_errno(client, LOG_WARNING, "setsockopt"); - goto fail; - } - - error = connect(relay_fd, (struct sockaddr*)&client->instance->config.relayaddr, sizeof(client->instance->config.relayaddr)); - if (error && errno != EINPROGRESS) { - redsocks_log_errno(client, LOG_NOTICE, "connect"); - goto fail; - } - - client->relay = bufferevent_new(relay_fd, NULL, redsocks_relay_connected, redsocks_event_error, client); + client->relay = red_connect_relay(&client->instance->config.relayaddr, + redsocks_relay_connected, redsocks_event_error, client); if (!client->relay) { - redsocks_log_errno(client, LOG_ERR, "bufferevent_new"); - goto fail; + redsocks_log_errno(client, LOG_ERR, "red_connect_relay"); + redsocks_drop_client(client); } - relay_fd = -1; - - error = bufferevent_enable(client->relay, EV_WRITE); // we wait for connection... - if (error) { - redsocks_log_errno(client, LOG_ERR, "bufferevent_enable"); - goto fail; - } - - return; // OK - -fail: - if (relay_fd != -1) - close(relay_fd); - redsocks_drop_client(client); } static void redsocks_accept_client(int fd, short what, void *_arg) diff --git a/utils.c b/utils.c new file mode 100644 index 0000000..39df3a8 --- /dev/null +++ b/utils.c @@ -0,0 +1,106 @@ +#include +#include +#include +#include +#include "log.h" +#include "utils.h" + +time_t redsocks_time(time_t *t) +{ + time_t retval; + retval = time(t); + if (retval == ((time_t) -1)) + log_errno(LOG_WARNING, "time"); + return retval; +} + +struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb writecb, everrorcb errorcb, void *cbarg) +{ + struct bufferevent *retval = NULL; + int on = 1; + int relay_fd = -1; + int error; + + relay_fd = socket(AF_INET, SOCK_STREAM, 0); + if (relay_fd == -1) { + log_errno(LOG_ERR, "socket"); + goto fail; + } + + error = fcntl_nonblock(relay_fd); + if (error) { + log_errno(LOG_ERR, "fcntl"); + goto fail; + } + + error = setsockopt(relay_fd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on)); + if (error) { + log_errno(LOG_WARNING, "setsockopt"); + goto fail; + } + + error = connect(relay_fd, (struct sockaddr*)addr, sizeof(*addr)); + if (error && errno != EINPROGRESS) { + log_errno(LOG_NOTICE, "connect"); + goto fail; + } + + retval = bufferevent_new(relay_fd, NULL, writecb, errorcb, cbarg); + if (!retval) { + log_errno(LOG_ERR, "bufferevent_new"); + goto fail; + } + + error = bufferevent_enable(retval, EV_WRITE); // we wait for connection... + if (error) { + log_errno(LOG_ERR, "bufferevent_enable"); + goto fail; + } + + return retval; + +fail: + if (relay_fd != -1) + close(relay_fd); + if (retval) + bufferevent_free(retval); + return NULL; +} + +int red_socket_geterrno(struct bufferevent *buffev) +{ + int error; + int pseudo_errno; + size_t optlen = sizeof(pseudo_errno); + + assert(EVENT_FD(&buffev->ev_read) == EVENT_FD(&buffev->ev_write)); + + error = getsockopt(EVENT_FD(&buffev->ev_read), SOL_SOCKET, SO_ERROR, &pseudo_errno, &optlen); + if (error) { + log_errno(LOG_ERR, "getsockopt"); + return -1; + } + return pseudo_errno; +} + +/** simple fcntl(2) wrapper, provides errno and all logging to caller + * I have to use it in event-driven code because of accept(2) (see NOTES) + * and connect(2) (see ERRORS about EINPROGRESS) + */ +int fcntl_nonblock(int fd) +{ + int error; + int flags; + + flags = fcntl(fd, F_GETFL); + if (flags == -1) + return -1; + + error = fcntl(fd, F_SETFL, flags | O_NONBLOCK); + if (error) + return -1; + + return 0; +} + +/* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */ diff --git a/utils.h b/utils.h index b91b8ba..057d6c0 100644 --- a/utils.h +++ b/utils.h @@ -2,6 +2,9 @@ #define UTILS_H_SAT_FEB__2_02_24_05_2008 #include +#include +#include +#include #define SIZEOF_ARRAY(arr) (sizeof(arr) / sizeof(arr[0])) @@ -20,6 +23,10 @@ const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) +time_t redsocks_time(time_t *t); +struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb writecb, everrorcb errorcb, void *cbarg); +int red_socket_geterrno(struct bufferevent *buffev); +int fcntl_nonblock(int fd); /* vim:set tabstop=4 softtabstop=4 shiftwidth=4: */ /* vim:set foldmethod=marker foldlevel=32 foldmarker={,}: */