Browse Source

fix issues

pull/4/merge
Max Lv 12 years ago
parent
commit
5df9644823
6 changed files with 45 additions and 27 deletions
  1. 2
      .gitignore
  2. 5
      src/jconf.c
  3. 28
      src/local.c
  4. 24
      src/server.c
  5. 12
      src/utils.c
  6. 1
      src/utils.h

2
.gitignore

@ -8,6 +8,8 @@ libtool
pid
ss*
stamp-h1
.libs
*.json
# Do not edit the following section
# Edit Compile Debug Document Distribute

5
src/jconf.c

@ -57,6 +57,11 @@ jconf_t *read_jconf(const char* file) {
fclose(f);
obj = json_parse(buf);
if (obj == NULL) {
FATAL("Invalid config file");
}
if (obj->type == json_object) {
int i, j;
for (i = 0; i < obj->u.object.length; i++) {

28
src/local.c

@ -66,7 +66,7 @@ int create_and_bind(const char *port) {
int opt = 1;
int err = setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if (err) {
perror("setsocket");
ERROR("setsocket");
}
s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
@ -74,7 +74,7 @@ int create_and_bind(const char *port) {
/* We managed to bind successfully! */
break;
} else {
perror("bind");
ERROR("bind");
}
close(listen_sock);
@ -123,7 +123,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
// continue to wait for recv
return;
} else {
perror("server recv");
ERROR("server recv");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
@ -142,7 +142,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
ev_io_start(EV_A_ &remote->send_ctx->io);
return;
} else {
perror("send");
ERROR("send");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
@ -264,7 +264,7 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) {
server->buf_len, 0);
if (s < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
perror("send");
ERROR("send");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
}
@ -338,7 +338,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) {
// continue to wait for recv
return;
} else {
perror("remote recv");
ERROR("remote recv");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
@ -356,7 +356,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) {
ev_io_start(EV_A_ &server->send_ctx->io);
return;
} else {
perror("send");
ERROR("send");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
@ -394,7 +394,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) {
ev_io_start(EV_A_ &remote->recv_ctx->io);
return;
} else {
perror("getpeername");
ERROR("getpeername");
// not connected
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
@ -412,7 +412,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) {
remote->buf_len, 0);
if (s < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
perror("send");
ERROR("send");
// close and free
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
@ -537,7 +537,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents) {
struct listen_ctx *listener = (struct listen_ctx *)w;
int serverfd = accept(listener->fd, NULL, NULL);
if (serverfd == -1) {
perror("accept");
ERROR("accept");
return;
}
setnonblocking(serverfd);
@ -550,13 +550,13 @@ static void accept_cb (EV_P_ ev_io *w, int revents) {
int index = clock() % listener->remote_num;
int err = getaddrinfo(listener->remote_host[index], listener->remote_port, &hints, &res);
if (err) {
perror("getaddrinfo");
ERROR("getaddrinfo");
return;
}
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd < 0) {
perror("socket");
ERROR("socket");
close(sockfd);
freeaddrinfo(res);
return;
@ -567,10 +567,10 @@ static void accept_cb (EV_P_ ev_io *w, int revents) {
timeout.tv_usec = 0;
err = setsockopt(sockfd, SOL_SOCKET,
SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
if (err) perror("setsockopt");
if (err) ERROR("setsockopt");
err = setsockopt(sockfd, SOL_SOCKET,
SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
if (err) perror("setsockopt");
if (err) ERROR("setsockopt");
setnonblocking(sockfd);
struct server *server = new_server(serverfd);

24
src/server.c

@ -69,7 +69,7 @@ int create_and_bind(const char *host, const char *port) {
int opt = 1;
int err = setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if (err) {
perror("setsocket");
ERROR("setsocket");
}
s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
@ -77,7 +77,7 @@ int create_and_bind(const char *host, const char *port) {
/* We managed to bind successfully! */
break;
} else {
perror("bind");
ERROR("bind");
}
close(listen_sock);
@ -102,14 +102,14 @@ struct remote *connect_to_remote(char *remote_host, char *remote_port, int timeo
int err = getaddrinfo(remote_host, remote_port, &hints, &res);
if (err) {
perror("getaddrinfo");
ERROR("getaddrinfo");
return NULL;
}
// initilize remote socks
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd < 0) {
perror("socket");
ERROR("socket");
close(sockfd);
freeaddrinfo(res);
return NULL;
@ -153,7 +153,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
// continue to wait for recv
return;
} else {
perror("server recv");
ERROR("server recv");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
@ -172,7 +172,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
ev_io_stop(EV_A_ &server_recv_ctx->io);
ev_io_start(EV_A_ &remote->send_ctx->io);
} else {
perror("server_recv_send");
ERROR("server_recv_send");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
}
@ -303,7 +303,7 @@ static void server_send_cb (EV_P_ ev_io *w, int revents) {
server->buf_len, 0);
if (s < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
perror("server_send_send");
ERROR("server_send_send");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
}
@ -378,7 +378,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) {
// continue to wait for recv
return;
} else {
perror("remote recv");
ERROR("remote recv");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
return;
@ -395,7 +395,7 @@ static void remote_recv_cb (EV_P_ ev_io *w, int revents) {
ev_io_stop(EV_A_ &remote_recv_ctx->io);
ev_io_start(EV_A_ &server->send_ctx->io);
} else {
perror("remote_recv_send");
ERROR("remote_recv_send");
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
}
@ -448,7 +448,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) {
}
} else {
perror("getpeername");
ERROR("getpeername");
// not connected
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
@ -467,7 +467,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) {
remote->buf_len, 0);
if (s < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
perror("remote_send_send");
ERROR("remote_send_send");
// close and free
close_and_free_remote(EV_A_ remote);
close_and_free_server(EV_A_ server);
@ -604,7 +604,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents) {
struct listen_ctx *listener = (struct listen_ctx *)w;
int serverfd = accept(listener->fd, NULL, NULL);
if (serverfd == -1) {
perror("accept");
ERROR("accept");
return;
}
setnonblocking(serverfd);

12
src/utils.c

@ -1,6 +1,10 @@
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
@ -12,6 +16,12 @@
#define INT_DIGITS 19 /* enough for 64 bit integer */
void ERROR(const char *s) {
char *msg = strerror(errno);
LOGE("%s: %s", s, msg);
}
char *itoa(int i) {
/* Room for INT_DIGITS digits, - and '\0' */
static char buf[INT_DIGITS + 2];
@ -35,7 +45,7 @@ char *itoa(int i) {
void FATAL(const char *msg) {
fprintf(stderr, "%s", msg);
LOGE("%s", msg);
exit(-1);
}

1
src/utils.h

@ -20,6 +20,7 @@ while(0)
while(0)
void FATAL(const char *msg);
void ERROR(const char *s);
void usage(void);
void demonize(const char* path);
char *itoa(int i);

Loading…
Cancel
Save