You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

734 lines
22 KiB

12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
11 years ago
11 years ago
12 years ago
11 years ago
12 years ago
11 years ago
11 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
12 years ago
11 years ago
11 years ago
11 years ago
12 years ago
  1. #include <sys/socket.h>
  2. #include <sys/stat.h>
  3. #include <sys/types.h>
  4. #include <arpa/inet.h>
  5. #include <errno.h>
  6. #include <fcntl.h>
  7. #include <locale.h>
  8. #include <netdb.h>
  9. #include <netinet/in.h>
  10. #include <netinet/tcp.h>
  11. #include <pthread.h>
  12. #include <signal.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <strings.h>
  17. #include <time.h>
  18. #include <unistd.h>
  19. #include <assert.h>
  20. #include "local.h"
  21. #include "socks5.h"
  22. #ifdef HAVE_CONFIG_H
  23. #include "config.h"
  24. #endif
  25. #ifndef MSG_NOSIGNAL
  26. #define MSG_NOSIGNAL MSG_HAVEMORE
  27. #endif
  28. #ifndef EAGAIN
  29. #define EAGAIN EWOULDBLOCK
  30. #endif
  31. #define min(a,b) (((a)<(b))?(a):(b))
  32. static char *_server;
  33. static char *_remote_port;
  34. static int _timeout;
  35. static char *_key;
  36. int setnonblocking(int fd) {
  37. int flags;
  38. if (-1 ==(flags = fcntl(fd, F_GETFL, 0)))
  39. flags = 0;
  40. return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  41. }
  42. int create_and_bind(const char *port) {
  43. struct addrinfo hints;
  44. struct addrinfo *result, *rp;
  45. int s, listen_sock;
  46. memset(&hints, 0, sizeof(struct addrinfo));
  47. hints.ai_family = AF_UNSPEC; /* Return IPv4 and IPv6 choices */
  48. hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */
  49. s = getaddrinfo("0.0.0.0", port, &hints, &result);
  50. if (s != 0) {
  51. LOGD("getaddrinfo: %s\n", gai_strerror(s));
  52. return -1;
  53. }
  54. for (rp = result; rp != NULL; rp = rp->ai_next) {
  55. listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
  56. if (listen_sock == -1)
  57. continue;
  58. int opt = 1;
  59. int err = setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  60. if (err) {
  61. perror("setsocket");
  62. }
  63. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  64. if (s == 0) {
  65. /* We managed to bind successfully! */
  66. break;
  67. } else {
  68. perror("bind");
  69. }
  70. close(listen_sock);
  71. }
  72. if (rp == NULL) {
  73. LOGE("Could not bind\n");
  74. return -1;
  75. }
  76. freeaddrinfo(result);
  77. return listen_sock;
  78. }
  79. static void server_recv_cb (EV_P_ ev_io *w, int revents) {
  80. struct server_ctx *server_recv_ctx = (struct server_ctx *)w;
  81. struct server *server = server_recv_ctx->server;
  82. struct remote *remote = server->remote;
  83. if (remote == NULL) {
  84. close_and_free_server(EV_A_ server);
  85. return;
  86. }
  87. while (1) {
  88. char *buf = remote->buf;
  89. int *buf_len = &remote->buf_len;
  90. if (server->stage != 5) {
  91. buf = server->buf;
  92. buf_len = &server->buf_len;
  93. }
  94. ssize_t r = recv(server->fd, buf, BUF_SIZE, 0);
  95. if (r == 0) {
  96. // connection closed
  97. *buf_len = 0;
  98. close_and_free_remote(EV_A_ remote);
  99. close_and_free_server(EV_A_ server);
  100. return;
  101. } else if(r < 0) {
  102. if (errno == EAGAIN) {
  103. // no data
  104. // continue to wait for recv
  105. break;
  106. } else {
  107. perror("server recv");
  108. close_and_free_remote(EV_A_ remote);
  109. close_and_free_server(EV_A_ server);
  110. return;
  111. }
  112. }
  113. // local socks5 server
  114. if (server->stage == 5) {
  115. encrypt_ctx(remote->buf, r, server->e_ctx);
  116. int w = send(remote->fd, remote->buf, r, 0);
  117. if(w == -1) {
  118. if (errno == EAGAIN) {
  119. // no data, wait for send
  120. ev_io_stop(EV_A_ &server_recv_ctx->io);
  121. ev_io_start(EV_A_ &remote->send_ctx->io);
  122. break;
  123. } else {
  124. perror("send");
  125. close_and_free_remote(EV_A_ remote);
  126. close_and_free_server(EV_A_ server);
  127. return;
  128. }
  129. } else if(w < r) {
  130. char *pt = remote->buf;
  131. char *et = pt + r;
  132. while (pt + w < et) {
  133. *pt = *(pt + w);
  134. pt++;
  135. }
  136. remote->buf_len = r - w;
  137. assert(remote->buf_len >= 0);
  138. ev_io_stop(EV_A_ &server_recv_ctx->io);
  139. ev_io_start(EV_A_ &remote->send_ctx->io);
  140. break;
  141. }
  142. } else if (server->stage == 0) {
  143. struct method_select_response response;
  144. response.ver = SVERSION;
  145. response.method = 0;
  146. char *send_buf = (char *)&response;
  147. send(server->fd, send_buf, sizeof(response), MSG_NOSIGNAL);
  148. server->stage = 1;
  149. return;
  150. } else if (server->stage == 1) {
  151. struct socks5_request *request = (struct socks5_request *)server->buf;
  152. if (request->cmd != 1) {
  153. LOGE("unsupported cmd: %d\n", request->cmd);
  154. struct socks5_response response;
  155. response.ver = SVERSION;
  156. response.rep = CMD_NOT_SUPPORTED;
  157. response.rsv = 0;
  158. response.atyp = 1;
  159. char *send_buf = (char *)&response;
  160. send(server->fd, send_buf, 4, MSG_NOSIGNAL);
  161. close_and_free_remote(EV_A_ remote);
  162. close_and_free_server(EV_A_ server);
  163. return;
  164. }
  165. char addr_to_send[256];
  166. unsigned char addr_len = 0;
  167. addr_to_send[addr_len++] = request->atyp;
  168. // get remote addr and port
  169. if (request->atyp == 1) {
  170. // IP V4
  171. size_t in_addr_len = sizeof(struct in_addr);
  172. memcpy(addr_to_send + addr_len, server->buf + 4, in_addr_len + 2);
  173. addr_len += in_addr_len + 2;
  174. } else if (request->atyp == 3) {
  175. // Domain name
  176. unsigned char name_len = *(unsigned char *)(server->buf + 4);
  177. addr_to_send[addr_len++] = name_len;
  178. memcpy(addr_to_send + addr_len, server->buf + 4 + 1, name_len);
  179. addr_len += name_len;
  180. // get port
  181. addr_to_send[addr_len++] = *(unsigned char *)(server->buf + 4 + 1 + name_len);
  182. addr_to_send[addr_len++] = *(unsigned char *)(server->buf + 4 + 1 + name_len + 1);
  183. } else {
  184. LOGE("unsupported addrtype: %d\n", request->atyp);
  185. close_and_free_remote(EV_A_ remote);
  186. close_and_free_server(EV_A_ server);
  187. return;
  188. }
  189. encrypt_ctx(addr_to_send, addr_len, server->e_ctx);
  190. send(remote->fd, addr_to_send, addr_len, 0);
  191. // Fake reply
  192. struct socks5_response response;
  193. response.ver = SVERSION;
  194. response.rep = 0;
  195. response.rsv = 0;
  196. response.atyp = 1;
  197. struct in_addr sin_addr;
  198. inet_aton("0.0.0.0", &sin_addr);
  199. memcpy(server->buf, &response, 4);
  200. memcpy(server->buf + 4, &sin_addr, sizeof(struct in_addr));
  201. *((unsigned short *)(server->buf + 4 + sizeof(struct in_addr)))
  202. = (unsigned short) htons(atoi(_remote_port));
  203. int reply_size = 4 + sizeof(struct in_addr) + sizeof(unsigned short);
  204. int r = send(server->fd, server->buf, reply_size, MSG_NOSIGNAL);
  205. if (r < reply_size) {
  206. LOGE("header not complete sent\n");
  207. close_and_free_remote(EV_A_ remote);
  208. close_and_free_server(EV_A_ server);
  209. return;
  210. }
  211. server->stage = 5;
  212. }
  213. }
  214. }
  215. static void server_send_cb (EV_P_ ev_io *w, int revents) {
  216. struct server_ctx *server_send_ctx = (struct server_ctx *)w;
  217. struct server *server = server_send_ctx->server;
  218. struct remote *remote = server->remote;
  219. if (server->buf_len == 0) {
  220. // close and free
  221. close_and_free_remote(EV_A_ remote);
  222. close_and_free_server(EV_A_ server);
  223. return;
  224. } else {
  225. // has data to send
  226. ssize_t r = send(server->fd, server->buf,
  227. server->buf_len, 0);
  228. if (r < 0) {
  229. if (errno != EAGAIN) {
  230. perror("send");
  231. close_and_free_remote(EV_A_ remote);
  232. close_and_free_server(EV_A_ server);
  233. return;
  234. }
  235. return;
  236. }
  237. if (r < server->buf_len) {
  238. // partly sent, move memory, wait for the next time to send
  239. char *pt = server->buf;
  240. char *et = pt + server->buf_len;
  241. while (pt + r < et) {
  242. *pt = *(pt + r);
  243. pt++;
  244. }
  245. server->buf_len -= r;
  246. assert(server->buf_len >= 0);
  247. return;
  248. } else {
  249. // all sent out, wait for reading
  250. ev_io_stop(EV_A_ &server_send_ctx->io);
  251. if (remote != NULL) {
  252. ev_io_start(EV_A_ &remote->recv_ctx->io);
  253. } else {
  254. close_and_free_remote(EV_A_ remote);
  255. close_and_free_server(EV_A_ server);
  256. return;
  257. }
  258. }
  259. }
  260. }
  261. static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents) {
  262. struct remote_ctx *remote_ctx = (struct remote_ctx *) (((void*)watcher)
  263. - sizeof(ev_io));
  264. struct remote *remote = remote_ctx->remote;
  265. struct server *server = remote->server;
  266. LOGD("remote timeout\n");
  267. ev_timer_stop(EV_A_ watcher);
  268. if (server == NULL) {
  269. close_and_free_remote(EV_A_ remote);
  270. return;
  271. }
  272. close_and_free_remote(EV_A_ remote);
  273. close_and_free_server(EV_A_ server);
  274. }
  275. static void remote_recv_cb (EV_P_ ev_io *w, int revents) {
  276. struct remote_ctx *remote_recv_ctx = (struct remote_ctx *)w;
  277. struct remote *remote = remote_recv_ctx->remote;
  278. struct server *server = remote->server;
  279. if (server == NULL) {
  280. close_and_free_remote(EV_A_ remote);
  281. return;
  282. }
  283. while (1) {
  284. ssize_t r = recv(remote->fd, server->buf, BUF_SIZE, 0);
  285. if (r == 0) {
  286. // connection closed
  287. server->buf_len = 0;
  288. close_and_free_remote(EV_A_ remote);
  289. close_and_free_server(EV_A_ server);
  290. return;
  291. } else if(r < 0) {
  292. if (errno == EAGAIN) {
  293. // no data
  294. // continue to wait for recv
  295. break;
  296. } else {
  297. perror("remote recv");
  298. close_and_free_remote(EV_A_ remote);
  299. close_and_free_server(EV_A_ server);
  300. return;
  301. }
  302. }
  303. decrypt_ctx(server->buf, r, server->d_ctx);
  304. int w = send(server->fd, server->buf, r, MSG_NOSIGNAL);
  305. if(w == -1) {
  306. if (errno == EAGAIN) {
  307. // no data, wait for send
  308. ev_io_stop(EV_A_ &remote_recv_ctx->io);
  309. ev_io_start(EV_A_ &server->send_ctx->io);
  310. break;
  311. } else {
  312. perror("send");
  313. close_and_free_remote(EV_A_ remote);
  314. close_and_free_server(EV_A_ server);
  315. return;
  316. }
  317. } else if(w < r) {
  318. char *pt = server->buf;
  319. char *et = pt + r;
  320. while (pt + w < et) {
  321. *pt = *(pt + w);
  322. pt++;
  323. }
  324. server->buf_len = r - w;
  325. assert(server->buf_len >= 0);
  326. ev_io_stop(EV_A_ &remote_recv_ctx->io);
  327. ev_io_start(EV_A_ &server->send_ctx->io);
  328. break;
  329. }
  330. }
  331. }
  332. static void remote_send_cb (EV_P_ ev_io *w, int revents) {
  333. struct remote_ctx *remote_send_ctx = (struct remote_ctx *)w;
  334. struct remote *remote = remote_send_ctx->remote;
  335. struct server *server = remote->server;
  336. if (!remote_send_ctx->connected) {
  337. struct sockaddr_storage addr;
  338. socklen_t len = sizeof addr;
  339. int r = getpeername(remote->fd, (struct sockaddr*)&addr, &len);
  340. if (r == 0) {
  341. remote_send_ctx->connected = 1;
  342. ev_io_stop(EV_A_ &remote_send_ctx->io);
  343. ev_timer_stop(EV_A_ &remote_send_ctx->watcher);
  344. ev_io_start(EV_A_ &server->recv_ctx->io);
  345. ev_io_start(EV_A_ &remote->recv_ctx->io);
  346. return;
  347. } else {
  348. perror("getpeername");
  349. // not connected
  350. close_and_free_remote(EV_A_ remote);
  351. close_and_free_server(EV_A_ server);
  352. return;
  353. }
  354. } else {
  355. if (remote->buf_len == 0) {
  356. // close and free
  357. close_and_free_remote(EV_A_ remote);
  358. close_and_free_server(EV_A_ server);
  359. return;
  360. } else {
  361. // has data to send
  362. ssize_t r = send(remote->fd, remote->buf,
  363. remote->buf_len, 0);
  364. if (r < 0) {
  365. if (errno != EAGAIN) {
  366. perror("send");
  367. // close and free
  368. close_and_free_remote(EV_A_ remote);
  369. close_and_free_server(EV_A_ server);
  370. return;
  371. }
  372. return;
  373. }
  374. if (r < remote->buf_len) {
  375. // partly sent, move memory, wait for the next time to send
  376. char *pt = remote->buf;
  377. char *et = pt + remote->buf_len;
  378. while (pt + r < et) {
  379. *pt = *(pt + r);
  380. pt++;
  381. }
  382. remote->buf_len -= r;
  383. assert(remote->buf_len >= 0);
  384. return;
  385. } else {
  386. // all sent out, wait for reading
  387. ev_io_stop(EV_A_ &remote_send_ctx->io);
  388. if (server != NULL) {
  389. ev_io_start(EV_A_ &server->recv_ctx->io);
  390. } else {
  391. close_and_free_remote(EV_A_ remote);
  392. close_and_free_server(EV_A_ server);
  393. return;
  394. }
  395. }
  396. }
  397. }
  398. }
  399. struct remote* new_remote(int fd) {
  400. struct remote *remote;
  401. remote = malloc(sizeof(struct remote));
  402. remote->recv_ctx = malloc(sizeof(struct remote_ctx));
  403. remote->send_ctx = malloc(sizeof(struct remote_ctx));
  404. remote->fd = fd;
  405. ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);
  406. ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);
  407. ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb, _timeout, 0);
  408. remote->recv_ctx->remote = remote;
  409. remote->recv_ctx->connected = 0;
  410. remote->send_ctx->remote = remote;
  411. remote->send_ctx->connected = 0;
  412. remote->buf_len = 0;
  413. return remote;
  414. }
  415. void free_remote(struct remote *remote) {
  416. if (remote != NULL) {
  417. if (remote->server != NULL) {
  418. remote->server->remote = NULL;
  419. }
  420. free(remote->recv_ctx);
  421. free(remote->send_ctx);
  422. free(remote);
  423. }
  424. }
  425. void close_and_free_remote(EV_P_ struct remote *remote) {
  426. if (remote != NULL) {
  427. ev_timer_stop(EV_A_ &remote->send_ctx->watcher);
  428. ev_io_stop(EV_A_ &remote->send_ctx->io);
  429. ev_io_stop(EV_A_ &remote->recv_ctx->io);
  430. close(remote->fd);
  431. free_remote(remote);
  432. }
  433. }
  434. struct server* new_server(int fd) {
  435. struct server *server;
  436. server = malloc(sizeof(struct server));
  437. server->recv_ctx = malloc(sizeof(struct server_ctx));
  438. server->send_ctx = malloc(sizeof(struct server_ctx));
  439. server->fd = fd;
  440. ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);
  441. ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);
  442. server->recv_ctx->server = server;
  443. server->recv_ctx->connected = 0;
  444. server->send_ctx->server = server;
  445. server->send_ctx->connected = 0;
  446. server->stage = 0;
  447. if (_method == RC4) {
  448. server->e_ctx = malloc(sizeof(EVP_CIPHER_CTX));
  449. server->d_ctx = malloc(sizeof(EVP_CIPHER_CTX));
  450. enc_ctx_init(server->e_ctx, _key, 1);
  451. enc_ctx_init(server->d_ctx, _key, 0);
  452. } else {
  453. server->e_ctx = NULL;
  454. server->d_ctx = NULL;
  455. }
  456. server->buf_len = 0;
  457. return server;
  458. }
  459. void free_server(struct server *server) {
  460. if (server != NULL) {
  461. if (server->remote != NULL) {
  462. server->remote->server = NULL;
  463. }
  464. if (_method == RC4) {
  465. EVP_CIPHER_CTX_cleanup(server->e_ctx);
  466. EVP_CIPHER_CTX_cleanup(server->d_ctx);
  467. free(server->e_ctx);
  468. free(server->d_ctx);
  469. }
  470. free(server->recv_ctx);
  471. free(server->send_ctx);
  472. free(server);
  473. }
  474. }
  475. void close_and_free_server(EV_P_ struct server *server) {
  476. if (server != NULL) {
  477. ev_io_stop(EV_A_ &server->send_ctx->io);
  478. ev_io_stop(EV_A_ &server->recv_ctx->io);
  479. close(server->fd);
  480. free_server(server);
  481. }
  482. }
  483. static void accept_cb (EV_P_ ev_io *w, int revents)
  484. {
  485. struct listen_ctx *listener = (struct listen_ctx *)w;
  486. int serverfd;
  487. while (1) {
  488. serverfd = accept(listener->fd, NULL, NULL);
  489. if (serverfd == -1) {
  490. perror("accept");
  491. break;
  492. }
  493. setnonblocking(serverfd);
  494. struct server *server = new_server(serverfd);
  495. struct addrinfo hints, *res;
  496. int sockfd;
  497. memset(&hints, 0, sizeof hints);
  498. hints.ai_family = AF_UNSPEC;
  499. hints.ai_socktype = SOCK_STREAM;
  500. int err = getaddrinfo(_server, _remote_port, &hints, &res);
  501. if (err) {
  502. perror("getaddrinfo");
  503. close_and_free_server(EV_A_ server);
  504. break;
  505. }
  506. sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
  507. if (sockfd < 0) {
  508. perror("socket");
  509. close(sockfd);
  510. close_and_free_server(EV_A_ server);
  511. freeaddrinfo(res);
  512. break;
  513. }
  514. struct timeval timeout;
  515. timeout.tv_sec = _timeout;
  516. timeout.tv_usec = 0;
  517. err = setsockopt(sockfd, SOL_SOCKET,
  518. SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
  519. if (err) perror("setsockopt");
  520. err = setsockopt(sockfd, SOL_SOCKET,
  521. SO_SNDTIMEO, (char *)&timeout, sizeof(timeout));
  522. if (err) perror("setsockopt");
  523. setnonblocking(sockfd);
  524. struct remote *remote = new_remote(sockfd);
  525. server->remote = remote;
  526. remote->server = server;
  527. connect(sockfd, res->ai_addr, res->ai_addrlen);
  528. freeaddrinfo(res);
  529. // listen to remote connected event
  530. ev_io_start(EV_A_ &remote->send_ctx->io);
  531. ev_timer_start(EV_A_ &remote->send_ctx->watcher);
  532. break;
  533. }
  534. }
  535. static void print_usage() {
  536. printf("usage: ss -s server_host -p server_port -l local_port\n");
  537. printf(" -k password [-m encrypt_method] [-f pid_file]\n");
  538. printf("\n");
  539. printf("info:\n");
  540. printf(" encrypt_method: table, rc4\n");
  541. printf(" pid_file: valid path to the pid file\n");
  542. }
  543. int main (int argc, char **argv)
  544. {
  545. char *server = NULL;
  546. char *remote_port = NULL;
  547. char *port = NULL;
  548. char *key = NULL;
  549. char *timeout = "10";
  550. char *method = NULL;
  551. int c;
  552. int f_flags = 0;
  553. char *f_path = NULL;
  554. opterr = 0;
  555. while ((c = getopt (argc, argv, "f:s:p:l:k:t:m:")) != -1) {
  556. switch (c) {
  557. case 's':
  558. server = optarg;
  559. break;
  560. case 'p':
  561. remote_port = optarg;
  562. break;
  563. case 'l':
  564. port = optarg;
  565. break;
  566. case 'k':
  567. key = optarg;
  568. break;
  569. case 'f':
  570. f_flags = 1;
  571. f_path = optarg;
  572. break;
  573. case 't':
  574. timeout = optarg;
  575. break;
  576. case 'm':
  577. method = optarg;
  578. break;
  579. }
  580. }
  581. if (server == NULL || remote_port == NULL ||
  582. port == NULL || key == NULL) {
  583. print_usage();
  584. exit(EXIT_FAILURE);
  585. }
  586. if (f_flags) {
  587. if (f_path == NULL) {
  588. print_usage();
  589. exit(EXIT_FAILURE);
  590. }
  591. /* Our process ID and Session ID */
  592. pid_t pid, sid;
  593. /* Fork off the parent process */
  594. pid = fork();
  595. if (pid < 0) {
  596. exit(EXIT_FAILURE);
  597. }
  598. /* If we got a good PID, then
  599. we can exit the parent process. */
  600. if (pid > 0) {
  601. FILE *file = fopen(f_path, "w");
  602. fprintf(file, "%d", pid);
  603. fclose(file);
  604. exit(EXIT_SUCCESS);
  605. }
  606. /* Change the file mode mask */
  607. umask(0);
  608. /* Open any logs here */
  609. /* Create a new SID for the child process */
  610. sid = setsid();
  611. if (sid < 0) {
  612. /* Log the failure */
  613. exit(EXIT_FAILURE);
  614. }
  615. /* Change the current working directory */
  616. if ((chdir("/")) < 0) {
  617. /* Log the failure */
  618. exit(EXIT_FAILURE);
  619. }
  620. /* Close out the standard file descriptors */
  621. close(STDIN_FILENO);
  622. close(STDOUT_FILENO);
  623. close(STDERR_FILENO);
  624. }
  625. // init global variables
  626. _server = strdup(server);
  627. _remote_port = strdup(remote_port);
  628. _timeout = atoi(timeout);
  629. _key = key;
  630. _method = TABLE;
  631. if (method != NULL) {
  632. if (strcmp(method, "rc4") == 0) {
  633. _method = RC4;
  634. }
  635. }
  636. LOGD("calculating ciphers %d\n", _method);
  637. if (_method != RC4) {
  638. get_table(key);
  639. }
  640. int listenfd;
  641. listenfd = create_and_bind(port);
  642. if (listenfd < 0) {
  643. LOGE("bind() error..\n");
  644. return 1;
  645. }
  646. if (listen(listenfd, SOMAXCONN) == -1) {
  647. LOGE("listen() error.\n");
  648. return 1;
  649. }
  650. LOGD("server listening at port %s\n", port);
  651. setnonblocking(listenfd);
  652. struct listen_ctx listen_ctx;
  653. listen_ctx.fd = listenfd;
  654. struct ev_loop *loop = ev_default_loop(0);
  655. if (!loop) {
  656. return 1;
  657. }
  658. ev_io_init (&listen_ctx.io, accept_cb, listenfd, EV_READ);
  659. ev_io_start (loop, &listen_ctx.io);
  660. ev_run (loop, 0);
  661. return 0;
  662. }