summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2021-01-18 19:34:39 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2021-01-18 19:34:39 +0000
commit6712287e957ba895aa29a82a7718e6cf33a2aaa0 (patch)
treeb4303553f5be5ccf0a30883919b7e2bcf83ebb11
parente958dc52c254794bd758ab824e3aa2749cb49b04 (diff)
downloaddnsfunnel-6712287e957ba895aa29a82a7718e6cf33a2aaa0.tar.gz
dnsfunnel-6712287e957ba895aa29a82a7718e6cf33a2aaa0.tar.xz
dnsfunnel-6712287e957ba895aa29a82a7718e6cf33a2aaa0.zip
Separate -i ip and -p port options
-rw-r--r--doc/dnsfunneld.html9
-rw-r--r--src/dnsfunnel/dnsfunneld.c26
2 files changed, 20 insertions, 15 deletions
diff --git a/doc/dnsfunneld.html b/doc/dnsfunneld.html
index 7fde21f..ae03cf1 100644
--- a/doc/dnsfunneld.html
+++ b/doc/dnsfunneld.html
@@ -29,7 +29,7 @@ queries, the responses, or both.
 <h2> Interface </h2>
 
 <pre>
-     dnsfunneld [ -v <em>verbosity</em> ] [ -1 ] [ -U | -u <em>uid</em> -g <em>gid</em> ] [ -i <em>ip</em>:<em>port</em> ] [ -R <em>root</em> ] [ -b <em>bufsize</em> ] [ -t <em>globaltimeout</em> ] [ -X | -x ] [ -N | -n ]
+     dnsfunneld [ -v <em>verbosity</em> ] [ -1 ] [ -U | -u <em>uid</em> -g <em>gid</em> ] [ -i <em>ip</em> ] [ -p <em>port</em> ] [ -R <em>root</em> ] [ -b <em>bufsize</em> ] [ -t <em>globaltimeout</em> ] [ -X | -x ] [ -N | -n ]
 </pre>
 
 <ul>
@@ -85,9 +85,10 @@ in the GID environment variable, and drop privileges to that uid/gid. </li>
 <em>uid</em>. </li>
  <li> <tt>-g&nbsp;<em>gid</em></tt>&nbsp;: drop privileges to numerical gid
 <em>gid</em>. </li>
- <li> <tt>-i&nbsp;<em>ip</em>:<em>port</em></tt>&nbsp;: bind the socket to
-IPv4 <em>ip</em> and port <em>port</em>. Default for <em>ip</em> is
-<tt>127.0.0.1</tt>; default for <em>port</em> is 53. </li>
+ <li> <tt>-i&nbsp;<em>ip</em></tt>&nbsp;: bind the socket to
+IPv4 <em>ip</em>. Default is <tt>127.0.0.1</tt>. </li>
+ <li> <tt>-p&nbsp;<em>port</em></tt>&nbsp;: bind the socket to
+port <em>port</em>. Default is <tt>53</tt>. </li>
  <li> <tt>-R&nbsp;<em>root</em></tt>&nbsp;: chroot to <em>root</em>. Default
 is <tt>/run/dnsfunnel/root</tt>. Note that chrooting only increases security
 if privileges are also dropped via the <tt>-U</tt> or <tt>-u</tt> and <tt>-g</tt>
diff --git a/src/dnsfunnel/dnsfunneld.c b/src/dnsfunnel/dnsfunneld.c
index 5df06f4..4aa2366 100644
--- a/src/dnsfunnel/dnsfunneld.c
+++ b/src/dnsfunnel/dnsfunneld.c
@@ -37,7 +37,7 @@
 
 #include "dnsfunneld.h"
 
-#define USAGE "dnsfunneld [ -v verbosity ] [ -1 ] [ -U | -u uid -g gid ] [ -i ip:port ] [ -R root ] [ -b bufsize ] [ -t globaltimeout ] [ -X | -x ] [ -N | -n ]"
+#define USAGE "dnsfunneld [ -v verbosity ] [ -1 ] [ -U | -u uid -g gid ] [ -i ip ] [ -p port ] [ -R root ] [ -b bufsize ] [ -t globaltimeout ] [ -X | -x ] [ -N | -n ]"
 #define dieusage() strerr_dieusage(100, USAGE)
 
 #define DNSFUNNELD_INPUT_MAX 64
@@ -156,6 +156,15 @@ static inline void sanitize_and_new (char const *buf, unsigned int len, char con
   else query_new(&d, qtype, hdr.id, ip, port, 0) ;
 }
 
+static inline size_t ip40_scan (char const *s, char *ip)
+{
+  char t[4] ;
+  size_t l = ip4_scan(s, t) ;
+  if (!l || s[l]) return 0 ;
+  memcpy(ip, t, 4) ;
+  return l ;
+}
+
 int main (int argc, char const *const *argv)
 {
   int spfd = -1 ;
@@ -166,19 +175,17 @@ int main (int argc, char const *const *argv)
     int flagU = 0 ;
     uid_t uid = -1 ;
     gid_t gid = -1 ;
-    char const *ipport = "127.0.0.1:53" ;
     char const *root = "/run/dnsfunnel/root" ;
     int notif = 0 ;
     int fd ;
-    char ip[4] ;
-    size_t pos ;
     unsigned int t = 0 ;
-    uint16_t port ;
+    char ip[4] = { 127, 0, 0, 1 } ;
+    uint16_t port = 53 ;
     subgetopt_t l = SUBGETOPT_ZERO ;
 
     for (;;)
     {
-      int opt = subgetopt_r(argc, argv, "v:1Uu:g:i:R:b:t:XxNn", &l) ;
+      int opt = subgetopt_r(argc, argv, "v:1Uu:g:i:p:R:b:t:XxNn", &l) ;
       if (opt == -1) break ;
       switch (opt)
       {
@@ -187,7 +194,8 @@ int main (int argc, char const *const *argv)
         case 'U' : flagU = 1 ; break ;
         case 'u' : if (!uid0_scan(l.arg, &uid)) dieusage() ; break ;
         case 'g' : if (!gid0_scan(l.arg, &gid)) dieusage() ; break ;
-        case 'i' : ipport = l.arg ; break ;
+        case 'i' : if (!ip40_scan(l.arg, ip)) dieusage() ; break ;
+        case 'p' : if (!uint160_scan(l.arg, &port)) dieusage() ; break ;
         case 'R' : root = l.arg ; break ;
         case 'b' : if (!uint0_scan(l.arg, &bufsize)) dieusage() ; break ;
         case 't' : if (!uint0_scan(l.arg, &t)) dieusage() ; break ;
@@ -202,10 +210,6 @@ int main (int argc, char const *const *argv)
 
     if (t) tain_from_millisecs(&globaltto, t) ;
     else globaltto = tain_infinite_relative ;
-    pos = ip4_scan(ipport, ip) ;
-    if (!pos) dieusage() ;
-    if (ipport[pos] != ':') dieusage() ;
-    if (!uint160_scan(ipport + pos + 1, &port)) dieusage() ;
     if (fcntl(1, F_GETFD) < 0)
     {
       if (notif) strerr_dief1sys(100, "option -1 given but stdout unavailable") ;