Sat Nov 1 06:31:02 2008

Asterisk developer's documentation


dundi-parser.c File Reference

Distributed Universal Number Discovery (DUNDi). More...

#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include "asterisk.h"
#include "asterisk/frame.h"
#include "asterisk/utils.h"
#include "asterisk/dundi.h"
#include "dundi-parser.h"

Include dependency graph for dundi-parser.c:

Go to the source code of this file.

Data Structures

struct  dundi_ie

Functions

static void dump_answer (char *output, int maxlen, void *value, int len)
static void dump_byte (char *output, int maxlen, void *value, int len)
static void dump_cause (char *output, int maxlen, void *value, int len)
static void dump_cbypass (char *output, int maxlen, void *value, int len)
static void dump_eid (char *output, int maxlen, void *value, int len)
static void dump_encrypted (char *output, int maxlen, void *value, int len)
static void dump_hint (char *output, int maxlen, void *value, int len)
static void dump_ies (unsigned char *iedata, int spaces, int len)
static void dump_int (char *output, int maxlen, void *value, int len)
static void dump_raw (char *output, int maxlen, void *value, int len)
static void dump_short (char *output, int maxlen, void *value, int len)
static void dump_string (char *output, int maxlen, void *value, int len)
int dundi_eid_cmp (dundi_eid *eid1, dundi_eid *eid2)
char * dundi_eid_to_str (char *s, int maxlen, dundi_eid *eid)
char * dundi_eid_to_str_short (char *s, int maxlen, dundi_eid *eid)
int dundi_eid_zero (dundi_eid *eid)
char * dundi_flags2str (char *buf, int bufsiz, int flags)
char * dundi_hint2str (char *buf, int bufsiz, int flags)
const char * dundi_ie2str (int ie)
int dundi_ie_append (struct dundi_ie_data *ied, unsigned char ie)
int dundi_ie_append_addr (struct dundi_ie_data *ied, unsigned char ie, struct sockaddr_in *sin)
int dundi_ie_append_answer (struct dundi_ie_data *ied, unsigned char ie, dundi_eid *eid, unsigned char protocol, unsigned short flags, unsigned short weight, char *data)
int dundi_ie_append_byte (struct dundi_ie_data *ied, unsigned char ie, unsigned char dat)
int dundi_ie_append_cause (struct dundi_ie_data *ied, unsigned char ie, unsigned char cause, char *data)
int dundi_ie_append_eid (struct dundi_ie_data *ied, unsigned char ie, dundi_eid *eid)
int dundi_ie_append_encdata (struct dundi_ie_data *ied, unsigned char ie, unsigned char *iv, void *data, int datalen)
int dundi_ie_append_hint (struct dundi_ie_data *ied, unsigned char ie, unsigned short flags, char *data)
int dundi_ie_append_int (struct dundi_ie_data *ied, unsigned char ie, unsigned int value)
int dundi_ie_append_raw (struct dundi_ie_data *ied, unsigned char ie, void *data, int datalen)
int dundi_ie_append_short (struct dundi_ie_data *ied, unsigned char ie, unsigned short value)
int dundi_ie_append_str (struct dundi_ie_data *ied, unsigned char ie, char *str)
int dundi_parse_ies (struct dundi_ies *ies, unsigned char *data, int datalen)
void dundi_set_error (void(*func)(const char *))
void dundi_set_output (void(*func)(const char *))
void dundi_showframe (struct dundi_hdr *fhi, int rx, struct sockaddr_in *sin, int datalen)
int dundi_str_short_to_eid (dundi_eid *eid, char *s)
int dundi_str_to_eid (dundi_eid *eid, char *s)
static void internalerror (const char *str)
static void internaloutput (const char *str)
static char * proto2str (int proto, char *buf, int bufsiz)

Variables

static void(*) errorf (const char *str) = internalerror
static struct dundi_ie ies []
static void(*) outputf (const char *str) = internaloutput


Detailed Description

Distributed Universal Number Discovery (DUNDi).

Definition in file dundi-parser.c.


Function Documentation

static void dump_answer ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 311 of file dundi-parser.c.

References answer, dundi_eid_to_str(), dundi_flags2str(), dundi_answer::flags, and proto2str().

00312 {
00313    struct dundi_answer *answer;
00314    char proto[40];
00315    char flags[40];
00316    char eid_str[40];
00317    char tmp[512]="";
00318    if (len >= 10) {
00319       answer = (struct dundi_answer *)(value);
00320       memcpy(tmp, answer->data, (len >= 500) ? 500 : len - 10);
00321       dundi_eid_to_str(eid_str, sizeof(eid_str), &answer->eid);
00322       snprintf(output, maxlen, "[%s] %d <%s/%s> from [%s]", 
00323          dundi_flags2str(flags, sizeof(flags), ntohs(answer->flags)), 
00324          ntohs(answer->weight),
00325          proto2str(answer->protocol, proto, sizeof(proto)), 
00326             tmp, eid_str);
00327    } else
00328       strncpy(output, "Invalid Answer", maxlen - 1);
00329 }

static void dump_byte ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 243 of file dundi-parser.c.

00244 {
00245    if (len == (int)sizeof(unsigned char))
00246       snprintf(output, maxlen, "%d", *((unsigned char *)value));
00247    else
00248       snprintf(output, maxlen, "Invalid BYTE");
00249 }

static void dump_cause ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 189 of file dundi-parser.c.

References causes.

00190 {
00191    static char *causes[] = {
00192       "SUCCESS",
00193       "GENERAL",
00194       "DYNAMIC",
00195       "NOAUTH" ,
00196       };
00197    char tmp[256];
00198    char tmp2[256];
00199    int mlen;
00200    unsigned char cause;
00201    if (len < 1) {
00202       strncpy(output, "<invalid contents>", maxlen);
00203       return;
00204    }
00205    cause = *((unsigned char *)value);
00206    memset(tmp2, 0, sizeof(tmp2));
00207    mlen = len - 1;
00208    if (mlen > 255)
00209       mlen = 255;
00210    memcpy(tmp2, value + 1, mlen);
00211    if (cause < sizeof(causes) / sizeof(causes[0])) {
00212       if (len > 1)
00213          snprintf(tmp, sizeof(tmp), "%s: %s", causes[cause], tmp2);
00214       else
00215          snprintf(tmp, sizeof(tmp), "%s", causes[cause]);
00216    } else {
00217       if (len > 1)
00218          snprintf(tmp, sizeof(tmp), "%d: %s", cause, tmp2);
00219       else
00220          snprintf(tmp, sizeof(tmp), "%d", cause);
00221    }
00222    
00223    strncpy(output,tmp, maxlen);
00224    output[maxlen] = '\0';
00225 }

static void dump_cbypass ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 136 of file dundi-parser.c.

00137 {
00138    maxlen--;
00139    strncpy(output, "Bypass Caches", maxlen);
00140    output[maxlen] = '\0';
00141 }

static void dump_eid ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 143 of file dundi-parser.c.

References dundi_eid_to_str().

00144 {
00145    if (len == 6)
00146       dundi_eid_to_str(output, maxlen, (dundi_eid *)value);
00147    else
00148       snprintf(output, maxlen, "Invalid EID len %d", len);
00149 }

static void dump_encrypted ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 331 of file dundi-parser.c.

00332 {
00333    char iv[33];
00334    int x;
00335    if ((len > 16) && !(len % 16)) {
00336       /* Build up IV */
00337       for (x=0;x<16;x++) {
00338          snprintf(iv + (x << 1), 3, "%02x", ((unsigned char *)value)[x]);
00339       }
00340       snprintf(output, maxlen, "[IV %s] %d encrypted blocks\n", iv, len / 16);
00341    } else
00342       snprintf(output, maxlen, "Invalid Encrypted Datalen %d", len);
00343 }

static void dump_hint ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 171 of file dundi-parser.c.

References dundi_hint2str().

00172 {
00173    unsigned short flags;
00174    char tmp[512];
00175    char tmp2[256];
00176    if (len < 2) {
00177       strncpy(output, "<invalid contents>", maxlen);
00178       return;
00179    }
00180    memcpy(&flags, value, sizeof(flags));
00181    flags = ntohs(flags);
00182    memset(tmp, 0, sizeof(tmp));
00183    dundi_hint2str(tmp2, sizeof(tmp2), flags);
00184    snprintf(tmp, sizeof(tmp), "[%s] ", tmp2);
00185    memcpy(tmp + strlen(tmp), value + 2, len - 2);
00186    strncpy(output, tmp, maxlen - 1);
00187 }

