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.

1333 lines
39 KiB

10 years ago
12 years ago
12 years ago
10 years ago
11 years ago
10 years ago
11 years ago
11 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
12 years ago
12 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
12 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
12 years ago
10 years ago
11 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
12 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
10 years ago
12 years ago
10 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
12 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
11 years ago
10 years ago
10 years ago
11 years ago
10 years ago
12 years ago
12 years ago
11 years ago
10 years ago
12 years ago
12 years ago
10 years ago
11 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
12 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
12 years ago
12 years ago
11 years ago
10 years ago
12 years ago
12 years ago
10 years ago
11 years ago
10 years ago
10 years ago
12 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
11 years ago
11 years ago
11 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
12 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
12 years ago
  1. /*
  2. * local.c - Setup a socks5 proxy through remote shadowsocks server
  3. *
  4. * Copyright (C) 2013 - 2015, Max Lv <max.c.lv@gmail.com>
  5. *
  6. * This file is part of the shadowsocks-libev.
  7. *
  8. * shadowsocks-libev is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 3 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * shadowsocks-libev is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with shadowsocks-libev; see the file COPYING. If not, see
  20. * <http://www.gnu.org/licenses/>.
  21. */
  22. #ifdef HAVE_CONFIG_H
  23. #include "config.h"
  24. #endif
  25. #include <sys/stat.h>
  26. #include <sys/types.h>
  27. #include <fcntl.h>
  28. #include <locale.h>
  29. #include <signal.h>
  30. #include <string.h>
  31. #include <strings.h>
  32. #include <unistd.h>
  33. #include <getopt.h>
  34. #ifndef __MINGW32__
  35. #include <errno.h>
  36. #include <arpa/inet.h>
  37. #include <netdb.h>
  38. #include <netinet/in.h>
  39. #include <netinet/tcp.h>
  40. #include <pthread.h>
  41. #endif
  42. #ifdef LIB_ONLY
  43. #include <pthread.h>
  44. #include "shadowsocks.h"
  45. #endif
  46. #if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)
  47. #include <net/if.h>
  48. #include <sys/ioctl.h>
  49. #define SET_INTERFACE
  50. #endif
  51. #include <libcork/core.h>
  52. #include <udns.h>
  53. #ifdef __MINGW32__
  54. #include "win32.h"
  55. #endif
  56. #include "netutils.h"
  57. #include "utils.h"
  58. #include "socks5.h"
  59. #include "acl.h"
  60. #include "local.h"
  61. #ifndef EAGAIN
  62. #define EAGAIN EWOULDBLOCK
  63. #endif
  64. #ifndef EWOULDBLOCK
  65. #define EWOULDBLOCK EAGAIN
  66. #endif
  67. #ifndef BUF_SIZE
  68. #define BUF_SIZE 2048
  69. #endif
  70. int verbose = 0;
  71. #ifdef ANDROID
  72. int vpn = 0;
  73. #endif
  74. static int acl = 0;
  75. static int mode = TCP_ONLY;
  76. static int fast_open = 0;
  77. #ifdef HAVE_SETRLIMIT
  78. #ifndef LIB_ONLY
  79. static int nofile = 0;
  80. #endif
  81. #endif
  82. static int auth = 0;
  83. static void server_recv_cb(EV_P_ ev_io *w, int revents);
  84. static void server_send_cb(EV_P_ ev_io *w, int revents);
  85. static void remote_recv_cb(EV_P_ ev_io *w, int revents);
  86. static void remote_send_cb(EV_P_ ev_io *w, int revents);
  87. static void accept_cb(EV_P_ ev_io *w, int revents);
  88. static void signal_cb(EV_P_ ev_signal *w, int revents);
  89. static int create_and_bind(const char *addr, const char *port);
  90. static struct remote * create_remote(struct listen_ctx *listener, struct sockaddr *addr);
  91. static void free_remote(struct remote *remote);
  92. static void close_and_free_remote(EV_P_ struct remote *remote);
  93. static void free_server(struct server *server);
  94. static void close_and_free_server(EV_P_ struct server *server);
  95. static struct remote * new_remote(int fd, int timeout);
  96. static struct server * new_server(int fd, int method);
  97. static struct cork_dllist connections;
  98. #ifndef __MINGW32__
  99. int setnonblocking(int fd)
  100. {
  101. int flags;
  102. if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {
  103. flags = 0;
  104. }
  105. return fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  106. }
  107. #endif
  108. #ifdef SET_INTERFACE
  109. int setinterface(int socket_fd, const char * interface_name)
  110. {
  111. struct ifreq interface;
  112. memset(&interface, 0, sizeof(interface));
  113. strncpy(interface.ifr_name, interface_name, IFNAMSIZ);
  114. int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,
  115. sizeof(struct ifreq));
  116. return res;
  117. }
  118. #endif
  119. int create_and_bind(const char *addr, const char *port)
  120. {
  121. struct addrinfo hints;
  122. struct addrinfo *result, *rp;
  123. int s, listen_sock;
  124. memset(&hints, 0, sizeof(struct addrinfo));
  125. hints.ai_family = AF_UNSPEC; /* Return IPv4 and IPv6 choices */
  126. hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */
  127. s = getaddrinfo(addr, port, &hints, &result);
  128. if (s != 0) {
  129. LOGI("getaddrinfo: %s", gai_strerror(s));
  130. return -1;
  131. }
  132. for (rp = result; rp != NULL; rp = rp->ai_next) {
  133. listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
  134. if (listen_sock == -1) {
  135. continue;
  136. }
  137. int opt = 1;
  138. setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
  139. #ifdef SO_NOSIGPIPE
  140. setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  141. #endif
  142. s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);
  143. if (s == 0) {
  144. /* We managed to bind successfully! */
  145. break;
  146. } else {
  147. ERROR("bind");
  148. }
  149. close(listen_sock);
  150. }
  151. if (rp == NULL) {
  152. LOGE("Could not bind");
  153. return -1;
  154. }
  155. freeaddrinfo(result);
  156. return listen_sock;
  157. }
  158. static void free_connections(struct ev_loop *loop)
  159. {
  160. struct cork_dllist_item *curr;
  161. for (curr = cork_dllist_start(&connections);
  162. !cork_dllist_is_end(&connections, curr);
  163. curr = curr->next) {
  164. struct server *server = cork_container_of(curr, struct server, entries);
  165. struct remote *remote = server->remote;
  166. close_and_free_server(loop, server);
  167. close_and_free_remote(loop, remote);
  168. }
  169. }
  170. static void server_recv_cb(EV_P_ ev_io *w, int revents)
  171. {
  172. struct server_ctx *server_recv_ctx = (struct server_ctx *)w;
  173. struct server *server = server_recv_ctx->server;
  174. struct remote *remote = server->remote;
  175. char *buf;
  176. if (remote == NULL) {
  177. buf = server->buf;
  178. } else {
  179. buf = remote->buf;
  180. }
  181. ssize_t r;
  182. r = recv(server->fd, buf, BUF_SIZE, 0);
  183. if (r == 0) {
  184. // connection closed
  185. close_and_free_remote(EV_A_ remote);
  186. close_and_free_server(EV_A_ server);
  187. return;
  188. } else if (r < 0) {
  189. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  190. // no data
  191. // continue to wait for recv
  192. return;
  193. } else {
  194. ERROR("server_recv_cb_recv");
  195. close_and_free_remote(EV_A_ remote);
  196. close_and_free_server(EV_A_ server);
  197. return;
  198. }
  199. }
  200. while (1) {
  201. // local socks5 server
  202. if (server->stage == 5) {
  203. if (remote == NULL) {
  204. LOGE("invalid remote");
  205. close_and_free_server(EV_A_ server);
  206. return;
  207. }
  208. if (!remote->direct && remote->send_ctx->connected && auth) {
  209. remote->buf = ss_gen_hash(remote->buf, &r, &remote->counter, server->e_ctx, BUF_SIZE);
  210. }
  211. // insert shadowsocks header
  212. if (!remote->direct) {
  213. remote->buf = ss_encrypt(BUF_SIZE, remote->buf, &r,
  214. server->e_ctx);
  215. if (remote->buf == NULL) {
  216. LOGE("invalid password or cipher");
  217. close_and_free_remote(EV_A_ remote);
  218. close_and_free_server(EV_A_ server);
  219. return;
  220. }
  221. }
  222. if (!remote->send_ctx->connected) {
  223. #ifdef ANDROID
  224. if (vpn) {
  225. if (protect_socket(remote->fd) == -1) {
  226. ERROR("protect_socket");
  227. close_and_free_remote(EV_A_ remote);
  228. close_and_free_server(EV_A_ server);
  229. return;
  230. }
  231. }
  232. #endif
  233. remote->buf_idx = 0;
  234. remote->buf_len = r;
  235. if (!fast_open || remote->direct) {
  236. // connecting, wait until connected
  237. connect(remote->fd, (struct sockaddr *)&(remote->addr), remote->addr_len);
  238. // wait on remote connected event
  239. ev_io_stop(EV_A_ & server_recv_ctx->io);
  240. ev_io_start(EV_A_ & remote->send_ctx->io);
  241. ev_timer_start(EV_A_ & remote->send_ctx->watcher);
  242. } else {
  243. #ifdef TCP_FASTOPEN
  244. int s = sendto(remote->fd, remote->buf, r, MSG_FASTOPEN,
  245. (struct sockaddr *)&(remote->addr), remote->addr_len);
  246. if (s == -1) {
  247. if (errno == EINPROGRESS) {
  248. // in progress, wait until connected
  249. remote->buf_idx = 0;
  250. remote->buf_len = r;
  251. ev_io_stop(EV_A_ & server_recv_ctx->io);
  252. ev_io_start(EV_A_ & remote->send_ctx->io);
  253. return;
  254. } else {
  255. ERROR("sendto");
  256. if (errno == ENOTCONN) {
  257. LOGE(
  258. "fast open is not supported on this platform");
  259. // just turn it off
  260. fast_open = 0;
  261. }
  262. close_and_free_remote(EV_A_ remote);
  263. close_and_free_server(EV_A_ server);
  264. return;
  265. }
  266. } else if (s < r) {
  267. remote->buf_len = r - s;
  268. remote->buf_idx = s;
  269. }
  270. // Just connected
  271. remote->send_ctx->connected = 1;
  272. ev_timer_stop(EV_A_ & remote->send_ctx->watcher);
  273. ev_io_start(EV_A_ & remote->recv_ctx->io);
  274. #else
  275. // if TCP_FASTOPEN is not defined, fast_open will always be 0
  276. LOGE("can't come here");
  277. exit(1);
  278. #endif
  279. }
  280. } else {
  281. int s = send(remote->fd, remote->buf, r, 0);
  282. if (s == -1) {
  283. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  284. // no data, wait for send
  285. remote->buf_idx = 0;
  286. remote->buf_len = r;
  287. ev_io_stop(EV_A_ & server_recv_ctx->io);
  288. ev_io_start(EV_A_ & remote->send_ctx->io);
  289. return;
  290. } else {
  291. ERROR("server_recv_cb_send");
  292. close_and_free_remote(EV_A_ remote);
  293. close_and_free_server(EV_A_ server);
  294. return;
  295. }
  296. } else if (s < r) {
  297. remote->buf_len = r - s;
  298. remote->buf_idx = s;
  299. ev_io_stop(EV_A_ & server_recv_ctx->io);
  300. ev_io_start(EV_A_ & remote->send_ctx->io);
  301. return;
  302. }
  303. }
  304. // all processed
  305. return;
  306. } else if (server->stage == 0) {
  307. struct method_select_response response;
  308. response.ver = SVERSION;
  309. response.method = 0;
  310. char *send_buf = (char *)&response;
  311. send(server->fd, send_buf, sizeof(response), 0);
  312. server->stage = 1;
  313. return;
  314. } else if (server->stage == 1) {
  315. struct socks5_request *request = (struct socks5_request *)buf;
  316. struct sockaddr_in sock_addr;
  317. memset(&sock_addr, 0, sizeof(sock_addr));
  318. int udp_assc = 0;
  319. if (mode != TCP_ONLY && request->cmd == 3) {
  320. udp_assc = 1;
  321. socklen_t addr_len = sizeof(sock_addr);
  322. getsockname(server->fd, (struct sockaddr *)&sock_addr,
  323. &addr_len);
  324. if (verbose) {
  325. LOGI("udp assc request accepted");
  326. }
  327. } else if (request->cmd != 1) {
  328. LOGE("unsupported cmd: %d", request->cmd);
  329. struct socks5_response response;
  330. response.ver = SVERSION;
  331. response.rep = CMD_NOT_SUPPORTED;
  332. response.rsv = 0;
  333. response.atyp = 1;
  334. char *send_buf = (char *)&response;
  335. send(server->fd, send_buf, 4, 0);
  336. close_and_free_remote(EV_A_ remote);
  337. close_and_free_server(EV_A_ server);
  338. return;
  339. } else {
  340. char host[256], port[16];
  341. char ss_addr_to_send[320];
  342. ssize_t addr_len = 0;
  343. ss_addr_to_send[addr_len++] = request->atyp;
  344. // get remote addr and port
  345. if (request->atyp == 1) {
  346. // IP V4
  347. size_t in_addr_len = sizeof(struct in_addr);
  348. memcpy(ss_addr_to_send + addr_len, buf + 4, in_addr_len +
  349. 2);
  350. addr_len += in_addr_len + 2;
  351. if (acl || verbose) {
  352. uint16_t p =
  353. ntohs(*(uint16_t *)(buf + 4 + in_addr_len));
  354. dns_ntop(AF_INET, (const void *)(buf + 4),
  355. host, INET_ADDRSTRLEN);
  356. sprintf(port, "%d", p);
  357. }
  358. } else if (request->atyp == 3) {
  359. // Domain name
  360. uint8_t name_len = *(uint8_t *)(buf + 4);
  361. ss_addr_to_send[addr_len++] = name_len;
  362. memcpy(ss_addr_to_send + addr_len, buf + 4 + 1, name_len +
  363. 2);
  364. addr_len += name_len + 2;
  365. if (acl || verbose) {
  366. uint16_t p =
  367. ntohs(*(uint16_t *)(buf + 4 + 1 + name_len));
  368. memcpy(host, buf + 4 + 1, name_len);
  369. host[name_len] = '\0';
  370. sprintf(port, "%d", p);
  371. }
  372. } else if (request->atyp == 4) {
  373. // IP V6
  374. size_t in6_addr_len = sizeof(struct in6_addr);
  375. memcpy(ss_addr_to_send + addr_len, buf + 4, in6_addr_len +
  376. 2);
  377. addr_len += in6_addr_len + 2;
  378. if (acl || verbose) {
  379. uint16_t p =
  380. ntohs(*(uint16_t *)(buf + 4 + in6_addr_len));
  381. dns_ntop(AF_INET6, (const void *)(buf + 4),
  382. host, INET6_ADDRSTRLEN);
  383. sprintf(port, "%d", p);
  384. }
  385. } else {
  386. LOGE("unsupported addrtype: %d", request->atyp);
  387. close_and_free_remote(EV_A_ remote);
  388. close_and_free_server(EV_A_ server);
  389. return;
  390. }
  391. server->stage = 5;
  392. r -= (3 + addr_len);
  393. buf += (3 + addr_len);
  394. if (verbose) {
  395. LOGI("connect to %s:%s", host, port);
  396. }
  397. if ((acl && (request->atyp == 1 || request->atyp == 4) && acl_contains_ip(host))) {
  398. if (verbose) {
  399. LOGI("bypass %s:%s", host, port);
  400. }
  401. struct sockaddr_storage storage;
  402. memset(&storage, 0, sizeof(struct sockaddr_storage));
  403. if (get_sockaddr(host, port, &storage, 0) != -1) {
  404. remote = create_remote(server->listener, (struct sockaddr *)&storage);
  405. remote->direct = 1;
  406. }
  407. } else {
  408. remote = create_remote(server->listener, NULL);
  409. }
  410. if (remote == NULL) {
  411. LOGE("invalid remote addr");
  412. close_and_free_server(EV_A_ server);
  413. return;
  414. }
  415. if (!remote->direct) {
  416. if (auth) {
  417. ss_addr_to_send[0] |= ONETIMEAUTH_FLAG;
  418. ss_onetimeauth(ss_addr_to_send + addr_len, ss_addr_to_send, addr_len, server->e_ctx->evp.iv);
  419. addr_len += ONETIMEAUTH_BYTES;
  420. }
  421. memcpy(remote->buf, ss_addr_to_send, addr_len);
  422. if (r > 0) {
  423. if (auth) {
  424. buf = ss_gen_hash(buf, &r, &remote->counter, server->e_ctx, BUF_SIZE);
  425. }
  426. memcpy(remote->buf + addr_len, buf, r);
  427. }
  428. r += addr_len;
  429. } else {
  430. if (r > 0) {
  431. memcpy(remote->buf, buf, r);
  432. }
  433. }
  434. server->remote = remote;
  435. remote->server = server;
  436. }
  437. // Fake reply
  438. struct socks5_response response;
  439. response.ver = SVERSION;
  440. response.rep = 0;
  441. response.rsv = 0;
  442. response.atyp = 1;
  443. memcpy(server->buf, &response, sizeof(struct socks5_response));
  444. memcpy(server->buf + sizeof(struct socks5_response),
  445. &sock_addr.sin_addr, sizeof(sock_addr.sin_addr));
  446. memcpy(server->buf + sizeof(struct socks5_response) +
  447. sizeof(sock_addr.sin_addr),
  448. &sock_addr.sin_port, sizeof(sock_addr.sin_port));
  449. int reply_size = sizeof(struct socks5_response) +
  450. sizeof(sock_addr.sin_addr) +
  451. sizeof(sock_addr.sin_port);
  452. int s = send(server->fd, server->buf, reply_size, 0);
  453. if (s < reply_size) {
  454. LOGE("failed to send fake reply");
  455. close_and_free_remote(EV_A_ remote);
  456. close_and_free_server(EV_A_ server);
  457. return;
  458. }
  459. if (udp_assc) {
  460. close_and_free_remote(EV_A_ remote);
  461. close_and_free_server(EV_A_ server);
  462. return;
  463. }
  464. }
  465. }
  466. }
  467. static void server_send_cb(EV_P_ ev_io *w, int revents)
  468. {
  469. struct server_ctx *server_send_ctx = (struct server_ctx *)w;
  470. struct server *server = server_send_ctx->server;
  471. struct remote *remote = server->remote;
  472. if (server->buf_len == 0) {
  473. // close and free
  474. close_and_free_remote(EV_A_ remote);
  475. close_and_free_server(EV_A_ server);
  476. return;
  477. } else {
  478. // has data to send
  479. ssize_t s = send(server->fd, server->buf + server->buf_idx,
  480. server->buf_len, 0);
  481. if (s < 0) {
  482. if (errno != EAGAIN && errno != EWOULDBLOCK) {
  483. ERROR("server_send_cb_send");
  484. close_and_free_remote(EV_A_ remote);
  485. close_and_free_server(EV_A_ server);
  486. }
  487. return;
  488. } else if (s < server->buf_len) {
  489. // partly sent, move memory, wait for the next time to send
  490. server->buf_len -= s;
  491. server->buf_idx += s;
  492. return;
  493. } else {
  494. // all sent out, wait for reading
  495. server->buf_len = 0;
  496. server->buf_idx = 0;
  497. ev_io_stop(EV_A_ & server_send_ctx->io);
  498. ev_io_start(EV_A_ & remote->recv_ctx->io);
  499. }
  500. }
  501. }
  502. static void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents)
  503. {
  504. struct remote_ctx *remote_ctx = (struct remote_ctx *)(((void *)watcher)
  505. - sizeof(ev_io));
  506. struct remote *remote = remote_ctx->remote;
  507. struct server *server = remote->server;
  508. if (verbose) {
  509. LOGI("TCP connection timeout");
  510. }
  511. close_and_free_remote(EV_A_ remote);
  512. close_and_free_server(EV_A_ server);
  513. }
  514. static void remote_recv_cb(EV_P_ ev_io *w, int revents)
  515. {
  516. struct remote_ctx *remote_recv_ctx = (struct remote_ctx *)w;
  517. struct remote *remote = remote_recv_ctx->remote;
  518. struct server *server = remote->server;
  519. ev_timer_again(EV_A_ & remote->recv_ctx->watcher);
  520. ssize_t r = recv(remote->fd, server->buf, BUF_SIZE, 0);
  521. if (r == 0) {
  522. // connection closed
  523. close_and_free_remote(EV_A_ remote);
  524. close_and_free_server(EV_A_ server);
  525. return;
  526. } else if (r < 0) {
  527. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  528. // no data
  529. // continue to wait for recv
  530. return;
  531. } else {
  532. ERROR("remote_recv_cb_recv");
  533. close_and_free_remote(EV_A_ remote);
  534. close_and_free_server(EV_A_ server);
  535. return;
  536. }
  537. }
  538. if (!remote->direct) {
  539. server->buf = ss_decrypt(BUF_SIZE, server->buf, &r, server->d_ctx);
  540. if (server->buf == NULL) {
  541. LOGE("invalid password or cipher");
  542. close_and_free_remote(EV_A_ remote);
  543. close_and_free_server(EV_A_ server);
  544. return;
  545. }
  546. }
  547. int s = send(server->fd, server->buf, r, 0);
  548. if (s == -1) {
  549. if (errno == EAGAIN || errno == EWOULDBLOCK) {
  550. // no data, wait for send
  551. server->buf_len = r;
  552. server->buf_idx = 0;
  553. ev_io_stop(EV_A_ & remote_recv_ctx->io);
  554. ev_io_start(EV_A_ & server->send_ctx->io);
  555. return;
  556. } else {
  557. ERROR("remote_recv_cb_send");
  558. close_and_free_remote(EV_A_ remote);
  559. close_and_free_server(EV_A_ server);
  560. return;
  561. }
  562. } else if (s < r) {
  563. server->buf_len = r - s;
  564. server->buf_idx = s;
  565. ev_io_stop(EV_A_ & remote_recv_ctx->io);
  566. ev_io_start(EV_A_ & server->send_ctx->io);
  567. return;
  568. }
  569. }
  570. static void remote_send_cb(EV_P_ ev_io *w, int revents)
  571. {
  572. struct remote_ctx *remote_send_ctx = (struct remote_ctx *)w;
  573. struct remote *remote = remote_send_ctx->remote;
  574. struct server *server = remote->server;
  575. if (!remote_send_ctx->connected) {
  576. struct sockaddr_storage addr;
  577. socklen_t len = sizeof addr;
  578. int r = getpeername(remote->fd, (struct sockaddr *)&addr, &len);
  579. if (r == 0) {
  580. remote_send_ctx->connected = 1;
  581. ev_timer_stop(EV_A_ & remote_send_ctx->watcher);
  582. ev_timer_start(EV_A_ & remote->recv_ctx->watcher);
  583. ev_io_start(EV_A_ & remote->recv_ctx->io);
  584. // no need to send any data
  585. if (remote->buf_len == 0) {
  586. ev_io_stop(EV_A_ & remote_send_ctx->io);
  587. ev_io_start(EV_A_ & server->recv_ctx->io);
  588. return;
  589. }
  590. } else {
  591. // not connected
  592. ERROR("getpeername");
  593. close_and_free_remote(EV_A_ remote);
  594. close_and_free_server(EV_A_ server);
  595. return;
  596. }
  597. }
  598. if (remote->buf_len == 0) {
  599. // close and free
  600. close_and_free_remote(EV_A_ remote);
  601. close_and_free_server(EV_A_ server);
  602. return;
  603. } else {
  604. // has data to send
  605. ssize_t s = send(remote->fd, remote->buf + remote->buf_idx,
  606. remote->buf_len, 0);
  607. if (s < 0) {
  608. if (errno != EAGAIN && errno != EWOULDBLOCK) {
  609. ERROR("remote_send_cb_send");
  610. // close and free
  611. close_and_free_remote(EV_A_ remote);
  612. close_and_free_server(EV_A_ server);
  613. }
  614. return;
  615. } else if (s < remote->buf_len) {
  616. // partly sent, move memory, wait for the next time to send
  617. remote->buf_len -= s;
  618. remote->buf_idx += s;
  619. return;
  620. } else {
  621. // all sent out, wait for reading
  622. remote->buf_len = 0;
  623. remote->buf_idx = 0;
  624. ev_io_stop(EV_A_ & remote_send_ctx->io);
  625. ev_io_start(EV_A_ & server->recv_ctx->io);
  626. }
  627. }
  628. }
  629. static struct remote * new_remote(int fd, int timeout)
  630. {
  631. struct remote *remote;
  632. remote = malloc(sizeof(struct remote));
  633. memset(remote, 0, sizeof(struct remote));
  634. remote->buf = malloc(BUF_SIZE);
  635. remote->recv_ctx = malloc(sizeof(struct remote_ctx));
  636. remote->send_ctx = malloc(sizeof(struct remote_ctx));
  637. remote->recv_ctx->connected = 0;
  638. remote->send_ctx->connected = 0;
  639. remote->fd = fd;
  640. ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);
  641. ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);
  642. ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb,
  643. min(MAX_CONNECT_TIMEOUT,
  644. timeout),
  645. 0);
  646. ev_timer_init(&remote->recv_ctx->watcher, remote_timeout_cb,
  647. min(MAX_CONNECT_TIMEOUT,
  648. timeout),
  649. timeout);
  650. remote->recv_ctx->remote = remote;
  651. remote->send_ctx->remote = remote;
  652. return remote;
  653. }
  654. static void free_remote(struct remote *remote)
  655. {
  656. if (remote->server != NULL) {
  657. remote->server->remote = NULL;
  658. }
  659. if (remote->buf != NULL) {
  660. free(remote->buf);
  661. }
  662. free(remote->recv_ctx);
  663. free(remote->send_ctx);
  664. free(remote);
  665. }
  666. static void close_and_free_remote(EV_P_ struct remote *remote)
  667. {
  668. if (remote != NULL) {
  669. ev_timer_stop(EV_A_ & remote->send_ctx->watcher);
  670. ev_timer_stop(EV_A_ & remote->recv_ctx->watcher);
  671. ev_io_stop(EV_A_ & remote->send_ctx->io);
  672. ev_io_stop(EV_A_ & remote->recv_ctx->io);
  673. close(remote->fd);
  674. free_remote(remote);
  675. }
  676. }
  677. static struct server * new_server(int fd, int method)
  678. {
  679. struct server *server;
  680. server = malloc(sizeof(struct server));
  681. memset(server, 0, sizeof(struct server));
  682. server->buf = malloc(BUF_SIZE);
  683. server->recv_ctx = malloc(sizeof(struct server_ctx));
  684. server->send_ctx = malloc(sizeof(struct server_ctx));
  685. server->recv_ctx->connected = 0;
  686. server->send_ctx->connected = 0;
  687. server->fd = fd;
  688. ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);
  689. ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);
  690. server->recv_ctx->server = server;
  691. server->send_ctx->server = server;
  692. if (method) {
  693. server->e_ctx = malloc(sizeof(struct enc_ctx));
  694. server->d_ctx = malloc(sizeof(struct enc_ctx));
  695. enc_ctx_init(method, server->e_ctx, 1);
  696. enc_ctx_init(method, server->d_ctx, 0);
  697. } else {
  698. server->e_ctx = NULL;
  699. server->d_ctx = NULL;
  700. }
  701. cork_dllist_add(&connections, &server->entries);
  702. return server;
  703. }
  704. static void free_server(struct server *server)
  705. {
  706. cork_dllist_remove(&server->entries);
  707. if (server->remote != NULL) {
  708. server->remote->server = NULL;
  709. }
  710. if (server->e_ctx != NULL) {
  711. cipher_context_release(&server->e_ctx->evp);
  712. free(server->e_ctx);
  713. }
  714. if (server->d_ctx != NULL) {
  715. cipher_context_release(&server->d_ctx->evp);
  716. free(server->d_ctx);
  717. }
  718. if (server->buf != NULL) {
  719. free(server->buf);
  720. }
  721. free(server->recv_ctx);
  722. free(server->send_ctx);
  723. free(server);
  724. }
  725. static void close_and_free_server(EV_P_ struct server *server)
  726. {
  727. if (server != NULL) {
  728. ev_io_stop(EV_A_ & server->send_ctx->io);
  729. ev_io_stop(EV_A_ & server->recv_ctx->io);
  730. close(server->fd);
  731. free_server(server);
  732. }
  733. }
  734. static struct remote * create_remote(struct listen_ctx *listener,
  735. struct sockaddr *addr)
  736. {
  737. struct sockaddr *remote_addr;
  738. int index = rand() % listener->remote_num;
  739. if (addr == NULL) {
  740. remote_addr = listener->remote_addr[index];
  741. } else {
  742. remote_addr = addr;
  743. }
  744. int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);
  745. if (remotefd < 0) {
  746. ERROR("socket");
  747. return NULL;
  748. }
  749. int opt = 1;
  750. setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
  751. #ifdef SO_NOSIGPIPE
  752. setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  753. #endif
  754. // Setup
  755. setnonblocking(remotefd);
  756. #ifdef SET_INTERFACE
  757. if (listener->iface) {
  758. setinterface(remotefd, listener->iface);
  759. }
  760. #endif
  761. struct remote *remote = new_remote(remotefd, listener->timeout);
  762. remote->addr_len = get_sockaddr_len(remote_addr);
  763. memcpy(&(remote->addr), remote_addr, remote->addr_len);
  764. return remote;
  765. }
  766. static void signal_cb(EV_P_ ev_signal *w, int revents)
  767. {
  768. if (revents & EV_SIGNAL) {
  769. switch (w->signum) {
  770. case SIGINT:
  771. case SIGTERM:
  772. ev_unloop(EV_A_ EVUNLOOP_ALL);
  773. }
  774. }
  775. }
  776. void accept_cb(EV_P_ ev_io *w, int revents)
  777. {
  778. struct listen_ctx *listener = (struct listen_ctx *)w;
  779. int serverfd = accept(listener->fd, NULL, NULL);
  780. if (serverfd == -1) {
  781. ERROR("accept");
  782. return;
  783. }
  784. setnonblocking(serverfd);
  785. int opt = 1;
  786. setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));
  787. #ifdef SO_NOSIGPIPE
  788. setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));
  789. #endif
  790. struct server *server = new_server(serverfd, listener->method);
  791. server->listener = listener;
  792. ev_io_start(EV_A_ & server->recv_ctx->io);
  793. }
  794. #ifndef LIB_ONLY
  795. int main(int argc, char **argv)
  796. {
  797. int i, c;
  798. int pid_flags = 0;
  799. char *user = NULL;
  800. char *local_port = NULL;
  801. char *local_addr = NULL;
  802. char *password = NULL;
  803. char *timeout = NULL;
  804. char *method = NULL;
  805. char *pid_path = NULL;
  806. char *conf_path = NULL;
  807. char *iface = NULL;
  808. srand(time(NULL));
  809. int remote_num = 0;
  810. ss_addr_t remote_addr[MAX_REMOTE_NUM];
  811. char *remote_port = NULL;
  812. int option_index = 0;
  813. static struct option long_options[] =
  814. {
  815. { "fast-open", no_argument, 0, 0 },
  816. { "acl", required_argument, 0, 0 },
  817. { 0, 0, 0, 0 }
  818. };
  819. opterr = 0;
  820. USE_TTY();
  821. #ifdef ANDROID
  822. while ((c = getopt_long(argc, argv, "f:s:p:l:k:t:m:i:c:b:a:uvVA",
  823. long_options, &option_index)) != -1) {
  824. #else
  825. while ((c = getopt_long(argc, argv, "f:s:p:l:k:t:m:i:c:b:a:uvA",
  826. long_options, &option_index)) != -1) {
  827. #endif
  828. switch (c) {
  829. case 0:
  830. if (option_index == 0) {
  831. fast_open = 1;
  832. } else if (option_index == 1) {
  833. LOGI("initialize acl...");
  834. acl = !init_acl(optarg);
  835. }
  836. break;
  837. case 's':
  838. if (remote_num < MAX_REMOTE_NUM) {
  839. remote_addr[remote_num].host = optarg;
  840. remote_addr[remote_num++].port = NULL;
  841. }
  842. break;
  843. case 'p':
  844. remote_port = optarg;
  845. break;
  846. case 'l':
  847. local_port = optarg;
  848. break;
  849. case 'k':
  850. password = optarg;
  851. break;
  852. case 'f':
  853. pid_flags = 1;
  854. pid_path = optarg;
  855. break;
  856. case 't':
  857. timeout = optarg;
  858. break;
  859. case 'm':
  860. method = optarg;
  861. break;
  862. case 'c':
  863. conf_path = optarg;
  864. break;
  865. case 'i':
  866. iface = optarg;
  867. break;
  868. case 'b':
  869. local_addr = optarg;
  870. break;
  871. case 'a':
  872. user = optarg;
  873. break;
  874. case 'u':
  875. mode = TCP_AND_UDP;
  876. break;
  877. case 'v':
  878. verbose = 1;
  879. break;
  880. case 'A':
  881. auth = 1;
  882. break;
  883. #ifdef ANDROID
  884. case 'V':
  885. vpn = 1;
  886. break;
  887. #endif
  888. }
  889. }
  890. if (opterr) {
  891. usage();
  892. exit(EXIT_FAILURE);
  893. }
  894. if (argc == 1) {
  895. if (conf_path == NULL) {
  896. conf_path = DEFAULT_CONF_PATH;
  897. }
  898. }
  899. if (conf_path != NULL) {
  900. jconf_t *conf = read_jconf(conf_path);
  901. if (remote_num == 0) {
  902. remote_num = conf->remote_num;
  903. for (i = 0; i < remote_num; i++) {
  904. remote_addr[i] = conf->remote_addr[i];
  905. }
  906. }
  907. if (remote_port == NULL) {
  908. remote_port = conf->remote_port;
  909. }
  910. if (local_addr == NULL) {
  911. local_addr = conf->local_addr;
  912. }
  913. if (local_port == NULL) {
  914. local_port = conf->local_port;
  915. }
  916. if (password == NULL) {
  917. password = conf->password;
  918. }
  919. if (method == NULL) {
  920. method = conf->method;
  921. }
  922. if (timeout == NULL) {
  923. timeout = conf->timeout;
  924. }
  925. if (auth == 0) {
  926. auth = conf->auth;
  927. }
  928. if (fast_open == 0) {
  929. fast_open = conf->fast_open;
  930. }
  931. #ifdef HAVE_SETRLIMIT
  932. if (nofile == 0) {
  933. nofile = conf->nofile;
  934. }
  935. /*
  936. * no need to check the return value here since we will show
  937. * the user an error message if setrlimit(2) fails
  938. */
  939. if (nofile) {
  940. if (verbose) {
  941. LOGI("setting NOFILE to %d", nofile);
  942. }
  943. set_nofile(nofile);
  944. }
  945. #endif
  946. }
  947. if (remote_num == 0 || remote_port == NULL ||
  948. local_port == NULL || password == NULL) {
  949. usage();
  950. exit(EXIT_FAILURE);
  951. }
  952. if (timeout == NULL) {
  953. timeout = "60";
  954. }
  955. if (local_addr == NULL) {
  956. local_addr = "127.0.0.1";
  957. }
  958. if (pid_flags) {
  959. USE_SYSLOG(argv[0]);
  960. daemonize(pid_path);
  961. }
  962. if (fast_open == 1) {
  963. #ifdef TCP_FASTOPEN
  964. LOGI("using tcp fast open");
  965. #else
  966. LOGE("tcp fast open is not supported by this environment");
  967. #endif
  968. }
  969. if (auth) {
  970. LOGI("onetime authentication enabled");
  971. }
  972. #ifdef __MINGW32__
  973. winsock_init();
  974. #else
  975. // ignore SIGPIPE
  976. signal(SIGPIPE, SIG_IGN);
  977. signal(SIGABRT, SIG_IGN);
  978. #endif
  979. struct ev_signal sigint_watcher;
  980. struct ev_signal sigterm_watcher;
  981. ev_signal_init(&sigint_watcher, signal_cb, SIGINT);
  982. ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);
  983. ev_signal_start(EV_DEFAULT, &sigint_watcher);
  984. ev_signal_start(EV_DEFAULT, &sigterm_watcher);
  985. // Setup keys
  986. LOGI("initialize ciphers... %s", method);
  987. int m = enc_init(password, method);
  988. // Setup proxy context
  989. struct listen_ctx listen_ctx;
  990. listen_ctx.remote_num = remote_num;
  991. listen_ctx.remote_addr = malloc(sizeof(struct sockaddr *) * remote_num);
  992. for (i = 0; i < remote_num; i++) {
  993. char *host = remote_addr[i].host;
  994. char *port = remote_addr[i].port == NULL ? remote_port :
  995. remote_addr[i].port;
  996. struct sockaddr_storage *storage = malloc(sizeof(struct sockaddr_storage));
  997. memset(storage, 0, sizeof(struct sockaddr_storage));
  998. if (get_sockaddr(host, port, storage, 1) == -1) {
  999. FATAL("failed to resolve the provided hostname");
  1000. }
  1001. listen_ctx.remote_addr[i] = (struct sockaddr *)storage;
  1002. }
  1003. listen_ctx.timeout = atoi(timeout);
  1004. listen_ctx.iface = iface;
  1005. listen_ctx.method = m;
  1006. struct ev_loop *loop = EV_DEFAULT;
  1007. // Setup socket
  1008. int listenfd;
  1009. listenfd = create_and_bind(local_addr, local_port);
  1010. if (listenfd < 0) {
  1011. FATAL("bind() error");
  1012. }
  1013. if (listen(listenfd, SOMAXCONN) == -1) {
  1014. FATAL("listen() error");
  1015. }
  1016. setnonblocking(listenfd);
  1017. listen_ctx.fd = listenfd;
  1018. ev_io_init(&listen_ctx.io, accept_cb, listenfd, EV_READ);
  1019. ev_io_start(loop, &listen_ctx.io);
  1020. // Setup UDP
  1021. if (mode != TCP_ONLY) {
  1022. LOGI("udprelay enabled");
  1023. init_udprelay(local_addr, local_port, listen_ctx.remote_addr[0],
  1024. get_sockaddr_len(listen_ctx.remote_addr[0]), m, auth, listen_ctx.timeout, iface);
  1025. }
  1026. LOGI("listening at %s:%s", local_addr, local_port);
  1027. // setuid
  1028. if (user != NULL) {
  1029. run_as(user);
  1030. }
  1031. // Init connections
  1032. cork_dllist_init(&connections);
  1033. // Enter the loop
  1034. ev_run(loop, 0);
  1035. if (verbose) {
  1036. LOGI("closed gracefully");
  1037. }
  1038. // Clean up
  1039. ev_io_stop(loop, &listen_ctx.io);
  1040. free_connections(loop);
  1041. if (mode != TCP_ONLY) {
  1042. free_udprelay();
  1043. }
  1044. for (i = 0; i < remote_num; i++) {
  1045. free(listen_ctx.remote_addr[i]);
  1046. }
  1047. free(listen_ctx.remote_addr);
  1048. #ifdef __MINGW32__
  1049. winsock_cleanup();
  1050. #endif
  1051. ev_signal_stop(EV_DEFAULT, &sigint_watcher);
  1052. ev_signal_stop(EV_DEFAULT, &sigterm_watcher);
  1053. return 0;
  1054. }
  1055. #else
  1056. int start_ss_local_server(profile_t profile)
  1057. {
  1058. srand(time(NULL));
  1059. char *remote_host = profile.remote_host;
  1060. char *local_addr = profile.local_addr;
  1061. char *method = profile.method;
  1062. char *password = profile.password;
  1063. char *log = profile.log;
  1064. int remote_port = profile.remote_port;
  1065. int local_port = profile.local_port;
  1066. int timeout = profile.timeout;
  1067. mode = profile.mode;
  1068. fast_open = profile.fast_open;
  1069. verbose = profile.verbose;
  1070. char local_port_str[16];
  1071. char remote_port_str[16];
  1072. sprintf(local_port_str, "%d", local_port);
  1073. sprintf(remote_port_str, "%d", remote_port);
  1074. USE_LOGFILE(log);
  1075. if (profile.acl != NULL) {
  1076. acl = !init_acl(profile.acl);
  1077. }
  1078. if (local_addr == NULL) {
  1079. local_addr = "127.0.0.1";
  1080. }
  1081. #ifdef __MINGW32__
  1082. winsock_init();
  1083. #else
  1084. // ignore SIGPIPE
  1085. signal(SIGPIPE, SIG_IGN);
  1086. signal(SIGABRT, SIG_IGN);
  1087. #endif
  1088. struct ev_signal sigint_watcher;
  1089. struct ev_signal sigterm_watcher;
  1090. ev_signal_init(&sigint_watcher, signal_cb, SIGINT);
  1091. ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);
  1092. ev_signal_start(EV_DEFAULT, &sigint_watcher);
  1093. ev_signal_start(EV_DEFAULT, &sigterm_watcher);
  1094. // Setup keys
  1095. LOGI("initialize ciphers... %s", method);
  1096. int m = enc_init(password, method);
  1097. struct sockaddr_storage *storage = malloc(sizeof(struct sockaddr_storage));
  1098. memset(storage, 0, sizeof(struct sockaddr_storage));
  1099. if (get_sockaddr(remote_host, remote_port_str, storage, 1) == -1) {
  1100. return -1;
  1101. }
  1102. // Setup proxy context
  1103. struct ev_loop *loop = EV_DEFAULT;
  1104. struct listen_ctx listen_ctx;
  1105. listen_ctx.remote_num = 1;
  1106. listen_ctx.remote_addr = malloc(sizeof(struct sockaddr *));
  1107. listen_ctx.remote_addr[0] = (struct sockaddr *)storage;
  1108. listen_ctx.timeout = timeout;
  1109. listen_ctx.method = m;
  1110. listen_ctx.iface = NULL;
  1111. // Setup socket
  1112. int listenfd;
  1113. listenfd = create_and_bind(local_addr, local_port_str);
  1114. if (listenfd < 0) {
  1115. ERROR("bind()");
  1116. return -1;
  1117. }
  1118. if (listen(listenfd, SOMAXCONN) == -1) {
  1119. ERROR("listen()");
  1120. return -1;
  1121. }
  1122. setnonblocking(listenfd);
  1123. listen_ctx.fd = listenfd;
  1124. ev_io_init(&listen_ctx.io, accept_cb, listenfd, EV_READ);
  1125. ev_io_start(loop, &listen_ctx.io);
  1126. // Setup UDP
  1127. if (mode != TCP_ONLY) {
  1128. LOGI("udprelay enabled");
  1129. struct sockaddr *addr = (struct sockaddr *)storage;
  1130. init_udprelay(local_addr, local_port_str, addr,
  1131. get_sockaddr_len(addr), m, auth, timeout, NULL);
  1132. }
  1133. LOGI("listening at %s:%s", local_addr, local_port_str);
  1134. // Init connections
  1135. cork_dllist_init(&connections);
  1136. // Enter the loop
  1137. ev_run(loop, 0);
  1138. if (verbose) {
  1139. LOGI("closed gracefully");
  1140. }
  1141. // Clean up
  1142. if (mode != TCP_ONLY) {
  1143. free_udprelay();
  1144. }
  1145. ev_io_stop(loop, &listen_ctx.io);
  1146. free_connections(loop);
  1147. close(listen_ctx.fd);
  1148. free(listen_ctx.remote_addr);
  1149. #ifdef __MINGW32__
  1150. winsock_cleanup();
  1151. #endif
  1152. ev_signal_stop(EV_DEFAULT, &sigint_watcher);
  1153. ev_signal_stop(EV_DEFAULT, &sigterm_watcher);
  1154. // cannot reach here
  1155. return 0;
  1156. }
  1157. #endif