aboutsummaryrefslogtreecommitdiffstats
path: root/srv.c
diff options
context:
space:
mode:
Diffstat (limited to 'srv.c')
-rwxr-xr-xsrv.c55
1 files changed, 14 insertions, 41 deletions
diff --git a/srv.c b/srv.c
index 95965ef69..c6365e361 100755
--- a/srv.c
+++ b/srv.c
@@ -119,13 +119,12 @@ static int parse_ie(unsigned char *data, int maxdatalen, unsigned char *src, int
return olen + 1;
}
-static int parse_srv(unsigned char *host, int hostlen, int *portno, unsigned char *answer, int len)
+static int parse_srv(unsigned char *host, int hostlen, int *portno, unsigned char *answer, int len, unsigned char *msg)
{
int res = 0;
struct srv *srv = (struct srv *)answer;
char repl[256] = "";
- char *oanswer = answer;
-
+
if (len < sizeof(struct srv)) {
printf("Length too short\n");
return -1;
@@ -133,52 +132,21 @@ static int parse_srv(unsigned char *host, int hostlen, int *portno, unsigned cha
answer += sizeof(struct srv);
len -= sizeof(struct srv);
- if ((res = dn_expand(oanswer,answer + len,answer, repl, sizeof(repl) - 1)) < 0) {
+ if ((res = dn_expand(msg,answer + len,answer, repl, sizeof(repl) - 1)) < 0) {
ast_log(LOG_WARNING, "Failed to expand hostname\n");
return -1;
}
if (res && strcmp(repl, ".")) {
+ ast_verbose( VERBOSE_PREFIX_3 "parse_srv: SRV mapped to host %s, port %d\n", repl, ntohs(srv->portnum));
if (host) {
- strncpy(host, repl, hostlen - 1);
- host[hostlen] = '\0';
+ strncpy(host, repl, hostlen - 2);
+ host[hostlen-1] = '\0';
}
if (portno)
*portno = ntohs(srv->portnum);
- res = 1;
+ return(0);
}
-
-#if 0
- if ((res = parse_ie(flags, sizeof(flags) - 1, answer, len)) < 0) {
- ast_log(LOG_WARNING, "Failed to get flags\n");
- return -1;
- } else { answer += res; len -= res; }
- if ((res = parse_ie(services, sizeof(services) - 1, answer, len)) < 0) {
- 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 0
- printf("Flags: %s\n", flags);
- printf("Services: %s\n", services);
- printf("Regexp: %s\n", regexp);
- printf("Repl: %s\n", repl);
-#endif
- if (!strncmp(regexp, "!^.*$!", 6)) {
- if (!strncmp(services, "E2U+voice:", 10)) {
- if (regexp[strlen(regexp) - 1] == '!')
- regexp[strlen(regexp) - 1] = '\0';
-#if 0
- printf("Technology: %s\n", services + 10);
- printf("Destination: %s\n", regexp + 6);
-#endif
- strncpy(dst, regexp + 6, dstsize);
- strncpy(tech, services + 10, techsize);
- }
- } else
- ast_log(LOG_WARNING, "Non-total substitution not yet supported\n");
-#endif
- return 0;
+ return(-1);
}
static int parse_answer(unsigned char *host, int hostlen, int *port, char *answer, int len)
@@ -190,8 +158,11 @@ static int parse_answer(unsigned char *host, int hostlen, int *port, char *answe
int res;
dns_HEADER *h;
struct dn_answer *ans;
+/* int lastlit = 1; */
+ char *oanswer = answer;
host[0] = '\0';
*port = 0;
+
#if 0
for (x=0;x<len;x++) {
if ((answer[x] < 32) || (answer[x] > 127)) {
@@ -257,8 +228,10 @@ static int parse_answer(unsigned char *host, int hostlen, int *port, char *answe
return -1;
}
if ((ntohs(ans->class) == C_IN) && (ntohs(ans->rtype) == T_SRV)) {
- if (parse_srv(host, hostlen, port, answer, ntohs(ans->size)))
+
+ if (parse_srv(host, hostlen, port, answer, ntohs(ans->size),oanswer))
ast_log(LOG_WARNING, "Failed to parse srv :(\n");
+
if (strlen(host))
return 0;
}