static void dump_ies ( unsigned char *  iedata,
int  spaces,
int  len 
) [static]

Definition at line 399 of file dundi-parser.c.

References DUNDI_IE_ENCDATA, ies, name, and outputf.

00400 {
00401    int ielen;
00402    int ie;
00403    int x;
00404    int found;
00405    char interp[1024];
00406    char tmp[1024];
00407    if (len < 2)
00408       return;
00409    while(len >= 2) {
00410       ie = iedata[0];
00411       ielen = iedata[1];
00412       /* Encrypted data is the remainder */
00413       if (ie == DUNDI_IE_ENCDATA)
00414          ielen = len - 2;
00415       if (ielen + 2> len) {
00416          snprintf(tmp, (int)sizeof(tmp), "Total IE length of %d bytes exceeds remaining frame length of %d bytes\n", ielen + 2, len);
00417          outputf(tmp);
00418          return;
00419       }
00420       found = 0;
00421       for (x=0;x<(int)sizeof(ies) / (int)sizeof(ies[0]); x++) {
00422          if (ies[x].ie == ie) {
00423             if (ies[x].dump) {
00424                ies[x].dump(interp, (int)sizeof(interp), iedata + 2, ielen);
00425                snprintf(tmp, (int)sizeof(tmp), "   %s%-15.15s : %s\n", (spaces ? "     " : "" ), ies[x].name, interp);
00426                outputf(tmp);
00427             } else {
00428                if (ielen)
00429                   snprintf(interp, (int)sizeof(interp), "%d bytes", ielen);
00430                else
00431                   strcpy(interp, "Present");
00432                snprintf(tmp, (int)sizeof(tmp), "   %s%-15.15s : %s\n", (spaces ? "     " : "" ), ies[x].name, interp);
00433                outputf(tmp);
00434             }
00435             found++;
00436          }
00437       }
00438       if (!found) {
00439          snprintf(tmp, (int)sizeof(tmp), "   %sUnknown IE %03d  : Present\n", (spaces ? "     " : "" ), ie);
00440          outputf(tmp);
00441       }
00442       iedata += (2 + ielen);
00443       len -= (2 + ielen);
00444    }
00445    outputf("\n");
00446 }

static void dump_int ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 227 of file dundi-parser.c.

00228 {
00229    if (len == (int)sizeof(unsigned int))
00230       snprintf(output, maxlen, "%lu", (unsigned long)ntohl(*((unsigned int *)value)));
00231    else
00232       snprintf(output, maxlen, "Invalid INT");
00233 }

static void dump_raw ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 345 of file dundi-parser.c.

00346 {
00347    int x;
00348    unsigned char *u = value;
00349    output[maxlen - 1] = '\0';
00350    strcpy(output, "[ ");
00351    for (x=0;x<len;x++) {
00352       snprintf(output + strlen(output), maxlen - strlen(output) - 1, "%02x ", u[x]);
00353    }
00354    strncat(output + strlen(output), "]", maxlen - strlen(output) - 1);
00355 }

static void dump_short ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 235 of file dundi-parser.c.

00236 {
00237    if (len == (int)sizeof(unsigned short))
00238       snprintf(output, maxlen, "%d", ntohs(*((unsigned short *)value)));
00239    else
00240       snprintf(output, maxlen, "Invalid SHORT");
00241 }

static void dump_string ( char *  output,
int  maxlen,
void *  value,
int  len 
) [static]

Definition at line 127 of file dundi-parser.c.

00128 {
00129    maxlen--;
00130    if (maxlen > len)
00131       maxlen = len;
00132    strncpy(output,value, maxlen);
00133    output[maxlen] = '\0';
00134 }

int dundi_eid_cmp ( dundi_eid eid1,
dundi_eid eid2 
)

Definition at line 122 of file dundi-parser.c.

Referenced by build_peer(), build_transactions(), destroy_trans(), dundi_answer_entity(), dundi_answer_query(), dundi_ie_append_eid_appropriately(), dundi_lookup_internal(), dundi_query_thread(), find_peer(), optimize_transactions(), and register_request().

00123 {
00124    return memcmp(eid1, eid2, sizeof(dundi_eid));
00125 }

