/* * dnsutl - utilities to make DNS easier to configure * Copyright (C) 1999, 2001, 2006, 2007 Peter Miller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or (at * your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include #include #include #include int verbose; static const char *domain; static string_ty * get_domain_name(void) { char buffer[1000]; const char *tmp; const char *ep; if (domain && *domain) tmp = domain; else { #ifdef HAVE_GETDOMAINNAME if (getdomainname(buffer, sizeof(buffer))) nfatal("getdomainname"); tmp = buffer; if (!*tmp) #endif tmp = "example.com"; } ep = strrchr(tmp, '.'); if (ep && ep[1] == 0) return str_from_c(tmp); return str_format("%s.", tmp); } void hosts(const char *infile, const char *outfile) { FILE *fp; srrf_t *rp; srrf_t *rp2; string_ty *s; string_ty *s2; srrf_class_ty *in_class; srrf_type_ty *in_ns_type; static const char *const soa[] = { "", /* server */ "", /* hostmaster */ "3", /* seral */ "10800", /* refresh: 3 hours */ "1800", /* retry: 30 minutes */ "604800", /* expire: 1 week */ "86400", /* minimum: 1 day */ }; /* * open the input file */ map_host_open(infile); /* * open the output file */ if (outfile) { fp = fopen(outfile, "w"); if (!fp) nfatal("creat \"%s\"", outfile); } else { outfile = "(stdout)"; fp = stdout; } /* * write the origin */ s = get_domain_name(); srrf_origin_set(s); srrf_origin_print(fp); str_free(s); /* * write the SOA record */ rp = srrf_alloc(); rp->name = str_copy(s); rp->class = srrf_class_by_name("in"); assert(rp->class); rp->type = srrf_type_by_name(rp->class, "soa"); assert(rp->type); strlist_append(&rp->arg, srrf_origin_get()); s2 = str_format("hostmaster.%s", srrf_origin_get()->str_text); strlist_append(&rp->arg, s2); str_free(s2); while (rp->arg.nstrings < SIZEOF(soa)) { s2 = str_from_c(soa[rp->arg.nstrings]); strlist_append(&rp->arg, s2); str_free(s2); } fprintf(fp, "$ttl %d\n", 8 * 60 * 60); srrf_print(fp, rp); /* * Print a name server record. */ fprintf(fp, "; This is an example name server record, you\n"); fprintf(fp, "; will probably need to edit this for your site.\n"); in_class = srrf_class_by_name("in"); assert(in_class); in_ns_type = srrf_type_by_name(in_class, "ns"); assert(in_ns_type); rp2 = srrf_alloc(); rp2->name = str_copy(rp->name); rp2->class = in_class; rp2->type = in_ns_type; s2 = str_format("ns.%s", srrf_origin_get()->str_text); strlist_append(&rp2->arg, s2); str_free(s2); if (rp->file_name) rp2->file_name = str_copy(rp->file_name); rp2->line_number = rp->line_number; srrf_print(fp, rp2); srrf_free(rp2); srrf_free(rp); /* * convert the format */ for (;;) { map_host_t *mhp; size_t j; mhp = map_host_read(); if (!mhp) break; rp = srrf_alloc(); rp->name = srrf_relative_to_absolute(mhp->name.string[0]); rp->class = srrf_class_by_name("in"); rp->type = srrf_type_by_name(rp->class, "a"); strlist_append(&rp->arg, mhp->address); srrf_print(fp, rp); srrf_free(rp); for (j = 1; j < mhp->name.nstrings; ++j) { rp = srrf_alloc(); rp->name = srrf_relative_to_absolute(mhp->name.string[j]); rp->class = srrf_class_by_name("in"); rp->type = srrf_type_by_name(rp->class, "cname"); strlist_append(&rp->arg, mhp->name.string[0]); srrf_print(fp, rp); srrf_free(rp); } map_host_delete(mhp); } /* * close the files */ map_host_close(); if (fflush(fp)) nfatal("write \"%s\"", outfile); if (fp != stdout && fclose(fp)) nfatal("close \"%s\"", outfile); } void hosts_domain(const char *s) { domain = s; }