17 #define WHO "tinydns-edit"
20 #define TTL_POSITIVE 86400
27 logmsg(
WHO,100,USAGE,
"tinydns-edit data data.new add [ns|childns|host|alias|mx] domain a.b.c.d\n"
28 "tinydns-edit data data.new add [ns|childns|host6|alias6|mx] domain a:b:c:d:e:f:g:h");
32 logmsg(
WHO,111,FATAL,
"out of memory");
36 logmsg(
WHO,100,FATAL,B(
"fatal: unable to read: ",
fn));
40 logmsg(
WHO,111,FATAL,B(
"fatal: unable to write: ",
fnnew));
70 static char *names[26];
78 int main(
int argc,
char **argv)
99 if (str_equal(*argv,
"ns"))
mode =
'.';
100 else if (str_equal(*argv,
"childns"))
mode =
'&';
101 else if (str_equal(*argv,
"host"))
mode =
'=';
102 else if (str_equal(*argv,
"host6"))
mode =
':';
103 else if (str_equal(*argv,
"alias"))
mode =
'+';
104 else if (str_equal(*argv,
"alias6"))
mode =
'~';
105 else if (str_equal(*argv,
"mx"))
mode =
'@';
133 for (i = 0; i < 26; ++i) {
135 if (!stralloc_copyb(&f[0],&ch,1))
nomem();
136 if (!stralloc_cats(&f[0],
".ns."))
nomem();
141 case '+':
case '=':
case ':':
case '~':
146 for (i = 0; i < 26; ++i) {
148 if (!stralloc_copyb(&f[0],&ch,1))
nomem();
149 if (!stralloc_cats(&f[0],
".mx."))
nomem();
164 if ((ch !=
' ') && (ch !=
'\t') && (ch !=
'\n'))
break;
167 if (!
line.len)
continue;
168 if (
line.s[0] ==
'#')
continue;
173 if (!stralloc_copys(&f[i],
""))
nomem();
176 k = byte_chr(
line.s + j,
line.len - j,
'|');
177 if (!stralloc_copyb(&f[i],
line.s + j,k))
nomem();
187 if (byte_chr(f[2].s,f[2].
len,
'.') >= f[2].
len) {
188 if (!stralloc_cats(&f[2],
".ns."))
nomem();
189 if (!stralloc_catb(&f[2],f[0].s,f[0].
len))
nomem();
192 if (!stralloc_0(&f[3]))
nomem();
193 if (!scan_ulong(f[3].s,&ttl)) ttl =
TTL_NS;
194 for (i = 0; i < 26; ++i)
204 if (
line.s[0] ==
'=') {
207 logmsg(
WHO,100,FATAL,
"host name already used");
208 if (!stralloc_0(&f[1]))
nomem();
209 if (ip4_scan(f[1].s,
ip4))
211 logmsg(
WHO,100,FATAL,
"IP address already used");
216 if (
line.s[0] ==
':') {
219 logmsg(
WHO,100,FATAL,
"host name already used");
220 if (!stralloc_0(&f[1]))
nomem();
221 if (ip6_scan(f[1].s,
ip6))
223 logmsg(
WHO,100,FATAL,
"IPv6 address already used");
228 if (
line.s[0] ==
'@') {
231 if (byte_chr(f[2].s,f[2].
len,
'.') >= f[2].
len) {
232 if (!stralloc_cats(&f[2],
".mx."))
nomem();
233 if (!stralloc_catb(&f[2],f[0].s,f[0].
len))
nomem();
236 if (!stralloc_0(&f[4]))
nomem();
238 for (i = 0; i < 26; ++i)
249 if (!stralloc_copyb(&f[0],&
mode,1))
nomem();
251 if (!stralloc_cats(&f[0],
"|"))
nomem();
258 case '.':
case '&':
case '@':
259 for (i = 0; i < 26; ++i)
263 logmsg(
WHO,100,FATAL,
"too many records for that domain");
265 if (!stralloc_cats(&f[0],
"|"))
nomem();
266 if (!stralloc_catb(&f[0],&ch,1))
nomem();
268 if (!stralloc_cats(&f[0],
"|"))
nomem();
271 if (!stralloc_cats(&f[0],
"|"))
nomem();
273 if (!stralloc_cats(&f[0],
"\n"))
nomem();
280 logmsg(
WHO,111,FATAL,B(
"unable to move ",
fnnew,
" to: ",
fn));
int rename(const char *, const char *)
int dns_domain_equal(const char *, const char *)
int dns_domain_fromdot(char **, const char *, unsigned int)
int dns_domain_todot_cat(stralloc *, const char *)
int main(int argc, char **argv)
void put(const char *buf, unsigned int len)