char* dundi_eid_to_str ( char *  s,
int  maxlen,
dundi_eid eid 
)

Definition at line 57 of file dundi-parser.c.

References _dundi_eid::eid.

Referenced by append_transaction(), build_peer(), build_transactions(), cache_lookup(), cache_lookup_internal(), check_key(), complete_peer_helper(), destroy_trans(), do_autokill(), do_register(), do_register_expire(), dump_answer(), dump_eid(), dundi_answer_entity(), dundi_lookup_internal(), dundi_lookup_local(), dundi_lookup_thread(), dundi_precache_thread(), dundi_prop_precache(), dundi_query_thread(), dundi_send(), dundi_show_entityid(), dundi_show_peer(), dundi_show_requests(), handle_command_response(), populate_addr(), register_request(), reset_global_eid(), and update_key().

00058 {
00059    int x;
00060    char *os = s;
00061    if (maxlen < 18) {
00062       if (s && (maxlen > 0))
00063          *s = '\0';
00064    } else {
00065       for (x=0;x<5;x++) {
00066          sprintf(s, "%02x:", eid->eid[x]);
00067          s += 3;
00068       }
00069       sprintf(s, "%02x", eid->eid[5]);
00070    }
00071    return os;
00072 }

char* dundi_eid_to_str_short ( char *  s,
int  maxlen,
dundi_eid eid 
)

Definition at line 74 of file dundi-parser.c.

References _dundi_eid::eid.

Referenced by cache_lookup(), cache_save(), cache_save_hint(), and handle_command_response().

00075 {
00076    int x;
00077    char *os = s;
00078    if (maxlen < 13) {
00079       if (s && (maxlen > 0))
00080          *s = '\0';
00081    } else {
00082       for (x=0;x<6;x++) {
00083          sprintf(s, "%02X", eid->eid[x]);
00084          s += 2;
00085       }
00086    }
00087    return os;
00088 }

int dundi_eid_zero ( dundi_eid eid  ) 

Definition at line 114 of file dundi-parser.c.

References _dundi_eid::eid.

Referenced by build_transactions(), dundi_discover(), dundi_query(), dundi_show_requests(), and precache_trans().

00115 {
00116    int x;
00117    for (x=0;x<sizeof(eid->eid) / sizeof(eid->eid[0]);x++)
00118       if (eid->eid[x]) return 0;
00119    return 1;
00120 }

char* dundi_flags2str ( char *  buf,
int  bufsiz,
int  flags 
)

Definition at line 273 of file dundi-parser.c.

References ast_strlen_zero(), DUNDI_FLAG_CANMATCH, DUNDI_FLAG_COMMERCIAL, DUNDI_FLAG_EXISTS, DUNDI_FLAG_IGNOREPAT, DUNDI_FLAG_MATCHMORE, DUNDI_FLAG_MOBILE, DUNDI_FLAG_NOCOMUNSOLICIT, DUNDI_FLAG_NOUNSOLICITED, and DUNDI_FLAG_RESIDENTIAL.

Referenced by cache_lookup_internal(), dump_answer(), dundi_do_lookup(), and dundi_show_mappings().

00274 {
00275    strcpy(buf, "");
00276    buf[bufsiz-1] = '\0';
00277    if (flags & DUNDI_FLAG_EXISTS) {
00278       strncat(buf, "EXISTS|", bufsiz - strlen(buf) - 1);
00279    }
00280    if (flags & DUNDI_FLAG_MATCHMORE) {
00281       strncat(buf, "MATCHMORE|", bufsiz - strlen(buf) - 1);
00282    }
00283    if (flags & DUNDI_FLAG_CANMATCH) {
00284       strncat(buf, "CANMATCH|", bufsiz - strlen(buf) - 1);
00285    }
00286    if (flags & DUNDI_FLAG_IGNOREPAT) {
00287       strncat(buf, "IGNOREPAT|", bufsiz - strlen(buf) - 1);
00288    }
00289    if (flags & DUNDI_FLAG_RESIDENTIAL) {
00290       strncat(buf, "RESIDENCE|", bufsiz - strlen(buf) - 1);
00291    }
00292    if (flags & DUNDI_FLAG_COMMERCIAL) {
00293       strncat(buf, "COMMERCIAL|", bufsiz - strlen(buf) - 1);
00294    }
00295    if (flags & DUNDI_FLAG_MOBILE) {
00296       strncat(buf, "MOBILE", bufsiz - strlen(buf) - 1);
00297    }
00298    if (flags & DUNDI_FLAG_NOUNSOLICITED) {
00299       strncat(buf, "NOUNSLCTD|", bufsiz - strlen(buf) - 1);
00300    }
00301    if (flags & DUNDI_FLAG_NOCOMUNSOLICIT) {
00302       strncat(buf, "NOCOMUNSLTD|", bufsiz - strlen(buf) - 1);
00303    }
00304    /* Get rid of trailing | */
00305    if (ast_strlen_zero(buf))
00306       strcpy(buf, "NONE|");
00307    buf[strlen(buf)-1] = '\0';
00308    return buf;
00309 }

