Merge "dnsck: add -i option, for SO_BINDTODEVICE"
diff --git a/cmds/dnsck.c b/cmds/dnsck.c
index a069345..38a914e 100644
--- a/cmds/dnsck.c
+++ b/cmds/dnsck.c
@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <sys/stat.h>
 #include <time.h>
+#include <unistd.h>
 
 #define RESOLV_CONF "/etc/resolv.conf"
 #define RESOLV_CONF_EXTERNAL "/tmp/resolv.conf.external"
@@ -265,12 +266,20 @@
     free((char *)servers[i]);
 }
 
-int main(int argc, const char *argv[])
+void usage(const char *progname)
+{
+  fprintf(stderr, "usage: %s [-i interface]\nwhere:\n", progname);
+  fprintf(stderr, "\t-i : name of interface to SO_BINDTODEVICE, like br0\n");
+  exit(1);
+}
+
+int main(int argc, char * const argv[])
 {
   ares_channel channel;
   const char *servers[MAX_SERVERS];
   size_t count;
-  int rc;
+  const char *interface = NULL;
+  int rc, c;
 
   struct ares_options options = {
     .flags = ARES_FLAG_NOCHECKRESP,
@@ -278,6 +287,17 @@
     .tries = 1,
   };
 
+  while ((c = getopt(argc, argv, "i:")) != -1) {
+    switch (c) {
+    case 'i':
+      interface = optarg;
+      break;
+    default:
+      usage(argv[0]);
+      break;
+    }
+  }
+
   rc = ares_library_init(ARES_LIB_INIT_NONE);
   if (rc)
     ares_error_die(ares_strerror(rc));
@@ -287,6 +307,10 @@
   if (rc)
     ares_error_die(ares_strerror(rc));
 
+  if (interface) {
+    ares_set_local_dev(channel, interface);
+  }
+
   count = read_resolv_conf(servers, MAX_SERVERS);
   resolve_array(channel, servers, count);
   free_servers(servers, count);
@@ -295,8 +319,8 @@
   resolve_array(channel, servers, count);
   free_servers(servers, count);
 
-  if (argc > 1)
-    resolve_array(channel, argv + 1, argc - 1);
+  if (optind > 0)
+    resolve_array(channel, (const char **)&argv[optind], argc - optind);
 
   printf("\n");
   ares_destroy(channel);