A Means for Expressing Location Information in the Domain Name System
draft-davis-dns-loc-01
The information below is for an old version of the document that is already published as an RFC.
Document | Type |
This is an older version of an Internet-Draft that was ultimately published as RFC 1876.
|
|
---|---|---|---|
Authors | Ian Dickinson , Paul A. Vixie , Christopher Davis , Tim Goodwin | ||
Last updated | 2013-03-02 (Latest revision 1995-03-27) | ||
RFC stream | Legacy stream | ||
Intended RFC status | (None) | ||
Formats | |||
Stream | Legacy state | (None) | |
Consensus boilerplate | Unknown | ||
RFC Editor Note | (None) | ||
IESG | IESG state | Became RFC 1876 (Experimental) | |
Telechat date | (None) | ||
Responsible AD | (None) | ||
Send notices to | (None) |
draft-davis-dns-loc-01
'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(*cp)) /* if any trailing garbage */ cp++; while (isspace(*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. */ u_int32_t loc_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; Davis, Vixie, Goodwin & Dickinson [Page 11] Expires 1995-09-24 draft-davis-dns-loc-01.txt March 1995 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(*cp)) altmeters = altmeters * 10 + (*cp++ - '0'); if (*cp == '.') { /* decimal meters */ cp++; if (isdigit(*cp)) { altfrac = (*cp++ - '0') * 10; if (isdigit(*cp)) { altfrac += (*cp++ - '0'); } } Davis, Vixie, Goodwin & Dickinson [Page 12] Expires 1995-09-24 draft-davis-dns-loc-01.txt March 1995 } alt = (10000000 + (altsign * (altmeters * 100 + altfrac))); while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */ cp++; while (isspace(*cp) && (cp < maxcp)) cp++; if (cp >= maxcp) goto defaults; siz = precsize_aton(&cp); while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */ cp++; while (isspace(*cp) && (cp < maxcp)) cp++; if (cp >= maxcp) goto defaults; hp = precsize_aton(&cp); while (!isspace(*cp) && (cp < maxcp)) /* if trailing garbage or m */ cp++; while (isspace(*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); Davis, Vixie, Goodwin & Dickinson [Page 13] Expires 1995-09-24 draft-davis-dns-loc-01.txt March 1995 return (16); /* size of RR in octets */ } /* takes an on-the-wire LOC RR and prints it in zone file (human readable) format. */ char * loc_ntoa(binary,ascii) const u_char *binary; char *ascii; { char tmpbuf[255*3]; register char *cp; register const u_char *rcp; int latdeg, latmin, latsec, latsecfrac; int longdeg, longmin, longsec, longsecfrac; char northsouth, eastwest; int altmeters, altfrac, altsign; const int referencealt = 100000 * 100; int32_t latval, longval, altval; u_int32_t templ; u_int8_t sizeval, hpval, vpval, versionval; char *sizestr, *hpstr, *vpstr; rcp = binary; if (ascii) cp = ascii; else { ascii = tmpbuf; cp = tmpbuf; } versionval = *rcp++; if (versionval) { sprintf(cp,"; error: unknown LOC RR version"); return (cp); } sizeval = *rcp++; hpval = *rcp++; vpval = *rcp++; Davis, Vixie, Goodwin & Dickinson [Page 14] Expires 1995-09-24 draft-davis-dns-loc-01.txt March 1995 GETLONG(templ,rcp); latval = (templ - (1<<31)); GETLONG(templ,rcp); longval = (templ - (1<<31)); GETLONG(templ,rcp); if (templ < referencealt) { /* below WGS 84 spheroid */ altval = referencealt - templ; altsign = -1; } else { altval = templ - referencealt; altsign = 1; } 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) * altsign; Davis, Vixie, Goodwin & Dickinson [Page 15] Expires 1995-09-24 draft-davis-dns-loc-01.txt March 1995 sizestr = savestr(precsize_ntoa(sizeval)); hpstr = savestr(precsize_ntoa(hpval)); vpstr = savestr(precsize_ntoa(vpval)); sprintf(cp, "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm", latdeg, latmin, latsec, latsecfrac, northsouth, longdeg, longmin, longsec, longsecfrac, eastwest, altmeters, altfrac, sizestr, hpstr, vpstr); free(sizestr); free(hpstr); free(vpstr); return (cp); } Davis, Vixie, Goodwin & Dickinson [Page 16]