char* dundi_hint2str ( char *  buf,
int  bufsiz,
int  flags 
)

Definition at line 151 of file dundi-parser.c.

References ast_strlen_zero(), DUNDI_HINT_DONT_ASK, DUNDI_HINT_TTL_EXPIRED, and DUNDI_HINT_UNAFFECTED.

Referenced by dump_hint().

00152 {
00153    strcpy(buf, "");
00154    buf[bufsiz-1] = '\0';
00155    if (flags & DUNDI_HINT_TTL_EXPIRED) {
00156       strncat(buf, "TTLEXPIRED|", bufsiz - strlen(buf) - 1);
00157    }
00158    if (flags & DUNDI_HINT_DONT_ASK) {
00159       strncat(buf, "DONTASK|", bufsiz - strlen(buf) - 1);
00160    }
00161    if (flags & DUNDI_HINT_UNAFFECTED) {
00162       strncat(buf, "UNAFFECTED|", bufsiz - strlen(buf) - 1);
00163    }
00164    /* Get rid of trailing | */
00165    if (ast_strlen_zero(buf))
00166       strcpy(buf, "NONE|");
00167    buf[strlen(buf)-1] = '\0';
00168    return buf;
00169 }

const char* dundi_ie2str ( int  ie  ) 

Definition at line 389 of file dundi-parser.c.

References ies, and name.

Referenced by dundi_ie_append_answer(), dundi_ie_append_cause(), dundi_ie_append_encdata(), dundi_ie_append_hint(), dundi_ie_append_raw(), and dundi_parse_ies().

00390 {
00391    int x;
00392    for (x=0;x<(int)sizeof(ies) / (int)sizeof(ies[0]); x++) {
00393       if (ies[x].ie == ie)
00394          return ies[x].name;
00395    }
00396    return "Unknown IE";
00397 }

int dundi_ie_append ( struct dundi_ie_data ied,
unsigned char  ie 
)

Definition at line 640 of file dundi-parser.c.

References dundi_ie_append_raw().

Referenced by dundi_discover().

00641 {
00642    return dundi_ie_append_raw(ied, ie, NULL, 0);
00643 }

int dundi_ie_append_addr ( struct dundi_ie_data ied,
unsigned char  ie,
struct sockaddr_in *  sin 
)

Definition at line 606 of file dundi-parser.c.

References dundi_ie_append_raw().

00607 {
00608    return dundi_ie_append_raw(ied, ie, sin, (int)sizeof(struct sockaddr_in));
00609 }

int dundi_ie_append_answer ( struct dundi_ie_data ied,
unsigned char  ie,
dundi_eid eid,
unsigned char  protocol,
unsigned short  flags,
unsigned short  weight,
char *  data 
)

Definition at line 579 of file dundi-parser.c.

References dundi_ie_data::buf, dundi_ie2str(), _dundi_eid::eid, errorf, and dundi_ie_data::pos.

Referenced by dundi_lookup_thread(), and precache_trans().

00580 {
00581    char tmp[256];
00582    int datalen = data ? strlen(data) + 11 : 11;
00583    int x;
00584    unsigned short myw;
00585    if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
00586       snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
00587       errorf(tmp);
00588       return -1;
00589    }
00590    ied->buf[ied->pos++] = ie;
00591    ied->buf[ied->pos++] = datalen;
00592    for (x=0;x<6;x++)
00593       ied->buf[ied->pos++] = eid->eid[x];
00594    ied->buf[ied->pos++] = protocol;
00595    myw = htons(flags);
00596    memcpy(ied->buf + ied->pos, &myw, 2);
00597    ied->pos += 2;
00598    myw = htons(weight);
00599    memcpy(ied->buf + ied->pos, &myw, 2);
00600    ied->pos += 2;
00601    memcpy(ied->buf + ied->pos, data, datalen-11);
00602    ied->pos += datalen-11;
00603    return 0;
00604 }

