|
2 | 2 | ============================================================================
|
3 | 3 | Name : hev-socks5-proxy.c
|
4 | 4 | Author : Heiher <[email protected]>
|
5 |
| - Copyright : Copyright (c) 2017 - 2022 hev |
| 5 | + Copyright : Copyright (c) 2017 - 2024 hev |
6 | 6 | Description : Socks5 Proxy
|
7 | 7 | ============================================================================
|
8 | 8 | */
|
@@ -35,7 +35,93 @@ static pthread_t *work_threads;
|
35 | 35 | static HevSocketFactory *factory;
|
36 | 36 | static HevSocks5Worker **worker_list;
|
37 | 37 |
|
38 |
| -static void hev_socks5_proxy_load (void); |
| 38 | +static void |
| 39 | +hev_socks5_proxy_load_file (HevSocks5Authenticator *auth, const char *file) |
| 40 | +{ |
| 41 | + char *line = NULL; |
| 42 | + size_t len = 0; |
| 43 | + ssize_t nread; |
| 44 | + FILE *fp; |
| 45 | + |
| 46 | + fp = fopen (file, "r"); |
| 47 | + if (!fp) { |
| 48 | + hev_object_unref (HEV_OBJECT (auth)); |
| 49 | + return; |
| 50 | + } |
| 51 | + |
| 52 | + while ((nread = getline (&line, &len, fp)) != -1) { |
| 53 | + HevSocks5UserMark *user; |
| 54 | + unsigned int nlen; |
| 55 | + unsigned int plen; |
| 56 | + char name[256]; |
| 57 | + char pass[256]; |
| 58 | + long mark = 0; |
| 59 | + int res; |
| 60 | + |
| 61 | + res = sscanf (line, "%255s %255s %lx\n", name, pass, &mark); |
| 62 | + if (res < 2) { |
| 63 | + LOG_E ("socks5 proxy user/pass format"); |
| 64 | + continue; |
| 65 | + } |
| 66 | + |
| 67 | + nlen = strlen (name); |
| 68 | + plen = strlen (pass); |
| 69 | + user = hev_socks5_user_mark_new (name, nlen, pass, plen, mark); |
| 70 | + hev_object_set_atomic (HEV_OBJECT (user), 1); |
| 71 | + res = hev_socks5_authenticator_add (auth, HEV_SOCKS5_USER (user)); |
| 72 | + if (res < 0) { |
| 73 | + LOG_E ("socks5 proxy user conflict"); |
| 74 | + hev_object_unref (HEV_OBJECT (user)); |
| 75 | + } |
| 76 | + } |
| 77 | + |
| 78 | + free (line); |
| 79 | + fclose (fp); |
| 80 | +} |
| 81 | + |
| 82 | +static void |
| 83 | +hev_socks5_proxy_load (void) |
| 84 | +{ |
| 85 | + HevSocks5Authenticator *auth; |
| 86 | + const char *file, *name, *pass; |
| 87 | + int i; |
| 88 | + |
| 89 | + LOG_D ("socks5 proxy load"); |
| 90 | + |
| 91 | + file = hev_config_get_auth_file (); |
| 92 | + name = hev_config_get_auth_username (); |
| 93 | + pass = hev_config_get_auth_password (); |
| 94 | + |
| 95 | + if (!file && !name && !pass) |
| 96 | + return; |
| 97 | + |
| 98 | + auth = hev_socks5_authenticator_new (); |
| 99 | + if (!auth) |
| 100 | + return; |
| 101 | + |
| 102 | + hev_object_set_atomic (HEV_OBJECT (auth), 1); |
| 103 | + |
| 104 | + if (file) { |
| 105 | + hev_socks5_proxy_load_file (auth, file); |
| 106 | + } else { |
| 107 | + HevSocks5UserMark *user; |
| 108 | + |
| 109 | + user = hev_socks5_user_mark_new (name, strlen (name), pass, |
| 110 | + strlen (pass), 0); |
| 111 | + hev_socks5_authenticator_add (auth, HEV_SOCKS5_USER (user)); |
| 112 | + hev_object_set_atomic (HEV_OBJECT (user), 1); |
| 113 | + } |
| 114 | + |
| 115 | + for (i = 0; i < workers; i++) { |
| 116 | + HevSocks5Worker *worker; |
| 117 | + |
| 118 | + worker = worker_list[i]; |
| 119 | + hev_socks5_worker_set_auth (worker, auth); |
| 120 | + hev_socks5_worker_reload (worker); |
| 121 | + } |
| 122 | + |
| 123 | + hev_object_unref (HEV_OBJECT (auth)); |
| 124 | +} |
39 | 125 |
|
40 | 126 | static void
|
41 | 127 | sigint_handler (int signum)
|
@@ -68,54 +154,41 @@ hev_socks5_proxy_init (void)
|
68 | 154 | goto exit;
|
69 | 155 | }
|
70 | 156 |
|
71 |
| - if (signal (SIGPIPE, SIG_IGN) == SIG_ERR) { |
72 |
| - LOG_E ("socks5 proxy sigpipe"); |
73 |
| - goto free; |
74 |
| - } |
75 |
| - |
76 |
| - if (signal (SIGINT, sigint_handler) == SIG_ERR) { |
77 |
| - LOG_E ("socks5 proxy sigint"); |
78 |
| - goto free; |
79 |
| - } |
80 |
| - |
81 |
| - if (signal (SIGUSR1, sigint_handler) == SIG_ERR) { |
82 |
| - LOG_E ("socks5 proxy sigusr1"); |
83 |
| - goto free; |
84 |
| - } |
85 |
| - |
86 | 157 | task = hev_task_new (-1);
|
87 | 158 | if (!task) {
|
88 | 159 | LOG_E ("socks5 proxy task");
|
89 |
| - goto free; |
| 160 | + goto exit; |
90 | 161 | }
|
91 | 162 |
|
92 | 163 | workers = hev_config_get_workers ();
|
93 |
| - |
94 | 164 | work_threads = hev_malloc0 (sizeof (pthread_t) * workers);
|
95 | 165 | if (!work_threads) {
|
96 | 166 | LOG_E ("socks5 proxy work threads");
|
97 |
| - goto free; |
| 167 | + goto exit; |
98 | 168 | }
|
99 | 169 |
|
100 | 170 | worker_list = hev_malloc0 (sizeof (HevSocks5Worker *) * workers);
|
101 | 171 | if (!worker_list) {
|
102 | 172 | LOG_E ("socks5 proxy worker list");
|
103 |
| - goto free; |
| 173 | + goto exit; |
104 | 174 | }
|
105 | 175 |
|
106 | 176 | factory = hev_socket_factory_new (hev_config_get_listen_address (),
|
107 | 177 | hev_config_get_listen_port (),
|
108 | 178 | hev_config_get_listen_ipv6_only ());
|
109 | 179 | if (!factory) {
|
110 | 180 | LOG_E ("socks5 proxy socket factory");
|
111 |
| - goto free; |
| 181 | + goto exit; |
112 | 182 | }
|
113 | 183 |
|
| 184 | + signal (SIGPIPE, SIG_IGN); |
| 185 | + signal (SIGINT, sigint_handler); |
| 186 | + signal (SIGUSR1, sigint_handler); |
| 187 | + |
114 | 188 | return 0;
|
115 | 189 |
|
116 |
| -free: |
117 |
| - hev_socks5_proxy_fini (); |
118 | 190 | exit:
|
| 191 | + hev_socks5_proxy_fini (); |
119 | 192 | return -1;
|
120 | 193 | }
|
121 | 194 |
|
@@ -238,85 +311,3 @@ hev_socks5_proxy_run (void)
|
238 | 311 | worker_list[0] = NULL;
|
239 | 312 | }
|
240 | 313 | }
|
241 |
| - |
242 |
| -static void |
243 |
| -hev_socks5_proxy_load (void) |
244 |
| -{ |
245 |
| - HevSocks5Authenticator *auth; |
246 |
| - const char *file, *name, *pass; |
247 |
| - int i; |
248 |
| - |
249 |
| - LOG_D ("socks5 proxy load"); |
250 |
| - |
251 |
| - file = hev_config_get_auth_file (); |
252 |
| - name = hev_config_get_auth_username (); |
253 |
| - pass = hev_config_get_auth_password (); |
254 |
| - |
255 |
| - if (!file && !name && !pass) |
256 |
| - return; |
257 |
| - |
258 |
| - auth = hev_socks5_authenticator_new (); |
259 |
| - if (!auth) |
260 |
| - return; |
261 |
| - |
262 |
| - hev_object_set_atomic (HEV_OBJECT (auth), 1); |
263 |
| - |
264 |
| - if (!file) { |
265 |
| - HevSocks5UserMark *user; |
266 |
| - |
267 |
| - user = hev_socks5_user_mark_new (name, strlen (name), pass, |
268 |
| - strlen (pass), 0); |
269 |
| - hev_socks5_authenticator_add (auth, HEV_SOCKS5_USER (user)); |
270 |
| - hev_object_set_atomic (HEV_OBJECT (user), 1); |
271 |
| - } else { |
272 |
| - char *line = NULL; |
273 |
| - size_t len = 0; |
274 |
| - ssize_t nread; |
275 |
| - FILE *fp; |
276 |
| - |
277 |
| - fp = fopen (file, "r"); |
278 |
| - if (!fp) { |
279 |
| - hev_object_unref (HEV_OBJECT (auth)); |
280 |
| - return; |
281 |
| - } |
282 |
| - |
283 |
| - while ((nread = getline (&line, &len, fp)) != -1) { |
284 |
| - HevSocks5UserMark *user; |
285 |
| - unsigned int nlen; |
286 |
| - unsigned int plen; |
287 |
| - char name[256]; |
288 |
| - char pass[256]; |
289 |
| - long mark = 0; |
290 |
| - int res; |
291 |
| - |
292 |
| - res = sscanf (line, "%255s %255s %lx\n", name, pass, &mark); |
293 |
| - if (res < 2) { |
294 |
| - LOG_E ("socks5 proxy user/pass format"); |
295 |
| - continue; |
296 |
| - } |
297 |
| - |
298 |
| - nlen = strlen (name); |
299 |
| - plen = strlen (pass); |
300 |
| - user = hev_socks5_user_mark_new (name, nlen, pass, plen, mark); |
301 |
| - hev_object_set_atomic (HEV_OBJECT (user), 1); |
302 |
| - res = hev_socks5_authenticator_add (auth, HEV_SOCKS5_USER (user)); |
303 |
| - if (res < 0) { |
304 |
| - LOG_E ("socks5 proxy user conflict"); |
305 |
| - hev_object_unref (HEV_OBJECT (user)); |
306 |
| - } |
307 |
| - } |
308 |
| - |
309 |
| - free (line); |
310 |
| - fclose (fp); |
311 |
| - } |
312 |
| - |
313 |
| - for (i = 0; i < workers; i++) { |
314 |
| - HevSocks5Worker *worker; |
315 |
| - |
316 |
| - worker = worker_list[i]; |
317 |
| - hev_socks5_worker_set_auth (worker, auth); |
318 |
| - hev_socks5_worker_reload (worker); |
319 |
| - } |
320 |
| - |
321 |
| - hev_object_unref (HEV_OBJECT (auth)); |
322 |
| -} |
0 commit comments