export.c
来自「此dns服务器是在mydns基础上改写」· C语言 代码 · 共 554 行 · 第 1/2 页
C
554 行
putc('\\', stdout); putc(*c, stdout); } putc('"', stdout); putc('\n', stdout); } else printf("%s\n", rr->data);}/*--- bind_dump_rr() ----------------------------------------------------------------------------*/#define TINYDNS_NAMEFIX(str) \ if (!(str)[0] || LASTCHAR((str)) != '.') \ { \ if ((str)[0]) strncat((str), ".", sizeof((str))-strlen((str))-1); \ strncat((str), soa->origin, sizeof((str))-strlen((str))-1); \ } \ if (LASTCHAR((str)) == '.') LASTCHAR((str)) = '\0';/************************************************************************************************** TINYDNS_DUMP_SOA**************************************************************************************************/static voidtinydns_dump_soa(MYDNS_SOA *soa){ char origin[DNSBUFLEN], ns[DNSBUFLEN], mbox[DNSBUFLEN]; strncpy(origin, soa->origin, sizeof(origin)-1); strncpy(ns, soa->ns, sizeof(ns)-1); strncpy(mbox, soa->mbox, sizeof(mbox)-1); if (LASTCHAR(origin) == '.') LASTCHAR(origin) = '\0'; if (LASTCHAR(ns) == '.') LASTCHAR(ns) = '\0'; if (LASTCHAR(mbox) == '.') LASTCHAR(mbox) = '\0'; printf("Z%s:%s:%s:%u:%u:%u:%u:%u:%u\n", origin, ns, mbox, soa->serial, soa->refresh, soa->retry, soa->expire, soa->minimum, soa->ttl); }/*--- tinydns_dump_soa() ------------------------------------------------------------------------*//************************************************************************************************** TINYDNS_DUMP_RR Output resource record, BIND format.**************************************************************************************************/static voidtinydns_dump_rr(MYDNS_SOA *soa, MYDNS_RR *rr, int maxlen){ char name[DNSBUFLEN], data[DNSBUFLEN]; strncpy(name, rr->name, sizeof(name)); TINYDNS_NAMEFIX(name); switch (rr->type) { case DNS_QTYPE_A: printf("=%s:%s:%u\n", name, rr->data, rr->ttl); break; case DNS_QTYPE_AAAA: /* Not supported by tinydns (?) */ break; case DNS_QTYPE_CNAME: strncpy(data, rr->data, sizeof(data)); TINYDNS_NAMEFIX(data); printf("C%s:%s:%u\n", name, data, rr->ttl); break; case DNS_QTYPE_MX: strncpy(data, rr->data, sizeof(data)); TINYDNS_NAMEFIX(data); printf("@%s::%s:%u:%u\n", name, data, rr->aux, rr->ttl); break; case DNS_QTYPE_NS: strncpy(data, rr->data, sizeof(data)); TINYDNS_NAMEFIX(data); printf(".%s::%s:%u\n", name, data, rr->ttl); break; /* tinydns does not natively support SRV; However, there's a patch (http://tinydns.org/srv-patch) to support it. This code complies with its format, which is "Sfqdn:ip:x:port:weight:priority:ttl:timestamp" */ case DNS_QTYPE_SRV: strncpy(data, rr->data, sizeof(data)); TINYDNS_NAMEFIX(data); printf("S%s::%s:%u:%u:%u:%u\n", name, data, rr->srv_port, rr->srv_weight, rr->aux, rr->ttl); break; case DNS_QTYPE_TXT: { char databuf[DNSBUFLEN * 4], *c, *d; /* Need to output colons as octal - also any other wierd chars */ for (c = rr->data, d = databuf; *c; c++) { if (*c == ':' || !isprint((int)(*c))) d += sprintf(d, "\\%03o", *c); else *(d++) = *c; } *d = '\0'; printf("'%s:%s:%u\n", name, databuf, rr->ttl); } break; default: break; }}/*--- tinydns_dump_rr() -------------------------------------------------------------------------*//************************************************************************************************** DUMP_SOA**************************************************************************************************/static MYDNS_SOA *dump_soa(void){ MYDNS_SOA *soa; if (mydns_soa_load(sql, &soa, zone,0) != 0) //modi by zyl 080408 ErrSQL(sql, "%s: %s", zone, _("error loading SOA record for zone")); if (!soa) Errx("%s: %s", zone, _("zone not found")); switch (output_format) { case OUTPUT_BIND: bind_dump_soa(soa); break; case OUTPUT_TINYDNS: tinydns_dump_soa(soa); break; } return (soa);}/*--- dump_soa() --------------------------------------------------------------------------------*//************************************************************************************************** DUMP_RR**************************************************************************************************/static voiddump_rr(MYDNS_SOA *soa, MYDNS_RR *rr, int maxlen){ switch (output_format) { case OUTPUT_BIND: bind_dump_rr(soa, rr, maxlen); break; case OUTPUT_TINYDNS: tinydns_dump_rr(soa, rr, maxlen); break; }}/*--- dump_rr() ---------------------------------------------------------------------------------*//************************************************************************************************** DUMP_RR_LONG**************************************************************************************************/static voiddump_rr_long(MYDNS_SOA *soa){ int maxlen = 0; char query[BUFSIZ]; size_t querylen; SQL_RES *res; SQL_ROW row; /* No records in zone - return immediately */ if (!sql_count(sql, "SELECT COUNT(*) FROM %s WHERE zone=%u", mydns_rr_table_name, soa->id)) { if (output_format == OUTPUT_BIND) puts(""); return; } if (output_format == OUTPUT_BIND) maxlen = sql_count(sql, "SELECT MAX(LENGTH(name)) FROM %s WHERE zone=%u", mydns_rr_table_name, soa->id) + 1; if (!maxlen) maxlen = DNS_MAXNAMELEN; querylen = snprintf(query, sizeof(query), "SELECT "MYDNS_RR_FIELDS" FROM %s WHERE zone=%u ORDER BY name,type,aux", mydns_rr_table_name, soa->id); /* Submit query */ if (!(res = sql_query(sql, query, querylen))) return; /* Add results to list */ while ((row = sql_getrow(res))) { MYDNS_RR *rr; if (!(rr = mydns_rr_parse(row, soa->origin))) continue; dump_rr(soa, rr, maxlen); mydns_rr_free(rr); } sql_free(res); if (output_format == OUTPUT_BIND) puts("");}/*--- dump_rr_long() ----------------------------------------------------------------------------*//************************************************************************************************** DUMP_ZONE**************************************************************************************************/static voiddump_zone(char *zone_name){ MYDNS_SOA *soa; strncpy(zone, zone_name, sizeof(zone)-2); if (LASTCHAR(zone) != '.') strcat(zone, "."); if ((soa = dump_soa())) { dump_rr_long(soa); mydns_soa_free(soa); } zones_out++;}/*--- dump_zone() -------------------------------------------------------------------------------*//************************************************************************************************** MAIN**************************************************************************************************/intmain(int argc, char **argv){ setlocale(LC_ALL, ""); /* Internationalization */ bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); cmdline(argc, argv); load_config(); db_connect(); dump_header(); if (optind >= argc) { SQL_RES *res; SQL_ROW row; char query[256]; size_t querylen; querylen = snprintf(query, sizeof(query), "SELECT origin FROM %s", mydns_soa_table_name); if (!(res = sql_query(sql, query, querylen))) return (0); while ((row = sql_getrow(res))) dump_zone(row[0]); sql_free(res); } while (optind < argc) dump_zone((char *)argv[optind++]); return (0);}/*--- main() ------------------------------------------------------------------------------------*//* vi:set ts=3: *//* NEED_PO */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?