int dundi_ie_append_byte ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned char  dat 
)

Definition at line 635 of file dundi-parser.c.

References dundi_ie_append_raw().

00636 {
00637    return dundi_ie_append_raw(ied, ie, &dat, 1);
00638 }

int dundi_ie_append_cause ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned char  cause,
char *  data 
)

Definition at line 523 of file dundi-parser.c.

References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos.

Referenced by dundi_answer_entity(), dundi_answer_query(), dundi_lookup_thread(), and handle_command_response().

00524 {
00525    char tmp[256];
00526    int datalen = data ? strlen(data) + 1 : 1;
00527    if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
00528       snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
00529       errorf(tmp);
00530       return -1;
00531    }
00532    ied->buf[ied->pos++] = ie;
00533    ied->buf[ied->pos++] = datalen;
00534    ied->buf[ied->pos++] = cause;
00535    memcpy(ied->buf + ied->pos, data, datalen-1);
00536    ied->pos += datalen-1;
00537    return 0;
00538 }

int dundi_ie_append_eid ( struct dundi_ie_data ied,
unsigned char  ie,
dundi_eid eid 
)

Definition at line 630 of file dundi-parser.c.

References dundi_ie_append_raw().

Referenced by do_register(), dundi_discover(), dundi_encrypt(), dundi_ie_append_eid_appropriately(), dundi_query(), and precache_trans().

00631 {
00632    return dundi_ie_append_raw(ied, ie, (unsigned char *)eid, sizeof(dundi_eid));
00633 }

int dundi_ie_append_encdata ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned char *  iv,
void *  data,
int  datalen 
)

Definition at line 559 of file dundi-parser.c.

References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos.

Referenced by dundi_encrypt().

00560 {
00561    char tmp[256];
00562    datalen += 16;
00563    if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
00564       snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
00565       errorf(tmp);
00566       return -1;
00567    }
00568    ied->buf[ied->pos++] = ie;
00569    ied->buf[ied->pos++] = datalen;
00570    memcpy(ied->buf + ied->pos, iv, 16);
00571    ied->pos += 16;
00572    if (data) {
00573       memcpy(ied->buf + ied->pos, data, datalen-16);
00574       ied->pos += datalen-16;
00575    }
00576    return 0;
00577 }

int dundi_ie_append_hint ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned short  flags,
char *  data 
)

Definition at line 540 of file dundi-parser.c.

References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos.

Referenced by dundi_lookup_thread(), dundi_query_thread(), and precache_trans().

00541 {
00542    char tmp[256];
00543    int datalen = data ? strlen(data) + 2 : 2;
00544    if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
00545       snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
00546       errorf(tmp);
00547       return -1;
00548    }
00549    ied->buf[ied->pos++] = ie;
00550    ied->buf[ied->pos++] = datalen;
00551    flags = htons(flags);
00552    memcpy(ied->buf + ied->pos, &flags, sizeof(flags));
00553    ied->pos += 2;
00554    memcpy(ied->buf + ied->pos, data, datalen-1);
00555    ied->pos += datalen-2;
00556    return 0;
00557 }

int dundi_ie_append_int ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned int  value 
)

Definition at line 611 of file dundi-parser.c.

References dundi_ie_append_raw().

Referenced by dundi_encrypt().

00612 {
00613    unsigned int newval;
00614    newval = htonl(value);
00615    return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval));
00616 }

int dundi_ie_append_raw ( struct dundi_ie_data ied,
unsigned char  ie,
void *  data,
int  datalen 
)

Definition at line 508 of file dundi-parser.c.

References dundi_ie_data::buf, dundi_ie2str(), errorf, and dundi_ie_data::pos.

Referenced by dundi_encrypt(), dundi_ie_append(), dundi_ie_append_addr(), dundi_ie_append_byte(), dundi_ie_append_eid(), dundi_ie_append_int(), dundi_ie_append_short(), and dundi_ie_append_str().

