Changeset 632627e for lib


Ignore:
Timestamp:
2014-07-24T03:51:07Z (10 years ago)
Author:
dequis <dx@…>
Branches:
master
Children:
f93fd2d
Parents:
59e66ff
git-author:
jcopenha <jcopenha@…> (24-07-14 03:51:07)
git-committer:
dequis <dx@…> (24-07-14 03:51:07)
Message:

srv_lookup: Portability fixes, handle compressed responses

srv_lookup works on cygwin and openbsd now.

Provide ns_initparse, friends, and types where they aren't provided by
platform.

Use dn_expandname instead of custom parser so compressed DNS responses
are handled correctly.

Location:
lib
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • lib/Makefile

    r59e66ff r632627e  
    1313
    1414# [SH] Program variables
    15 objects = arc.o base64.o $(EVENT_HANDLER) ftutil.o http_client.o ini.o json.o json_util.o md5.o misc.o oauth.o oauth2.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o
     15objects = arc.o base64.o $(EVENT_HANDLER) ftutil.o http_client.o ini.o json.o json_util.o md5.o misc.o oauth.o oauth2.o proxy.o sha1.o $(SSL_CLIENT) url.o xmltree.o ns_parse.o
    1616
    1717LFLAGS += -r
  • lib/misc.c

    r59e66ff r632627e  
    525525        ns_msg nsh;
    526526        ns_rr rr;
    527         int i, n, len, size;
     527        int n, len, size;
    528528       
    529529        g_snprintf( name, sizeof( name ), "_%s._%s.%s", service, protocol, domain );
     
    538538        while( ns_parserr( &nsh, ns_s_an, n, &rr ) == 0 )
    539539        {
    540                 size = ns_rr_rdlen( rr );
     540                char name[NS_MAXDNAME];
     541
     542                if( ns_rr_rdlen( rr ) < 7)
     543                    break;
     544
    541545                buf = ns_rr_rdata( rr );
    542546               
    543                 len = 0;
    544                 for( i = 6; i < size && buf[i]; i += buf[i] + 1 )
    545                         len += buf[i] + 1;
    546                
    547                 if( i > size )
     547                if( dn_expand(querybuf, querybuf + size, &buf[6], name, NS_MAXDNAME) == -1 )
    548548                        break;
     549
     550                len = strlen(name) + 1;
    549551               
    550552                reply = g_malloc( sizeof( struct ns_srv_reply ) + len );
    551                 memcpy( reply->name, buf + 7, len );
    552                
    553                 for( i = buf[6]; i < len && buf[7+i]; i += buf[7+i] + 1 )
    554                         reply->name[i] = '.';
    555                
    556                 if( i > len )
    557                 {
    558                         g_free( reply );
    559                         break;
    560                 }
     553                memcpy( reply->name, name, len );
    561554               
    562555                reply->prio = ( buf[0] << 8 ) | buf[1];
  • lib/misc.h

    r59e66ff r632627e  
    3838};
    3939
     40#ifndef NAMESER_HAS_NS_TYPES
     41
     42#define NS_MAXDNAME 1025
     43#define NS_INT16SZ  2
     44#define NS_INT32SZ  4
     45
     46#define NS_GET16(s, cp) do { \
     47        register const unsigned char *t_cp = (const unsigned char*)(cp); \
     48        (s) = ((guint16)t_cp[0] << 8) \
     49            | ((guint16)t_cp[1]) \
     50            ; \
     51        (cp) += NS_INT16SZ; \
     52} while(0)
     53
     54#define NS_GET32(s, cp) do { \
     55        register const unsigned char *t_cp = (const unsigned char*)(cp); \
     56        (s) = ((guint16)t_cp[0] << 24) \
     57            | ((guint16)t_cp[1] << 16) \
     58            | ((guint16)t_cp[2] << 8) \
     59            | ((guint16)t_cp[3]) \
     60            ; \
     61        (cp) += NS_INT32SZ; \
     62} while(0)
     63
     64#define ns_rr_rdlen(rr) ((rr).rdlength + 0)
     65#define ns_rr_rdata(rr) ((rr).rdata + 0)
     66
     67struct _ns_flagdata { int mask, shift; };
     68
     69typedef struct __ns_rr {
     70        char name[NS_MAXDNAME];
     71        guint16 type;
     72        guint16 rr_class;
     73        guint32 ttl;
     74        guint16 rdlength;
     75        const unsigned char* rdata;
     76} ns_rr;
     77
     78typedef enum __ns_sect {
     79        ns_s_qd = 0,
     80        ns_s_zn = 0,
     81        ns_s_an = 1,
     82        ns_s_pr = 1,
     83        ns_s_ns = 2,
     84        ns_s_ud = 2,
     85        ns_s_ar = 3,
     86        ns_s_max =4
     87} ns_sect;
     88
     89typedef struct __ns_msg
     90{
     91        const unsigned char* _msg;
     92        const unsigned char* _eom;
     93        guint16 _id;
     94        guint16 _flags;
     95        guint16 _counts[ns_s_max];
     96        const unsigned char* _sections[ns_s_max];
     97        ns_sect _sect;
     98        int _rrnum;
     99        const unsigned char* _msg_ptr;
     100} ns_msg;
     101
     102typedef enum __ns_class {
     103        ns_c_invalid = 0,
     104        ns_c_in = 1,
     105        ns_c_2 = 2,
     106        ns_c_chaos = 3,
     107        ns_c_hs = 4,
     108        ns_c_none = 254,
     109        ns_c_any = 255,
     110        ns_c_max = 65536
     111} ns_class;
     112
     113
     114/* TODO : fill out the rest */
     115typedef enum __ns_type {
     116        ns_t_srv = 33
     117} ns_type;
     118
     119#endif /* NAMESER_HAS_NS_INITPARSE */
     120
    40121G_MODULE_EXPORT void strip_linefeed( gchar *text );
    41122G_MODULE_EXPORT char *add_cr( char *text );
Note: See TracChangeset for help on using the changeset viewer.