diff --git a/configure b/configure index 2a6babda..16daa96f 100755 --- a/configure +++ b/configure @@ -2078,7 +2078,7 @@ $as_echo "$as_me: loading site script $ac_site_file" >&6;} || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi done @@ -2306,11 +2306,11 @@ am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) - as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5 ;; + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) - as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5 ;; + as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's @@ -2981,7 +2981,7 @@ fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 @@ -3096,7 +3096,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } @@ -3139,7 +3139,7 @@ else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 @@ -3198,7 +3198,7 @@ $as_echo "$ac_try_echo"; } >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi fi fi @@ -3250,7 +3250,7 @@ sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi @@ -3910,7 +3910,7 @@ else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check -See \`config.log' for more details" "$LINENO" 5 ; } +See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c @@ -5064,7 +5064,7 @@ do "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;; + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done @@ -5382,7 +5382,7 @@ do esac case $ac_mode$ac_tag in :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac @@ -5410,7 +5410,7 @@ do [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;; + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" @@ -5437,7 +5437,7 @@ $as_echo "$as_me: creating $ac_file" >&6;} case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac diff --git a/local.c b/local.c index d10d954b..e6cbd4b6 100644 --- a/local.c +++ b/local.c @@ -399,6 +399,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents) perror("accept"); break; } + setnonblocking(serverfd); struct server *server = new_server(serverfd); struct addrinfo hints, *res; int sockfd; diff --git a/server.c b/server.c index 5c5f858d..774a75c2 100644 --- a/server.c +++ b/server.c @@ -177,7 +177,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { response.rsv = 0; response.atyp = 1; char *send_buf = (char *)&response; - send_encrypt(server->fd, send_buf, sizeof(response), MSG_NOSIGNAL); + send_encrypt(server->fd, send_buf, 4, MSG_NOSIGNAL); close_and_free_server(EV_A_ server); return; } @@ -191,20 +191,20 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { // IP V4 struct sockaddr_in *addrp = (struct sockaddr_in *)&remote_sockaddr; struct in_addr *in_addr; - in_addr = (struct in_addr *)(server->buf + sizeof(request)); + in_addr = (struct in_addr *)(server->buf + 4); addrp->sin_addr = *in_addr; // get port - addrp->sin_port = *(unsigned short *)(server->buf + sizeof(request) + 4); + addrp->sin_port = *(unsigned short *)(server->buf + 4 + 4); } else if (request->atyp == 3) { struct addrinfo hints, *res; memset(&hints, 0, sizeof hints); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; char name_buf[256]; - unsigned char name_len = *(unsigned char *)(server->buf + sizeof(request)); - memcpy(name_buf, server->buf + sizeof(request) + 1, name_len); + unsigned char name_len = *(unsigned char *)(server->buf + 4); + memcpy(name_buf, server->buf + 4 + 1, name_len); name_buf[name_len] = 0; // append NUL - fprintf(stderr, "%s\n", name_buf); + fprintf(stderr, "connecting: %s\n", name_buf); if ((rv = getaddrinfo(name_buf, "80", &hints, &res)) != 0) { perror("getaddrinfo"); // TODO send reply @@ -217,7 +217,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) { // get port struct sockaddr_in *addrp = (struct sockaddr_in *)&remote_sockaddr; - addrp->sin_port = *(unsigned short *)(server->buf + sizeof(request) + 1 + name_len); + addrp->sin_port = *(unsigned short *)(server->buf + 4 + 1 + name_len); freeaddrinfo(res); } else { fprintf(stderr, "unsupported addrtype: %d\n", request->atyp); @@ -358,8 +358,10 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { struct remote_ctx *remote_send_ctx = (struct remote_ctx *)w; struct remote *remote = remote_send_ctx->remote; struct server *server = remote->server; + printf("remote_send_cb\n"); if (!remote_send_ctx->connected) { + printf("not connected\n"); socklen_t len; struct sockaddr_storage addr; char ipstr[INET6_ADDRSTRLEN]; @@ -369,6 +371,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { if (r == 0) { remote_send_ctx->connected = 1; + printf("send reply\n"); // send reply struct sockaddr_in sockaddr; socklen_t sockaddrlen = sizeof(sockaddr); @@ -385,15 +388,15 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { response.rsv = 0; response.atyp = 1; - memcpy(server->buf, &response, sizeof(response)); - memcpy(server->buf + sizeof(response), &sockaddr.sin_addr, sizeof(struct in_addr)); - memcpy(server->buf + sizeof(response) + sizeof(struct in_addr), &sockaddr.sin_port, + memcpy(server->buf, &response, 4); + memcpy(server->buf + 4, &sockaddr.sin_addr, sizeof(struct in_addr)); + memcpy(server->buf + 4 + sizeof(struct in_addr), &sockaddr.sin_port, sizeof(struct in_addr)); fprintf(stderr, "send reply\n"); - int r = send_encrypt(server->fd, server->buf, sizeof(response) + sizeof(struct in_addr) + + int r = send_encrypt(server->fd, server->buf, 4 + sizeof(struct in_addr) + sizeof(unsigned short), 0); - if (r < sizeof(response) + sizeof(struct in_addr) + sizeof(unsigned short)) { + if (r < 4 + sizeof(struct in_addr) + sizeof(unsigned short)) { fprintf(stderr, "header not complete sent\n"); close_and_free_remote(EV_A_ remote); close_and_free_server(EV_A_ server); @@ -411,6 +414,7 @@ static void remote_send_cb (EV_P_ ev_io *w, int revents) { return; } } else { + printf("is connected\n"); if (remote->buf_len == 0) { // close and free close_and_free_remote(EV_A_ remote); @@ -537,6 +541,7 @@ static void accept_cb (EV_P_ ev_io *w, int revents) perror("accept"); break; } + setnonblocking(serverfd); struct server *server = new_server(serverfd); // struct addrinfo hints, *res; // int sockfd; diff --git a/socks5.h b/socks5.h index 312c743b..6fe7cd03 100755 --- a/socks5.h +++ b/socks5.h @@ -7,6 +7,8 @@ #define IPV6 0x04 #define CMD_NOT_SUPPORTED 0x07 +#pragma pack(1) + struct method_select_request { char ver; @@ -36,3 +38,5 @@ struct socks5_response char atyp; }; +#pragma pack() +