}
#endif
static void Paddr(struct sockaddr *addr, int *lenr) {
- struct sockaddr_in *sa= (struct sockaddr_in*)addr;
- char *p, *ep;
- long ul;
- assert(*lenr >= sizeof(*sa));
- p= strchr(vb2.buf+vb2.used,':');
- if (!p) Psyntax("no port on address");
- *p++= 0;
- memset(sa,0,sizeof(*sa));
- sa->sin_family= AF_INET;
- if (!inet_aton(vb2.buf+vb2.used,&sa->sin_addr)) Psyntax("invalid address");
- ul= strtoul(p,&ep,10);
+ adns_rr_addr a;
+ char *p, *q, *ep;
+ int err;
+ unsigned long ul;
+ p= vb2.buf+vb2.used;
+ if (*p!='[') {
+ q= strchr(p,':');
+ if (!q) Psyntax("missing :");
+ *q++= 0;
+ } else {
+ p++;
+ q= strchr(p,']');
+ if (!q) Psyntax("missing ]");
+ *q++= 0;
+ if (*q!=':') Psyntax("expected : after ]");
+ q++;
+ }
+ ul= strtoul(q,&ep,10);
if (*ep && *ep != ' ') Psyntax("invalid port (bad syntax)");
if (ul >= 65536) Psyntax("port too large");
- sa->sin_port= htons(ul);
- *lenr= sizeof(*sa);
+ a.len= sizeof(a.addr);
+ err= adns_text2addr(p, (int)ul, 0, &a.addr.sa,&a.len);
+ if (err) Psyntax("invalid address");
+ assert(*lenr >= a.len);
+ memcpy(addr, &a.addr, a.len);
+ *lenr= a.len;
vb2.used= ep - (char*)vb2.buf;
}
static int Pbytes(byte *buf, int maxlen) {
}
}
void Q_vb(void) {
- int r;
const char *nl;
Tensurerecordfile();
if (!adns__vbuf_ensure(&vb2,vb.used+2)) Tnomem();
- r= fread(vb2.buf,1,vb.used+2,Tinputfile);
+ fread(vb2.buf,1,vb.used+2,Tinputfile);
if (feof(Tinputfile)) {
fprintf(stderr,"adns test harness: input ends prematurely; program did:\n %.*s\n",
vb.used,vb.buf);
int Hsocket( int domain , int type , int protocol ) {
int r, amtread;
char *ep;
- Tmust("socket","domain",domain==AF_INET);
+ Tmust("socket","domain",domain==AF_INET || domain==AF_INET6);
Tmust("socket","type",type==SOCK_STREAM || type==SOCK_DGRAM);
- Qsocket( type );
+ Qsocket( domain , type );
if (!adns__vbuf_ensure(&vb2,1000)) Tnomem();
fgets(vb2.buf,vb2.avail,Tinputfile); Pcheckinput();
Tensurereportfile();