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.7 by root, Sat Dec 1 21:01:32 2007 UTC vs.
Revision 1.9 by root, Sat Dec 1 22:36:10 2007 UTC

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
198static struct pollfd *fds; 216static struct pollfd *fds;
199static int nfd, mfd; 217static int nfd, mfd;
200static ev_io *iow; 218static ev_io *iow;
201static ev_timer tw; 219static ev_timer tw;
220static ev_idle iw;
202static ev_prepare prepare_ev; 221static ev_prepare prepare_ev;
203static struct timeval tv_now; 222static struct timeval tv_now;
204 223
205static void 224static void
206update_now (EV_P) 225update_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
233static void
234idle_cb (EV_P_ ev_idle *w, int revents)
235{
236 ev_idle_stop (EV_A_ w);
212} 237}
213 238
214static void 239static void
215timer_cb (EV_P_ ev_timer *w, int revents) 240timer_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);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines