📄 res_debug.c
字号:
while (isdigit((unsigned char)*cp)) secs = secs * 10 + (*cp++ - '0'); if (*cp == '.') { /* decimal seconds */ cp++; if (isdigit((unsigned char)*cp)) { secsfrac = (*cp++ - '0') * 100; if (isdigit((unsigned char)*cp)) { secsfrac += (*cp++ - '0') * 10; if (isdigit((unsigned char)*cp)) { secsfrac += (*cp++ - '0'); } } } } while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ cp++; while (isspace((unsigned char)*cp)) cp++; fndhemi: switch (*cp) { case 'N': case 'n': case 'E': case 'e': retval = ((unsigned)1<<31) + (((((deg * 60) + min) * 60) + secs) * 1000) + secsfrac; break; case 'S': case 's': case 'W': case 'w': retval = ((unsigned)1<<31) - (((((deg * 60) + min) * 60) + secs) * 1000) - secsfrac; break; default: retval = 0; /* invalid value -- indicates error */ break; } switch (*cp) { case 'N': case 'n': case 'S': case 's': *which = 1; /* latitude */ break; case 'E': case 'e': case 'W': case 'w': *which = 2; /* longitude */ break; default: *which = 0; /* error */ break; } cp++; /* skip the hemisphere */ while (!isspace((unsigned char)*cp)) /* if any trailing garbage */ cp++; while (isspace((unsigned char)*cp)) /* move to next field */ cp++; *latlonstrptr = cp; return (retval);}/* converts a zone file representation in a string to an RDATA on-the-wire * representation. */intloc_aton(ascii, binary) const char *ascii; u_char *binary;{ const char *cp, *maxcp; u_char *bcp; u_int32_t latit = 0, longit = 0, alt = 0; u_int32_t lltemp1 = 0, lltemp2 = 0; int altmeters = 0, altfrac = 0, altsign = 1; u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */ u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */ u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */ int which1 = 0, which2 = 0; cp = ascii; maxcp = cp + strlen(ascii); lltemp1 = latlon2ul(&cp, &which1); lltemp2 = latlon2ul(&cp, &which2); switch (which1 + which2) { case 3: /* 1 + 2, the only valid combination */ if ((which1 == 1) && (which2 == 2)) { /* normal case */ latit = lltemp1; longit = lltemp2; } else if ((which1 == 2) && (which2 == 1)) { /* reversed */ longit = lltemp1; latit = lltemp2; } else { /* some kind of brokenness */ return (0); } break; default: /* we didn't get one of each */ return (0); } /* altitude */ if (*cp == '-') { altsign = -1; cp++; } if (*cp == '+') cp++; while (isdigit((unsigned char)*cp)) altmeters = altmeters * 10 + (*cp++ - '0'); if (*cp == '.') { /* decimal meters */ cp++; if (isdigit((unsigned char)*cp)) { altfrac = (*cp++ - '0') * 10; if (isdigit((unsigned char)*cp)) { altfrac += (*cp++ - '0'); } } } alt = (10000000 + (altsign * (altmeters * 100 + altfrac))); while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ cp++; while (isspace((unsigned char)*cp) && (cp < maxcp)) cp++; if (cp >= maxcp) goto defaults; siz = precsize_aton(&cp); while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ cp++; while (isspace((unsigned char)*cp) && (cp < maxcp)) cp++; if (cp >= maxcp) goto defaults; hp = precsize_aton(&cp); while (!isspace((unsigned char)*cp) && (cp < maxcp)) /* if trailing garbage or m */ cp++; while (isspace((unsigned char)*cp) && (cp < maxcp)) cp++; if (cp >= maxcp) goto defaults; vp = precsize_aton(&cp); defaults: bcp = binary; *bcp++ = (u_int8_t) 0; /* version byte */ *bcp++ = siz; *bcp++ = hp; *bcp++ = vp; PUTLONG(latit,bcp); PUTLONG(longit,bcp); PUTLONG(alt,bcp); return (16); /* size of RR in octets */}/* takes an on-the-wire LOC RR and formats it in a human readable format. */const char *loc_ntoa(binary, ascii) const u_char *binary; char *ascii;{ static const char *error = "?"; static char tmpbuf[sizeof"1000 60 60.000 N 1000 60 60.000 W -12345678.00m 90000000.00m 90000000.00m 90000000.00m"]; const u_char *cp = binary; int latdeg, latmin, latsec, latsecfrac; int longdeg, longmin, longsec, longsecfrac; char northsouth, eastwest; const char *altsign; int altmeters, altfrac; const u_int32_t referencealt = 100000 * 100; int32_t latval, longval, altval; u_int32_t templ; u_int8_t sizeval, hpval, vpval, versionval; char *sizestr, *hpstr, *vpstr; versionval = *cp++; if (ascii == NULL) ascii = tmpbuf; if (versionval) { (void) sprintf(ascii, "; error: unknown LOC RR version"); return (ascii); } sizeval = *cp++; hpval = *cp++; vpval = *cp++; GETLONG(templ, cp); latval = (templ - ((unsigned)1<<31)); GETLONG(templ, cp); longval = (templ - ((unsigned)1<<31)); GETLONG(templ, cp); if (templ < referencealt) { /* below WGS 84 spheroid */ altval = referencealt - templ; altsign = "-"; } else { altval = templ - referencealt; altsign = ""; } if (latval < 0) { northsouth = 'S'; latval = -latval; } else northsouth = 'N'; latsecfrac = latval % 1000; latval = latval / 1000; latsec = latval % 60; latval = latval / 60; latmin = latval % 60; latval = latval / 60; latdeg = latval; if (longval < 0) { eastwest = 'W'; longval = -longval; } else eastwest = 'E'; longsecfrac = longval % 1000; longval = longval / 1000; longsec = longval % 60; longval = longval / 60; longmin = longval % 60; longval = longval / 60; longdeg = longval; altfrac = altval % 100; altmeters = (altval / 100); sizestr = strdup(precsize_ntoa(sizeval)); hpstr = strdup(precsize_ntoa(hpval)); vpstr = strdup(precsize_ntoa(vpval)); sprintf(ascii, "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %s%d.%.2dm %sm %sm %sm", latdeg, latmin, latsec, latsecfrac, northsouth, longdeg, longmin, longsec, longsecfrac, eastwest, altsign, altmeters, altfrac, (sizestr != NULL) ? sizestr : error, (hpstr != NULL) ? hpstr : error, (vpstr != NULL) ? vpstr : error); if (sizestr != NULL) free(sizestr); if (hpstr != NULL) free(hpstr); if (vpstr != NULL) free(vpstr); return (ascii);}/* Return the number of DNS hierarchy levels in the name. */intdn_count_labels(const char *name) { int i, len, count; len = strlen(name); for (i = 0, count = 0; i < len; i++) { /* XXX need to check for \. or use named's nlabels(). */ if (name[i] == '.') count++; } /* don't count initial wildcard */ if (name[0] == '*') if (count) count--; /* don't count the null label for root. */ /* if terminating '.' not found, must adjust */ /* count to include last label */ if (len > 0 && name[len-1] != '.') count++; return (count);}/* * Make dates expressed in seconds-since-Jan-1-1970 easy to read. * SIG records are required to be printed like this, by the Secure DNS RFC. */char *p_secstodate (u_long secs) { /* XXX nonreentrant */ static char output[15]; /* YYYYMMDDHHMMSS and null */ time_t clock = secs; struct tm *time;#ifdef HAVE_TIME_R struct tm res; time = gmtime_r(&clock, &res);#else time = gmtime(&clock);#endif time->tm_year += 1900; time->tm_mon += 1; sprintf(output, "%04d%02d%02d%02d%02d%02d", time->tm_year, time->tm_mon, time->tm_mday, time->tm_hour, time->tm_min, time->tm_sec); return (output);}u_int16_tres_nametoclass(const char *buf, int *successp) { unsigned long result; char *endptr; int success; result = sym_ston(__p_class_syms, buf, &success); if (success) goto done; if (strncasecmp(buf, "CLASS", 5) != 0 || !isdigit((unsigned char)buf[5])) goto done; errno = 0; result = strtoul(buf + 5, &endptr, 10); if (errno == 0 && *endptr == '\0' && result <= 0xffffU) success = 1; done: if (successp) *successp = success; return (result);}u_int16_tres_nametotype(const char *buf, int *successp) { unsigned long result; char *endptr; int success; result = sym_ston(__p_type_syms, buf, &success); if (success) goto done; if (strncasecmp(buf, "type", 4) != 0 || !isdigit((unsigned char)buf[4])) goto done; errno = 0; result = strtoul(buf + 4, &endptr, 10); if (errno == 0 && *endptr == '\0' && result <= 0xffffU) success = 1; done: if (successp) *successp = success; return (result);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -