1 #include "netheaders.h"
6 // XXX unistd/getopt isnt available everywhere!
11 #include <event2/event.h>
12 #include <event2/dns.h>
13 #include <event2/util.h>
21 #define DEFAULT_LISTEN_ADDR "127.0.0.1"
22 #define DEFAULT_LISTEN_PORT "8123"
25 set_socks_server(const char *socks
)
28 enum socks_ver socksv
;
30 url
= url_tokenize(socks
);
31 if (!url
|| !url
->scheme
) {
32 log_error("shim: bad socks server, %s", socks
);
38 if (!evutil_ascii_strcasecmp(url
->scheme
, "socks4"))
40 else if (!evutil_ascii_strcasecmp(url
->scheme
, "socks4a"))
43 log_error("shim: unknown socks version, %s",
48 if (conn_set_socks_server(url
->host
, url
->port
, socksv
) < 0)
55 start_listening(struct event_base
*base
, struct evdns_base
*dns
,
56 const char *laddr
, const char *lport
)
58 struct evutil_addrinfo hints
;
59 struct evutil_addrinfo
*ai
= NULL
;
62 if (!evutil_ascii_strcasecmp(laddr
, "any"))
65 memset(&hints
, 0, sizeof(hints
));
66 hints
.ai_family
= AF_UNSPEC
;
67 hints
.ai_socktype
= SOCK_STREAM
;
68 /* turn NULL hostname into INADDR_ANY, and skip looking up any address
69 * types we don't have an interface to connect to. */
70 hints
.ai_flags
= EVUTIL_AI_PASSIVE
|EVUTIL_AI_ADDRCONFIG
;
72 ret
= evutil_getaddrinfo(laddr
, lport
, &hints
, &ai
);
74 log_error("shim: bad listen address: %s",
75 evutil_gai_strerror(ret
));
79 if (proxy_init(base
, dns
, ai
->ai_addr
, ai
->ai_addrlen
) < 0)
84 decrease_log_verbosity(void)
86 switch (log_get_min_level()) {
88 log_set_min_level(LOG_INFO
);
91 log_set_min_level(LOG_NOTICE
);
94 log_set_min_level(LOG_WARN
);
97 log_set_min_level(LOG_ERROR
);
100 log_set_min_level(LOG_FATAL
);
108 increase_log_verbosity(void)
110 switch (log_get_min_level()) {
112 log_set_min_level(LOG_ERROR
);
115 log_set_min_level(LOG_WARN
);
118 log_set_min_level(LOG_NOTICE
);
121 log_set_min_level(LOG_INFO
);
124 log_set_min_level(LOG_DEBUG
);
136 WSAStartup(0x101, &WSAData
);
138 if (signal(SIGPIPE
, SIG_IGN
) == SIG_ERR
) {
148 printf("shim [-l host] [-p port] [-qVv] "
149 "[ socks_version://address[:port] ]\n");
154 main(int argc
, char **argv
)
156 struct event_base
*base
;
157 struct evdns_base
*dns
= NULL
;
159 const char *laddr
, *lport
;
163 base
= event_base_new();
164 #ifndef DISABLE_DIRECT_CONNECTIONS
165 dns
= evdns_base_new(base
, 1);
169 laddr
= DEFAULT_LISTEN_ADDR
;
170 lport
= DEFAULT_LISTEN_PORT
;
172 while ((opt
= getopt(argc
, argv
, "l:p:Vvq")) >= 0) {
181 printf("%s\n", PACKAGE_STRING
);
184 increase_log_verbosity();
187 decrease_log_verbosity();
198 set_socks_server(argv
[0]);
199 start_listening(base
, dns
, laddr
, lport
);
200 event_base_dispatch(base
);