… | |
… | |
69 | case adns_r_ptr_raw: |
69 | case adns_r_ptr_raw: |
70 | sv = newSVpv (a->rrs.str [i], 0); |
70 | sv = newSVpv (a->rrs.str [i], 0); |
71 | break; |
71 | break; |
72 | |
72 | |
73 | case adns_r_txt: |
73 | case adns_r_txt: |
74 | sv = newSVpvn (a->rrs.manyistr [i]->str, a->rrs.manyistr [i]->i); |
74 | { |
|
|
75 | AV *av = newAV (); |
|
|
76 | adns_rr_intstr *rr = a->rrs.manyistr [i]; |
|
|
77 | |
|
|
78 | while (rr->str) |
|
|
79 | { |
|
|
80 | av_push (av, newSVpvn (rr->str, rr->i)); |
|
|
81 | ++rr; |
|
|
82 | } |
|
|
83 | |
|
|
84 | sv = newRV_noinc ((SV *)av); |
|
|
85 | } |
75 | break; |
86 | break; |
76 | |
87 | |
77 | case adns_r_a: |
88 | case adns_r_a: |
78 | sv = newSVpv (inet_ntoa (a->rrs.inaddr [i]), 0); |
89 | sv = newSVpv (inet_ntoa (a->rrs.inaddr [i]), 0); |
79 | break; |
90 | break; |
… | |
… | |
84 | |
95 | |
85 | case adns_r_hinfo: |
96 | case adns_r_hinfo: |
86 | { |
97 | { |
87 | /* untested */ |
98 | /* untested */ |
88 | AV *av = newAV (); |
99 | AV *av = newAV (); |
89 | sv = newRV_noinc ((SV *)av); |
|
|
90 | adns_rr_intstrpair *rr = a->rrs.intstrpair + i; |
100 | adns_rr_intstrpair *rr = a->rrs.intstrpair + i; |
91 | |
101 | |
92 | av_push (av, newSVpvn (rr->array [0].str, rr->array [0].i)); |
102 | av_push (av, newSVpvn (rr->array [0].str, rr->array [0].i)); |
93 | av_push (av, newSVpvn (rr->array [1].str, rr->array [1].i)); |
103 | av_push (av, newSVpvn (rr->array [1].str, rr->array [1].i)); |
|
|
104 | |
|
|
105 | sv = newRV_noinc ((SV *)av); |
94 | } |
106 | } |
95 | break; |
107 | break; |
96 | |
108 | |
97 | case adns_r_rp: |
109 | case adns_r_rp: |
98 | case adns_r_rp_raw: |
110 | case adns_r_rp_raw: |
99 | { |
111 | { |
100 | /* untested */ |
112 | /* untested */ |
101 | AV *av = newAV (); |
113 | AV *av = newAV (); |
102 | sv = newRV_noinc ((SV *)av); |
|
|
103 | adns_rr_strpair *rr = a->rrs.strpair + i; |
114 | adns_rr_strpair *rr = a->rrs.strpair + i; |
104 | |
115 | |
105 | av_push (av, newSVpv (rr->array [0], 0)); |
116 | av_push (av, newSVpv (rr->array [0], 0)); |
106 | av_push (av, newSVpv (rr->array [1], 0)); |
117 | av_push (av, newSVpv (rr->array [1], 0)); |
|
|
118 | |
|
|
119 | sv = newRV_noinc ((SV *)av); |
107 | } |
120 | } |
108 | break; |
121 | break; |
109 | |
122 | |
110 | case adns_r_mx: |
123 | case adns_r_mx: |
111 | { |
124 | { |
112 | AV *av = newAV (); |
125 | AV *av = newAV (); |
113 | sv = newRV_noinc ((SV *)av); |
|
|
114 | adns_rr_inthostaddr *rr = a->rrs.inthostaddr + i; |
126 | adns_rr_inthostaddr *rr = a->rrs.inthostaddr + i; |
115 | |
127 | |
116 | av_push (av, newSViv (rr->i)); |
128 | av_push (av, newSViv (rr->i)); |
117 | av_push (av, ha2sv (&rr->ha)); |
129 | av_push (av, ha2sv (&rr->ha)); |
|
|
130 | |
|
|
131 | sv = newRV_noinc ((SV *)av); |
118 | } |
132 | } |
119 | break; |
133 | break; |
120 | |
134 | |
121 | case adns_r_mx_raw: |
135 | case adns_r_mx_raw: |
122 | { |
136 | { |
123 | AV *av = newAV (); |
137 | AV *av = newAV (); |
124 | sv = newRV_noinc ((SV *)av); |
|
|
125 | adns_rr_intstr *rr = a->rrs.intstr + i; |
138 | adns_rr_intstr *rr = a->rrs.intstr + i; |
126 | |
139 | |
127 | av_push (av, newSViv (rr->i)); |
140 | av_push (av, newSViv (rr->i)); |
128 | av_push (av, newSVpv (rr->str, 0)); |
141 | av_push (av, newSVpv (rr->str, 0)); |
|
|
142 | |
|
|
143 | sv = newRV_noinc ((SV *)av); |
129 | } |
144 | } |
130 | break; |
145 | break; |
131 | |
146 | |
132 | case adns_r_soa: |
147 | case adns_r_soa: |
133 | case adns_r_soa_raw: |
148 | case adns_r_soa_raw: |
134 | { |
149 | { |
135 | AV *av = newAV (); |
150 | AV *av = newAV (); |
136 | sv = newRV_noinc ((SV *)av); |
|
|
137 | adns_rr_soa *rr = a->rrs.soa + i; |
151 | adns_rr_soa *rr = a->rrs.soa + i; |
138 | |
152 | |
139 | av_push (av, newSVpv (rr->mname, 0)); |
153 | av_push (av, newSVpv (rr->mname, 0)); |
140 | av_push (av, newSVpv (rr->rname, 0)); |
154 | av_push (av, newSVpv (rr->rname, 0)); |
141 | av_push (av, newSVuv (rr->serial)); |
155 | av_push (av, newSVuv (rr->serial)); |
142 | av_push (av, newSVuv (rr->refresh)); |
156 | av_push (av, newSVuv (rr->refresh)); |
143 | av_push (av, newSVuv (rr->retry)); |
157 | av_push (av, newSVuv (rr->retry)); |
144 | av_push (av, newSVuv (rr->expire)); |
158 | av_push (av, newSVuv (rr->expire)); |
145 | av_push (av, newSVuv (rr->minimum)); |
159 | av_push (av, newSVuv (rr->minimum)); |
|
|
160 | |
|
|
161 | sv = newRV_noinc ((SV *)av); |
146 | } |
162 | } |
147 | break; |
163 | break; |
148 | |
164 | |
149 | case adns_r_srv_raw: |
165 | case adns_r_srv_raw: |
150 | { |
166 | { |
151 | AV *av = newAV (); |
167 | AV *av = newAV (); |
152 | sv = newRV_noinc ((SV *)av); |
|
|
153 | adns_rr_srvraw *rr = a->rrs.srvraw + i; |
168 | adns_rr_srvraw *rr = a->rrs.srvraw + i; |
154 | |
169 | |
155 | av_push (av, newSViv (rr->priority)); |
170 | av_push (av, newSViv (rr->priority)); |
156 | av_push (av, newSViv (rr->weight)); |
171 | av_push (av, newSViv (rr->weight)); |
157 | av_push (av, newSViv (rr->port)); |
172 | av_push (av, newSViv (rr->port)); |
158 | av_push (av, newSVpv (rr->host, 0)); |
173 | av_push (av, newSVpv (rr->host, 0)); |
|
|
174 | |
|
|
175 | sv = newRV_noinc ((SV *)av); |
159 | } |
176 | } |
160 | break; |
177 | break; |
161 | |
178 | |
162 | case adns_r_srv: |
179 | case adns_r_srv: |
163 | { |
180 | { |
164 | AV *av = newAV (); |
181 | AV *av = newAV (); |
165 | sv = newRV_noinc ((SV *)av); |
|
|
166 | adns_rr_srvha *rr = a->rrs.srvha + i; |
182 | adns_rr_srvha *rr = a->rrs.srvha + i; |
167 | |
183 | |
168 | av_push (av, newSViv (rr->priority)); |
184 | av_push (av, newSViv (rr->priority)); |
169 | av_push (av, newSViv (rr->weight)); |
185 | av_push (av, newSViv (rr->weight)); |
170 | av_push (av, newSViv (rr->port)); |
186 | av_push (av, newSViv (rr->port)); |
171 | av_push (av, ha2sv (&rr->ha)); |
187 | av_push (av, ha2sv (&rr->ha)); |
|
|
188 | |
|
|
189 | sv = newRV_noinc ((SV *)av); |
172 | } |
190 | } |
173 | break; |
191 | break; |
174 | |
192 | |
175 | case adns_r_unknown: |
193 | case adns_r_unknown: |
176 | sv = newSVpvn (a->rrs.byteblock [i].data, a->rrs.byteblock [i].len); |
194 | sv = newSVpvn (a->rrs.byteblock [i].data, a->rrs.byteblock [i].len); |
… | |
… | |
197 | |
215 | |
198 | static struct pollfd *fds; |
216 | static struct pollfd *fds; |
199 | static int nfd, mfd; |
217 | static int nfd, mfd; |
200 | static ev_io *iow; |
218 | static ev_io *iow; |
201 | static ev_timer tw; |
219 | static ev_timer tw; |
|
|
220 | static ev_idle iw; |
202 | static ev_prepare prepare_ev; |
221 | static ev_prepare prepare_ev; |
203 | static struct timeval tv_now; |
222 | static struct timeval tv_now; |
204 | |
223 | |
205 | static void |
224 | static void |
206 | update_now (EV_P) |
225 | update_now (EV_P) |
207 | { |
226 | { |
208 | ev_tstamp t = ev_now (); |
227 | ev_tstamp t = ev_now (); |
209 | |
228 | |
210 | tv_now.tv_sec = (long)t; |
229 | tv_now.tv_sec = (long)t; |
211 | tv_now.tv_usec = (long)((t - (ev_tstamp)tv_now.tv_sec) * 1e-6); |
230 | tv_now.tv_usec = (long)((t - (ev_tstamp)tv_now.tv_sec) * 1e-6); |
|
|
231 | } |
|
|
232 | |
|
|
233 | static void |
|
|
234 | idle_cb (EV_P_ ev_idle *w, int revents) |
|
|
235 | { |
|
|
236 | ev_idle_stop (EV_A_ w); |
212 | } |
237 | } |
213 | |
238 | |
214 | static void |
239 | static void |
215 | timer_cb (EV_P_ ev_timer *w, int revents) |
240 | timer_cb (EV_P_ ev_timer *w, int revents) |
216 | { |
241 | { |
… | |
… | |
235 | if (ev_is_active (&tw)) |
260 | if (ev_is_active (&tw)) |
236 | { |
261 | { |
237 | ev_ref (); |
262 | ev_ref (); |
238 | ev_timer_stop (EV_A_ &tw); |
263 | ev_timer_stop (EV_A_ &tw); |
239 | } |
264 | } |
|
|
265 | |
|
|
266 | if (ev_is_active (&iw)) |
|
|
267 | ev_idle_stop (EV_A_ &iw); |
240 | |
268 | |
241 | for (i = 0; i < nfd; ++i) |
269 | for (i = 0; i < nfd; ++i) |
242 | { |
270 | { |
243 | ev_ref (); |
271 | ev_ref (); |
244 | ev_io_stop (EV_A_ iow + i); |
272 | ev_io_stop (EV_A_ iow + i); |
… | |
… | |
368 | for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) |
396 | for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; ) |
369 | newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); |
397 | newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv)); |
370 | |
398 | |
371 | I_EV_API ("EV::ADNS"); |
399 | I_EV_API ("EV::ADNS"); |
372 | |
400 | |
373 | ev_prepare_init (&prepare_ev, prepare_cb); ev_prepare_start (EV_DEFAULT_ &prepare_ev); |
401 | ev_prepare_init (&prepare_ev, prepare_cb); |
|
|
402 | ev_prepare_start (EV_DEFAULT_ &prepare_ev); |
374 | ev_unref (); |
403 | ev_unref (); |
375 | |
404 | |
|
|
405 | ev_init (&iw, idle_cb); |
376 | ev_init (&tw, timer_cb); |
406 | ev_init (&tw, timer_cb); |
377 | |
407 | |
378 | adns_init (&ads, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn | adns_if_noautosys, 0); |
408 | adns_init (&ads, adns_if_noenv | adns_if_noerrprint | adns_if_noserverwarn | adns_if_noautosys, 0); |
379 | } |
409 | } |
380 | |
410 | |
… | |
… | |
398 | SvCUR_set (csv, sizeof (struct ctx)); |
428 | SvCUR_set (csv, sizeof (struct ctx)); |
399 | |
429 | |
400 | c->self = csv; |
430 | c->self = csv; |
401 | c->cb = newSVsv (cb); |
431 | c->cb = newSVsv (cb); |
402 | |
432 | |
|
|
433 | if (!ev_is_active (&iw)) |
|
|
434 | ev_idle_start (EV_A_ &iw); |
|
|
435 | |
403 | if (GIMME_V != G_VOID) |
436 | if (GIMME_V != G_VOID) |
404 | { |
437 | { |
405 | csv = sv_2mortal (newRV_inc (csv)); |
438 | csv = sv_2mortal (newRV_inc (csv)); |
406 | sv_bless (csv, stash); |
439 | sv_bless (csv, stash); |
407 | XPUSHs (csv); |
440 | XPUSHs (csv); |