16 #define FATAL "dnsfilter: fatal: "
20 strerr_die2x(111,FATAL
,"out of memory");
27 struct dns_transmit dt
;
32 unsigned int xmax
= 1000;
33 unsigned int xnum
= 0;
34 unsigned int numactive
= 0;
35 unsigned int maxactive
= 10;
37 static stralloc partial
;
49 char name
[DNS_NAME4_DOMAIN
];
55 if (!stralloc_copys(&x
[i
].middle
,":")) nomem();
56 if (!stralloc_cats(&x
[i
].middle
,error_str(errno
))) nomem();
57 for (j
= 0;j
< x
[i
].middle
.len
;++j
)
58 if (x
[i
].middle
.s
[j
] == ' ')
59 x
[i
].middle
.s
[j
] = '-';
62 int main(int argc
,char **argv
)
72 while ((opt
= getopt(argc
,argv
,"c:l:")) != opteof
)
75 scan_ulong(optarg
,&u
);
77 if (u
> 1000) u
= 1000;
81 scan_ulong(optarg
,&u
);
83 if (u
> 1000000) u
= 1000000;
87 strerr_die1x(111,"dnsfilter: usage: dnsfilter [ -c concurrency ] [ -l lines ]");
90 x
= (struct line
*) alloc(xmax
* sizeof(struct line
));
92 byte_zero(x
,xmax
* sizeof(struct line
));
94 io
= (iopause_fd
*) alloc((xmax
+ 1) * sizeof(iopause_fd
));
97 if (!stralloc_copys(&partial
,"")) nomem();
100 while (flag0
|| inbuflen
|| partial
.len
|| xnum
) {
102 taia_uint(&deadline
,120);
103 taia_add(&deadline
,&deadline
,&stamp
);
108 if (inbuflen
< sizeof inbuf
) {
111 inio
->events
= IOPAUSE_READ
;
114 for (i
= 0;i
< xnum
;++i
)
115 if (x
[i
].flagactive
) {
116 x
[i
].io
= io
+ iolen
++;
117 dns_transmit_io(&x
[i
].dt
,x
[i
].io
,&deadline
);
120 iopause(io
,iolen
,&deadline
,&stamp
);
123 if (inbuflen
< sizeof inbuf
)
125 r
= read(0,inbuf
+ inbuflen
,(sizeof inbuf
) - inbuflen
);
132 for (i
= 0;i
< xnum
;++i
)
133 if (x
[i
].flagactive
) {
134 r
= dns_transmit_get(&x
[i
].dt
,x
[i
].io
,&stamp
);
141 if (dns_name_packet(&x
[i
].middle
,x
[i
].dt
.packet
,x
[i
].dt
.packetlen
) == -1)
144 if (!stralloc_cats(&x
[i
].left
,"=")) nomem();
152 if (xnum
&& !x
[0].flagactive
) {
153 buffer_put(buffer_1
,x
[0].left
.s
,x
[0].left
.len
);
154 buffer_put(buffer_1
,x
[0].middle
.s
,x
[0].middle
.len
);
155 buffer_put(buffer_1
,x
[0].right
.s
,x
[0].right
.len
);
156 buffer_flush(buffer_1
);
159 for (i
= 0;i
< xnum
;++i
) x
[i
] = x
[i
+ 1];
164 if ((xnum
< xmax
) && (numactive
< maxactive
)) {
165 i
= byte_chr(inbuf
,inbuflen
,'\n');
166 if (inbuflen
&& (i
== inbuflen
)) {
167 if (!stralloc_catb(&partial
,inbuf
,inbuflen
)) nomem();
172 if ((i
< inbuflen
) || (!flag0
&& partial
.len
)) {
173 if (i
< inbuflen
) ++i
;
174 if (!stralloc_catb(&partial
,inbuf
,i
)) nomem();
176 for (j
= 0;j
< inbuflen
;++j
) inbuf
[j
] = inbuf
[j
+ i
];
179 i
= byte_chr(partial
.s
,partial
.len
,'\n');
180 i
= byte_chr(partial
.s
,i
,'\t');
181 i
= byte_chr(partial
.s
,i
,' ');
183 if (!stralloc_copyb(&x
[xnum
].left
,partial
.s
,i
)) nomem();
184 if (!stralloc_copys(&x
[xnum
].middle
,"")) nomem();
185 if (!stralloc_copyb(&x
[xnum
].right
,partial
.s
+ i
,partial
.len
- i
)) nomem();
186 x
[xnum
].flagactive
= 0;
189 if (!stralloc_0(&partial
)) nomem();
190 if (ip4_scan(partial
.s
,ip
)) {
191 dns_name4_domain(name
,ip
);
192 if (dns_resolvconfip(servers
) == -1)
193 strerr_die2sys(111,FATAL
,"unable to read /etc/resolv.conf: ");
194 if (dns_transmit_start(&x
[xnum
].dt
,servers
,1,name
,DNS_T_PTR
,"\0\0\0\0") == -1)
197 x
[xnum
].flagactive
= 1;