Annotation of embedaddon/dnsmasq/contrib/dns-loc/dnsmasq2-loc-rfc1876.patch, revision 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>