1 /* RFC2136 DNS inform - necessary for Win2k3 DNS servers */
15 [1] "request format error",
16 [2] "internal server error",
17 [3] "domain name does not exist",
18 [4] "request not supported",
19 [5] "permission denied",
20 [6] "domain name already exists",
21 [7] "resource record already exists",
22 [8] "resource record does not exist",
23 [9] "server not authoritative",
24 [10] "domain name not in zone",
35 fprint(2, "usage: %s [-x netmtpt]\n", argv0);
40 ding(void *, char *msg)
42 if(strstr(msg, "alarm") != nil)
74 pmem(uchar **p, void *v, int len)
81 pname(uchar **p, char *s)
87 while(*s && *s != '.')
97 main(int argc, char *argv[])
101 char *sysname, *dnsdomain, *dom, *ns, net[32];
102 uchar *p, buf[4096], addr[IPv4addrlen], v6addr[IPaddrlen];
106 static char *query[] = { "dom", "dnsdomain", "ns", };
108 fmtinstall('I', eipfmt);
109 fmtinstall('V', eipfmt);
110 setnetmtpt(net, sizeof net, nil);
121 setnetmtpt(net, sizeof net, EARGF(usage()));
130 if((sysname = getenv("sysname")) == nil)
131 sysfatal("$sysname not set");
133 if((db = ndbopen(nil)) == nil)
134 sysfatal("can't open ndb: %r");
135 tt = ndbipinfo(db, "sys", sysname, query, nelem(query));
136 for(t = tt; t; t = t->entry)
137 if(strcmp(t->attr, "ns") == 0)
139 else if(strcmp(t->attr, "dom") == 0)
141 else if(strcmp(t->attr, "dnsdomain") == 0)
147 sysfatal("no relevant ns=");
149 sysfatal("no relevant dom=");
151 sysfatal("no relevant dnsdomain=");
153 myipaddr(v6addr, net);
154 memmove(addr, v6addr + IPaddrlen - IPv4addrlen, IPv4addrlen);
157 print("ip=%V\n", addr);
158 print("ns=%s\n", ns);
159 print("dnsdomain=%s\n", dnsdomain);
160 print("dom=%s\n", dom);
163 if((fd = dial(netmkaddr(ns, "udp", "dns"), 0, 0, 0)) < 0)
164 sysfatal("can't dial %s: %r", ns);
166 txid = time(nil) + getpid();
169 p16(&p, txid); /* ID */
170 p16(&p, 5<<11); /* flags */
171 p16(&p, 1); /* # Zones */
172 p16(&p, 0); /* # prerequisites */
173 p16(&p, 2); /* # updates */
174 p16(&p, 0); /* # additionals */
176 pname(&p, dnsdomain); /* zone */
177 p16(&p, Tsoa); /* zone type */
178 p16(&p, Cin); /* zone class */
180 /* delete old name */
181 pname(&p, dom); /* name */
182 p16(&p, Ta); /* type: v4 addr */
183 p16(&p, Call); /* class */
184 p32(&p, 0); /* TTL */
185 p16(&p, 0); /* data len */
187 /* add new A record */
188 pname(&p, dom); /* name */
189 p16(&p, Ta); /* type: v4 addr */
190 p16(&p, Cin); /* class */
191 p32(&p, 60*60*25); /* TTL (25 hours) */
192 p16(&p, IPv4addrlen); /* data len */
193 pmem(&p, addr, IPv4addrlen); /* v4 address */
196 if(write(fd, buf, len) != len)
197 sysfatal("write failed: %r");
202 if(read(fd, buf, sizeof buf) < 0)
205 }while(g16(&p) != txid);
211 if(err != 0 && err != 7) /* err==7 is just a "yes, I know" warning */
212 if(err < nelem(errmsgs))
213 sysfatal("%s", errmsgs[err]);
215 sysfatal("unknown dns server error %d", err);