mirror of
https://github.com/darkk/redsocks.git
synced 2025-08-28 12:45:30 +00:00
Some source code cleanup.
This commit is contained in:
parent
a37aa7a0e6
commit
c50dd8b2b4
2
Makefile
2
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)
|
||||
|
94
redsocks.c
94
redsocks.c
@ -19,7 +19,6 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <signal.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
@ -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;
|
||||
}
|
||||
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_log_errno(client, LOG_ERR, "red_connect_relay");
|
||||
redsocks_drop_client(client);
|
||||
}
|
||||
}
|
||||
|
||||
static void redsocks_accept_client(int fd, short what, void *_arg)
|
||||
|
106
utils.c
Normal file
106
utils.c
Normal file
@ -0,0 +1,106 @@
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <fcntl.h>
|
||||
#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: */
|
7
utils.h
7
utils.h
@ -2,6 +2,9 @@
|
||||
#define UTILS_H_SAT_FEB__2_02_24_05_2008
|
||||
|
||||
#include <stddef.h>
|
||||
#include <time.h>
|
||||
#include <netinet/in.h>
|
||||
#include <event.h>
|
||||
|
||||
|
||||
#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={,}: */
|
||||
|
Loading…
Reference in New Issue
Block a user