m4_dnl - playback routines
m4_dnl This file is part of adns, which is
-m4_dnl Copyright (C) 1997-2000,2003,2006 Ian Jackson
+m4_dnl Copyright (C) 1997-2000,2003,2006,2014-2016,2020 Ian Jackson
+m4_dnl Copyright (C) 2014 Mark Wooding
m4_dnl Copyright (C) 1999-2000,2003,2006 Tony Finch
m4_dnl Copyright (C) 1991 Massachusetts Institute of Technology
m4_dnl (See the file INSTALL for full details.)
m4_dnl
m4_dnl This program is free software; you can redistribute it and/or modify
m4_dnl it under the terms of the GNU General Public License as published by
-m4_dnl the Free Software Foundation; either version 2, or (at your option)
+m4_dnl the Free Software Foundation; either version 3, or (at your option)
m4_dnl any later version.
m4_dnl
m4_dnl This program is distributed in the hope that it will be useful,
m4_dnl GNU General Public License for more details.
m4_dnl
m4_dnl You should have received a copy of the GNU General Public License
-m4_dnl along with this program; if not, write to the Free Software Foundation,
-m4_dnl Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+m4_dnl along with this program; if not, write to the Free Software Foundation.
m4_include(hmacros.i4)
}
void Tensurerecordfile(void) {
- const char *fdstr;
int fd;
int chars;
unsigned long sec, usec;
if (Tinputfile) return;
Tinputfile= stdin;
- fdstr= getenv("ADNS_TEST_IN_FD");
- if (fdstr) {
- fd= atoi(fdstr);
+ fd = Ttestinputfd();
+ if (fd >= 0) {
Tinputfile= fdopen(fd,"r"); if (!Tinputfile) Tfailed("fdopen ADNS_TEST_IN_FD");
}
setvbuf(Tinputfile,0,_IONBF,0);
if (te->n) return te->v;
r= strtoul(stuff+2,&ep,10);
if (*ep) Psyntax("errno value not recognised, not numeric");
+ if (r==0 || r>255) Psyntax("numeric errno out of range 1..255");
return r;
}
static void Pfdset(fd_set *set, int max) {
int r, c;
char *ep;
+
+ if (!set) {
+ Pstring("null","null fdset pointer");
+ return;
+ }
if (vb2.buf[vb2.used++] != hm_squote[hm_squote) Psyntax("fd set start not [");
FD_ZERO(set);
#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);
- if (*ep && *ep != hm_squote hm_squote) Psyntax("invalid port (bad syntax)");
+ 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;
}