Code

bindings/perl: Fix a memory leak in _ping_iterator_get_hostname().
[liboping.git] / bindings / perl / Oping.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <string.h>
8 #include <errno.h>
9 #include <assert.h>
10 #include <netdb.h> /* NI_MAXHOST */
11 #include <oping.h>
13 MODULE = Net::Oping             PACKAGE = Net::Oping            
15 PROTOTYPES: DISABLE
17 pingobj_t *
18 _ping_construct ()
19         CODE:
20                 RETVAL = ping_construct ();
21         OUTPUT:
22                 RETVAL
24 void 
25 _ping_destroy (obj);
26         pingobj_t *obj
27         CODE:
28                 ping_destroy(obj);
30 int
31 _ping_setopt_timeout (obj, timeout)
32         pingobj_t *obj
33         double timeout
34         CODE:
35                 RETVAL = ping_setopt (obj, PING_OPT_TIMEOUT, &timeout);
36         OUTPUT:
37                 RETVAL
39 int
40 _ping_setopt_source (obj, addr)
41         pingobj_t *obj
42         char *addr
43         CODE:
44                 RETVAL = ping_setopt (obj, PING_OPT_SOURCE, addr);
45         OUTPUT:
46                 RETVAL
48 int 
49 _ping_host_add (obj, host);
50         pingobj_t *obj
51         const char *host
52         CODE:
53                 RETVAL = ping_host_add (obj, host);
54         OUTPUT:
55                 RETVAL
57 int 
58 _ping_host_remove (obj, host)
59         pingobj_t *obj
60         const char *host
61         CODE:
62                 RETVAL = ping_host_remove (obj, host);
63         OUTPUT:
64                 RETVAL
66 int 
67 _ping_send (obj)
68         pingobj_t *obj
69         CODE:
70                 RETVAL=ping_send (obj);
71         OUTPUT:
72                 RETVAL
74 pingobj_iter_t *
75 _ping_iterator_get (obj)
76         pingobj_t *obj
77         CODE:
78                 RETVAL = ping_iterator_get (obj);
79         OUTPUT:
80                 RETVAL
82 pingobj_iter_t *
83 _ping_iterator_next (iter)
84         pingobj_iter_t *iter
85         CODE:
86                 RETVAL = ping_iterator_next (iter);
87         OUTPUT:
88                 RETVAL
90 double
91 _ping_iterator_get_latency (iter)
92         pingobj_iter_t *iter
93         CODE:
94                 double tmp;
95                 size_t tmp_size;
96                 int status;
98                 RETVAL = -1.0;
100                 tmp_size = sizeof (tmp);
101                 status = ping_iterator_get_info (iter, PING_INFO_LATENCY,
102                         (void *) &tmp, &tmp_size);
103                 if (status == 0)
104                         RETVAL = tmp;
105         OUTPUT:
106                 RETVAL
108 void
109 _ping_iterator_get_hostname (iter)
110         pingobj_iter_t *iter
111         PPCODE:
112                 char *buffer;
113                 size_t buffer_size;
114                 int status;
116         do {
117                 buffer = NULL;
118                 buffer_size = 0;
119                 status = ping_iterator_get_info (iter, PING_INFO_HOSTNAME,
120                                 (void *) buffer, &buffer_size);
121                 if (status != ENOMEM)
122                         break;
124                 /* FIXME: This is a workaround for a bug in 0.3.5. */
125                 buffer_size++;
127                 buffer = (char *) malloc (buffer_size);
128                 if (buffer == NULL)
129                         break;
131                 status = ping_iterator_get_info (iter, PING_INFO_HOSTNAME,
132                                 (void *) buffer, &buffer_size);
133                 if (status != 0)
134                         break;
136                 XPUSHs (sv_2mortal (newSVpvn(buffer,buffer_size)));
137                 free(buffer);
138         } while (0);
140 const char *
141 _ping_get_error (obj)
142         pingobj_t *obj
143         CODE:
144                 RETVAL = ping_get_error(obj);
145         OUTPUT:
146                 RETVAL