00509 {
00510    char tmp[256];
00511    if (datalen > ((int)sizeof(ied->buf) - ied->pos)) {
00512       snprintf(tmp, (int)sizeof(tmp), "Out of space for ie '%s' (%d), need %d have %d\n", dundi_ie2str(ie), ie, datalen, (int)sizeof(ied->buf) - ied->pos);
00513       errorf(tmp);
00514       return -1;
00515    }
00516    ied->buf[ied->pos++] = ie;
00517    ied->buf[ied->pos++] = datalen;
00518    memcpy(ied->buf + ied->pos, data, datalen);
00519    ied->pos += datalen;
00520    return 0;
00521 }

int dundi_ie_append_short ( struct dundi_ie_data ied,
unsigned char  ie,
unsigned short  value 
)

Definition at line 618 of file dundi-parser.c.

References dundi_ie_append_raw().

Referenced by do_register(), dundi_discover(), dundi_lookup_thread(), dundi_query(), handle_command_response(), and precache_trans().

00619 {
00620    unsigned short newval;
00621    newval = htons(value);
00622    return dundi_ie_append_raw(ied, ie, &newval, (int)sizeof(newval));
00623 }

int dundi_ie_append_str ( struct dundi_ie_data ied,
unsigned char  ie,
char *  str 
)

Definition at line 625 of file dundi-parser.c.

References dundi_ie_append_raw().

Referenced by dundi_discover(), dundi_query(), dundi_query_thread(), and precache_trans().

00626 {
00627    return dundi_ie_append_raw(ied, ie, str, strlen(str));
00628 }

int dundi_parse_ies ( struct dundi_ies ies,
unsigned char *  data,
int  datalen 
)

Definition at line 655 of file dundi-parser.c.

References dundi_ie2str(), DUNDI_IE_ANSWER, DUNDI_IE_CACHEBYPASS, DUNDI_IE_CALLED_CONTEXT, DUNDI_IE_CALLED_NUMBER, DUNDI_IE_CAUSE, DUNDI_IE_COUNTRY, DUNDI_IE_DEPARTMENT, DUNDI_IE_EID, DUNDI_IE_EID_DIRECT, DUNDI_IE_EMAIL, DUNDI_IE_ENCDATA, DUNDI_IE_EXPIRATION, DUNDI_IE_HINT, DUNDI_IE_IPADDR, DUNDI_IE_KEYCRC32, DUNDI_IE_LOCALITY, DUNDI_IE_ORGANIZATION, DUNDI_IE_PHONE, DUNDI_IE_REQEID, DUNDI_IE_SHAREDKEY, DUNDI_IE_SIGNATURE, DUNDI_IE_STATE_PROV, DUNDI_IE_TTL, DUNDI_IE_UNKNOWN, DUNDI_IE_VERSION, DUNDI_MAX_ANSWERS, DUNDI_MAX_STACK, errorf, ies, and outputf.

Referenced by handle_command_response().

00656 {
00657    /* Parse data into information elements */
00658    int len;
00659    int ie;
00660    char tmp[256];
00661    memset(ies, 0, (int)sizeof(struct dundi_ies));
00662    ies->ttl = -1;
00663    ies->expiration = -1;
00664    ies->unknowncmd = -1;
00665    ies->cause = -1;
00666    while(datalen >= 2) {
00667       ie = data[0];
00668       len = data[1];
00669       if (len > datalen - 2) {
00670          errorf("Information element length exceeds message size\n");
00671          return -1;
00672       }
00673       switch(ie) {
00674       case DUNDI_IE_EID:
00675       case DUNDI_IE_EID_DIRECT:
00676          if (len != (int)sizeof(dundi_eid)) {
00677             errorf("Improper entity identifer, expecting 6 bytes!\n");
00678          } else if (ies->eidcount < DUNDI_MAX_STACK) {
00679             ies->eids[ies->eidcount] = (dundi_eid *)(data + 2);
00680             ies->eid_direct[ies->eidcount] = (ie == DUNDI_IE_EID_DIRECT);
00681             ies->eidcount++;
00682          } else
00683             errorf("Too many entities in stack!\n");
00684          break;
00685       case DUNDI_IE_REQEID:
00686          if (len != (int)sizeof(dundi_eid)) {
00687             errorf(