--- enum.c.org Sun Dec 7 13:02:16 2003 +++ enum.c Sun Dec 7 13:01:06 2003 @@ -11,6 +11,9 @@ * */ +/* Uncomment to provide debugging */ +/* #define ENUMDEBUG 0 */ + #include #include #include @@ -38,8 +41,10 @@ #define T_NAPTR 35 #endif -#define TOPLEV "e164.arpa." +#define TOPLEV "e164.arpa." /* ENUM Top level, if not defined otherwise in enum.conf */ +#define ENUMCONF "enum.conf" /* ENUM Config file */ +/* Storage of enum config - one or several top roots */ static struct enum_search { char toplev[80]; struct enum_search *next; @@ -49,11 +54,14 @@ static ast_mutex_t enumlock = AST_MUTEX_INITIALIZER; + +/* NAPTR record from DNS. We only read one. Shold be fixed */ struct naptr { unsigned short order; unsigned short pref; } __attribute__ ((__packed__)); +/* Parse something */ static int parse_ie(unsigned char *data, int maxdatalen, unsigned char *src, int srclen) { int len, olen; @@ -70,6 +78,7 @@ return olen + 1; } +/* Parse NAPTR record from DNS */ static int parse_naptr(unsigned char *dst, int dstsize, char *tech, int techsize, unsigned char *answer, int len, char *naptrinput) { unsigned char *oanswer = answer; @@ -104,14 +113,21 @@ ast_log(LOG_WARNING, "Failed to get services\n"); return -1; } else { answer += res; len -= res; } - if ((res = parse_ie(regexp, sizeof(regexp) - 1, answer, len)) < 0) - return -1; else { answer += res; len -= res; } + if ((res = parse_ie(regexp, sizeof(regexp) - 1, answer, len)) < 0) { + +#ifdef ENUMDEBUG + printf ("Regexp 0: -%s- Length %d\n",regexp,strlen(regexp)); +#endif + ast_log(LOG_WARNING, "Failed to get regexp\n"); + return -1; + } else { + answer += res; len -= res; } if ((res = dn_expand(oanswer,answer + len,answer, repl, sizeof(repl) - 1)) < 0) { ast_log(LOG_WARNING, "Failed to expand hostname\n"); return -1; } - ast_log(LOG_DEBUG, "input='%s', flags='%s', services='%s', regexp='%s', repl='%s'\n", + ast_log(LOG_DEBUG, "NAPTR Record: input='%s', flags='%s', services='%s', regexp='%s', repl='%s'\n", naptrinput, flags, services, regexp, repl); if (tolower(flags[0]) != 'u') { @@ -140,7 +156,7 @@ strncpy(tech, services+10, techsize -1); } else { ast_log(LOG_DEBUG, - "Services must be e2u+${tech}, ${tech}+e2u, or e2u+voice: where $tech is from (sip, h323, tel, iax, iax2). \n"); + "Services must be e2u+${tech}, ${tech}+e2u, or e2u+voice: where $tech is from (sip, h323, tel, iax, iax2, x-iax2). \n"); return 0; } @@ -148,6 +164,10 @@ strcpy(regexp, "!^\\+43(.*)$!\\1@bla.fasel!"); */ +#ifdef ENUMDEBUG + printf("Regexp 1: -%s- Len %d chars\n", regexp,strlen(regexp)); +#endif + regexp_len = strlen(regexp); if (regexp_len < 7) { ast_log(LOG_WARNING, "Regex too short to be meaningful.\n"); @@ -155,21 +175,24 @@ } - delim = regexp[0]; - delim2 = strchr(regexp + 1, delim); + delim = regexp[0]; /* Get first delimiter */ + delim2 = strchr(regexp + 1, delim); /* check for second delimiter */ + /* CHeck for end delimiter */ if ((delim2 == NULL) || (regexp[regexp_len-1] != delim)) { ast_log(LOG_WARNING, "Regex delimiter error (on \"%s\").\n",regexp); return -1; } - pattern = regexp + 1; - *delim2 = 0; - subst = delim2 + 1; - regexp[regexp_len-1] = 0; - -#if 0 - printf("Pattern: %s\n", pattern); - printf("Subst: %s\n", subst); + pattern = regexp + 1; /* Match pattern: the first part of regexp */ + *delim2 = 0; /* terminate pattern string */ + subst = delim2 + 1; /* Substitution pattern, the second part of regexp */ + regexp[regexp_len-1] = 0; /* Terminate subst pattern (at delimiter) */ + +#ifdef ENUMDEBUG + printf("Regexp 2: -%s- Len %d chars\n", regexp,strlen(regexp)); + printf("Pattern: -%s- Len %d\n", pattern,strlen(pattern)); + printf("Subst: -%s- Len %d\n", subst,strlen(subst)); + printf("Naptrinput: %s\n", naptrinput); #endif /* @@ -177,7 +200,7 @@ */ if (regcomp(&preg, pattern, REG_EXTENDED | REG_NEWLINE)) { - ast_log(LOG_WARNING, "Regex compilation error (regex = \"%s\").\n",regexp); + ast_log(LOG_WARNING, "Regex compilation error (pattern = \"%s\").\n",pattern); return -1; } @@ -324,7 +347,7 @@ free(sl); } toplevs = NULL; - cfg = ast_load("enum.conf"); + cfg = ast_load(ENUMCONF); if (cfg) { sl = NULL; v = ast_variable_browse(cfg, "general"); @@ -338,6 +361,9 @@ toplevs = s; sl = s; } + } else { + /* Undefined option, complain to user */ + ast_log(LOG_WARNING,"Undefined option in %s: %s\n",ENUMCONF,v->name); } v = v->next; }