You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kamailio/test/dns_query.c

222 lines
6.0 KiB

/*
* $Id$
*
* tests for ../resolver.c
*
* Compile with:
* gcc -o dns_query2 dns_query.c ../resolve.o ../dprint.o ../mem/ *.o -lresolv
* (and first compile ser with qm_malloc)
*
*
* Copyright (C) 2001-2003 FhG Fokus
*
* This file is part of ser, a free SIP server.
*
* ser is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version
*
* For a license to use the ser software under conditions
* other than those described here, or to purchase support for this
* software, please contact iptel.org by e-mail at the following addresses:
* info@iptel.org
*
* ser is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*
* tester for ser resolver (andrei) */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include "../resolve.h"
#include "../mem/q_malloc.h"
/* symbols needed by dprint */
int log_stderr=1;
int debug=0;
int pids[1];
int process_no=0;
long shm_mem_size=0;
char mem_pool[1024*1024];
struct qm_block* mem_block;
int log_facility=0;
int memlog=0;
int memdbg=0;
int ser_error=0;
struct process_table* pt=0;
static char* id="$Id$";
static char* version="dns_query 0.1";
static char* help_msg="\
Usage: dns_query [-t type] [-hV] -n host\n\
Options:\n\
-n host host name\n\
-t type query type (default A)\n\
-V version number\n\
-h this help message\n\
";
int main(int argc, char** argv)
{
char c;
char* name;
char* type_str;
int type;
int r;
struct rdata* head;
struct rdata* l;
struct srv_rdata* srv;
struct naptr_rdata* naptr;
struct a_rdata* ip;
name=type_str=0;
opterr=0;
while ((c=getopt(argc, argv, "n:t:hV"))!=-1){
switch(c){
case 'n':
name=optarg;
break;
case 't':
type_str=optarg;
break;
case 'V':
printf("version: %s\n", version);
printf("%s\n", id);
exit(0);
break;
case 'h':
printf("version: %s\n", version);
printf("%s", help_msg);
exit(0);
break;
case '?':
if (isprint(optopt))
fprintf(stderr, "Unknown option `-%c<>\n", optopt);
else
fprintf(stderr, "Unknown character `\\x%x<>\n", optopt);
goto error;
case ':':
fprintf(stderr, "Option `-%c<> requires an argument.\n",
optopt);
goto error;
break;
default:
abort();
}
}
if (name==0){
fprintf(stderr, "Missing domain name (-n name)\n");
goto error;
}
type=T_A;
if (type_str){
if (strcasecmp(type_str, "A")==0) type=T_A;
else if (strcasecmp(type_str, "NS")==0) type=T_NS;
else if (strcasecmp(type_str, "MD")==0) type=T_MD;
else if (strcasecmp(type_str, "MF")==0) type=T_MF;
else if (strcasecmp(type_str, "CNAME")==0) type=T_CNAME;
else if (strcasecmp(type_str, "SOA")==0) type=T_SOA;
else if (strcasecmp(type_str, "PTR")==0) type=T_PTR;
else if (strcasecmp(type_str, "HINFO")==0) type=T_HINFO;
else if (strcasecmp(type_str, "MINFO")==0) type=T_MINFO;
else if (strcasecmp(type_str, "MX")==0) type=T_MX;
else if (strcasecmp(type_str, "TXT")==0) type=T_TXT;
else if (strcasecmp(type_str, "AAAA")==0) type=T_AAAA;
else if (strcasecmp(type_str, "SRV")==0) type=T_SRV;
else if (strcasecmp(type_str, "NAPTR")==0) type=T_NAPTR;
else if (strcasecmp(type_str, "AXFR")==0) type=T_AXFR;
else{
fprintf(stderr, "Unknown query type %s\n", type_str);
goto error;
}
}
/* init mallocs*/
mem_block=qm_malloc_init(mem_pool, 1024*1024);
printf("calling get_record...\n");
head=get_record(name, type);
if (head==0) printf("no answer\n");
else{
printf("records:\n");
for(l=head; l; l=l->next){
switch(l->type){
case T_SRV:
srv=(struct srv_rdata*)l->rdata;
printf("SRV type= %d class=%d ttl=%d\n",
l->type, l->class, l->ttl);
printf(" prio= %d weight=%d port=%d\n",
srv->priority, srv->weight, srv->port);
printf(" name_len= %d (%d), name= [%.*s]\n",
srv->name_len, strlen(srv->name),
srv->name_len, srv->name);
break;
case T_CNAME:
printf("CNAME type= %d class=%d ttl=%d\n",
l->type, l->class, l->ttl);
printf(" name=[%s]\n",
((struct cname_rdata*)l->rdata)->name);
break;
case T_A:
ip=(struct a_rdata*)l->rdata;
printf("A type= %d class=%d ttl=%d\n",
l->type, l->class, l->ttl);
printf(" ip= %d.%d.%d.%d\n",
ip->ip[0], ip->ip[1], ip->ip[2], ip->ip[3]);
break;
case T_AAAA:
printf("AAAA type= %d class=%d ttl=%d\n",
l->type, l->class, l->ttl);
printf(" ip6= ");
for(r=0;r<16;r++)
printf("%x ", ((struct aaaa_rdata*)l->rdata)->ip6[r]);
printf("\n");
break;
case T_NAPTR:
naptr=(struct naptr_rdata*)l->rdata;
printf("NAPTR type= %d class=%d ttl=%d\n",
l->type, l->class, l->ttl);
printf(" order= %d pref=%d\n",
naptr->order, naptr->pref);
printf(" flags_len= %d, flags= [%.*s]\n",
naptr->flags_len,
naptr->flags_len, naptr->flags);
printf(" services_len= %d, services= [%.*s]\n",
naptr->services_len,
naptr->services_len, naptr->services);
printf(" regexp_len= %d, regexp= [%.*s]\n",
naptr->regexp_len,
naptr->regexp_len, naptr->regexp);
printf(" repl_len= %d, repl= [%s]\n",
naptr->repl_len, naptr->repl);
break;
default:
printf("UNKN type= %d class=%d ttl=%d\n",
l->type, l->class, l->ttl);
printf(" rdata=%p\n", l->rdata);
}
}
}
printf("done\n");
exit(0);
error:
exit(-1);
}