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

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines