📄 rr.c~
字号:
case DNS_QTYPE_RP: case DNS_QTYPE_SRV:#ifdef DN_COLUMN_NAMES /* Just append dot for DN */ strncat(rr->data, ".", sizeof(rr->data) - strlen(rr->data) - 1);#else { int namelen = strlen(rr->data); if (namelen && rr->data[namelen-1] != '.') { strncat(rr->data, ".", sizeof(rr->data) - namelen - 1); strncat(rr->data, origin, sizeof(rr->data) - namelen - 2); } }#endif break; default: break; } if (rr->type == DNS_QTYPE_SRV) mydns_rr_parse_srv(row, origin, rr); } return (rr);}/*--- mydns_rr_parse() --------------------------------------------------------------------------*//************************************************************************************************** MYDNS_RR_DUP Make and return a copy of a MYDNS_RR record. If 'recurse' is specified, copies all records in the RRset.**************************************************************************************************/MYDNS_RR *mydns_rr_dup(MYDNS_RR *start, int recurse){ register MYDNS_RR *first = NULL, *last = NULL, *rr, *s, *tmp; for (s = start; s; s = tmp) { tmp = s->next; if (!(rr = (MYDNS_RR *)calloc(1, sizeof(MYDNS_RR)))) Err(_("out of memory")); rr->id = s->id; rr->zone = s->zone; strncpy(rr->name, s->name, sizeof(rr->name)-1); rr->type = s->type; rr->class = s->class; strncpy(rr->data, s->data, sizeof(rr->data)-1); rr->aux = s->aux; rr->ttl = s->ttl;#if ALIAS_ENABLED rr->alias = s->alias;#endif rr->srv_weight = s->srv_weight; rr->srv_port = s->srv_port; /* Copy rp_txt only for RP records */ if (rr->type == DNS_QTYPE_RP) strncpy(rr->rp_txt, s->rp_txt, sizeof(rr->rp_txt) - 1); /* Copy naptr fields only for NAPTR records */ if (rr->type == DNS_QTYPE_NAPTR) { rr->naptr_order = s->naptr_order; rr->naptr_pref = s->naptr_pref; strncpy(rr->naptr_flags, s->naptr_flags, sizeof(rr->naptr_flags) - 1); strncpy(rr->naptr_service, s->naptr_service, sizeof(rr->naptr_service) - 1); strncpy(rr->naptr_regex, s->naptr_regex, sizeof(rr->naptr_regex) - 1); strncpy(rr->naptr_replacement, s->naptr_replacement, sizeof(rr->naptr_replacement) - 1); } rr->next = NULL; if (recurse) { if (!first) first = rr; if (last) last->next = rr; last = rr; } else return (rr); } return (first);}/*--- mydns_rr_dup() ----------------------------------------------------------------------------*//************************************************************************************************** MYDNS_RR_SIZE**************************************************************************************************/inline size_tmydns_rr_size(MYDNS_RR *first){ register MYDNS_RR *p; register size_t size = 0; for (p = first; p; p = p->next) size += sizeof(MYDNS_RR); return (size);}/*--- mydns_rr_size() ---------------------------------------------------------------------------*//************************************************************************************************** _MYDNS_RR_FREE Frees the pointed-to structure. Don't call this function directly, call the macro.**************************************************************************************************/inline void_mydns_rr_free(MYDNS_RR *first){ register MYDNS_RR *p, *tmp; for (p = first; p; p = tmp) { tmp = p->next; Free(p); }}/*--- _mydns_rr_free() --------------------------------------------------------------------------*//************************************************************************************************** MYDNS_RR_LOAD Returns 0 on success or nonzero if an error occurred. If "name" is NULL, all resource records for the zone will be loaded.**************************************************************************************************/intmydns_rr_load(SQL *sqlConn, MYDNS_RR **rptr, uint32_t zone, dns_qtype_t type, char *name, char *origin, const char *requestor_ip_section){ MYDNS_RR *first = NULL, *last = NULL; size_t querylen; uchar query[DNS_QUERYBUFSIZ], namequery[DNS_MAXNAMELEN + DNS_MAXNAMELEN + DNS_MAXNAMELEN + 25] = ""; uchar *wheretype; register char *c, *cp; SQL_RES *res; SQL_ROW row;#ifdef DN_COLUMN_NAMES int originlen = origin ? strlen(origin) : 0; int namelen = name ? strlen(name) : 0;#endif#if DEBUG_ENABLED && DEBUG_LIB_RR Debug("mydns_rr_load(zone=%u, type='%s', name='%s', origin='%s')", zone, mydns_qtype_str(type), name ?: "NULL", origin ?: "NULL");#endif if (rptr) *rptr = NULL; /* Verify args */ if (!sqlConn || !rptr) { errno = EINVAL; return (-1); } /* Get the type='XX' part of the WHERE clause */ switch (type) {#if ALIAS_ENABLED case DNS_QTYPE_A: wheretype = " AND (type='A' OR type='ALIAS')"; break;#else case DNS_QTYPE_A: wheretype = " AND type='A'"; break;#endif case DNS_QTYPE_AAAA: wheretype = " AND type='AAAA'"; break; case DNS_QTYPE_CNAME: wheretype = " AND type='CNAME'"; break; case DNS_QTYPE_HINFO: wheretype = " AND type='HINFO'"; break; case DNS_QTYPE_MX: wheretype = " AND type='MX'"; break; case DNS_QTYPE_NAPTR: wheretype = " AND type='NAPTR'"; break; case DNS_QTYPE_NS: wheretype = " AND type='NS'"; break; case DNS_QTYPE_PTR: wheretype = " AND type='PTR'"; break; case DNS_QTYPE_SOA: wheretype = " AND type='SOA'"; break; case DNS_QTYPE_SRV: wheretype = " AND type='SRV'"; break; case DNS_QTYPE_TXT: wheretype = " AND type='TXT'"; break; case DNS_QTYPE_ANY: wheretype = ""; break; default: errno = EINVAL; return (-1); } /* Make sure 'name' and 'origin' (if present) are valid */ if (name) { for (c = name; *c; c++) if (SQL_BADCHAR(*c)) return (0); } if (origin) { for (c = origin; *c; c++) if (SQL_BADCHAR(*c)) return (0); }#ifdef DN_COLUMN_NAMES /* Remove dot from origin and name for DN */ if (originlen && origin[originlen - 1] == '.') origin[originlen-1] = '\0'; else originlen = 0; if (name) { if (namelen && name[namelen - 1] == '.') name[namelen-1] = '\0'; else namelen = 0; }#endif /* Construct query */ if (name) { if (origin) { if (!name[0]) snprintf(namequery, sizeof(namequery), "(name='' OR name='%s')", origin); else {#ifdef DN_COLUMN_NAMES snprintf(namequery, sizeof(namequery), "name='%s'", name);#else snprintf(namequery, sizeof(namequery), "(name='%s' OR name='%s.%s')", name, name, origin);#endif } } else snprintf(namequery, sizeof(namequery), "name='%s'", name); }#ifdef DN_COLUMN_NAMES if (originlen) origin[originlen - 1] = '.'; /* Readd dot to origin for DN */ if (name) { if (namelen) name[namelen - 1] = '.'; }#endif querylen = snprintf(query, sizeof(query), "SELECT "MYDNS_RR_FIELDS"%s FROM %s WHERE "#ifdef DN_COLUMN_NAMES "zone_id=%u%s"#else "zone=%u%s"#endif "%s%s%s%s", (mydns_rr_use_active ? ",active" : ""), mydns_rr_table_name, zone, wheretype, (namequery[0]) ? " AND " : "", namequery, (mydns_rr_where_clause) ? " AND " : "", (mydns_rr_where_clause) ? mydns_rr_where_clause : ""); /* Submit query */ if (!(res = sql_query(sqlConn, query, querylen))) return (-1);#if DEBUG_ENABLED && DEBUG_LIB_RR { int numresults = sql_num_rows(res); Debug("[*%s*][*%s*]%s RR query: %d row%s: %s",__FILE__,__LINE__, numresults, S(numresults), query); }#endif /* Add results to list */ while ((row = sql_getrow(res))) { MYDNS_RR *new; /* Obey "active" column */ if (mydns_rr_use_active && row[MYDNS_RR_NUMFIELDS] && !GETBOOL(row[MYDNS_RR_NUMFIELDS])) continue; if (!(new = mydns_rr_parse(row, origin))) continue; /* Always trim origin from name (XXX: Why? When did I add this?) */ /* Apparently removing this code breaks RRs where the name IS the origin */ /* But trim only where the name is exactly the origin */ if (origin && (cp = strstr(new->name, origin)) && !(cp - new->name)) *cp = '\0'; if (!first) first = new; if (last) last->next = new; last = new; } *rptr = first; sql_free(res); return (0);}/*--- mydns_rr_load() ---------------------------------------------------------------------------*//* vi:set ts=3: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -