Browse Source

clean up

pull/446/head
Max Lv 9 years ago
parent
commit
25c575cb78
8 changed files with 135 additions and 117 deletions
  1. 9
      src/android.c
  2. 8
      src/encrypt.c
  3. 91
      src/hmac-sha1.c
  4. 2
      src/jconf.c
  5. 13
      src/local.c
  6. 79
      src/manager.c
  7. 25
      src/server.c
  8. 25
      src/udprelay.c

9
src/android.c

@ -45,7 +45,8 @@
#include "netutils.h"
#include "utils.h"
int protect_socket(int fd) {
int protect_socket(int fd)
{
int sock;
struct sockaddr_un addr;
@ -57,7 +58,7 @@ int protect_socket(int fd) {
// Set timeout to 100us
struct timeval tv;
tv.tv_sec = 1; /* 0 Secs Timeout */
tv.tv_usec = 0; // Not init'ing this can cause strange errors
tv.tv_usec = 0; // Not init'ing this can cause strange errors
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval));
@ -65,9 +66,9 @@ int protect_socket(int fd) {
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, path, sizeof(addr.sun_path)-1);
strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);
if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
LOGE("[android] connect() failed: %s (socket fd = %d)\n", strerror(errno), sock);
close(sock);
return -1;

8
src/encrypt.c

@ -1268,7 +1268,9 @@ char * ss_decrypt_all(int buf_size, char *ciphertext, ssize_t *len, int method,
char hash[ONETIMEAUTH_BYTES];
memcpy(hash, plaintext + p_len - ONETIMEAUTH_BYTES, ONETIMEAUTH_BYTES);
ret = !ss_onetimeauth_verify(hash, plaintext, p_len - ONETIMEAUTH_BYTES, iv);
if (ret) p_len -= ONETIMEAUTH_BYTES;
if (ret) {
p_len -= ONETIMEAUTH_BYTES;
}
}
if (!ret) {
@ -1554,10 +1556,10 @@ int ss_check_hash(char **buf_ptr, ssize_t *buf_len, struct chunk *chunk, struct
memcpy(key + enc_iv_len, &c, sizeof(uint32_t));
#if defined(USE_CRYPTO_OPENSSL)
HMAC(EVP_sha1(), key, enc_iv_len + sizeof(uint32_t),
(uint8_t *)chunk->buf + AUTH_BYTES, chunk->len, hash, NULL);
(uint8_t *)chunk->buf + AUTH_BYTES, chunk->len, hash, NULL);
#else
ss_sha1_hmac(key, enc_iv_len + sizeof(uint32_t),
(uint8_t *)chunk->buf + AUTH_BYTES, chunk->len, hash);
(uint8_t *)chunk->buf + AUTH_BYTES, chunk->len, hash);
#endif
if (memcmp(hash, chunk->buf + CLEN_BYTES, ONETIMEAUTH_BYTES) != 0) {

91
src/hmac-sha1.c

@ -49,9 +49,9 @@ void ss_sha1_process( ss_sha1_context *ctx, const unsigned char data[64] )
{
uint32_t temp, W[16], A, B, C, D, E;
GET_UINT32_BE( W[ 0], data, 0 );
GET_UINT32_BE( W[ 1], data, 4 );
GET_UINT32_BE( W[ 2], data, 8 );
GET_UINT32_BE( W[ 0], data, 0 );
GET_UINT32_BE( W[ 1], data, 4 );
GET_UINT32_BE( W[ 2], data, 8 );
GET_UINT32_BE( W[ 3], data, 12 );
GET_UINT32_BE( W[ 4], data, 16 );
GET_UINT32_BE( W[ 5], data, 20 );
@ -66,19 +66,19 @@ void ss_sha1_process( ss_sha1_context *ctx, const unsigned char data[64] )
GET_UINT32_BE( W[14], data, 56 );
GET_UINT32_BE( W[15], data, 60 );
#define S(x,n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define S(x, n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
#define R(t) \
( \
temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \
W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \
( W[t & 0x0F] = S(temp,1) ) \
)
#define R(t) \
( \
temp = W[(t - 3) & 0x0F] ^ W[(t - 8) & 0x0F] ^ \
W[(t - 14) & 0x0F] ^ W[ t & 0x0F], \
( W[t & 0x0F] = S(temp, 1) ) \
)
#define P(a,b,c,d,e,x) \
{ \
e += S(a,5) + F(b,c,d) + K + x; b = S(b,30); \
}
#define P(a, b, c, d, e, x) \
{ \
e += S(a, 5) + F(b, c, d) + K + x; b = S(b, 30); \
}
A = ctx->state[0];
B = ctx->state[1];
@ -86,7 +86,7 @@ void ss_sha1_process( ss_sha1_context *ctx, const unsigned char data[64] )
D = ctx->state[3];
E = ctx->state[4];
#define F(x,y,z) (z ^ (x & (y ^ z)))
#define F(x, y, z) (z ^ (x & (y ^ z)))
#define K 0x5A827999
P( A, B, C, D, E, W[0] );
@ -113,7 +113,7 @@ void ss_sha1_process( ss_sha1_context *ctx, const unsigned char data[64] )
#undef K
#undef F
#define F(x,y,z) (x ^ y ^ z)
#define F(x, y, z) (x ^ y ^ z)
#define K 0x6ED9EBA1
P( A, B, C, D, E, R(20) );
@ -140,7 +140,7 @@ void ss_sha1_process( ss_sha1_context *ctx, const unsigned char data[64] )
#undef K
#undef F
#define F(x,y,z) ((x & y) | (z & (x | y)))
#define F(x, y, z) ((x & y) | (z & (x | y)))
#define K 0x8F1BBCDC
P( A, B, C, D, E, R(40) );
@ -167,7 +167,7 @@ void ss_sha1_process( ss_sha1_context *ctx, const unsigned char data[64] )
#undef K
#undef F
#define F(x,y,z) (x ^ y ^ z)
#define F(x, y, z) (x ^ y ^ z)
#define K 0xCA62C1D6
P( A, B, C, D, E, R(60) );
@ -209,44 +209,45 @@ void ss_sha1_update( ss_sha1_context *ctx, const unsigned char *input, size_t il
size_t fill;
uint32_t left;
if( ilen <= 0 )
if (ilen <= 0) {
return;
}
left = ctx->total[0] & 0x3F;
fill = 64 - left;
ctx->total[0] += (uint32_t) ilen;
ctx->total[0] += (uint32_t)ilen;
ctx->total[0] &= 0xFFFFFFFF;
if( ctx->total[0] < (uint32_t) ilen )
if (ctx->total[0] < (uint32_t)ilen) {
ctx->total[1]++;
}
if( left && ilen >= fill )
{
memcpy( (void *) (ctx->buffer + left), input, fill );
if (left && ilen >= fill) {
memcpy( (void *)(ctx->buffer + left), input, fill );
ss_sha1_process( ctx, ctx->buffer );
input += fill;
ilen -= fill;
ilen -= fill;
left = 0;
}
while( ilen >= 64 )
{
while (ilen >= 64) {
ss_sha1_process( ctx, input );
input += 64;
ilen -= 64;
ilen -= 64;
}
if( ilen > 0 )
memcpy( (void *) (ctx->buffer + left), input, ilen );
if (ilen > 0) {
memcpy( (void *)(ctx->buffer + left), input, ilen );
}
}
static const unsigned char ss_sha1_padding[64] =
{
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
/*
@ -259,11 +260,11 @@ void ss_sha1_finish( ss_sha1_context *ctx, unsigned char output[20] )
unsigned char msglen[8];
high = ( ctx->total[0] >> 29 )
| ( ctx->total[1] << 3 );
low = ( ctx->total[0] << 3 );
| ( ctx->total[1] << 3 );
low = ( ctx->total[0] << 3 );
PUT_UINT32_BE( high, msglen, 0 );
PUT_UINT32_BE( low, msglen, 4 );
PUT_UINT32_BE( low, msglen, 4 );
last = ctx->total[0] & 0x3F;
padn = ( last < 56 ) ? ( 56 - last ) : ( 120 - last );
@ -271,9 +272,9 @@ void ss_sha1_finish( ss_sha1_context *ctx, unsigned char output[20] )
ss_sha1_update( ctx, ss_sha1_padding, padn );
ss_sha1_update( ctx, msglen, 8 );
PUT_UINT32_BE( ctx->state[0], output, 0 );
PUT_UINT32_BE( ctx->state[1], output, 4 );
PUT_UINT32_BE( ctx->state[2], output, 8 );
PUT_UINT32_BE( ctx->state[0], output, 0 );
PUT_UINT32_BE( ctx->state[1], output, 4 );
PUT_UINT32_BE( ctx->state[2], output, 8 );
PUT_UINT32_BE( ctx->state[3], output, 12 );
PUT_UINT32_BE( ctx->state[4], output, 16 );
}
@ -299,8 +300,7 @@ void ss_sha1_hmac_starts( ss_sha1_context *ctx, const unsigned char *key, size_t
size_t i;
unsigned char sum[20];
if( keylen > 64 )
{
if (keylen > 64) {
ss_sha1( key, keylen, sum );
keylen = 20;
key = sum;
@ -309,8 +309,7 @@ void ss_sha1_hmac_starts( ss_sha1_context *ctx, const unsigned char *key, size_t
memset( ctx->ipad, 0x36, 64 );
memset( ctx->opad, 0x5C, 64 );
for( i = 0; i < keylen; i++ )
{
for (i = 0; i < keylen; i++) {
ctx->ipad[i] = (unsigned char)( ctx->ipad[i] ^ key[i] );
ctx->opad[i] = (unsigned char)( ctx->opad[i] ^ key[i] );
}
@ -358,8 +357,8 @@ void ss_sha1_hmac_reset( ss_sha1_context *ctx )
* output = HMAC-SHA-1( hmac key, input buffer )
*/
void ss_sha1_hmac( const unsigned char *key, size_t keylen,
const unsigned char *input, size_t ilen,
unsigned char output[20] )
const unsigned char *input, size_t ilen,
unsigned char output[20] )
{
ss_sha1_context ctx;

2
src/jconf.c

@ -168,7 +168,7 @@ jconf_t *read_jconf(const char * file)
json_value *v = value->u.object.values[j].value;
if (v->type == json_string) {
conf.port_password[j].port = ss_strndup(value->u.object.values[j].name,
value->u.object.values[j].name_length);
value->u.object.values[j].name_length);
conf.port_password[j].password = to_string(v);
conf.port_password_num = j + 1;
}

13
src/local.c

@ -398,8 +398,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
if (request->atyp == 1) {
// IP V4
size_t in_addr_len = sizeof(struct in_addr);
memcpy(ss_addr_to_send + addr_len, buf + 4, in_addr_len +
2);
memcpy(ss_addr_to_send + addr_len, buf + 4, in_addr_len + 2);
addr_len += in_addr_len + 2;
if (acl || verbose) {
@ -413,8 +412,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
// Domain name
uint8_t name_len = *(uint8_t *)(buf + 4);
ss_addr_to_send[addr_len++] = name_len;
memcpy(ss_addr_to_send + addr_len, buf + 4 + 1, name_len +
2);
memcpy(ss_addr_to_send + addr_len, buf + 4 + 1, name_len + 2);
addr_len += name_len + 2;
if (acl || verbose) {
@ -427,8 +425,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
} else if (request->atyp == 4) {
// IP V6
size_t in6_addr_len = sizeof(struct in6_addr);
memcpy(ss_addr_to_send + addr_len, buf + 4, in6_addr_len +
2);
memcpy(ss_addr_to_send + addr_len, buf + 4, in6_addr_len + 2);
addr_len += in6_addr_len + 2;
if (acl || verbose) {
@ -831,7 +828,7 @@ static void close_and_free_server(EV_P_ struct server *server)
}
static struct remote * create_remote(struct listen_ctx *listener,
struct sockaddr *addr)
struct sockaddr *addr)
{
struct sockaddr *remote_addr;
@ -1122,7 +1119,7 @@ int main(int argc, char **argv)
for (i = 0; i < remote_num; i++) {
char *host = remote_addr[i].host;
char *port = remote_addr[i].port == NULL ? remote_port :
remote_addr[i].port;
remote_addr[i].port;
struct sockaddr_storage *storage = malloc(sizeof(struct sockaddr_storage));
memset(storage, 0, sizeof(struct sockaddr_storage));
if (get_sockaddr(host, port, storage, 1) == -1) {

79
src/manager.c

@ -87,15 +87,16 @@ int setnonblocking(int fd)
}
#endif
static char *construct_command_line(struct manager_ctx *manager, struct server *server) {
static char *construct_command_line(struct manager_ctx *manager, struct server *server)
{
static char cmd[BUF_SIZE];
int i;
memset(cmd, 0, BUF_SIZE);
snprintf(cmd, BUF_SIZE,
"%s -p %s -m %s -k %s --manager-address %s -f %s/.shadowsocks_%s.pid", executable,
server->port, manager->method, server->password, manager->manager_address,
working_dir, server->port);
"%s -p %s -m %s -k %s --manager-address %s -f %s/.shadowsocks_%s.pid", executable,
server->port, manager->method, server->password, manager->manager_address,
working_dir, server->port);
if (manager->acl != NULL) {
int len = strlen(cmd);
snprintf(cmd + len, BUF_SIZE - len, " --acl %s", manager->acl);
@ -145,32 +146,45 @@ static char *construct_command_line(struct manager_ctx *manager, struct server *
}
static char *get_data(char *buf, int len) {
static char *get_data(char *buf, int len)
{
char *data;
int pos = 0;
while(buf[pos] != '{' && pos < len) pos++;
if (pos == len) return NULL;
while (buf[pos] != '{' && pos < len) {
pos++;
}
if (pos == len) {
return NULL;
}
data = buf + pos - 1;
return data;
}
static char *get_action(char *buf, int len) {
static char *get_action(char *buf, int len)
{
char *action;
int pos = 0;
while(isspace((unsigned char)buf[pos]) && pos < len) pos++;
if (pos == len) return NULL;
while (isspace((unsigned char)buf[pos]) && pos < len) {
pos++;
}
if (pos == len) {
return NULL;
}
action = buf + pos;
while((!isspace((unsigned char)buf[pos]) && buf[pos] != ':') && pos < len) pos++;
while ((!isspace((unsigned char)buf[pos]) && buf[pos] != ':') && pos < len) {
pos++;
}
buf[pos] = '\0';
return action;
}
static struct server *get_server(char *buf, int len) {
static struct server *get_server(char *buf, int len)
{
char *data = get_data(buf, len);
char error_buf[512];
struct server *server = (struct server *)malloc(sizeof(struct server));
@ -198,7 +212,7 @@ static struct server *get_server(char *buf, int len) {
if (value->type == json_string) {
strncpy(server->port, value->u.string.ptr, 8);
} else if (value->type == json_integer) {
snprintf(server->port, 8, "%"PRIu64"", value->u.integer);
snprintf(server->port, 8, "%" PRIu64 "", value->u.integer);
}
} else if (strcmp(name, "password") == 0) {
if (value->type == json_string) {
@ -216,7 +230,8 @@ static struct server *get_server(char *buf, int len) {
return server;
}
static int parse_traffic(char *buf, int len, char *port, uint64_t *traffic) {
static int parse_traffic(char *buf, int len, char *port, uint64_t *traffic)
{
char *data = get_data(buf, len);
char error_buf[512];
json_settings settings = { 0 };
@ -294,7 +309,7 @@ static void remove_server(char *prefix, char *port)
static void update_stat(char *port, uint64_t traffic)
{
void *ret = cork_hash_table_get(server_table, (void*)port);
void *ret = cork_hash_table_get(server_table, (void *)port);
if (ret != NULL) {
struct server *server = (struct server *)ret;
server->traffic = traffic;
@ -312,7 +327,7 @@ static void manager_recv_cb(EV_P_ ev_io *w, int revents)
memset(buf, 0, BUF_SIZE);
len = sizeof(struct sockaddr_un);
r = recvfrom(manager->fd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);
r = recvfrom(manager->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&claddr, &len);
if (r == -1) {
ERROR("manager_recvfrom");
return;
@ -376,7 +391,7 @@ static void manager_recv_cb(EV_P_ ev_io *w, int revents)
} else if (strcmp(action, "ping") == 0) {
struct cork_hash_table_entry *entry;
struct cork_hash_table_entry *entry;
struct cork_hash_table_iterator server_iter;
char buf[BUF_SIZE];
@ -386,18 +401,18 @@ static void manager_recv_cb(EV_P_ ev_io *w, int revents)
cork_hash_table_iterator_init(server_table, &server_iter);
while((entry = cork_hash_table_iterator_next(&server_iter)) != NULL) {
struct server *server = (struct server*)entry->value;
while ((entry = cork_hash_table_iterator_next(&server_iter)) != NULL) {
struct server *server = (struct server *)entry->value;
size_t pos = strlen(buf);
if (pos > BUF_SIZE / 2) {
buf[pos - 1] = '}';
if (sendto(manager->fd, buf, pos + 1, 0, (struct sockaddr *)&claddr, len)
!= pos + 1) {
!= pos + 1) {
ERROR("ping_sendto");
}
memset(buf, 0, BUF_SIZE);
} else {
sprintf(buf + pos, "\"%s\":%"PRIu64",", server->port, server->traffic);
sprintf(buf + pos, "\"%s\":%" PRIu64 ",", server->port, server->traffic);
}
}
@ -409,14 +424,14 @@ static void manager_recv_cb(EV_P_ ev_io *w, int revents)
}
if (sendto(manager->fd, buf, pos + 1, 0, (struct sockaddr *)&claddr, len)
!= pos + 1) {
!= pos + 1) {
ERROR("ping_sendto");
}
}
return;
ERROR_MSG:
ERROR_MSG:
strcpy(buf, "err");
if (sendto(manager->fd, buf, 4, 0, (struct sockaddr *)&claddr, len) != 4) {
ERROR("error_sendto");
@ -538,11 +553,11 @@ int main(int argc, char **argv)
int option_index = 0;
static struct option long_options[] =
{
{ "fast-open", no_argument, 0, 0 },
{ "acl", required_argument, 0, 0 },
{ "manager-address", required_argument, 0, 0 },
{ "executable", required_argument, 0, 0 },
{ 0, 0, 0, 0 }
{ "fast-open", no_argument, 0, 0 },
{ "acl", required_argument, 0, 0 },
{ "manager-address", required_argument, 0, 0 },
{ "executable", required_argument, 0, 0 },
{ 0, 0, 0, 0 }
};
opterr = 0;
@ -754,7 +769,7 @@ int main(int argc, char **argv)
svaddr.sun_family = AF_UNIX;
strncpy(svaddr.sun_path, manager_address, sizeof(svaddr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *) &svaddr, sizeof(struct sockaddr_un)) == -1) {
if (bind(sfd, (struct sockaddr *)&svaddr, sizeof(struct sockaddr_un)) == -1) {
ERROR("bind");
exit(EXIT_FAILURE);
}
@ -777,13 +792,13 @@ int main(int argc, char **argv)
}
// Clean up
struct cork_hash_table_entry *entry;
struct cork_hash_table_entry *entry;
struct cork_hash_table_iterator server_iter;
cork_hash_table_iterator_init(server_table, &server_iter);
while((entry = cork_hash_table_iterator_next(&server_iter)) != NULL) {
struct server *server = (struct server*)entry->value;
while ((entry = cork_hash_table_iterator_next(&server_iter)) != NULL) {
struct server *server = (struct server *)entry->value;
stop_server(working_dir, server->port);
}

25
src/server.c

@ -134,10 +134,10 @@ static void stat_update_cb(EV_P_ ev_timer *watcher, int revents)
char resp[BUF_SIZE];
if (verbose) {
LOGI("update traffic stat: tx: %"PRIu64" rx: %"PRIu64"", tx, rx);
LOGI("update traffic stat: tx: %" PRIu64 " rx: %" PRIu64 "", tx, rx);
}
snprintf(resp, BUF_SIZE, "stat: {\"%s\":%"PRIu64"}", server_port, tx + rx);
snprintf(resp, BUF_SIZE, "stat: {\"%s\":%" PRIu64 "}", server_port, tx + rx);
msgLen = strlen(resp) + 1;
ss_addr_t ip_addr = { .host = NULL, .port = NULL };
@ -156,7 +156,7 @@ static void stat_update_cb(EV_P_ ev_timer *watcher, int revents)
unlink(claddr.sun_path);
if (bind(sfd, (struct sockaddr *) &claddr, sizeof(struct sockaddr_un)) == -1) {
if (bind(sfd, (struct sockaddr *)&claddr, sizeof(struct sockaddr_un)) == -1) {
ERROR("stat_bind");
close(sfd);
return;
@ -166,8 +166,8 @@ static void stat_update_cb(EV_P_ ev_timer *watcher, int revents)
svaddr.sun_family = AF_UNIX;
strncpy(svaddr.sun_path, manager_address, sizeof(svaddr.sun_path) - 1);
if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *) &svaddr,
sizeof(struct sockaddr_un)) != msgLen) {
if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&svaddr,
sizeof(struct sockaddr_un)) != msgLen) {
ERROR("stat_sendto");
close(sfd);
return;
@ -192,7 +192,7 @@ static void stat_update_cb(EV_P_ ev_timer *watcher, int revents)
size_t addr_len = get_sockaddr_len((struct sockaddr *)&storage);
if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&storage,
addr_len) != msgLen) {
addr_len) != msgLen) {
ERROR("stat_sendto");
close(sfd);
return;
@ -671,7 +671,8 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
report_addr(server->fd);
close_and_free_server(EV_A_ server);
return;
};
}
;
offset += ONETIMEAUTH_BYTES;
server->auth = 1;
}
@ -1103,7 +1104,7 @@ static struct server * new_server(int fd, struct listen_ctx *listener)
ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);
ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);
ev_timer_init(&server->recv_ctx->watcher, server_timeout_cb,
min(MAX_CONNECT_TIMEOUT, listener->timeout), listener->timeout);
min(MAX_CONNECT_TIMEOUT, listener->timeout), listener->timeout);
server->recv_ctx->server = server;
server->recv_ctx->connected = 0;
server->send_ctx->server = server;
@ -1239,10 +1240,10 @@ int main(int argc, char **argv)
int option_index = 0;
static struct option long_options[] =
{
{ "fast-open", no_argument, 0, 0 },
{ "acl", required_argument, 0, 0 },
{ "manager-address", required_argument, 0, 0 },
{ 0, 0, 0, 0 }
{ "fast-open", no_argument, 0, 0 },
{ "acl", required_argument, 0, 0 },
{ "manager-address", required_argument, 0, 0 },
{ 0, 0, 0, 0 }
};
opterr = 0;

25
src/udprelay.c

@ -189,7 +189,8 @@ static char *hash_key(const int af, const struct sockaddr_storage *addr)
#if defined(UDPRELAY_REDIR) || defined(UDPRELAY_REMOTE)
static int construct_udprealy_header(const struct sockaddr_storage *in_addr,
char *addr_header) {
char *addr_header)
{
int addr_header_len = 0;
if (in_addr->ss_family == AF_INET) {
@ -223,7 +224,9 @@ static int parse_udprealy_header(const char * buf, const int buf_len,
const uint8_t atyp = *(uint8_t *)buf;
int offset = 1;
if (auth != NULL) *auth |= (atyp & ONETIMEAUTH_FLAG);
if (auth != NULL) {
*auth |= (atyp & ONETIMEAUTH_FLAG);
}
// get remote addr and port
if ((atyp & ADDRTYPE_MASK) == 1) {
@ -247,7 +250,7 @@ static int parse_udprealy_header(const char * buf, const int buf_len,
uint8_t name_len = *(uint8_t *)(buf + offset);
if (name_len + 4 < buf_len) {
if (storage != NULL) {
char tmp[256] = {0};
char tmp[256] = { 0 };
struct cork_ip ip;
memcpy(tmp, buf + offset + 1, name_len);
if (cork_ip_init(&ip, tmp) != -1) {
@ -580,7 +583,7 @@ static void query_resolve_cb(struct sockaddr *addr, void *data)
remote_ctx->server_ctx = query_ctx->server_ctx;
remote_ctx->addr_header_len = query_ctx->addr_header_len;
memcpy(remote_ctx->addr_header, query_ctx->addr_header,
query_ctx->addr_header_len);
query_ctx->addr_header_len);
} else {
ERROR("[udp] bind() error");
}
@ -748,7 +751,7 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents)
}
int s = sendto(src_fd, buf, buf_len, 0,
(struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);
(struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);
if (s == -1) {
ERROR("[udp] remote_recv_sendto");
close(src_fd);
@ -1120,7 +1123,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
cache_hit = 1;
// detect destination mismatch
if (remote_ctx->addr_header_len != addr_header_len
|| memcmp(addr_header, remote_ctx->addr_header, addr_header_len) != 0) {
|| memcmp(addr_header, remote_ctx->addr_header, addr_header_len) != 0) {
if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {
need_query = 1;
}
@ -1156,8 +1159,8 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
if (remote_ctx != NULL && !need_query) {
size_t addr_len = get_sockaddr_len((struct sockaddr *)&dst_addr);
int s = sendto(remote_ctx->fd, buf + addr_header_len,
buf_len - addr_header_len, 0,
(struct sockaddr *)&dst_addr, addr_len);
buf_len - addr_header_len, 0,
(struct sockaddr *)&dst_addr, addr_len);
if (s == -1) {
ERROR("[udp] sendto_remote");
@ -1183,8 +1186,8 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
hints.ai_protocol = IPPROTO_UDP;
struct query_ctx *query_ctx = new_query_ctx(buf + addr_header_len,
buf_len -
addr_header_len);
buf_len -
addr_header_len);
query_ctx->server_ctx = server_ctx;
query_ctx->addr_header_len = addr_header_len;
query_ctx->src_addr = src_addr;
@ -1195,7 +1198,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
}
struct ResolvQuery *query = resolv_query(host, query_resolve_cb,
NULL, query_ctx, htons(atoi(port)));
NULL, query_ctx, htons(atoi(port)));
if (query == NULL) {
ERROR("[udp] unable to create DNS query");
close_and_free_query(EV_A_ query_ctx);

Loading…
Cancel
Save