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
|
.PHONY: all
|
||||||
all: redsocks
|
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))
|
src = $(patsubst %.o,%.c,$(obj))
|
||||||
|
|
||||||
redsocks: $(obj)
|
redsocks: $(obj)
|
||||||
|
94
redsocks.c
94
redsocks.c
@ -19,7 +19,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
@ -41,26 +40,6 @@
|
|||||||
static void redsocks_shutdown(redsocks_client *client, struct bufferevent *buffev, int how);
|
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_connect_subsys;
|
||||||
extern relay_subsys http_relay_subsys;
|
extern relay_subsys http_relay_subsys;
|
||||||
extern relay_subsys socks4_subsys;
|
extern relay_subsys socks4_subsys;
|
||||||
@ -73,7 +52,7 @@ static relay_subsys *relay_subsystems[] =
|
|||||||
&socks5_subsys,
|
&socks5_subsys,
|
||||||
};
|
};
|
||||||
|
|
||||||
list_head instances = LIST_HEAD_INIT(instances);
|
static list_head instances = LIST_HEAD_INIT(instances);
|
||||||
|
|
||||||
static parser_entry redsocks_entries[] =
|
static parser_entry redsocks_entries[] =
|
||||||
{
|
{
|
||||||
@ -197,16 +176,6 @@ void redsocks_log_write(
|
|||||||
va_end(ap);
|
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)
|
void redsocks_touch_client(redsocks_client *client)
|
||||||
{
|
{
|
||||||
redsocks_time(&client->last_event);
|
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
|
// I assume that -1 is invalid errno value
|
||||||
static int redsocks_socket_geterrno(redsocks_client *client, struct bufferevent *buffev)
|
static int redsocks_socket_geterrno(redsocks_client *client, struct bufferevent *buffev)
|
||||||
{
|
{
|
||||||
int error;
|
int pseudo_errno = red_socket_geterrno(buffev);
|
||||||
int pseudo_errno;
|
if (pseudo_errno == -1) {
|
||||||
size_t optlen = sizeof(pseudo_errno);
|
redsocks_log_errno(client, LOG_ERR, "red_socket_geterrno");
|
||||||
|
|
||||||
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");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return pseudo_errno;
|
return pseudo_errno;
|
||||||
@ -543,54 +506,13 @@ fail:
|
|||||||
|
|
||||||
void redsocks_connect_relay(redsocks_client *client)
|
void redsocks_connect_relay(redsocks_client *client)
|
||||||
{
|
{
|
||||||
int on = 1;
|
client->relay = red_connect_relay(&client->instance->config.relayaddr,
|
||||||
int relay_fd = -1;
|
redsocks_relay_connected, redsocks_event_error, client);
|
||||||
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);
|
|
||||||
if (!client->relay) {
|
if (!client->relay) {
|
||||||
redsocks_log_errno(client, LOG_ERR, "bufferevent_new");
|
redsocks_log_errno(client, LOG_ERR, "red_connect_relay");
|
||||||
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_drop_client(client);
|
redsocks_drop_client(client);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void redsocks_accept_client(int fd, short what, void *_arg)
|
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
|
#define UTILS_H_SAT_FEB__2_02_24_05_2008
|
||||||
|
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <event.h>
|
||||||
|
|
||||||
|
|
||||||
#define SIZEOF_ARRAY(arr) (sizeof(arr) / sizeof(arr[0]))
|
#define SIZEOF_ARRAY(arr) (sizeof(arr) / sizeof(arr[0]))
|
||||||
@ -20,6 +23,10 @@
|
|||||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
(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 tabstop=4 softtabstop=4 shiftwidth=4: */
|
||||||
/* vim:set foldmethod=marker foldlevel=32 foldmarker={,}: */
|
/* vim:set foldmethod=marker foldlevel=32 foldmarker={,}: */
|
||||||
|
Loading…
Reference in New Issue
Block a user