diff --git a/.gitignore b/.gitignore index 62a19e48..5cb155bd 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ libtool pid ss* stamp-h1 +.libs +*.json # Do not edit the following section # Edit Compile Debug Document Distribute diff --git a/src/jconf.c b/src/jconf.c index ee4cde1b..c415e3ab 100644 --- a/src/jconf.c +++ b/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++) { diff --git a/src/local.c b/src/local.c index 5c818393..96f7f1a1 100644 --- a/src/local.c +++ b/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); diff --git a/src/server.c b/src/server.c index 0998a7c9..cfb0b457 100644 --- a/src/server.c +++ b/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); diff --git a/src/utils.c b/src/utils.c index 2b4d1cd5..5ad8d329 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,6 +1,10 @@ #include #include #include +#include +#include +#include + #include #include @@ -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); } diff --git a/src/utils.h b/src/utils.h index 1c2515da..9dc610db 100644 --- a/src/utils.h +++ b/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);