?? soa.c
字號:
/************************************************************************************************** $Id: soa.c,v 1.65 2005/12/18 19:16:41 bboy Exp $ Copyright (C) 2002-2005 Don Moore <bboy@bboy.net> 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA**************************************************************************************************/#include "mydns.h"char mydns_soa_table_name[PATH_MAX] = MYDNS_SOA_TABLE;char *mydns_soa_where_clause = NULL;/* Optional columns */int mydns_soa_use_active = 0;int mydns_soa_use_xfer = 0;int mydns_soa_use_update_acl = 0;/* Make this nonzero to enable debugging within this source file */#define DEBUG_LIB_SOA 1/************************************************************************************************** MYDNS_SOA_COUNT Returns the number of zones in the soa table.**************************************************************************************************/longmydns_soa_count(SQL *sqlConn){ return sql_count(sqlConn, "SELECT COUNT(*) FROM %s", mydns_soa_table_name);}/*--- mydns_soa_count() -------------------------------------------------------------------------*//************************************************************************************************** MYDNS_SET_SOA_TABLE_NAME**************************************************************************************************/voidmydns_set_soa_table_name(char *name){ if (!name) strncpy(mydns_soa_table_name, MYDNS_SOA_TABLE, sizeof(mydns_soa_table_name)-1); else strncpy(mydns_soa_table_name, name, sizeof(mydns_soa_table_name)-1);}/*--- mydns_set_soa_table_name() ----------------------------------------------------------------*//************************************************************************************************** MYDNS_SET_SOA_WHERE_CLAUSE**************************************************************************************************/voidmydns_set_soa_where_clause(char *where){ if (where && strlen(where)) { if (!(mydns_soa_where_clause = strdup(where))) Errx("out of memory"); }}/*--- mydns_set_soa_where_clause() --------------------------------------------------------------*//************************************************************************************************** MYDNS_SOA_PARSE**************************************************************************************************/#if !PROFILINGinline#endifMYDNS_SOA *mydns_soa_parse(SQL_ROW row){ MYDNS_SOA *rv; int len; if ((rv = (MYDNS_SOA *)malloc(sizeof(MYDNS_SOA)))) { rv->next = NULL; rv->id = atou(row[0]); strncpy(rv->origin, row[1], sizeof(rv->origin)-1); strncpy(rv->ns, row[2], sizeof(rv->ns)-1); if (!rv->ns[0]) snprintf(rv->ns, sizeof(rv->ns), "ns.%s", rv->origin); strncpy(rv->mbox, row[3], sizeof(rv->mbox)-1); if (!rv->mbox[0]) snprintf(rv->mbox, sizeof(rv->mbox), "hostmaster.%s", rv->origin); rv->serial = atou(row[4]); rv->refresh = atou(row[5]); rv->retry = atou(row[6]); rv->expire = atou(row[7]); rv->minimum = atou(row[8]); rv->ttl = atou(row[9]); /* If 'ns' or 'mbox' don't end in a dot, append the origin */ len = strlen(rv->ns); if (rv->ns[len-1] != '.') { strncat(rv->ns, ".", sizeof(rv->ns) - len - 1); strncat(rv->ns, rv->origin, sizeof(rv->ns) - len - 2); } len = strlen(rv->mbox); if (rv->mbox[len-1] != '.') { strncat(rv->mbox, ".", sizeof(rv->mbox) - len - 1); strncat(rv->mbox, rv->origin, sizeof(rv->mbox) - len - 2); } /* Make sure TTL for SOA is at least the minimum */ if (rv->ttl < rv->minimum) rv->ttl = rv->minimum; } return (rv);}/*--- mydns_soa_parse() -------------------------------------------------------------------------*//************************************************************************************************** MYDNS_SOA_DUP Create a duplicate copy of the record. Make and return a copy of a MYDNS_SOA record. If 'recurse' is specified, copies all records in the list.**************************************************************************************************/MYDNS_SOA *mydns_soa_dup(MYDNS_SOA *start, int recurse){ register MYDNS_SOA *first = NULL, *last = NULL, *soa, *s, *tmp; for (s = start; s; s = tmp) { tmp = s->next; if (!(soa = (MYDNS_SOA *)calloc(1, sizeof(MYDNS_SOA)))) Err(_("out of memory")); soa->id = s->id; strncpy(soa->origin, s->origin, sizeof(soa->origin)-1); strncpy(soa->ns, s->ns, sizeof(soa->ns)-1); strncpy(soa->mbox, s->mbox, sizeof(soa->mbox)-1); soa->serial = s->serial; soa->refresh = s->refresh; soa->retry = s->retry; soa->expire = s->expire; soa->minimum = s->minimum; soa->ttl = s->ttl; soa->next = NULL; if (recurse) { if (!first) first = soa; if (last) last->next = soa; last = soa; } else return (soa); } return (first);}/*--- mydns_soa_dup() ---------------------------------------------------------------------------*//************************************************************************************************** MYDNS_SOA_SIZE**************************************************************************************************/#if !PROFILINGinline#endifsize_tmydns_soa_size(MYDNS_SOA *first){ register MYDNS_SOA *p; register size_t size = 0; for (p = first; p; p = p->next) size += sizeof(MYDNS_SOA); return (size);}/*--- mydns_soa_size() --------------------------------------------------------------------------*//************************************************************************************************** _MYDNS_SOA_FREE Frees the pointed-to structure. Don't call this function directly, call the macro.**************************************************************************************************/#if !PROFILINGinline#endifvoid_mydns_soa_free(MYDNS_SOA *first){ register MYDNS_SOA *p, *tmp; for (p = first; p; p = tmp) { tmp = p->next; Free(p); }}/*--- mydns_soa_free() --------------------------------------------------------------------------*//************************************************************************************************** MYDNS_SOA_LOAD Returns 0 on success or nonzero if an error occurred.**************************************************************************************************/intmydns_soa_load(SQL *sqlConn, MYDNS_SOA **rptr, char *origin, int telecom_operator){ MYDNS_SOA *first = NULL, *last = NULL; size_t querylen; char query[DNS_QUERYBUFSIZ]; SQL_RES *res; SQL_ROW row; register char *c;#ifdef DN_COLUMN_NAMES int originlen = strlen(origin);#endif if (rptr) *rptr = NULL; /* Verify args */ if (!sqlConn || !origin || !rptr) { errno = EINVAL; return (-1); } /* We're not escaping 'origin', so check it for illegal type chars */ for (c = origin; *c; c++) if (SQL_BADCHAR(*c)) return (0);#ifdef DN_COLUMN_NAMES if (origin[originlen - 1] == '.') origin[originlen - 1] = '\0'; /* Remove dot from origin for DN */ else originlen = 0;#endif /* Construct query */ if (mydns_soa_where_clause) querylen = snprintf(query, sizeof(query), "SELECT "MYDNS_SOA_FIELDS"%s FROM %s WHERE origin='%s' AND %s AND telecom_operator=%d", (mydns_soa_use_active ? ",active" : ""), mydns_soa_table_name, origin, mydns_soa_where_clause,telecom_operator); else { querylen = snprintf(query, sizeof(query), "SELECT "MYDNS_SOA_FIELDS"%s FROM %s WHERE origin='%s' AND telecom_operator=%d", (mydns_soa_use_active ? ",active" : ""), mydns_soa_table_name, origin,telecom_operator); //querylen = snprintf(query, sizeof(query), // "SELECT "MYDNS_SOA_FIELDS" FROM soa WHERE id=3"); }#ifdef DN_COLUMN_NAMES if (originlen) origin[originlen - 1] = '.'; /* Readd dot to origin for DN */#endif /* Submit query */ if (!(res = sql_query(sqlConn, query, querylen))) return (-1);#if DEBUG_ENABLED && DEBUG_LIB_SOA { int numresults = sql_num_rows(res); Debug("SOA query: %d row%s: %s", numresults, S(numresults), query); }#endif /* Add results to list */ while ((row = sql_getrow(res))) { MYDNS_SOA *new; if (mydns_soa_use_active && row[MYDNS_SOA_NUMFIELDS] && !GETBOOL(row[MYDNS_SOA_NUMFIELDS])) continue; if (!(new = mydns_soa_parse(row))) { sql_free(res); return (-1); } if (!first) first = new; if (last) last->next = new; else last = new; } *rptr = first; sql_free(res); return (0);}/*--- mydns_soa_load() --------------------------------------------------------------------------*//* vi:set ts=3: */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -