ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/EV-ADNS/ADNS.xs
(Generate patch)

Comparing cvsroot/EV-ADNS/ADNS.xs (file contents):
Revision 1.5 by root, Sat Dec 1 15:54:40 2007 UTC vs.
Revision 1.7 by root, Sat Dec 1 21:01:32 2007 UTC

15 SV *self; 15 SV *self;
16 adns_query query; 16 adns_query query;
17 SV *cb; 17 SV *cb;
18}; 18};
19 19
20static SV *
21ha2sv (adns_rr_hostaddr *rr)
22{
23 AV *av = newAV ();
24 av_push (av, newSVpv (rr->host, 0));
25 // TODO: add addresses
26
27 return newRV_noinc ((SV *)av);
28}
29
20static void 30static void
21process () 31process ()
22{ 32{
23 dSP; 33 dSP;
24 34
25 for (;;) 35 for (;;)
26 { 36 {
37 int i;
27 adns_query q = 0; 38 adns_query q = 0;
28 adns_answer *a; 39 adns_answer *a;
29 void *ctx; 40 void *ctx;
30 SV *cb; 41 SV *cb;
31 struct ctx *c; 42 struct ctx *c;
32 int r = adns_check (ads, &q, &a, &ctx); 43 int r = adns_check (ads, &q, &a, &ctx);
33 44
34 printf ("check %d\n", r);//D
35 if (r) 45 if (r)
36 break; 46 break;
37 47
38 c = (struct ctx *)ctx; 48 c = (struct ctx *)ctx;
39 cb = c->cb; 49 cb = c->cb;
40 c->cb = 0; 50 c->cb = 0;
41 ev_unref (); 51 ev_unref ();
52 SvREFCNT_dec (c->self);
42 53
43 PUSHMARK (SP); 54 PUSHMARK (SP);
44 55
56 EXTEND (SP, a->nrrs + 2);
45 XPUSHs (sv_2mortal (newSViv (a->status))); 57 PUSHs (sv_2mortal (newSViv (a->status)));
58 PUSHs (sv_2mortal (newSViv (a->expires)));
59
60 for (i = 0; i < a->nrrs; ++i)
61 {
62 SV *sv;
63
64 switch (a->type & adns_r_unknown ? adns_r_unknown : a->type)
65 {
66 case adns_r_ns_raw:
67 case adns_r_cname:
68 case adns_r_ptr:
69 case adns_r_ptr_raw:
70 sv = newSVpv (a->rrs.str [i], 0);
71 break;
72
73 case adns_r_txt:
74 sv = newSVpvn (a->rrs.manyistr [i]->str, a->rrs.manyistr [i]->i);
75 break;
76
77 case adns_r_a:
78 sv = newSVpv (inet_ntoa (a->rrs.inaddr [i]), 0);
79 break;
80
81 case adns_r_ns:
82 sv = ha2sv (a->rrs.hostaddr + i);
83 break;
84
85 case adns_r_hinfo:
86 {
87 /* untested */
88 AV *av = newAV ();
89 sv = newRV_noinc ((SV *)av);
90 adns_rr_intstrpair *rr = a->rrs.intstrpair + i;
91
92 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));
94 }
95 break;
96
97 case adns_r_rp:
98 case adns_r_rp_raw:
99 {
100 /* untested */
101 AV *av = newAV ();
102 sv = newRV_noinc ((SV *)av);
103 adns_rr_strpair *rr = a->rrs.strpair + i;
104
105 av_push (av, newSVpv (rr->array [0], 0));
106 av_push (av, newSVpv (rr->array [1], 0));
107 }
108 break;
109
110 case adns_r_mx:
111 {
112 AV *av = newAV ();
113 sv = newRV_noinc ((SV *)av);
114 adns_rr_inthostaddr *rr = a->rrs.inthostaddr + i;
115
116 av_push (av, newSViv (rr->i));
117 av_push (av, ha2sv (&rr->ha));
118 }
119 break;
120
121 case adns_r_mx_raw:
122 {
123 AV *av = newAV ();
124 sv = newRV_noinc ((SV *)av);
125 adns_rr_intstr *rr = a->rrs.intstr + i;
126
127 av_push (av, newSViv (rr->i));
128 av_push (av, newSVpv (rr->str, 0));
129 }
130 break;
131
132 case adns_r_soa:
133 case adns_r_soa_raw:
134 {
135 AV *av = newAV ();
136 sv = newRV_noinc ((SV *)av);
137 adns_rr_soa *rr = a->rrs.soa + i;
138
139 av_push (av, newSVpv (rr->mname, 0));
140 av_push (av, newSVpv (rr->rname, 0));
141 av_push (av, newSVuv (rr->serial));
142 av_push (av, newSVuv (rr->refresh));
143 av_push (av, newSVuv (rr->retry));
144 av_push (av, newSVuv (rr->expire));
145 av_push (av, newSVuv (rr->minimum));
146 }
147 break;
148
149 case adns_r_srv_raw:
150 {
151 AV *av = newAV ();
152 sv = newRV_noinc ((SV *)av);
153 adns_rr_srvraw *rr = a->rrs.srvraw + i;
154
155 av_push (av, newSViv (rr->priority));
156 av_push (av, newSViv (rr->weight));
157 av_push (av, newSViv (rr->port));
158 av_push (av, newSVpv (rr->host, 0));
159 }
160 break;
161
162 case adns_r_srv:
163 {
164 AV *av = newAV ();
165 sv = newRV_noinc ((SV *)av);
166 adns_rr_srvha *rr = a->rrs.srvha + i;
167
168 av_push (av, newSViv (rr->priority));
169 av_push (av, newSViv (rr->weight));
170 av_push (av, newSViv (rr->port));
171 av_push (av, ha2sv (&rr->ha));
172 }
173 break;
174
175 case adns_r_unknown:
176 sv = newSVpvn (a->rrs.byteblock [i].data, a->rrs.byteblock [i].len);
177 break;
178
179 default:
180 case adns_r_addr:
181 sv = &PL_sv_undef; /* not supported */
182 break;
183 }
184
185 PUSHs (sv_2mortal (sv));
186 }
187
46 free (a); 188 free (a);
47 189
48 PUTBACK; 190 PUTBACK;
49 call_sv (cb, G_VOID | G_DISCARD | G_EVAL); 191 call_sv (cb, G_VOID | G_DISCARD | G_EVAL);
50 SPAGAIN; 192 SPAGAIN;
51 193
52 SvREFCNT_dec (cb); 194 SvREFCNT_dec (cb);
53 SvREFCNT_dec (c->self);
54 } 195 }
55} 196}
56 197
57static struct pollfd *fds; 198static struct pollfd *fds;
58static int nfd, mfd; 199static int nfd, mfd;
89prepare_cb (EV_P_ ev_prepare *w, int revents) 230prepare_cb (EV_P_ ev_prepare *w, int revents)
90{ 231{
91 int i; 232 int i;
92 int timeout = 3600000; 233 int timeout = 3600000;
93 234
235 if (ev_is_active (&tw))
236 {
237 ev_ref ();
94 ev_timer_stop (EV_A_ &tw); 238 ev_timer_stop (EV_A_ &tw);
239 }
95 240
96 for (i = 0; i < nfd; ++i) 241 for (i = 0; i < nfd; ++i)
242 {
243 ev_ref ();
97 ev_io_stop (EV_A_ iow + i); 244 ev_io_stop (EV_A_ iow + i);
245 }
98 246
99 process (); 247 process ();
100 248
101 update_now (EV_A); 249 update_now (EV_A);
102 250
104 252
105 while (adns_beforepoll (ads, fds, &nfd, &timeout, &tv_now)) 253 while (adns_beforepoll (ads, fds, &nfd, &timeout, &tv_now))
106 { 254 {
107 mfd = nfd; 255 mfd = nfd;
108 256
257 free (iow); iow = malloc (mfd * sizeof (ev_io));
109 free (iow); iow = malloc (mfd * sizeof (struct pollfd)); 258 free (fds); fds = malloc (mfd * sizeof (struct pollfd));
110 free (fds); fds = malloc (mfd * sizeof (ev_io));
111 } 259 }
112
113 printf ("to %d\n", timeout);//d
114 260
115 ev_timer_set (&tw, timeout * 1e-3, 0.); 261 ev_timer_set (&tw, timeout * 1e-3, 0.);
116 ev_timer_start (EV_A_ &tw); 262 ev_timer_start (EV_A_ &tw);
263 ev_unref ();
117 264
118 // create one ev_io per pollfd 265 // create one ev_io per pollfd
119 for (i = 0; i < nfd; ++i) 266 for (i = 0; i < nfd; ++i)
120 { 267 {
121 ev_io_init (iow + i, io_cb, fds [i].fd, 268 ev_io_init (iow + i, io_cb, fds [i].fd,
122 ((fds [i].events & POLLIN ? EV_READ : 0) 269 ((fds [i].events & POLLIN ? EV_READ : 0)
123 | (fds [i].events & POLLOUT ? EV_WRITE : 0))); 270 | (fds [i].events & POLLOUT ? EV_WRITE : 0)));
124 271
125 ev_io_start (EV_A_ iow + i); 272 ev_io_start (EV_A_ iow + i);
273 ev_unref ();
126 } 274 }
127} 275}
128 276
129MODULE = EV::ADNS PACKAGE = EV::ADNS 277MODULE = EV::ADNS PACKAGE = EV::ADNS
130 278
238 int r = adns_submit (ads, owner, type, flags, (void *)c, &c->query); 386 int r = adns_submit (ads, owner, type, flags, (void *)c, &c->query);
239 387
240 if (r) 388 if (r)
241 { 389 {
242 SvREFCNT_dec (csv); 390 SvREFCNT_dec (csv);
391 errno = r;
243 XSRETURN_EMPTY; 392 XSRETURN_EMPTY;
244 } 393 }
245 else 394 else
246 { 395 {
247 ev_ref (); 396 ev_ref ();
248 SvPOK_only (csv); 397 SvPOK_only (csv);
249 SvCUR_set (csv, sizeof (struct ctx)); 398 SvCUR_set (csv, sizeof (struct ctx));
399
250 c->self = csv; 400 c->self = csv;
251 c->cb = newSVsv (cb); 401 c->cb = newSVsv (cb);
252 402
253 if (GIMME_V != G_VOID) 403 if (GIMME_V != G_VOID)
254 { 404 {
258 } 408 }
259 } 409 }
260} 410}
261 411
262void DESTROY (SV *req) 412void DESTROY (SV *req)
413 ALIAS:
414 cancel = 1
263 CODE: 415 CODE:
264{ 416{
265 struct ctx *c; 417 struct ctx *c;
266 418
267 if (!(SvROK (req) && SvOBJECT (SvRV (req)) 419 if (!(SvROK (req) && SvOBJECT (SvRV (req))
271 c = (struct ctx *)SvPVX (SvRV (req)); 423 c = (struct ctx *)SvPVX (SvRV (req));
272 424
273 if (c->cb) 425 if (c->cb)
274 { 426 {
275 ev_unref (); 427 ev_unref ();
428 SvREFCNT_dec (c->cb);
429 c->cb = 0;
276 adns_cancel (c->query); 430 adns_cancel (c->query);
277 SvREFCNT_dec (c->cb); 431 SvREFCNT_dec (c->self);
278 } 432 }
279} 433}
280 434
281 435
282 436

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines