X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Ficmpdnd.c;h=29d62f9270403d6734153b70dfd21ab37bb8e21d;hb=1eb230f9a739866bcf329573bf728f701d84008b;hp=910d1a509013ca9e3619cc6d01b5c66394e5c72b;hpb=2269406c64770520d8c504f925af30eebe60d5aa;p=icmp-dn.git diff --git a/src/icmpdnd.c b/src/icmpdnd.c index 910d1a5..29d62f9 100644 --- a/src/icmpdnd.c +++ b/src/icmpdnd.c @@ -29,58 +29,55 @@ #include #include #include +#ifdef HAVE_CONFIG_H #include "config.h" +#endif -struct icmphdr { - u_int8_t type; - u_int8_t code; - u_int16_t checksum; -}; +#include "icmpdefs.h" -struct reqhdr { - u_int8_t type; - u_int8_t code; - u_int16_t checksum; - u_int16_t id; - u_int16_t seq; -}; - -struct rephdr { - u_int8_t type; - u_int8_t code; - u_int16_t checksum; - u_int16_t id; - u_int16_t seq; - int32_t ttl; -}; - -#define ICMP_NAMEREQ 37 -#define ICMP_NAMEREP 38 +#ifndef MAXHNAME +#define MAXHNAME 1024 +#endif 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 +146,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 +161,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 +285,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: */