Annotation of embedaddon/dnsmasq/contrib/dns-loc/dnsmasq2-loc-rfc1876.patch, revision 1.1.1.1
1.1 misho 1: diff -Nur dnsmasq-2.39-orig/bld/Makefile dnsmasq-2.39/bld/Makefile
2: --- dnsmasq-2.39-orig/bld/Makefile 2007-02-17 14:37:06.000000000 +0100
3: +++ dnsmasq-2.39/bld/Makefile 2007-05-20 18:23:44.000000000 +0200
4: @@ -2,7 +2,7 @@
5: PKG_CONFIG ?= pkg-config
6:
7:
8: -OBJS = cache.o rfc1035.o util.o option.o forward.o isc.o network.o \
9: +OBJS = cache.o rfc1035.o rfc1876.o util.o option.o forward.o isc.o network.o \
10: dnsmasq.o dhcp.o lease.o rfc2131.o netlink.o dbus.o bpf.o \
11: helper.o tftp.o log.o
12:
13: diff -Nur dnsmasq-2.39-orig/src/dnsmasq.h dnsmasq-2.39/src/dnsmasq.h
14: --- dnsmasq-2.39-orig/src/dnsmasq.h 2007-04-20 12:53:38.000000000 +0200
15: +++ dnsmasq-2.39/src/dnsmasq.h 2007-05-20 19:50:37.000000000 +0200
16: @@ -162,6 +162,12 @@
17: struct interface_name *next;
18: };
19:
20: +struct loc_record {
21: + char *name, loc[16];
22: + unsigned short class;
23: + struct loc_record *next;
24: +};
25: +
26: union bigname {
27: char name[MAXDNAME];
28: union bigname *next; /* freelist */
29: @@ -476,6 +482,7 @@
30: struct mx_srv_record *mxnames;
31: struct txt_record *txt;
32: struct ptr_record *ptr;
33: + struct loc_record *loc;
34: struct interface_name *int_names;
35: char *mxtarget;
36: char *lease_file;
37: @@ -725,3 +732,6 @@
38: void tftp_request(struct listener *listen, struct daemon *daemon, time_t now);
39: void check_tftp_listeners(struct daemon *daemon, fd_set *rset, time_t now);
40: #endif
41: +
42: +/* rfc1876 */
43: +u_int32_t loc_aton(const char *ascii, u_char *binary);
44: diff -Nur dnsmasq-2.39-orig/src/option.c dnsmasq-2.39/src/option.c
45: --- dnsmasq-2.39-orig/src/option.c 2007-04-19 23:34:49.000000000 +0200
46: +++ dnsmasq-2.39/src/option.c 2007-05-20 20:15:15.000000000 +0200
47: @@ -43,6 +43,7 @@
48: #define LOPT_REMOTE 269
49: #define LOPT_SUBSCR 270
50: #define LOPT_INTNAME 271
51: +#define LOPT_LOC 272
52:
53: #ifdef HAVE_GETOPT_LONG
54: static const struct option opts[] =
55: @@ -122,6 +123,7 @@
56: {"tftp-root", 1, 0, LOPT_PREFIX },
57: {"tftp-max", 1, 0, LOPT_TFTP_MAX },
58: {"ptr-record", 1, 0, LOPT_PTR },
59: + {"loc-record", 1, 0, LOPT_LOC },
60: #if defined(__FreeBSD__) || defined(__DragonFly__)
61: {"bridge-interface", 1, 0 , LOPT_BRIDGE },
62: #endif
63: @@ -235,6 +237,7 @@
64: { "-y, --localise-queries", gettext_noop("Answer DNS queries based on the interface a query was sent to."), NULL },
65: { "-Y --txt-record=name,txt....", gettext_noop("Specify TXT DNS record."), NULL },
66: { " --ptr-record=name,target", gettext_noop("Specify PTR DNS record."), NULL },
67: + { " --loc-record=name,lat lon alt", gettext_noop("Specify LOC DNS record."), NULL },
68: { " --interface-name=name,interface", gettext_noop("Give DNS name to IPv4 address of interface."), NULL },
69: { "-z, --bind-interfaces", gettext_noop("Bind only to interfaces in use."), NULL },
70: { "-Z, --read-ethers", gettext_noop("Read DHCP static host information from %s."), ETHERSFILE },
71: @@ -1835,6 +1838,37 @@
72: new->intr = safe_string_alloc(comma);
73: break;
74: }
75: +
76: + case LOPT_LOC:
77: + {
78: + struct loc_record *new;
79: + unsigned char *p, *q;
80: +
81: + comma = split(arg);
82: +
83: + if (!canonicalise_opt(arg))
84: + {
85: + option = '?';
86: + problem = _("bad LOC record");
87: + break;
88: + }
89: +
90: + new = safe_malloc(sizeof(struct loc_record));
91: + new->next = daemon->loc;
92: + daemon->loc = new;
93: + new->class = C_IN;
94: + if (!comma || loc_aton(comma,new->loc)!=16)
95: + {
96: + option = '?';
97: + problem = _("bad LOC record");
98: + break;
99: + }
100: +
101: + if (comma)
102: + *comma = 0;
103: + new->name = safe_string_alloc(arg);
104: + break;
105: + }
106:
107: case LOPT_PTR: /* --ptr-record */
108: {
109: diff -Nur dnsmasq-2.39-orig/src/rfc1035.c dnsmasq-2.39/src/rfc1035.c
110: --- dnsmasq-2.39-orig/src/rfc1035.c 2007-04-20 12:54:26.000000000 +0200
111: +++ dnsmasq-2.39/src/rfc1035.c 2007-05-20 18:22:46.000000000 +0200
112: @@ -1112,6 +1112,27 @@
113: }
114: }
115:
116: + if (qtype == T_LOC || qtype == T_ANY)
117: + {
118: + struct loc_record *t;
119: + for(t = daemon->loc; t ; t = t->next)
120: + {
121: + if (t->class == qclass && hostname_isequal(name, t->name))
122: + {
123: + ans = 1;
124: + if (!dryrun)
125: + {
126: + log_query(F_CNAME | F_FORWARD | F_CONFIG | F_NXDOMAIN, name, NULL, 0, NULL, 0);
127: + if (add_resource_record(header, limit, &trunc, nameoffset, &ansp,
128: + daemon->local_ttl, NULL,
129: + T_LOC, t->class, "t", 16, t->loc))
130: + anscount++;
131: +
132: + }
133: + }
134: + }
135: + }
136: +
137: if (qclass == C_IN)
138: {
139: if (qtype == T_PTR || qtype == T_ANY)
140: diff -Nur dnsmasq-2.39-orig/src/rfc1876.c dnsmasq-2.39/src/rfc1876.c
141: --- dnsmasq-2.39-orig/src/rfc1876.c 1970-01-01 01:00:00.000000000 +0100
142: +++ dnsmasq-2.39/src/rfc1876.c 2007-05-20 19:50:10.000000000 +0200
143: @@ -0,0 +1,379 @@
144: +/*
145: + * routines to convert between on-the-wire RR format and zone file
146: + * format. Does not contain conversion to/from decimal degrees;
147: + * divide or multiply by 60*60*1000 for that.
148: + */
149: +
150: +#include "dnsmasq.h"
151: +
152: +static unsigned int poweroften[10] = {1, 10, 100, 1000, 10000, 100000,
153: + 1000000,10000000,100000000,1000000000};
154: +
155: +/* takes an XeY precision/size value, returns a string representation.*/
156: +static const char *
157: +precsize_ntoa(u_int8_t prec)
158: +{
159: + static char retbuf[sizeof("90000000.00")];
160: + unsigned long val;
161: + int mantissa, exponent;
162: +
163: + mantissa = (int)((prec >> 4) & 0x0f) % 10;
164: + exponent = (int)((prec >> 0) & 0x0f) % 10;
165: +
166: + val = mantissa * poweroften[exponent];
167: +
168: + (void) sprintf(retbuf,"%d.%.2d", val/100, val%100);
169: + return (retbuf);
170: +}
171: +
172: +/* converts ascii size/precision X * 10**Y(cm) to 0xXY. moves pointer.*/
173: +static u_int8_t
174: +precsize_aton(char **strptr)
175: +{
176: + unsigned int mval = 0, cmval = 0;
177: + u_int8_t retval = 0;
178: + register char *cp;
179: + register int exponent;
180: + register int mantissa;
181: +
182: + cp = *strptr;
183: +
184: + while (isdigit(*cp))
185: + mval = mval * 10 + (*cp++ - '0');
186: +
187: + if (*cp == '.') { /* centimeters */
188: + cp++;
189: + if (isdigit(*cp)) {
190: + cmval = (*cp++ - '0') * 10;
191: + if (isdigit(*cp)) {
192: + cmval += (*cp++ - '0');
193: + }
194: + }
195: + }
196: + cmval = (mval * 100) + cmval;
197: +
198: + for (exponent = 0; exponent < 9; exponent++)
199: + if (cmval < poweroften[exponent+1])
200: + break;
201: +
202: + mantissa = cmval / poweroften[exponent];
203: + if (mantissa > 9)
204: + mantissa = 9;
205: +
206: + retval = (mantissa << 4) | exponent;
207: +
208: + *strptr = cp;
209: +
210: + return (retval);
211: +}
212: +
213: +/* converts ascii lat/lon to unsigned encoded 32-bit number.
214: + * moves pointer. */
215: +static u_int32_t
216: +latlon2ul(char **latlonstrptr,int *which)
217: +{
218: + register char *cp;
219: + u_int32_t retval;
220: + int deg = 0, min = 0, secs = 0, secsfrac = 0;
221: +
222: + cp = *latlonstrptr;
223: +
224: + while (isdigit(*cp))
225: + deg = deg * 10 + (*cp++ - '0');
226: +
227: + while (isspace(*cp))
228: + cp++;
229: +
230: + if (!(isdigit(*cp)))
231: + goto fndhemi;
232: +
233: + while (isdigit(*cp))
234: + min = min * 10 + (*cp++ - '0');
235: + while (isspace(*cp))
236: + cp++;
237: +
238: + if (!(isdigit(*cp)))
239: + goto fndhemi;
240: +
241: + while (isdigit(*cp))
242: + secs = secs * 10 + (*cp++ - '0');
243: +
244: + if (*cp == '.') { /* decimal seconds */
245: + cp++;
246: + if (isdigit(*cp)) {
247: + secsfrac = (*cp++ - '0') * 100;
248: + if (isdigit(*cp)) {
249: + secsfrac += (*cp++ - '0') * 10;
250: + if (isdigit(*cp)) {
251: + secsfrac += (*cp++ - '0');
252: + }
253: + }
254: + }
255: + }
256: +
257: + while (!isspace(*cp)) /* if any trailing garbage */
258: + cp++;
259: +
260: + while (isspace(*cp))
261: + cp++;
262: +
263: + fndhemi:
264: + switch (*cp) {
265: + case 'N': case 'n':
266: + case 'E': case 'e':
267: + retval = ((unsigned)1<<31)
268: + + (((((deg * 60) + min) * 60) + secs) * 1000)
269: + + secsfrac;
270: + break;
271: + case 'S': case 's':
272: + case 'W': case 'w':
273: + retval = ((unsigned)1<<31)
274: + - (((((deg * 60) + min) * 60) + secs) * 1000)
275: + - secsfrac;
276: + break;
277: + default:
278: + retval = 0; /* invalid value -- indicates error */
279: + break;
280: + }
281: +
282: + switch (*cp) {
283: + case 'N': case 'n':
284: + case 'S': case 's':
285: + *which = 1; /* latitude */
286: + break;
287: + case 'E': case 'e':
288: + case 'W': case 'w':
289: + *which = 2; /* longitude */
290: + break;
291: + default:
292: + *which = 0; /* error */
293: + break;
294: + }
295: +
296: + cp++; /* skip the hemisphere */
297: +
298: + while (!isspace(*cp)) /* if any trailing garbage */
299: + cp++;
300: +
301: + while (isspace(*cp)) /* move to next field */
302: + cp++;
303: +
304: + *latlonstrptr = cp;
305: +
306: + return (retval);
307: +}
308: +
309: +/* converts a zone file representation in a string to an RDATA
310: + * on-the-wire representation. */
311: +u_int32_t
312: +loc_aton(const char *ascii, u_char *binary)
313: +{
314: + const char *cp, *maxcp;
315: + u_char *bcp;
316: +
317: + u_int32_t latit = 0, longit = 0, alt = 0;
318: + u_int32_t lltemp1 = 0, lltemp2 = 0;
319: + int altmeters = 0, altfrac = 0, altsign = 1;
320: + u_int8_t hp = 0x16; /* default = 1e6 cm = 10000.00m = 10km */
321: + u_int8_t vp = 0x13; /* default = 1e3 cm = 10.00m */
322: + u_int8_t siz = 0x12; /* default = 1e2 cm = 1.00m */
323: + int which1 = 0, which2 = 0;
324: +
325: + cp = ascii;
326: + maxcp = cp + strlen(ascii);
327: +
328: + lltemp1 = latlon2ul(&cp, &which1);
329: + lltemp2 = latlon2ul(&cp, &which2);
330: +
331: + switch (which1 + which2) {
332: + case 3: /* 1 + 2, the only valid combination */
333: + if ((which1 == 1) && (which2 == 2)) { /* normal case */
334: + latit = lltemp1;
335: + longit = lltemp2;
336: + } else if ((which1 == 2) && (which2 == 1)) {/*reversed*/
337: + longit = lltemp1;
338: + latit = lltemp2;
339: + } else { /* some kind of brokenness */
340: + return 0;
341: + }
342: + break;
343: + default: /* we didn't get one of each */
344: + return 0;
345: + }
346: +
347: + /* altitude */
348: + if (*cp == '-') {
349: + altsign = -1;
350: + cp++;
351: + }
352: +
353: + if (*cp == '+')
354: + cp++;
355: +
356: + while (isdigit(*cp))
357: + altmeters = altmeters * 10 + (*cp++ - '0');
358: +
359: + if (*cp == '.') { /* decimal meters */
360: + cp++;
361: + if (isdigit(*cp)) {
362: + altfrac = (*cp++ - '0') * 10;
363: + if (isdigit(*cp)) {
364: + altfrac += (*cp++ - '0');
365: + }
366: + }
367: + }
368: +
369: + alt = (10000000 + (altsign * (altmeters * 100 + altfrac)));
370: +
371: + while (!isspace(*cp) && (cp < maxcp))
372: + /* if trailing garbage or m */
373: + cp++;
374: +
375: + while (isspace(*cp) && (cp < maxcp))
376: + cp++;
377: + if (cp >= maxcp)
378: + goto defaults;
379: +
380: + siz = precsize_aton(&cp);
381: +
382: + while (!isspace(*cp) && (cp < maxcp))/*if trailing garbage or m*/
383: + cp++;
384: +
385: + while (isspace(*cp) && (cp < maxcp))
386: + cp++;
387: +
388: + if (cp >= maxcp)
389: + goto defaults;
390: +
391: + hp = precsize_aton(&cp);
392: +
393: + while (!isspace(*cp) && (cp < maxcp))/*if trailing garbage or m*/
394: + cp++;
395: +
396: + while (isspace(*cp) && (cp < maxcp))
397: + cp++;
398: +
399: + if (cp >= maxcp)
400: + goto defaults;
401: +
402: + vp = precsize_aton(&cp);
403: +
404: + defaults:
405: +
406: + bcp = binary;
407: + *bcp++ = (u_int8_t) 0; /* version byte */
408: + *bcp++ = siz;
409: + *bcp++ = hp;
410: + *bcp++ = vp;
411: + PUTLONG(latit,bcp);
412: + PUTLONG(longit,bcp);
413: + PUTLONG(alt,bcp);
414: +
415: + return (16); /* size of RR in octets */
416: +}
417: +
418: +/* takes an on-the-wire LOC RR and prints it in zone file
419: + * (human readable) format. */
420: +char *
421: +loc_ntoa(const u_char *binary,char *ascii)
422: +{
423: + static char tmpbuf[255*3];
424: +
425: + register char *cp;
426: + register const u_char *rcp;
427: +
428: + int latdeg, latmin, latsec, latsecfrac;
429: + int longdeg, longmin, longsec, longsecfrac;
430: + char northsouth, eastwest;
431: + int altmeters, altfrac, altsign;
432: +
433: + const int referencealt = 100000 * 100;
434: +
435: + int32_t latval, longval, altval;
436: + u_int32_t templ;
437: + u_int8_t sizeval, hpval, vpval, versionval;
438: +
439: + char *sizestr, *hpstr, *vpstr;
440: +
441: + rcp = binary;
442: + if (ascii)
443: + cp = ascii;
444: + else {
445: + cp = tmpbuf;
446: + }
447: +
448: + versionval = *rcp++;
449: +
450: + if (versionval) {
451: + sprintf(cp,"; error: unknown LOC RR version");
452: + return (cp);
453: + }
454: +
455: + sizeval = *rcp++;
456: +
457: + hpval = *rcp++;
458: + vpval = *rcp++;
459: +
460: + GETLONG(templ,rcp);
461: + latval = (templ - ((unsigned)1<<31));
462: +
463: + GETLONG(templ,rcp);
464: + longval = (templ - ((unsigned)1<<31));
465: +
466: + GETLONG(templ,rcp);
467: + if (templ < referencealt) { /* below WGS 84 spheroid */
468: + altval = referencealt - templ;
469: + altsign = -1;
470: + } else {
471: + altval = templ - referencealt;
472: + altsign = 1;
473: + }
474: +
475: + if (latval < 0) {
476: + northsouth = 'S';
477: + latval = -latval;
478: + }
479: + else
480: + northsouth = 'N';
481: +
482: + latsecfrac = latval % 1000;
483: + latval = latval / 1000;
484: + latsec = latval % 60;
485: + latval = latval / 60;
486: + latmin = latval % 60;
487: + latval = latval / 60;
488: + latdeg = latval;
489: +
490: + if (longval < 0) {
491: + eastwest = 'W';
492: + longval = -longval;
493: + }
494: + else
495: + eastwest = 'E';
496: +
497: + longsecfrac = longval % 1000;
498: + longval = longval / 1000;
499: + longsec = longval % 60;
500: + longval = longval / 60;
501: + longmin = longval % 60;
502: + longval = longval / 60;
503: + longdeg = longval;
504: +
505: + altfrac = altval % 100;
506: + altmeters = (altval / 100) * altsign;
507: +
508: + sizestr = strdup(precsize_ntoa(sizeval));
509: + hpstr = strdup(precsize_ntoa(hpval));
510: + vpstr = strdup(precsize_ntoa(vpval));
511: +
512: + sprintf(cp,
513: + "%d %.2d %.2d.%.3d %c %d %.2d %.2d.%.3d %c %d.%.2dm %sm %sm %sm",
514: + latdeg, latmin, latsec, latsecfrac, northsouth,
515: + longdeg, longmin, longsec, longsecfrac, eastwest,
516: + altmeters, altfrac, sizestr, hpstr, vpstr);
517: + free(sizestr);
518: + free(hpstr);
519: + free(vpstr);
520: +
521: + return (cp);
522: +}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>