@@ -50,6 +50,8 @@ static void print_usage(const char *name)
5050 "Usage: %s [options]\n"
5151 "\n"
5252 "Options:\n"
53+ " -4 enable IPv4\n"
54+ " -6 enable IPv6\n"
5355 " -d run as a daemon\n"
5456 " -f skip firewall rules\n"
5557 " -h <hostname> hostname for obfuscation (required)\n"
@@ -74,15 +76,24 @@ int main(int argc, char *argv[])
7476{
7577 unsigned long long tmp ;
7678 int res , opt , exitcode ;
79+ char * ipproto_info ;
7780
7881 if (!argc || !argv [0 ]) {
7982 return EXIT_FAILURE ;
8083 }
8184
8285 exitcode = EXIT_FAILURE ;
8386
84- while ((opt = getopt (argc , argv , "dfh :i:km:n:r:st:w:x:z" )) != -1 ) {
87+ while ((opt = getopt (argc , argv , "46dfh :i:km:n:r:st:w:x:z" )) != -1 ) {
8588 switch (opt ) {
89+ case '4' :
90+ g_ctx .use_ipv4 = 1 ;
91+ break ;
92+
93+ case '6' :
94+ g_ctx .use_ipv6 = 1 ;
95+ break ;
96+
8697 case 'd' :
8798 g_ctx .daemon = 1 ;
8899 break ;
@@ -200,6 +211,10 @@ int main(int argc, char *argv[])
200211 return res < 0 ? EXIT_FAILURE : EXIT_SUCCESS ;
201212 }
202213
214+ if (!g_ctx .use_ipv4 && !g_ctx .use_ipv6 ) {
215+ g_ctx .use_ipv4 = g_ctx .use_ipv6 = 1 ;
216+ }
217+
203218 if (!g_ctx .fwmask ) {
204219 g_ctx .fwmask = g_ctx .fwmark ;
205220 } else if ((g_ctx .fwmark & g_ctx .fwmask ) != g_ctx .fwmark ) {
@@ -278,8 +293,15 @@ int main(int argc, char *argv[])
278293 EE ("WARNING: setpriority(): %s" , strerror (errno ));
279294 }
280295
281- E ("listening on %s, netfilter queue number %" PRIu32 "..." , g_ctx .iface ,
282- g_ctx .nfqnum );
296+ if (g_ctx .use_ipv4 && !g_ctx .use_ipv6 ) {
297+ ipproto_info = " (IPv4 only)" ;
298+ } else if (!g_ctx .use_ipv4 && g_ctx .use_ipv6 ) {
299+ ipproto_info = " (IPv6 only)" ;
300+ } else {
301+ ipproto_info = "" ;
302+ }
303+ E ("listening on %s%s, netfilter queue number %" PRIu32 "..." , g_ctx .iface ,
304+ ipproto_info , g_ctx .nfqnum );
283305
284306 /*
285307 Main Loop
0 commit comments