diff --git a/dns.c b/dns.c index 0b64fa8..1b80024 100644 --- a/dns.c +++ b/dns.c @@ -85,11 +85,13 @@ open_dns(const char *host, const char *domain) } printf("Opened UDP socket\n"); + printf("Sending queries for %s to %s\n", domain, host); // Init dns target struct h = gethostbyname(host); if (!h) { - perror("gethostbyname"); + printf("Could not resolve name %s, exiting\n", host); + exit(9); } bzero(&peer, sizeof(peer)); peer.sin_family = AF_INET; diff --git a/iodine.c b/iodine.c index 77354a0..dbbc2ca 100644 --- a/iodine.c +++ b/iodine.c @@ -81,7 +81,6 @@ tunnel(int tun_fd, int dns_fd) if(FD_ISSET(tun_fd, &fds)) { read = read_tun(tun_fd, frame, FRAMESIZE); if (read > 0) { - printf("Got data on tun! %d bytes\n", read); buflen = sizeof(buf); compress2(buf, &buflen, frame->data, read - 4, 9); dns_handle_tun(dns_fd, buf, buflen); @@ -93,8 +92,6 @@ tunnel(int tun_fd, int dns_fd) buflen = 64*1024-4; uncompress(frame->data, &buflen, buf, read); - printf("Got data on dns! %d bytes\n", read); - frame->flags = htons(0x0000); #ifdef LINUX frame->proto = htons(0x0800); // Linux wants ETH_P_IP @@ -121,6 +118,8 @@ extern char *__progname; static void usage() { printf("Usage: %s [-u user] nameserver topdomain\n", __progname); + printf("-f is to keep running in foreground\n"); + printf("-u name to drop privileges and run as user 'name'\n"); exit(2); } @@ -132,16 +131,21 @@ main(int argc, char **argv) int choice; char *username; struct passwd *pw; + int foreground; username = NULL; + foreground = 0; if (geteuid() != 0) { printf("Run as root and you'll be happy.\n"); usage(); } - while ((choice = getopt(argc, argv, "u:")) != -1) { + while ((choice = getopt(argc, argv, "fu:")) != -1) { switch(choice) { + case 'f': + foreground = 1; + break; case 'u': username = optarg; break; @@ -166,13 +170,17 @@ main(int argc, char **argv) } } - tun_fd = open_tun(); dns_fd = open_dns(argv[0], argv[1]); - printf("Sending queries for %s to %s\n", argv[1], argv[0]); signal(SIGINT, sigint); + if (!foreground) { + daemon(0, 0); + umask(0); + alarm(0); + } + if (username) { if (setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) { printf("Could not switch to user %s!\n", username); diff --git a/iodined.c b/iodined.c index c02ac62..b1a1862 100644 --- a/iodined.c +++ b/iodined.c @@ -116,7 +116,9 @@ extern char *__progname; static void usage() { - printf("Usage: %s [-u user] topdomain\n", __progname); + printf("Usage: %s [-f] [-u user] topdomain\n", __progname); + printf("-f is to keep running in foreground\n"); + printf("-u name to drop privileges and run as user 'name'\n"); exit(2); } @@ -128,16 +130,21 @@ main(int argc, char **argv) int choice; char *username; struct passwd *pw; + int foreground; username = NULL; + foreground = 0; if (geteuid() != 0) { printf("Run as root and you'll be happy.\n"); usage(); } - while ((choice = getopt(argc, argv, "u:")) != -1) { + while ((choice = getopt(argc, argv, "fu:")) != -1) { switch(choice) { + case 'f': + foreground = 1; + break; case 'u': username = optarg; break; @@ -166,6 +173,12 @@ main(int argc, char **argv) dnsd_fd = open_dnsd(argv[0]); printf("Listening to dns for domain %s\n", argv[0]); + if (!foreground) { + daemon(0, 0); + umask(0); + alarm(0); + } + signal(SIGINT, sigint); if (username) { if (setgid(pw->pw_gid) < 0 || setuid(pw->pw_uid) < 0) { @@ -177,8 +190,6 @@ main(int argc, char **argv) tunnel(tun_fd, dnsd_fd); - printf("Closing tunnel\n"); - close_dnsd(dnsd_fd); close_tun(tun_fd);