ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/EV/EV.xs
Revision: 1.58
Committed: Wed Nov 7 13:27:56 2007 UTC (16 years, 6 months ago) by root
Branch: MAIN
Changes since 1.57: +2 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 /*#include <netinet/in.h>*/
6
7 #define EV_PROTOTYPES 1
8 #include "EV/EVAPI.h"
9
10 /* fix perl api breakage */
11 #undef signal
12 #undef sigaction
13
14 #define EV_SELECT_USE_WIN32_HANDLES 0
15 #define EV_SELECT_USE_FD_SET 0
16 /* due to bugs in OS X we have to use libev/ explicitly here */
17 #include "libev/ev.c"
18 #include "event.c"
19
20 #ifndef WIN32
21 #define DNS_USE_GETTIMEOFDAY_FOR_ID 1
22 #if !defined (WIN32) && !defined(__CYGWIN__)
23 # define HAVE_STRUCT_IN6_ADDR 1
24 #endif
25 #undef HAVE_STRTOK_R
26 #undef strtok_r
27 #define strtok_r fake_strtok_r
28 #include "evdns.c"
29 #endif
30
31 #ifndef WIN32
32 # include <pthread.h>
33 #endif
34
35 typedef int Signal;
36
37 static struct EVAPI evapi;
38
39 static HV
40 *stash_watcher,
41 *stash_io,
42 *stash_timer,
43 *stash_periodic,
44 *stash_signal,
45 *stash_idle,
46 *stash_prepare,
47 *stash_check,
48 *stash_child;
49
50 #ifndef SIG_SIZE
51 /* kudos to Slaven Rezic for the idea */
52 static char sig_size [] = { SIG_NUM };
53 # define SIG_SIZE (sizeof (sig_size) + 1)
54 #endif
55
56 static int
57 sv_signum (SV *sig)
58 {
59 int signum;
60
61 SvGETMAGIC (sig);
62
63 for (signum = 1; signum < SIG_SIZE; ++signum)
64 if (strEQ (SvPV_nolen (sig), PL_sig_name [signum]))
65 return signum;
66
67 if (SvIV (sig) > 0)
68 return SvIV (sig);
69
70 return -1;
71 }
72
73 /////////////////////////////////////////////////////////////////////////////
74 // Event
75
76 static void e_cb (struct ev_watcher *w, int revents);
77
78 static int
79 sv_fileno (SV *fh)
80 {
81 SvGETMAGIC (fh);
82
83 if (SvROK (fh))
84 fh = SvRV (fh);
85
86 if (SvTYPE (fh) == SVt_PVGV)
87 return PerlIO_fileno (IoIFP (sv_2io (fh)));
88
89 if ((SvIV (fh) >= 0) && (SvIV (fh) < 0x7ffffff))
90 return SvIV (fh);
91
92 return -1;
93 }
94
95 static void *
96 e_new (int size, SV *cb_sv)
97 {
98 struct ev_watcher *w;
99 SV *self = NEWSV (0, size);
100 SvPOK_only (self);
101 SvCUR_set (self, size);
102
103 w = (struct ev_watcher *)SvPVX (self);
104
105 ev_watcher_init (w, e_cb);
106
107 w->fh = 0;
108 w->cb_sv = newSVsv (cb_sv);
109 w->self = self;
110
111 return (void *)w;
112 }
113
114 static void
115 e_destroy (void *w_)
116 {
117 struct ev_watcher *w = (struct ev_watcher *)w_;
118
119 SvREFCNT_dec (w->fh ); w->fh = 0;
120 SvREFCNT_dec (w->cb_sv); w->cb_sv = 0;
121 }
122
123 static SV *
124 e_bless (struct ev_watcher *w, HV *stash)
125 {
126 SV *rv;
127
128 if (SvOBJECT (w->self))
129 rv = newRV_inc (w->self);
130 else
131 {
132 rv = newRV_noinc (w->self);
133 sv_bless (rv, stash);
134 SvREADONLY_on (w->self);
135 }
136
137 return rv;
138 }
139
140 static void
141 e_cb (struct ev_watcher *w, int revents)
142 {
143 dSP;
144 I32 mark = SP - PL_stack_base;
145 SV *sv_self, *sv_events, *sv_status = 0;
146 static SV *sv_events_cache;
147
148 sv_self = newRV_inc (w->self); /* w->self MUST be blessed by now */
149
150 if (sv_events_cache)
151 {
152 sv_events = sv_events_cache; sv_events_cache = 0;
153 SvIV_set (sv_events, revents);
154 }
155 else
156 sv_events = newSViv (revents);
157
158 PUSHMARK (SP);
159 EXTEND (SP, 2);
160 PUSHs (sv_self);
161 PUSHs (sv_events);
162
163 PUTBACK;
164 call_sv (w->cb_sv, G_DISCARD | G_VOID | G_EVAL);
165 SP = PL_stack_base + mark; PUTBACK;
166
167 SvREFCNT_dec (sv_self);
168 SvREFCNT_dec (sv_status);
169
170 if (sv_events_cache)
171 SvREFCNT_dec (sv_events);
172 else
173 sv_events_cache = sv_events;
174
175 if (SvTRUE (ERRSV))
176 {
177 PUSHMARK (SP);
178 PUTBACK;
179 call_sv (get_sv ("EV::DIED", 1), G_DISCARD | G_VOID | G_EVAL | G_KEEPERR);
180 SP = PL_stack_base + mark; PUTBACK;
181 }
182 }
183
184 /////////////////////////////////////////////////////////////////////////////
185 // DNS
186
187 #ifndef WIN32
188 static void
189 dns_cb (int result, char type, int count, int ttl, void *addresses, void *arg)
190 {
191 dSP;
192 SV *cb = (SV *)arg;
193
194 ENTER;
195 SAVETMPS;
196 PUSHMARK (SP);
197 EXTEND (SP, count + 3);
198 PUSHs (sv_2mortal (newSViv (result)));
199
200 if (result == DNS_ERR_NONE && ttl >= 0)
201 {
202 int i;
203
204 PUSHs (sv_2mortal (newSViv (type)));
205 PUSHs (sv_2mortal (newSViv (ttl)));
206
207 for (i = 0; i < count; ++i)
208 switch (type)
209 {
210 case DNS_IPv6_AAAA:
211 PUSHs (sv_2mortal (newSVpvn (i * 16 + (char *)addresses, 16)));
212 break;
213 case DNS_IPv4_A:
214 PUSHs (sv_2mortal (newSVpvn (i * 4 + (char *)addresses, 4)));
215 break;
216 case DNS_PTR:
217 PUSHs (sv_2mortal (newSVpv (*(char **)addresses, 0)));
218 break;
219 }
220 }
221
222 PUTBACK;
223 call_sv (sv_2mortal (cb), G_DISCARD | G_VOID | G_EVAL);
224
225 FREETMPS;
226
227 if (SvTRUE (ERRSV))
228 {
229 PUSHMARK (SP);
230 PUTBACK;
231 call_sv (get_sv ("EV::DIED", 1), G_DISCARD | G_VOID | G_EVAL | G_KEEPERR);
232 }
233
234 LEAVE;
235 }
236 #endif
237
238 #define CHECK_REPEAT(repeat) if (repeat < 0.) \
239 croak (# repeat " value must be >= 0");
240
241 #define CHECK_FD(fh,fd) if ((fd) < 0) \
242 croak ("illegal file descriptor or filehandle (either no attached file descriptor or illegal value): %s", SvPV_nolen (fh));
243
244 /////////////////////////////////////////////////////////////////////////////
245 // XS interface functions
246
247 MODULE = EV PACKAGE = EV PREFIX = ev_
248
249 PROTOTYPES: ENABLE
250
251 BOOT:
252 {
253 HV *stash = gv_stashpv ("EV", 1);
254
255 static const struct {
256 const char *name;
257 IV iv;
258 } *civ, const_iv[] = {
259 # define const_iv(pfx, name) { # name, (IV) pfx ## name },
260 const_iv (EV_, MINPRI)
261 const_iv (EV_, MAXPRI)
262
263 const_iv (EV_, UNDEF)
264 const_iv (EV_, NONE)
265 const_iv (EV_, TIMEOUT)
266 const_iv (EV_, READ)
267 const_iv (EV_, WRITE)
268 const_iv (EV_, SIGNAL)
269 const_iv (EV_, IDLE)
270 const_iv (EV_, CHECK)
271 const_iv (EV_, ERROR)
272
273 const_iv (EV, LOOP_ONESHOT)
274 const_iv (EV, LOOP_NONBLOCK)
275
276 const_iv (EV, METHOD_AUTO)
277 const_iv (EV, METHOD_SELECT)
278 const_iv (EV, METHOD_POLL)
279 const_iv (EV, METHOD_EPOLL)
280 const_iv (EV, METHOD_KQUEUE)
281 const_iv (EV, METHOD_DEVPOLL)
282 const_iv (EV, METHOD_PORT)
283 const_iv (EV, METHOD_ANY)
284 };
285
286 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
287 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
288
289 stash_watcher = gv_stashpv ("EV::Watcher" , 1);
290 stash_io = gv_stashpv ("EV::Io" , 1);
291 stash_timer = gv_stashpv ("EV::Timer" , 1);
292 stash_periodic = gv_stashpv ("EV::Periodic", 1);
293 stash_signal = gv_stashpv ("EV::Signal" , 1);
294 stash_idle = gv_stashpv ("EV::Idle" , 1);
295 stash_prepare = gv_stashpv ("EV::Prepare" , 1);
296 stash_check = gv_stashpv ("EV::Check" , 1);
297 stash_child = gv_stashpv ("EV::Child" , 1);
298
299 {
300 SV *sv = perl_get_sv ("EV::API", TRUE);
301 perl_get_sv ("EV::API", TRUE); /* silence 5.10 warning */
302
303 /* the poor man's shared library emulator */
304 evapi.ver = EV_API_VERSION;
305 evapi.rev = EV_API_REVISION;
306 evapi.sv_fileno = sv_fileno;
307 evapi.sv_signum = sv_signum;
308 evapi.now = ev_now;
309 evapi.method = ev_method;
310 evapi.unloop = ev_unloop;
311 evapi.time = ev_time;
312 evapi.loop = ev_loop;
313 evapi.once = ev_once;
314 evapi.io_start = ev_io_start;
315 evapi.io_stop = ev_io_stop;
316 evapi.timer_start = ev_timer_start;
317 evapi.timer_stop = ev_timer_stop;
318 evapi.timer_again = ev_timer_again;
319 evapi.periodic_start = ev_periodic_start;
320 evapi.periodic_stop = ev_periodic_stop;
321 evapi.signal_start = ev_signal_start;
322 evapi.signal_stop = ev_signal_stop;
323 evapi.idle_start = ev_idle_start;
324 evapi.idle_stop = ev_idle_stop;
325 evapi.prepare_start = ev_prepare_start;
326 evapi.prepare_stop = ev_prepare_stop;
327 evapi.check_start = ev_check_start;
328 evapi.check_stop = ev_check_stop;
329 evapi.child_start = ev_child_start;
330 evapi.child_stop = ev_child_stop;
331
332 sv_setiv (sv, (IV)&evapi);
333 SvREADONLY_on (sv);
334 }
335 #ifndef WIN32
336 pthread_atfork (0, 0, ev_default_fork);
337 #endif
338 }
339
340 NV ev_now ()
341
342 int ev_method ()
343
344 NV ev_time ()
345
346 int ev_default_loop (int methods = EVMETHOD_AUTO)
347
348 void ev_loop (int flags = 0)
349
350 void ev_unloop (int how = 1)
351
352 struct ev_io *io (SV *fh, int events, SV *cb)
353 ALIAS:
354 io_ns = 1
355 CODE:
356 {
357 int fd = sv_fileno (fh);
358 CHECK_FD (fh, fd);
359
360 RETVAL = e_new (sizeof (struct ev_io), cb);
361 RETVAL->fh = newSVsv (fh);
362 ev_io_set (RETVAL, fd, events);
363 if (!ix) ev_io_start (RETVAL);
364 }
365 OUTPUT:
366 RETVAL
367
368 struct ev_timer *timer (NV after, NV repeat, SV *cb)
369 ALIAS:
370 timer_ns = 1
371 INIT:
372 CHECK_REPEAT (repeat);
373 CODE:
374 RETVAL = e_new (sizeof (struct ev_timer), cb);
375 ev_timer_set (RETVAL, after, repeat);
376 if (!ix) ev_timer_start (RETVAL);
377 OUTPUT:
378 RETVAL
379
380 struct ev_periodic *periodic (NV at, NV interval, SV *cb)
381 ALIAS:
382 periodic_ns = 1
383 INIT:
384 CHECK_REPEAT (interval);
385 CODE:
386 RETVAL = e_new (sizeof (struct ev_periodic), cb);
387 ev_periodic_set (RETVAL, at, interval);
388 if (!ix) ev_periodic_start (RETVAL);
389 OUTPUT:
390 RETVAL
391
392 struct ev_signal *signal (Signal signum, SV *cb)
393 ALIAS:
394 signal_ns = 1
395 CODE:
396 RETVAL = e_new (sizeof (struct ev_signal), cb);
397 ev_signal_set (RETVAL, signum);
398 if (!ix) ev_signal_start (RETVAL);
399 OUTPUT:
400 RETVAL
401
402 struct ev_idle *idle (SV *cb)
403 ALIAS:
404 idle_ns = 1
405 CODE:
406 RETVAL = e_new (sizeof (struct ev_idle), cb);
407 ev_idle_set (RETVAL);
408 if (!ix) ev_idle_start (RETVAL);
409 OUTPUT:
410 RETVAL
411
412 struct ev_prepare *prepare (SV *cb)
413 ALIAS:
414 prepare_ns = 1
415 CODE:
416 RETVAL = e_new (sizeof (struct ev_prepare), cb);
417 ev_prepare_set (RETVAL);
418 if (!ix) ev_prepare_start (RETVAL);
419 OUTPUT:
420 RETVAL
421
422 struct ev_check *check (SV *cb)
423 ALIAS:
424 check_ns = 1
425 CODE:
426 RETVAL = e_new (sizeof (struct ev_check), cb);
427 ev_check_set (RETVAL);
428 if (!ix) ev_check_start (RETVAL);
429 OUTPUT:
430 RETVAL
431
432 struct ev_child *child (int pid, SV *cb)
433 ALIAS:
434 check_ns = 1
435 CODE:
436 RETVAL = e_new (sizeof (struct ev_child), cb);
437 ev_child_set (RETVAL, pid);
438 if (!ix) ev_child_start (RETVAL);
439 OUTPUT:
440 RETVAL
441
442
443 PROTOTYPES: DISABLE
444
445 MODULE = EV PACKAGE = EV::Watcher PREFIX = ev_
446
447 int ev_is_active (struct ev_watcher *w)
448
449 SV *cb (struct ev_watcher *w, SV *new_cb = 0)
450 CODE:
451 {
452 RETVAL = newSVsv (w->cb_sv);
453
454 if (items > 1)
455 sv_setsv (w->cb_sv, new_cb);
456 }
457 OUTPUT:
458 RETVAL
459
460 void trigger (struct ev_watcher *w, int revents = EV_NONE)
461 CODE:
462 w->cb (w, revents);
463
464 int priority (struct ev_watcher *w, int new_priority = 0)
465 CODE:
466 {
467 RETVAL = w->priority;
468
469 if (items > 1)
470 {
471 int active = ev_is_active (w);
472
473 if (new_priority < EV_MINPRI || new_priority > EV_MAXPRI)
474 croak ("watcher priority out of range, value must be between %d and %d, inclusive", EV_MINPRI, EV_MAXPRI);
475
476 if (active)
477 {
478 /* grrr. */
479 PUSHMARK (SP);
480 XPUSHs (ST (0));
481 call_method ("stop", G_DISCARD | G_VOID);
482 }
483
484 ev_set_priority (w, new_priority);
485
486 if (active)
487 {
488 PUSHMARK (SP);
489 XPUSHs (ST (0));
490 call_method ("start", G_DISCARD | G_VOID);
491 }
492 }
493 }
494 OUTPUT:
495 RETVAL
496
497 MODULE = EV PACKAGE = EV::Io PREFIX = ev_io_
498
499 void ev_io_start (struct ev_io *w)
500
501 void ev_io_stop (struct ev_io *w)
502
503 void DESTROY (struct ev_io *w)
504 CODE:
505 ev_io_stop (w);
506 e_destroy (w);
507
508 void set (struct ev_io *w, SV *fh, int events)
509 CODE:
510 {
511 int active = ev_is_active (w);
512 int fd = sv_fileno (fh);
513 CHECK_FD (fh, fd);
514
515 if (active) ev_io_stop (w);
516
517 sv_setsv (w->fh, fh);
518 ev_io_set (w, fd, events);
519
520 if (active) ev_io_start (w);
521 }
522
523 SV *fh (struct ev_io *w, SV *new_fh = 0)
524 CODE:
525 {
526 RETVAL = newSVsv (w->fh);
527
528 if (items > 1)
529 {
530 int active = ev_is_active (w);
531 if (active) ev_io_stop (w);
532
533 sv_setsv (w->fh, new_fh);
534 ev_io_set (w, sv_fileno (w->fh), w->events);
535
536 if (active) ev_io_start (w);
537 }
538 }
539 OUTPUT:
540 RETVAL
541
542 int events (struct ev_io *w, int new_events = EV_UNDEF)
543 CODE:
544 {
545 RETVAL = w->events;
546
547 if (items > 1)
548 {
549 int active = ev_is_active (w);
550 if (active) ev_io_stop (w);
551
552 ev_io_set (w, w->fd, new_events);
553
554 if (active) ev_io_start (w);
555 }
556 }
557 OUTPUT:
558 RETVAL
559
560 MODULE = EV PACKAGE = EV::Signal PREFIX = ev_signal_
561
562 void ev_signal_start (struct ev_signal *w)
563
564 void ev_signal_stop (struct ev_signal *w)
565
566 void DESTROY (struct ev_signal *w)
567 CODE:
568 ev_signal_stop (w);
569 e_destroy (w);
570
571 void set (struct ev_signal *w, SV *signal)
572 CODE:
573 {
574 Signal signum = sv_signum (signal); /* may croak here */
575 int active = ev_is_active (w);
576
577 if (active) ev_signal_stop (w);
578
579 ev_signal_set (w, signum);
580
581 if (active) ev_signal_start (w);
582 }
583
584 int signal (struct ev_signal *w, SV *new_signal = 0)
585 CODE:
586 {
587 RETVAL = w->signum;
588
589 if (items > 1)
590 {
591 Signal signum = sv_signum (new_signal); /* may croak here */
592 int active = ev_is_active (w);
593 if (active) ev_signal_stop (w);
594
595 ev_signal_set (w, signum);
596
597 if (active) ev_signal_start (w);
598 }
599 }
600 OUTPUT:
601 RETVAL
602
603 MODULE = EV PACKAGE = EV::Timer PREFIX = ev_timer_
604
605 void ev_timer_start (struct ev_timer *w)
606 INIT:
607 CHECK_REPEAT (w->repeat);
608
609 void ev_timer_stop (struct ev_timer *w)
610
611 void ev_timer_again (struct ev_timer *w)
612 INIT:
613 CHECK_REPEAT (w->repeat);
614
615 void DESTROY (struct ev_timer *w)
616 CODE:
617 ev_timer_stop (w);
618 e_destroy (w);
619
620 void set (struct ev_timer *w, NV after, NV repeat = 0.)
621 INIT:
622 CHECK_REPEAT (repeat);
623 CODE:
624 {
625 int active = ev_is_active (w);
626 if (active) ev_timer_stop (w);
627 ev_timer_set (w, after, repeat);
628 if (active) ev_timer_start (w);
629 }
630
631 MODULE = EV PACKAGE = EV::Periodic PREFIX = ev_periodic_
632
633 void ev_periodic_start (struct ev_periodic *w)
634 INIT:
635 CHECK_REPEAT (w->interval);
636
637 void ev_periodic_stop (struct ev_periodic *w)
638
639 void DESTROY (struct ev_periodic *w)
640 CODE:
641 ev_periodic_stop (w);
642 e_destroy (w);
643
644 void set (struct ev_periodic *w, NV at, NV interval = 0.)
645 INIT:
646 CHECK_REPEAT (interval);
647 CODE:
648 {
649 int active = ev_is_active (w);
650 if (active) ev_periodic_stop (w);
651
652 ev_periodic_set (w, at, interval);
653
654 if (active) ev_periodic_start (w);
655 }
656
657 MODULE = EV PACKAGE = EV::Idle PREFIX = ev_idle_
658
659 void ev_idle_start (struct ev_idle *w)
660
661 void ev_idle_stop (struct ev_idle *w)
662
663 void DESTROY (struct ev_idle *w)
664 CODE:
665 ev_idle_stop (w);
666 e_destroy (w);
667
668 MODULE = EV PACKAGE = EV::Prepare PREFIX = ev_check_
669
670 void ev_prepare_start (struct ev_prepare *w)
671
672 void ev_prepare_stop (struct ev_prepare *w)
673
674 void DESTROY (struct ev_prepare *w)
675 CODE:
676 ev_prepare_stop (w);
677 e_destroy (w);
678
679 MODULE = EV PACKAGE = EV::Check PREFIX = ev_check_
680
681 void ev_check_start (struct ev_check *w)
682
683 void ev_check_stop (struct ev_check *w)
684
685 void DESTROY (struct ev_check *w)
686 CODE:
687 ev_check_stop (w);
688 e_destroy (w);
689
690 MODULE = EV PACKAGE = EV::Child PREFIX = ev_child_
691
692 void ev_child_start (struct ev_child *w)
693
694 void ev_child_stop (struct ev_child *w)
695
696 void DESTROY (struct ev_child *w)
697 CODE:
698 ev_child_stop (w);
699 e_destroy (w);
700
701 void set (struct ev_child *w, int pid)
702 CODE:
703 {
704 int active = ev_is_active (w);
705 if (active) ev_child_stop (w);
706
707 ev_child_set (w, pid);
708
709 if (active) ev_child_start (w);
710 }
711
712 int pid (struct ev_child *w, int new_pid = 0)
713 CODE:
714 {
715 RETVAL = w->pid;
716
717 if (items > 1)
718 {
719 int active = ev_is_active (w);
720 if (active) ev_child_stop (w);
721
722 ev_child_set (w, new_pid);
723
724 if (active) ev_child_start (w);
725 }
726 }
727 OUTPUT:
728 RETVAL
729
730
731 int rstatus (struct ev_child *w)
732 ALIAS:
733 rpid = 1
734 CODE:
735 RETVAL = ix ? w->rpid : w->rstatus;
736 OUTPUT:
737 RETVAL
738
739 #ifndef WIN32
740
741 MODULE = EV PACKAGE = EV::DNS PREFIX = evdns_
742
743 BOOT:
744 {
745 HV *stash = gv_stashpv ("EV::DNS", 1);
746
747 static const struct {
748 const char *name;
749 IV iv;
750 } *civ, const_iv[] = {
751 # define const_iv(pfx, name) { # name, (IV) pfx ## name },
752 const_iv (DNS_, ERR_NONE)
753 const_iv (DNS_, ERR_FORMAT)
754 const_iv (DNS_, ERR_SERVERFAILED)
755 const_iv (DNS_, ERR_NOTEXIST)
756 const_iv (DNS_, ERR_NOTIMPL)
757 const_iv (DNS_, ERR_REFUSED)
758 const_iv (DNS_, ERR_TRUNCATED)
759 const_iv (DNS_, ERR_UNKNOWN)
760 const_iv (DNS_, ERR_TIMEOUT)
761 const_iv (DNS_, ERR_SHUTDOWN)
762 const_iv (DNS_, IPv4_A)
763 const_iv (DNS_, PTR)
764 const_iv (DNS_, IPv6_AAAA)
765 const_iv (DNS_, QUERY_NO_SEARCH)
766 const_iv (DNS_, OPTION_SEARCH)
767 const_iv (DNS_, OPTION_NAMESERVERS)
768 const_iv (DNS_, OPTION_MISC)
769 const_iv (DNS_, OPTIONS_ALL)
770 const_iv (DNS_, NO_SEARCH)
771 };
772
773 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
774 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
775 }
776
777 int evdns_init ()
778
779 void evdns_shutdown (int fail_requests = 1)
780
781 const char *evdns_err_to_string (int err)
782
783 int evdns_nameserver_add (U32 address)
784
785 int evdns_count_nameservers ()
786
787 int evdns_clear_nameservers_and_suspend ()
788
789 int evdns_resume ()
790
791 int evdns_nameserver_ip_add (char *ip_as_string)
792
793 int evdns_resolve_ipv4 (const char *name, int flags, SV *cb)
794 C_ARGS: name, flags, dns_cb, (void *)SvREFCNT_inc (cb)
795
796 int evdns_resolve_ipv6 (const char *name, int flags, SV *cb)
797 C_ARGS: name, flags, dns_cb, (void *)SvREFCNT_inc (cb)
798
799 int evdns_resolve_reverse (SV *addr, int flags, SV *cb)
800 ALIAS:
801 evdns_resolve_reverse_ipv6 = 1
802 CODE:
803 {
804 STRLEN len;
805 char *data = SvPVbyte (addr, len);
806 if (len != (ix ? 16 : 4))
807 croak ("ipv4/ipv6 address to be resolved must be given as 4/16 byte octet string");
808
809 RETVAL = ix
810 ? evdns_resolve_reverse_ipv6 ((struct in6_addr *)data, flags, dns_cb, (void *)SvREFCNT_inc (cb))
811 : evdns_resolve_reverse ((struct in_addr *)data, flags, dns_cb, (void *)SvREFCNT_inc (cb));
812 }
813 OUTPUT:
814 RETVAL
815
816 int evdns_set_option (char *option, char *val, int flags)
817
818 int evdns_resolv_conf_parse (int flags, const char *filename)
819
820 #ifdef MS_WINDOWS
821
822 int evdns_config_windows_nameservers ()
823
824 #endif
825
826 void evdns_search_clear ()
827
828 void evdns_search_add (char *domain)
829
830 void evdns_search_ndots_set (int ndots)
831
832 #if 0
833
834 MODULE = EV PACKAGE = EV::HTTP PREFIX = evhttp_
835
836 BOOT:
837 {
838 HV *stash = gv_stashpv ("EV::HTTP", 1);
839
840 static const struct {
841 const char *name;
842 IV iv;
843 } *civ, const_iv[] = {
844 # define const_iv(pfx, name) { # name, (IV) pfx ## name },
845 const_iv (HTTP_, OK)
846 const_iv (HTTP_, NOCONTENT)
847 const_iv (HTTP_, MOVEPERM)
848 const_iv (HTTP_, MOVETEMP)
849 const_iv (HTTP_, NOTMODIFIED)
850 const_iv (HTTP_, BADREQUEST)
851 const_iv (HTTP_, NOTFOUND)
852 const_iv (HTTP_, SERVUNAVAIL)
853 const_iv (EVHTTP_, REQ_OWN_CONNECTION)
854 const_iv (EVHTTP_, PROXY_REQUEST)
855 const_iv (EVHTTP_, REQ_GET)
856 const_iv (EVHTTP_, REQ_POST)
857 const_iv (EVHTTP_, REQ_HEAD)
858 const_iv (EVHTTP_, REQUEST)
859 const_iv (EVHTTP_, RESPONSE)
860 };
861
862 for (civ = const_iv + sizeof (const_iv) / sizeof (const_iv [0]); civ-- > const_iv; )
863 newCONSTSUB (stash, (char *)civ->name, newSViv (civ->iv));
864 }
865
866 MODULE = EV PACKAGE = EV::HTTP::Request PREFIX = evhttp_request_
867
868 #HttpRequest new (SV *klass, SV *cb)
869
870 #void DESTROY (struct evhttp_request *req);
871
872 #endif
873
874 #endif
875
876
877
878
879
880
881