X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Ficmpdnd.c;h=49d1b5c3d1d05a90ff4464486bcbcecb4342657d;hb=4ca7c46fea3e06937d81496645ccd62d44aaa33d;hp=910d1a509013ca9e3619cc6d01b5c66394e5c72b;hpb=2269406c64770520d8c504f925af30eebe60d5aa;p=icmp-dn.git diff --git a/src/icmpdnd.c b/src/icmpdnd.c index 910d1a5..49d1b5c 100644 --- a/src/icmpdnd.c +++ b/src/icmpdnd.c @@ -29,7 +29,13 @@ #include #include #include +#ifdef HAVE_CONFIG_H #include "config.h" +#endif + +#ifndef MAXHNAME +#define MAXHNAME 1024 +#endif struct icmphdr { u_int8_t type; @@ -58,29 +64,44 @@ struct rephdr { #define ICMP_NAMEREP 38 volatile int alive; +char myname[MAXHNAME] = ""; -size_t filldn(char *dst) +void setname(char *newname) { - char *p, *p2, *dp; - char namebuf[1024]; - int hl; + int nl; - if(gethostname(namebuf, sizeof(namebuf)) < 0) { - perror("gethostname"); - exit(1); - } - hl = strlen(namebuf); - namebuf[hl++] = '.'; - if(getdomainname(namebuf + hl, sizeof(namebuf) - hl) < 0) { - perror("getdomainname"); - exit(1); - } - if(strlen(namebuf + hl) != 0) { - hl = strlen(namebuf); - namebuf[hl++] = '.'; + if(newname == NULL) { + if(gethostname(myname, sizeof(myname)) < 0) { + perror("gethostname"); + exit(1); + } + nl = strlen(myname); + myname[nl++] = '.'; + if(getdomainname(myname + nl, sizeof(myname) - nl) < 0) { + perror("getdomainname"); + exit(1); + } + if(strlen(myname + nl) != 0) { + nl = strlen(myname); + myname[nl++] = '.'; + } + myname[nl] = 0; + } else { + strcpy(myname, newname); + nl = strlen(myname); + if(myname[nl - 1] != '.') { + myname[nl] = '.'; + myname[nl + 1] = 0; + } } - namebuf[hl] = 0; +} + +size_t filldn(char *dst) +{ + char *p, *p2, *dp; + char namebuf[MAXHNAME]; + strcpy(namebuf, myname); p = namebuf; dp = dst; while((p2 = strchr(p, '.')) != NULL) { @@ -149,11 +170,14 @@ int main(int argc, char **argv) daemonize = 1; ttl = 3600; - while((c = getopt(argc, argv, "nht:")) != -1) { + while((c = getopt(argc, argv, "nht:d:")) != -1) { switch(c) { case 't': ttl = atoi(optarg); break; + case 'd': + setname(optarg); + break; case 'n': daemonize = 0; break; @@ -161,10 +185,12 @@ int main(int argc, char **argv) case '?': case ':': default: - fprintf(stderr, "usage: icmpdnd [-n]"); + fprintf(stderr, "usage: icmpdnd [-nh] [-t ttl] [-d domainname]\n"); exit((c == 'h')?0:1); } } + if(*myname == 0) + setname(NULL); s4 = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); s6 = socket(PF_INET6, SOCK_RAW, IPPROTO_ICMP); @@ -283,6 +309,6 @@ int main(int argc, char **argv) /* * Local Variables: - * compile-command: "gcc -Wall -g -o icmpdnd icmpdnd.c" + * compile-command: "make CFLAGS='-Wall -g'" * End: */