15185a700Sflorian /*
25185a700Sflorian * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
35185a700Sflorian *
45185a700Sflorian * Permission to use, copy, modify, and/or distribute this software for any
55185a700Sflorian * purpose with or without fee is hereby granted, provided that the above
65185a700Sflorian * copyright notice and this permission notice appear in all copies.
75185a700Sflorian *
85185a700Sflorian * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
95185a700Sflorian * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
105185a700Sflorian * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
115185a700Sflorian * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
125185a700Sflorian * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
135185a700Sflorian * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
145185a700Sflorian * PERFORMANCE OF THIS SOFTWARE.
155185a700Sflorian */
165185a700Sflorian
175185a700Sflorian /*! \file */
185185a700Sflorian
195185a700Sflorian #include <sys/types.h>
205185a700Sflorian
215185a700Sflorian #include <ctype.h>
225185a700Sflorian #include <dirent.h>
235185a700Sflorian #include <stdlib.h>
245185a700Sflorian #include <stdio.h>
255185a700Sflorian #include <string.h>
265185a700Sflorian #include <time.h>
275185a700Sflorian #include <unistd.h>
285185a700Sflorian
295185a700Sflorian #define INSIST(cond) \
305185a700Sflorian if (!(cond)) { \
315185a700Sflorian fprintf(stderr, "%s:%d: INSIST(%s)\n", \
325185a700Sflorian __FILE__, __LINE__, #cond); \
335185a700Sflorian abort(); \
345185a700Sflorian }
355185a700Sflorian
365185a700Sflorian #define TOTEXTARGS "rdata, tctx, target"
375185a700Sflorian #define TOTEXTCLASS "rdata->rdclass"
385185a700Sflorian #define TOTEXTTYPE "rdata->type"
39*1fb015a8Sflorian #define TOTEXTDEF "use_default = 1"
405185a700Sflorian
415185a700Sflorian #define FROMWIREARGS "rdclass, type, source, dctx, options, target"
425185a700Sflorian #define FROMWIRECLASS "rdclass"
435185a700Sflorian #define FROMWIRETYPE "type"
44*1fb015a8Sflorian #define FROMWIREDEF "use_default = 1"
455185a700Sflorian
465185a700Sflorian #define TOWIREARGS "rdata, cctx, target"
475185a700Sflorian #define TOWIRECLASS "rdata->rdclass"
485185a700Sflorian #define TOWIRETYPE "rdata->type"
49*1fb015a8Sflorian #define TOWIREDEF "use_default = 1"
505185a700Sflorian
515185a700Sflorian static const char copyright[] =
525185a700Sflorian "/*\n"
535185a700Sflorian " * Copyright (C) 2004%s Internet Systems Consortium, Inc. (\"ISC\")\n"
545185a700Sflorian " * Copyright (C) 1998-2003 Internet Software Consortium.\n"
555185a700Sflorian " *\n"
565185a700Sflorian " * Permission to use, copy, modify, and distribute this software for any\n"
575185a700Sflorian " * purpose with or without fee is hereby granted, provided that the above\n"
585185a700Sflorian " * copyright notice and this permission notice appear in all copies.\n"
595185a700Sflorian " *\n"
605185a700Sflorian " * THE SOFTWARE IS PROVIDED \"AS IS\" AND ISC DISCLAIMS ALL WARRANTIES WITH\n"
615185a700Sflorian " * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n"
625185a700Sflorian " * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,\n"
635185a700Sflorian " * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n"
645185a700Sflorian " * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE\n"
655185a700Sflorian " * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n"
665185a700Sflorian " * PERFORMANCE OF THIS SOFTWARE.\n"
675185a700Sflorian " */\n"
685185a700Sflorian "\n"
695185a700Sflorian "/***************\n"
705185a700Sflorian " ***************\n"
715185a700Sflorian " *************** THIS FILE IS AUTOMATICALLY GENERATED BY gen.c.\n"
725185a700Sflorian " *************** DO NOT EDIT!\n"
735185a700Sflorian " ***************\n"
745185a700Sflorian " ***************/\n"
755185a700Sflorian "\n"
765185a700Sflorian "/*! \\file */\n"
775185a700Sflorian "\n";
785185a700Sflorian
795185a700Sflorian #define STR_EXPAND(tok) #tok
805185a700Sflorian #define STR(tok) STR_EXPAND(tok)
815185a700Sflorian
825185a700Sflorian #define TYPECLASSLEN 20 /* DNS mnemonic size. Must be less than 100. */
835185a700Sflorian #define TYPECLASSBUF (TYPECLASSLEN + 1)
845185a700Sflorian #define TYPECLASSFMT "%" STR(TYPECLASSLEN) "[-0-9a-z]_%d"
855185a700Sflorian #define DIRNAMESIZE 256
865185a700Sflorian
875185a700Sflorian static struct cc {
885185a700Sflorian struct cc *next;
895185a700Sflorian int rdclass;
905185a700Sflorian char classname[TYPECLASSBUF];
915185a700Sflorian } *classes;
925185a700Sflorian
935185a700Sflorian static struct tt {
945185a700Sflorian struct tt *next;
955185a700Sflorian int rdclass;
965185a700Sflorian int type;
975185a700Sflorian char classname[TYPECLASSBUF];
985185a700Sflorian char typename[TYPECLASSBUF];
995185a700Sflorian char dirname[DIRNAMESIZE]; /* XXX Should be max path length */
1005185a700Sflorian } *types;
1015185a700Sflorian
1025185a700Sflorian static char *
1035185a700Sflorian funname(const char *, char *);
1045185a700Sflorian static void
1055185a700Sflorian doswitch(const char *, const char *, const char *, const char *,
1065185a700Sflorian const char *, const char *);
1075185a700Sflorian static void
1085185a700Sflorian add(int, const char *, int, const char *, const char *);
1095185a700Sflorian static void
1105185a700Sflorian sd(int, const char *, const char *, char);
1115185a700Sflorian
1125185a700Sflorian
1135185a700Sflorian static char *
funname(const char * s,char * buf)1145185a700Sflorian funname(const char *s, char *buf) {
1155185a700Sflorian char *b = buf;
1165185a700Sflorian char c;
1175185a700Sflorian
1185185a700Sflorian INSIST(strlen(s) < TYPECLASSBUF);
1195185a700Sflorian while ((c = *s++)) {
1205185a700Sflorian *b++ = (c == '-') ? '_' : c;
1215185a700Sflorian }
1225185a700Sflorian *b = '\0';
1235185a700Sflorian return (buf);
1245185a700Sflorian }
1255185a700Sflorian
1265185a700Sflorian static void
doswitch(const char * name,const char * function,const char * args,const char * tsw,const char * csw,const char * res)1275185a700Sflorian doswitch(const char *name, const char *function, const char *args,
1285185a700Sflorian const char *tsw, const char *csw, const char *res)
1295185a700Sflorian {
1305185a700Sflorian struct tt *tt;
1315185a700Sflorian int first = 1;
1325185a700Sflorian int lasttype = 0;
1335185a700Sflorian int subswitch = 0;
1345185a700Sflorian char buf1[TYPECLASSBUF], buf2[TYPECLASSBUF];
1355185a700Sflorian const char *result = " result =";
1365185a700Sflorian
1375185a700Sflorian if (res == NULL)
1385185a700Sflorian result = "";
1395185a700Sflorian
1405185a700Sflorian for (tt = types; tt != NULL; tt = tt->next) {
1415185a700Sflorian if (first) {
1425185a700Sflorian fprintf(stdout, "\n#define %s \\\n", name);
1435185a700Sflorian fprintf(stdout, "\tswitch (%s) { \\\n" /*}*/, tsw);
1445185a700Sflorian first = 0;
1455185a700Sflorian }
1465185a700Sflorian if (tt->type != lasttype && subswitch) {
1475185a700Sflorian if (res == NULL)
1485185a700Sflorian fprintf(stdout, "\t\tdefault: break; \\\n");
1495185a700Sflorian else
1505185a700Sflorian fprintf(stdout,
1515185a700Sflorian "\t\tdefault: %s; break; \\\n", res);
1525185a700Sflorian fputs(/*{*/ "\t\t} \\\n", stdout);
1535185a700Sflorian fputs("\t\tbreak; \\\n", stdout);
1545185a700Sflorian subswitch = 0;
1555185a700Sflorian }
1565185a700Sflorian if (tt->rdclass && tt->type != lasttype) {
1575185a700Sflorian fprintf(stdout, "\tcase %d: switch (%s) { \\\n" /*}*/,
1585185a700Sflorian tt->type, csw);
1595185a700Sflorian subswitch = 1;
1605185a700Sflorian }
1615185a700Sflorian if (tt->rdclass == 0)
1625185a700Sflorian fprintf(stdout,
1635185a700Sflorian "\tcase %d:%s %s_%s(%s); break;",
1645185a700Sflorian tt->type, result, function,
1655185a700Sflorian funname(tt->typename, buf1), args);
1665185a700Sflorian else
1675185a700Sflorian fprintf(stdout,
1685185a700Sflorian "\t\tcase %d:%s %s_%s_%s(%s); break;",
1695185a700Sflorian tt->rdclass, result, function,
1705185a700Sflorian funname(tt->classname, buf1),
1715185a700Sflorian funname(tt->typename, buf2), args);
1725185a700Sflorian fputs(" \\\n", stdout);
1735185a700Sflorian lasttype = tt->type;
1745185a700Sflorian }
1755185a700Sflorian if (subswitch) {
1765185a700Sflorian if (res == NULL)
1775185a700Sflorian fprintf(stdout, "\t\tdefault: break; \\\n");
1785185a700Sflorian else
1795185a700Sflorian fprintf(stdout, "\t\tdefault: %s; break; \\\n", res);
1805185a700Sflorian fputs(/*{*/ "\t\t} \\\n", stdout);
1815185a700Sflorian fputs("\t\tbreak; \\\n", stdout);
1825185a700Sflorian }
1835185a700Sflorian if (first) {
1845185a700Sflorian if (res == NULL)
1855185a700Sflorian fprintf(stdout, "\n#define %s\n", name);
1865185a700Sflorian else
1875185a700Sflorian fprintf(stdout, "\n#define %s %s;\n", name, res);
1885185a700Sflorian } else {
1895185a700Sflorian if (res == NULL)
1905185a700Sflorian fprintf(stdout, "\tdefault: break; \\\n");
1915185a700Sflorian else
1925185a700Sflorian fprintf(stdout, "\tdefault: %s; break; \\\n", res);
1935185a700Sflorian fputs(/*{*/ "\t}\n", stdout);
1945185a700Sflorian }
1955185a700Sflorian }
1965185a700Sflorian
1975185a700Sflorian static void
add(int rdclass,const char * classname,int type,const char * typename,const char * dirname)1985185a700Sflorian add(int rdclass, const char *classname, int type, const char *typename,
1995185a700Sflorian const char *dirname)
2005185a700Sflorian {
2015185a700Sflorian struct tt *newtt = (struct tt *)malloc(sizeof(*newtt));
2025185a700Sflorian struct tt *tt, *oldtt;
2035185a700Sflorian struct cc *newcc;
2045185a700Sflorian struct cc *cc, *oldcc;
2055185a700Sflorian
2065185a700Sflorian INSIST(strlen(typename) < TYPECLASSBUF);
2075185a700Sflorian INSIST(strlen(classname) < TYPECLASSBUF);
2085185a700Sflorian INSIST(strlen(dirname) < DIRNAMESIZE);
2095185a700Sflorian
2105185a700Sflorian if (newtt == NULL) {
2115185a700Sflorian fprintf(stderr, "malloc() failed\n");
2125185a700Sflorian exit(1);
2135185a700Sflorian }
2145185a700Sflorian
2155185a700Sflorian newtt->next = NULL;
2165185a700Sflorian newtt->rdclass = rdclass;
2175185a700Sflorian newtt->type = type;
2185185a700Sflorian
2195185a700Sflorian strncpy(newtt->classname, classname, sizeof(newtt->classname));
2205185a700Sflorian newtt->classname[sizeof(newtt->classname) - 1] = '\0';
2215185a700Sflorian
2225185a700Sflorian strncpy(newtt->typename, typename, sizeof(newtt->typename));
2235185a700Sflorian newtt->typename[sizeof(newtt->typename) - 1] = '\0';
2245185a700Sflorian
2255185a700Sflorian if (strncmp(dirname, "./", 2) == 0)
2265185a700Sflorian dirname += 2;
2275185a700Sflorian strncpy(newtt->dirname, dirname, sizeof(newtt->dirname));
2285185a700Sflorian newtt->dirname[sizeof(newtt->dirname) - 1] = '\0';
2295185a700Sflorian
2305185a700Sflorian tt = types;
2315185a700Sflorian oldtt = NULL;
2325185a700Sflorian
2335185a700Sflorian while ((tt != NULL) && (tt->type < type)) {
2345185a700Sflorian oldtt = tt;
2355185a700Sflorian tt = tt->next;
2365185a700Sflorian }
2375185a700Sflorian
2385185a700Sflorian while ((tt != NULL) && (tt->type == type) && (tt->rdclass < rdclass)) {
2395185a700Sflorian if (strcmp(tt->typename, typename) != 0)
2405185a700Sflorian exit(1);
2415185a700Sflorian oldtt = tt;
2425185a700Sflorian tt = tt->next;
2435185a700Sflorian }
2445185a700Sflorian
2455185a700Sflorian if ((tt != NULL) && (tt->type == type) && (tt->rdclass == rdclass))
2465185a700Sflorian exit(1);
2475185a700Sflorian
2485185a700Sflorian newtt->next = tt;
2495185a700Sflorian if (oldtt != NULL)
2505185a700Sflorian oldtt->next = newtt;
2515185a700Sflorian else
2525185a700Sflorian types = newtt;
2535185a700Sflorian
2545185a700Sflorian /*
2555185a700Sflorian * Do a class switch for this type.
2565185a700Sflorian */
2575185a700Sflorian if (rdclass == 0)
2585185a700Sflorian return;
2595185a700Sflorian
2605185a700Sflorian newcc = (struct cc *)malloc(sizeof(*newcc));
2615185a700Sflorian if (newcc == NULL) {
2625185a700Sflorian fprintf(stderr, "malloc() failed\n");
2635185a700Sflorian exit(1);
2645185a700Sflorian }
2655185a700Sflorian newcc->rdclass = rdclass;
2665185a700Sflorian strncpy(newcc->classname, classname, sizeof(newcc->classname));
2675185a700Sflorian newcc->classname[sizeof(newcc->classname) - 1] = '\0';
2685185a700Sflorian cc = classes;
2695185a700Sflorian oldcc = NULL;
2705185a700Sflorian
2715185a700Sflorian while ((cc != NULL) && (cc->rdclass < rdclass)) {
2725185a700Sflorian oldcc = cc;
2735185a700Sflorian cc = cc->next;
2745185a700Sflorian }
2755185a700Sflorian
2765185a700Sflorian if ((cc != NULL) && cc->rdclass == rdclass) {
2775185a700Sflorian free((char *)newcc);
2785185a700Sflorian return;
2795185a700Sflorian }
2805185a700Sflorian
2815185a700Sflorian newcc->next = cc;
2825185a700Sflorian if (oldcc != NULL)
2835185a700Sflorian oldcc->next = newcc;
2845185a700Sflorian else
2855185a700Sflorian classes = newcc;
2865185a700Sflorian }
2875185a700Sflorian
2885185a700Sflorian static void
sd(int rdclass,const char * classname,const char * dirname,char filetype)2895185a700Sflorian sd(int rdclass, const char *classname, const char *dirname, char filetype) {
2905185a700Sflorian DIR *dirp;
2915185a700Sflorian struct dirent *dp;
2925185a700Sflorian char buf[TYPECLASSLEN + sizeof("_65535.h")];
2935185a700Sflorian char typename[TYPECLASSBUF];
2945185a700Sflorian int type, n;
2955185a700Sflorian
2965185a700Sflorian if ((dirp = opendir(dirname)) == NULL)
2975185a700Sflorian return;
2985185a700Sflorian
2995185a700Sflorian while ((dp = readdir(dirp)) != NULL) {
3005185a700Sflorian if (sscanf(dp->d_name, TYPECLASSFMT, typename, &type) != 2)
3015185a700Sflorian continue;
3025185a700Sflorian if ((type > 65535) || (type < 0))
3035185a700Sflorian continue;
3045185a700Sflorian
3055185a700Sflorian n = snprintf(buf, sizeof(buf), "%s_%d.%c", typename,
3065185a700Sflorian type, filetype);
3075185a700Sflorian INSIST(n > 0 && (unsigned)n < sizeof(buf));
3085185a700Sflorian if (strcmp(buf, dp->d_name) != 0)
3095185a700Sflorian continue;
3105185a700Sflorian add(rdclass, classname, type, typename, dirname);
3115185a700Sflorian }
3125185a700Sflorian
3135185a700Sflorian closedir(dirp);
3145185a700Sflorian }
3155185a700Sflorian
3165185a700Sflorian int
main(int argc,char ** argv)3175185a700Sflorian main(int argc, char **argv) {
3185185a700Sflorian DIR *dirp;
3195185a700Sflorian struct dirent *dp;
3205185a700Sflorian char buf[DIRNAMESIZE]; /* XXX Should be max path length */
3215185a700Sflorian char srcdir[DIRNAMESIZE]; /* XXX Should be max path length */
3225185a700Sflorian int rdclass;
3235185a700Sflorian char classname[TYPECLASSBUF];
3245185a700Sflorian struct tt *tt;
3255185a700Sflorian struct cc *cc;
3265185a700Sflorian struct tm *tm;
3275185a700Sflorian time_t now;
3285185a700Sflorian char year[11];
3295185a700Sflorian int lasttype;
3305185a700Sflorian int code = 1;
3315185a700Sflorian int class_enum = 0;
3325185a700Sflorian int type_enum = 0;
3335185a700Sflorian int structs = 0;
3345185a700Sflorian int depend = 0;
3359e6f49f3Sflorian int c, n;
3365185a700Sflorian char buf1[TYPECLASSBUF];
3375185a700Sflorian char filetype = 'c';
3385185a700Sflorian FILE *fd;
3395185a700Sflorian char *prefix = NULL;
3405185a700Sflorian char *suffix = NULL;
3415185a700Sflorian char *file = NULL;
3425185a700Sflorian
3435185a700Sflorian srcdir[0] = '\0';
3445185a700Sflorian while ((c = getopt(argc, argv, "cdits:F:P:S:")) != -1)
3455185a700Sflorian switch (c) {
3465185a700Sflorian case 'c':
3475185a700Sflorian code = 0;
3485185a700Sflorian depend = 0;
3495185a700Sflorian type_enum = 0;
3505185a700Sflorian class_enum = 1;
3515185a700Sflorian filetype = 'c';
3525185a700Sflorian structs = 0;
3535185a700Sflorian break;
3545185a700Sflorian case 'd':
3555185a700Sflorian code = 0;
3565185a700Sflorian depend = 1;
3575185a700Sflorian class_enum = 0;
3585185a700Sflorian type_enum = 0;
3595185a700Sflorian structs = 0;
3605185a700Sflorian filetype = 'h';
3615185a700Sflorian break;
3625185a700Sflorian case 't':
3635185a700Sflorian code = 0;
3645185a700Sflorian depend = 0;
3655185a700Sflorian class_enum = 0;
3665185a700Sflorian type_enum = 1;
3675185a700Sflorian filetype = 'c';
3685185a700Sflorian structs = 0;
3695185a700Sflorian break;
3705185a700Sflorian case 'i':
3715185a700Sflorian code = 0;
3725185a700Sflorian depend = 0;
3735185a700Sflorian class_enum = 0;
3745185a700Sflorian type_enum = 0;
3755185a700Sflorian structs = 1;
3765185a700Sflorian filetype = 'h';
3775185a700Sflorian break;
3785185a700Sflorian case 's':
3795185a700Sflorian if (strlen(optarg) >
3805185a700Sflorian DIRNAMESIZE - 2 * TYPECLASSLEN -
3815185a700Sflorian sizeof("/rdata/_65535_65535")) {
3825185a700Sflorian fprintf(stderr, "\"%s\" too long\n",
3835185a700Sflorian optarg);
3845185a700Sflorian exit(1);
3855185a700Sflorian }
3865185a700Sflorian n = snprintf(srcdir, sizeof(srcdir), "%s/",
3875185a700Sflorian optarg);
3885185a700Sflorian INSIST(n > 0 && (unsigned)n < sizeof(srcdir));
3895185a700Sflorian break;
3905185a700Sflorian case 'F':
3915185a700Sflorian file = optarg;
3925185a700Sflorian break;
3935185a700Sflorian case 'P':
3945185a700Sflorian prefix = optarg;
3955185a700Sflorian break;
3965185a700Sflorian case 'S':
3975185a700Sflorian suffix = optarg;
3985185a700Sflorian break;
3995185a700Sflorian case '?':
4005185a700Sflorian exit(1);
4015185a700Sflorian }
4025185a700Sflorian
4035185a700Sflorian n = snprintf(buf, sizeof(buf), "%srdata", srcdir);
4045185a700Sflorian INSIST(n > 0 && (unsigned)n < sizeof(srcdir));
4055185a700Sflorian
4065185a700Sflorian if ((dirp = opendir(buf)) == NULL)
4075185a700Sflorian exit(1);
4085185a700Sflorian
4095185a700Sflorian while ((dp = readdir(dirp)) != NULL) {
4105185a700Sflorian if (sscanf(dp->d_name, TYPECLASSFMT, classname,
4115185a700Sflorian &rdclass) != 2)
4125185a700Sflorian continue;
4135185a700Sflorian if ((rdclass > 65535) || (rdclass < 0))
4145185a700Sflorian continue;
4155185a700Sflorian
4165185a700Sflorian n = snprintf(buf, sizeof(buf), "%srdata/%s_%d",
4175185a700Sflorian srcdir, classname, rdclass);
4185185a700Sflorian INSIST(n > 0 && (unsigned)n < sizeof(buf));
4195185a700Sflorian if (strcmp(buf + 6 + strlen(srcdir), dp->d_name) != 0)
4205185a700Sflorian continue;
4215185a700Sflorian sd(rdclass, classname, buf, filetype);
4225185a700Sflorian }
4235185a700Sflorian closedir(dirp);
4245185a700Sflorian
4255185a700Sflorian n = snprintf(buf, sizeof(buf), "%srdata/generic", srcdir);
4265185a700Sflorian INSIST(n > 0 && (unsigned)n < sizeof(srcdir));
4275185a700Sflorian sd(0, "", buf, filetype);
4285185a700Sflorian
4295185a700Sflorian if (time(&now) != -1) {
4305185a700Sflorian if ((tm = localtime(&now)) != NULL && tm->tm_year > 104) {
4315185a700Sflorian n = snprintf(year, sizeof(year), "-%d",
4325185a700Sflorian tm->tm_year + 1900);
4335185a700Sflorian INSIST(n > 0 && (unsigned)n < sizeof(year));
4345185a700Sflorian } else
4355185a700Sflorian year[0] = 0;
4365185a700Sflorian } else
4375185a700Sflorian year[0] = 0;
4385185a700Sflorian
4395185a700Sflorian if (!depend)
4405185a700Sflorian fprintf(stdout, copyright, year);
4415185a700Sflorian
4425185a700Sflorian if (code) {
4435185a700Sflorian fputs("#ifndef DNS_CODE_H\n", stdout);
4445185a700Sflorian fputs("#define DNS_CODE_H 1\n\n", stdout);
4455185a700Sflorian
4465185a700Sflorian fputs("#include <isc/result.h>\n\n", stdout);
4475185a700Sflorian fputs("#include <dns/name.h>\n\n", stdout);
4485185a700Sflorian
4495185a700Sflorian for (tt = types; tt != NULL; tt = tt->next)
4505185a700Sflorian fprintf(stdout, "#include \"%s/%s_%d.c\"\n",
4515185a700Sflorian tt->dirname, tt->typename, tt->type);
4525185a700Sflorian
4535185a700Sflorian fputs("\n\n", stdout);
4545185a700Sflorian
4555185a700Sflorian doswitch("TOTEXTSWITCH", "totext", TOTEXTARGS,
4565185a700Sflorian TOTEXTTYPE, TOTEXTCLASS, TOTEXTDEF);
4575185a700Sflorian doswitch("FROMWIRESWITCH", "fromwire", FROMWIREARGS,
4585185a700Sflorian FROMWIRETYPE, FROMWIRECLASS, FROMWIREDEF);
4595185a700Sflorian doswitch("TOWIRESWITCH", "towire", TOWIREARGS,
4605185a700Sflorian TOWIRETYPE, TOWIRECLASS, TOWIREDEF);
4615185a700Sflorian
4625185a700Sflorian fputs("#endif /* DNS_CODE_H */\n", stdout);
4635185a700Sflorian } else if (type_enum) {
4645185a700Sflorian char *s;
4655185a700Sflorian
4665185a700Sflorian fprintf(stdout, "#ifndef DNS_ENUMTYPE_H\n");
4675185a700Sflorian fprintf(stdout, "#define DNS_ENUMTYPE_H 1\n\n");
4685185a700Sflorian
4695185a700Sflorian fprintf(stdout, "enum {\n");
4705185a700Sflorian fprintf(stdout, "\tdns_rdatatype_none = 0,\n");
4715185a700Sflorian
4725185a700Sflorian lasttype = 0;
4735185a700Sflorian for (tt = types; tt != NULL; tt = tt->next)
4745185a700Sflorian if (tt->type != lasttype)
4755185a700Sflorian fprintf(stdout,
4765185a700Sflorian "\tdns_rdatatype_%s = %d,\n",
4775185a700Sflorian funname(tt->typename, buf1),
4785185a700Sflorian lasttype = tt->type);
4795185a700Sflorian
4805185a700Sflorian fprintf(stdout, "\tdns_rdatatype_ixfr = 251,\n");
4815185a700Sflorian fprintf(stdout, "\tdns_rdatatype_axfr = 252,\n");
4825185a700Sflorian fprintf(stdout, "\tdns_rdatatype_mailb = 253,\n");
4835185a700Sflorian fprintf(stdout, "\tdns_rdatatype_maila = 254,\n");
4845185a700Sflorian fprintf(stdout, "\tdns_rdatatype_any = 255\n");
4855185a700Sflorian
4865185a700Sflorian fprintf(stdout, "};\n\n");
4875185a700Sflorian
4885185a700Sflorian fprintf(stdout, "#define dns_rdatatype_none\t"
4895185a700Sflorian "((dns_rdatatype_t)dns_rdatatype_none)\n");
4905185a700Sflorian
4915185a700Sflorian for (tt = types; tt != NULL; tt = tt->next)
4925185a700Sflorian if (tt->type != lasttype) {
4935185a700Sflorian s = funname(tt->typename, buf1);
4945185a700Sflorian fprintf(stdout,
4955185a700Sflorian "#define dns_rdatatype_%s\t%s"
4965185a700Sflorian "((dns_rdatatype_t)dns_rdatatype_%s)"
4975185a700Sflorian "\n",
4985185a700Sflorian s, strlen(s) < 2U ? "\t" : "", s);
4995185a700Sflorian lasttype = tt->type;
5005185a700Sflorian }
5015185a700Sflorian
5025185a700Sflorian fprintf(stdout, "#define dns_rdatatype_ixfr\t"
5035185a700Sflorian "((dns_rdatatype_t)dns_rdatatype_ixfr)\n");
5045185a700Sflorian fprintf(stdout, "#define dns_rdatatype_axfr\t"
5055185a700Sflorian "((dns_rdatatype_t)dns_rdatatype_axfr)\n");
5065185a700Sflorian fprintf(stdout, "#define dns_rdatatype_mailb\t"
5075185a700Sflorian "((dns_rdatatype_t)dns_rdatatype_mailb)\n");
5085185a700Sflorian fprintf(stdout, "#define dns_rdatatype_maila\t"
5095185a700Sflorian "((dns_rdatatype_t)dns_rdatatype_maila)\n");
5105185a700Sflorian fprintf(stdout, "#define dns_rdatatype_any\t"
5115185a700Sflorian "((dns_rdatatype_t)dns_rdatatype_any)\n");
5125185a700Sflorian
5135185a700Sflorian fprintf(stdout, "\n#endif /* DNS_ENUMTYPE_H */\n");
5145185a700Sflorian
5155185a700Sflorian } else if (class_enum) {
5165185a700Sflorian char *s;
5175185a700Sflorian int classnum;
5185185a700Sflorian
5195185a700Sflorian fprintf(stdout, "#ifndef DNS_ENUMCLASS_H\n");
5205185a700Sflorian fprintf(stdout, "#define DNS_ENUMCLASS_H 1\n\n");
5215185a700Sflorian
5225185a700Sflorian fprintf(stdout, "enum {\n");
5235185a700Sflorian
5245185a700Sflorian fprintf(stdout, "\tdns_rdataclass_reserved0 = 0,\n");
5255185a700Sflorian fprintf(stdout, "#define dns_rdataclass_reserved0 \\\n\t\t\t\t"
5265185a700Sflorian "((dns_rdataclass_t)dns_rdataclass_reserved0)\n");
5275185a700Sflorian
5285185a700Sflorian #define PRINTCLASS(name, num) \
5295185a700Sflorian do { \
5305185a700Sflorian s = funname(name, buf1); \
5315185a700Sflorian classnum = num; \
5325185a700Sflorian fprintf(stdout, "\tdns_rdataclass_%s = %d%s\n", s, classnum, \
5335185a700Sflorian classnum != 255 ? "," : ""); \
5345185a700Sflorian fprintf(stdout, "#define dns_rdataclass_%s\t" \
5355185a700Sflorian "((dns_rdataclass_t)dns_rdataclass_%s)\n", s, s); \
5365185a700Sflorian } while (0)
5375185a700Sflorian
5385185a700Sflorian for (cc = classes; cc != NULL; cc = cc->next) {
5395185a700Sflorian if (cc->rdclass == 3)
5405185a700Sflorian PRINTCLASS("chaos", 3);
5415185a700Sflorian else if (cc->rdclass == 255)
5425185a700Sflorian PRINTCLASS("none", 254);
5435185a700Sflorian PRINTCLASS(cc->classname, cc->rdclass);
5445185a700Sflorian }
5455185a700Sflorian
5465185a700Sflorian #undef PRINTCLASS
5475185a700Sflorian
5485185a700Sflorian fprintf(stdout, "};\n\n");
5495185a700Sflorian fprintf(stdout, "#endif /* DNS_ENUMCLASS_H */\n");
5505185a700Sflorian } else if (structs) {
5515185a700Sflorian if (prefix != NULL) {
5525185a700Sflorian if ((fd = fopen(prefix,"r")) != NULL) {
5535185a700Sflorian while (fgets(buf, sizeof(buf), fd) != NULL)
5545185a700Sflorian fputs(buf, stdout);
5555185a700Sflorian fclose(fd);
5565185a700Sflorian }
5575185a700Sflorian }
5585185a700Sflorian for (tt = types; tt != NULL; tt = tt->next) {
5595185a700Sflorian snprintf(buf, sizeof(buf), "%s/%s_%d.h",
5605185a700Sflorian tt->dirname, tt->typename, tt->type);
5615185a700Sflorian if ((fd = fopen(buf,"r")) != NULL) {
5625185a700Sflorian while (fgets(buf, sizeof(buf), fd) != NULL)
5635185a700Sflorian fputs(buf, stdout);
5645185a700Sflorian fclose(fd);
5655185a700Sflorian }
5665185a700Sflorian }
5675185a700Sflorian if (suffix != NULL) {
5685185a700Sflorian if ((fd = fopen(suffix,"r")) != NULL) {
5695185a700Sflorian while (fgets(buf, sizeof(buf), fd) != NULL)
5705185a700Sflorian fputs(buf, stdout);
5715185a700Sflorian fclose(fd);
5725185a700Sflorian }
5735185a700Sflorian }
5745185a700Sflorian } else if (depend) {
5755185a700Sflorian for (tt = types; tt != NULL; tt = tt->next)
5765185a700Sflorian fprintf(stdout, "%s:\t%s/%s_%d.h\n", file,
5775185a700Sflorian tt->dirname, tt->typename, tt->type);
5785185a700Sflorian }
5795185a700Sflorian
5805185a700Sflorian if (ferror(stdout) != 0)
5815185a700Sflorian exit(1);
5825185a700Sflorian
5835185a700Sflorian return (0);
5845185a700Sflorian }
585