#include <arpa/inet.h>
#include <netinet/ip.h>
#include <sys/types.h>
+#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) {
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;
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);
/*
* Local Variables:
- * compile-command: "gcc -Wall -g -o icmpdnd icmpdnd.c"
+ * compile-command: "make CFLAGS='-Wall -g'"
* End:
*/