spiped 0.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ext/spiped/extconf.rb +3 -0
- data/ext/spiped/spiped-source/BUILDING +46 -0
- data/ext/spiped/spiped-source/CHANGELOG +44 -0
- data/ext/spiped/spiped-source/COPYRIGHT +33 -0
- data/ext/spiped/spiped-source/Makefile +47 -0
- data/ext/spiped/spiped-source/Makefile.POSIX +27 -0
- data/ext/spiped/spiped-source/Makefile.inc +20 -0
- data/ext/spiped/spiped-source/Makefile.prog +23 -0
- data/ext/spiped/spiped-source/POSIX/README +10 -0
- data/ext/spiped/spiped-source/POSIX/posix-cflags.sh +10 -0
- data/ext/spiped/spiped-source/POSIX/posix-clock_realtime.c +3 -0
- data/ext/spiped/spiped-source/POSIX/posix-l.c +1 -0
- data/ext/spiped/spiped-source/POSIX/posix-l.sh +14 -0
- data/ext/spiped/spiped-source/POSIX/posix-msg_nosignal.c +3 -0
- data/ext/spiped/spiped-source/README +198 -0
- data/ext/spiped/spiped-source/STYLE +151 -0
- data/ext/spiped/spiped-source/lib/dnsthread/dnsthread.c +464 -0
- data/ext/spiped/spiped-source/lib/dnsthread/dnsthread.h +45 -0
- data/ext/spiped/spiped-source/libcperciva/alg/sha256.c +442 -0
- data/ext/spiped/spiped-source/libcperciva/alg/sha256.h +95 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/Build/cpusupport-X86-AESNI.c +13 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/Build/cpusupport-X86-CPUID.c +8 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/Build/cpusupport.sh +37 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/cpusupport.h +63 -0
- data/ext/spiped/spiped-source/libcperciva/cpusupport/cpusupport_x86_aesni.c +30 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes.c +166 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes.h +31 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes_aesni.c +229 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aes_aesni.h +31 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aesctr.c +124 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_aesctr.h +41 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh.c +293 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh.h +43 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh_group14.c +46 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_dh_group14.h +9 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_entropy.c +215 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_entropy.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_verify_bytes.c +21 -0
- data/ext/spiped/spiped-source/libcperciva/crypto/crypto_verify_bytes.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/elasticarray.c +276 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/elasticarray.h +167 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/mpool.h +85 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/ptrheap.c +334 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/ptrheap.h +89 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/timerqueue.c +241 -0
- data/ext/spiped/spiped-source/libcperciva/datastruct/timerqueue.h +60 -0
- data/ext/spiped/spiped-source/libcperciva/events/events.c +203 -0
- data/ext/spiped/spiped-source/libcperciva/events/events.h +106 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_immediate.c +149 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_internal.h +95 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_network.c +347 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_network_selectstats.c +106 -0
- data/ext/spiped/spiped-source/libcperciva/events/events_timer.c +273 -0
- data/ext/spiped/spiped-source/libcperciva/network/network.h +95 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_accept.c +103 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_connect.c +258 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_read.c +155 -0
- data/ext/spiped/spiped-source/libcperciva/network/network_write.c +188 -0
- data/ext/spiped/spiped-source/libcperciva/util/asprintf.c +49 -0
- data/ext/spiped/spiped-source/libcperciva/util/asprintf.h +16 -0
- data/ext/spiped/spiped-source/libcperciva/util/daemonize.c +134 -0
- data/ext/spiped/spiped-source/libcperciva/util/daemonize.h +10 -0
- data/ext/spiped/spiped-source/libcperciva/util/entropy.c +76 -0
- data/ext/spiped/spiped-source/libcperciva/util/entropy.h +13 -0
- data/ext/spiped/spiped-source/libcperciva/util/imalloc.h +33 -0
- data/ext/spiped/spiped-source/libcperciva/util/insecure_memzero.c +19 -0
- data/ext/spiped/spiped-source/libcperciva/util/insecure_memzero.h +33 -0
- data/ext/spiped/spiped-source/libcperciva/util/monoclock.c +52 -0
- data/ext/spiped/spiped-source/libcperciva/util/monoclock.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/util/noeintr.c +54 -0
- data/ext/spiped/spiped-source/libcperciva/util/noeintr.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock.c +472 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock.h +56 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock_internal.h +14 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock_util.c +271 -0
- data/ext/spiped/spiped-source/libcperciva/util/sock_util.h +51 -0
- data/ext/spiped/spiped-source/libcperciva/util/sysendian.h +146 -0
- data/ext/spiped/spiped-source/libcperciva/util/warnp.c +76 -0
- data/ext/spiped/spiped-source/libcperciva/util/warnp.h +59 -0
- data/ext/spiped/spiped-source/proto/proto_conn.c +362 -0
- data/ext/spiped/spiped-source/proto/proto_conn.h +25 -0
- data/ext/spiped/spiped-source/proto/proto_crypt.c +396 -0
- data/ext/spiped/spiped-source/proto/proto_crypt.h +102 -0
- data/ext/spiped/spiped-source/proto/proto_handshake.c +330 -0
- data/ext/spiped/spiped-source/proto/proto_handshake.h +30 -0
- data/ext/spiped/spiped-source/proto/proto_pipe.c +202 -0
- data/ext/spiped/spiped-source/proto/proto_pipe.h +23 -0
- data/ext/spiped/spiped-source/spipe/Makefile +90 -0
- data/ext/spiped/spiped-source/spipe/README +24 -0
- data/ext/spiped/spiped-source/spipe/main.c +178 -0
- data/ext/spiped/spiped-source/spipe/pushbits.c +101 -0
- data/ext/spiped/spiped-source/spipe/pushbits.h +10 -0
- data/ext/spiped/spiped-source/spipe/spipe.1 +60 -0
- data/ext/spiped/spiped-source/spiped/Makefile +98 -0
- data/ext/spiped/spiped-source/spiped/README +62 -0
- data/ext/spiped/spiped-source/spiped/dispatch.c +214 -0
- data/ext/spiped/spiped-source/spiped/dispatch.h +27 -0
- data/ext/spiped/spiped-source/spiped/main.c +267 -0
- data/ext/spiped/spiped-source/spiped/spiped.1 +112 -0
- data/lib/spiped.rb +3 -0
- metadata +143 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#include <sys/time.h>
|
|
2
|
+
|
|
3
|
+
#include "monoclock.h"
|
|
4
|
+
|
|
5
|
+
#include "events.h"
|
|
6
|
+
#include "events_internal.h"
|
|
7
|
+
|
|
8
|
+
/* Time when inter-select duration clock started. */
|
|
9
|
+
static struct timeval st;
|
|
10
|
+
static int running = 0;
|
|
11
|
+
|
|
12
|
+
/* Statistics on inter-select durations. */
|
|
13
|
+
static double N = 0.0;
|
|
14
|
+
static double mu = 0.0;
|
|
15
|
+
static double M2 = 0.0;
|
|
16
|
+
static double max = 0.0;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* events_network_selectstats_startclock(void):
|
|
20
|
+
* Start the inter-select duration clock: There is a selectable event.
|
|
21
|
+
*/
|
|
22
|
+
void
|
|
23
|
+
events_network_selectstats_startclock(void)
|
|
24
|
+
{
|
|
25
|
+
|
|
26
|
+
/* If the clock is already running, return silently. */
|
|
27
|
+
if (running)
|
|
28
|
+
return;
|
|
29
|
+
|
|
30
|
+
/* Get the current time; return silently on error. */
|
|
31
|
+
if (monoclock_get(&st))
|
|
32
|
+
return;
|
|
33
|
+
|
|
34
|
+
/* The clock is now running. */
|
|
35
|
+
running = 1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* events_network_selectstats_stopclock(void):
|
|
40
|
+
* Stop the inter-select duration clock: There are no selectable events.
|
|
41
|
+
*/
|
|
42
|
+
void
|
|
43
|
+
events_network_selectstats_stopclock(void)
|
|
44
|
+
{
|
|
45
|
+
|
|
46
|
+
/* The clock is no longer running. */
|
|
47
|
+
running = 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* events_network_selectstats_select(void):
|
|
52
|
+
* Update inter-select duration statistics in relation to an upcoming
|
|
53
|
+
* select(2) call.
|
|
54
|
+
*/
|
|
55
|
+
void
|
|
56
|
+
events_network_selectstats_select(void)
|
|
57
|
+
{
|
|
58
|
+
struct timeval tnow;
|
|
59
|
+
double t, d;
|
|
60
|
+
|
|
61
|
+
/* If the clock is not running, return silently. */
|
|
62
|
+
if (!running)
|
|
63
|
+
return;
|
|
64
|
+
|
|
65
|
+
/* If we can't get the current time, fail silently. */
|
|
66
|
+
if (monoclock_get(&tnow))
|
|
67
|
+
goto done;
|
|
68
|
+
|
|
69
|
+
/* Compute inter-select duration in seconds. */
|
|
70
|
+
t = (tnow.tv_sec - st.tv_sec) + (tnow.tv_usec - st.tv_usec) * 0.000001;
|
|
71
|
+
|
|
72
|
+
/* Adjust statistics. We track running mean, variance * N, and max. */
|
|
73
|
+
N += 1.0;
|
|
74
|
+
d = t - mu;
|
|
75
|
+
mu += d / N;
|
|
76
|
+
M2 += d * (t - mu);
|
|
77
|
+
if (max < t)
|
|
78
|
+
max = t;
|
|
79
|
+
|
|
80
|
+
done:
|
|
81
|
+
/* The clock is no longer running. */
|
|
82
|
+
running = 0;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* events_network_selectstats(N, mu, va, max):
|
|
87
|
+
* Return statistics on the inter-select durations since the last time this
|
|
88
|
+
* function was called.
|
|
89
|
+
*/
|
|
90
|
+
void
|
|
91
|
+
events_network_selectstats(double * _N, double * _mu, double * _va,
|
|
92
|
+
double * _max)
|
|
93
|
+
{
|
|
94
|
+
|
|
95
|
+
/* Copy statistics out. */
|
|
96
|
+
*_N = N;
|
|
97
|
+
*_mu = mu;
|
|
98
|
+
if (N > 1.0)
|
|
99
|
+
*_va = M2 / (N - 1.0);
|
|
100
|
+
else
|
|
101
|
+
*_va = 0.0;
|
|
102
|
+
*_max = max;
|
|
103
|
+
|
|
104
|
+
/* Zero statistics. */
|
|
105
|
+
N = mu = M2 = max = 0.0;
|
|
106
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
#include <sys/time.h>
|
|
2
|
+
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <string.h>
|
|
5
|
+
|
|
6
|
+
#include "monoclock.h"
|
|
7
|
+
#include "timerqueue.h"
|
|
8
|
+
|
|
9
|
+
#include "events_internal.h"
|
|
10
|
+
#include "events.h"
|
|
11
|
+
|
|
12
|
+
struct timerrec {
|
|
13
|
+
struct eventrec * r;
|
|
14
|
+
void * cookie;
|
|
15
|
+
struct timeval tv_orig;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
static struct timerqueue * Q = NULL;
|
|
19
|
+
|
|
20
|
+
/* Set tv := <current time> + tdelta. */
|
|
21
|
+
static int
|
|
22
|
+
gettimeout(struct timeval * tv, struct timeval * tdelta)
|
|
23
|
+
{
|
|
24
|
+
|
|
25
|
+
if (monoclock_get(tv))
|
|
26
|
+
goto err0;
|
|
27
|
+
tv->tv_sec += tdelta->tv_sec;
|
|
28
|
+
if ((tv->tv_usec += tdelta->tv_usec) >= 1000000) {
|
|
29
|
+
tv->tv_usec -= 1000000;
|
|
30
|
+
tv->tv_sec += 1;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Success! */
|
|
34
|
+
return (0);
|
|
35
|
+
|
|
36
|
+
err0:
|
|
37
|
+
/* Failure! */
|
|
38
|
+
return (-1);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* events_timer_register(func, cookie, timeo):
|
|
43
|
+
* Register ${func}(${cookie}) to be run ${timeo} in the future. Return a
|
|
44
|
+
* cookie which can be passed to events_timer_cancel or events_timer_reset.
|
|
45
|
+
*/
|
|
46
|
+
void *
|
|
47
|
+
events_timer_register(int (*func)(void *), void * cookie,
|
|
48
|
+
const struct timeval * timeo)
|
|
49
|
+
{
|
|
50
|
+
struct eventrec * r;
|
|
51
|
+
struct timerrec * t;
|
|
52
|
+
struct timeval tv;
|
|
53
|
+
|
|
54
|
+
/* Create the timer queue if it doesn't exist yet. */
|
|
55
|
+
if (Q == NULL) {
|
|
56
|
+
if ((Q = timerqueue_init()) == NULL)
|
|
57
|
+
goto err0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Bundle into an eventrec record. */
|
|
61
|
+
if ((r = events_mkrec(func, cookie)) == NULL)
|
|
62
|
+
goto err0;
|
|
63
|
+
|
|
64
|
+
/* Create a timer record. */
|
|
65
|
+
if ((t = malloc(sizeof(struct timerrec))) == NULL)
|
|
66
|
+
goto err1;
|
|
67
|
+
t->r = r;
|
|
68
|
+
memcpy(&t->tv_orig, timeo, sizeof(struct timeval));
|
|
69
|
+
|
|
70
|
+
/* Compute the absolute timeout. */
|
|
71
|
+
if (gettimeout(&tv, &t->tv_orig))
|
|
72
|
+
goto err2;
|
|
73
|
+
|
|
74
|
+
/* Add this to the timer queue. */
|
|
75
|
+
if ((t->cookie = timerqueue_add(Q, &tv, t)) == NULL)
|
|
76
|
+
goto err2;
|
|
77
|
+
|
|
78
|
+
/* Success! */
|
|
79
|
+
return (t);
|
|
80
|
+
|
|
81
|
+
err2:
|
|
82
|
+
free(t);
|
|
83
|
+
err1:
|
|
84
|
+
events_freerec(r);
|
|
85
|
+
err0:
|
|
86
|
+
/* Failure! */
|
|
87
|
+
return (NULL);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* events_timer_register_double(func, cookie, timeo):
|
|
92
|
+
* As events_timer_register, but ${timeo} is a double-precision floating point
|
|
93
|
+
* value specifying a number of seconds.
|
|
94
|
+
*/
|
|
95
|
+
void *
|
|
96
|
+
events_timer_register_double(int (*func)(void *), void * cookie,
|
|
97
|
+
double timeo)
|
|
98
|
+
{
|
|
99
|
+
struct timeval tv;
|
|
100
|
+
|
|
101
|
+
/* Convert timeo to a struct timeval. */
|
|
102
|
+
tv.tv_sec = timeo;
|
|
103
|
+
tv.tv_usec = (timeo - tv.tv_sec) * 1000000.0;
|
|
104
|
+
|
|
105
|
+
/* Schedule the timeout. */
|
|
106
|
+
return (events_timer_register(func, cookie, &tv));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* events_timer_cancel(cookie):
|
|
111
|
+
* Cancel the timer for which the cookie ${cookie} was returned by
|
|
112
|
+
* events_timer_register.
|
|
113
|
+
*/
|
|
114
|
+
void
|
|
115
|
+
events_timer_cancel(void * cookie)
|
|
116
|
+
{
|
|
117
|
+
struct timerrec * t = cookie;
|
|
118
|
+
|
|
119
|
+
/* Remove from the timer queue. */
|
|
120
|
+
timerqueue_delete(Q, t->cookie);
|
|
121
|
+
|
|
122
|
+
/* Free the eventrec and timer records. */
|
|
123
|
+
events_freerec(t->r);
|
|
124
|
+
free(t);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* events_timer_reset(cookie):
|
|
129
|
+
* Reset the timer for which the cookie ${cookie} was returned by
|
|
130
|
+
* events_timer_register to its initial value.
|
|
131
|
+
*/
|
|
132
|
+
int
|
|
133
|
+
events_timer_reset(void * cookie)
|
|
134
|
+
{
|
|
135
|
+
struct timerrec * t = cookie;
|
|
136
|
+
struct timeval tv;
|
|
137
|
+
|
|
138
|
+
/* Compute the new timeout. */
|
|
139
|
+
if (gettimeout(&tv, &t->tv_orig))
|
|
140
|
+
goto err0;
|
|
141
|
+
|
|
142
|
+
/* Adjust the timer. */
|
|
143
|
+
timerqueue_increase(Q, t->cookie, &tv);
|
|
144
|
+
|
|
145
|
+
/* Success! */
|
|
146
|
+
return (0);
|
|
147
|
+
|
|
148
|
+
err0:
|
|
149
|
+
/* Failure! */
|
|
150
|
+
return (-1);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* events_timer_min(timeo):
|
|
155
|
+
* Return via ${timeo} a pointer to the minimum time which must be waited
|
|
156
|
+
* before a timer will expire; or to NULL if there are no timers. The caller
|
|
157
|
+
* is responsible for freeing the returned pointer.
|
|
158
|
+
*/
|
|
159
|
+
int
|
|
160
|
+
events_timer_min(struct timeval ** timeo)
|
|
161
|
+
{
|
|
162
|
+
struct timeval tnow;
|
|
163
|
+
const struct timeval * tv;
|
|
164
|
+
|
|
165
|
+
/* If we have no queue, we have no timers; return NULL. */
|
|
166
|
+
if (Q == NULL) {
|
|
167
|
+
*timeo = NULL;
|
|
168
|
+
goto done;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Get the minimum timer from the queue. */
|
|
172
|
+
tv = timerqueue_getmin(Q);
|
|
173
|
+
|
|
174
|
+
/* If there are no timers, return NULL. */
|
|
175
|
+
if (tv == NULL) {
|
|
176
|
+
*timeo = NULL;
|
|
177
|
+
goto done;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Allocate space for holding the returned timeval. */
|
|
181
|
+
if ((*timeo = malloc(sizeof(struct timeval))) == NULL)
|
|
182
|
+
goto err0;
|
|
183
|
+
|
|
184
|
+
/* Get the current time... */
|
|
185
|
+
if (monoclock_get(&tnow))
|
|
186
|
+
goto err1;
|
|
187
|
+
|
|
188
|
+
/* ... and compare it to the minimum timer. */
|
|
189
|
+
if ((tnow.tv_sec > tv->tv_sec) ||
|
|
190
|
+
((tnow.tv_sec == tv->tv_sec) && (tnow.tv_usec > tv->tv_usec))) {
|
|
191
|
+
/* The timer has already expired, so return zero. */
|
|
192
|
+
(*timeo)->tv_sec = 0;
|
|
193
|
+
(*timeo)->tv_usec = 0;
|
|
194
|
+
} else {
|
|
195
|
+
/* Compute the difference. */
|
|
196
|
+
(*timeo)->tv_sec = tv->tv_sec - tnow.tv_sec;
|
|
197
|
+
(*timeo)->tv_usec = tv->tv_usec - tnow.tv_usec;
|
|
198
|
+
if (tv->tv_usec < tnow.tv_usec) {
|
|
199
|
+
(*timeo)->tv_usec += 1000000;
|
|
200
|
+
(*timeo)->tv_sec -= 1;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
done:
|
|
205
|
+
/* Success! */
|
|
206
|
+
return (0);
|
|
207
|
+
|
|
208
|
+
err1:
|
|
209
|
+
free(*timeo);
|
|
210
|
+
err0:
|
|
211
|
+
/* Failure! */
|
|
212
|
+
return (-1);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* events_timer_get(r):
|
|
217
|
+
* Return via ${r} a pointer to an eventrec structure corresponding to an
|
|
218
|
+
* expired timer, and delete said timer; or to NULL if there are no expired
|
|
219
|
+
* timers. The caller is responsible for freeing the returned pointer.
|
|
220
|
+
*/
|
|
221
|
+
int
|
|
222
|
+
events_timer_get(struct eventrec ** r)
|
|
223
|
+
{
|
|
224
|
+
struct timeval tnow;
|
|
225
|
+
struct timerrec * t;
|
|
226
|
+
|
|
227
|
+
/* If we have no queue, we have no timers; return NULL. */
|
|
228
|
+
if (Q == NULL) {
|
|
229
|
+
*r = NULL;
|
|
230
|
+
goto done;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/* Get current time. */
|
|
234
|
+
if (monoclock_get(&tnow))
|
|
235
|
+
goto err0;
|
|
236
|
+
|
|
237
|
+
/* Get an expired timer, if there is one. */
|
|
238
|
+
t = timerqueue_getptr(Q, &tnow);
|
|
239
|
+
|
|
240
|
+
/* If there is an expired timer... */
|
|
241
|
+
if (t != NULL) {
|
|
242
|
+
/* ... pass back the eventrec and free the timer. */
|
|
243
|
+
*r = t->r;
|
|
244
|
+
free(t);
|
|
245
|
+
} else {
|
|
246
|
+
/* Otherwise, return NULL. */
|
|
247
|
+
*r = NULL;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
done:
|
|
251
|
+
/* Success! */
|
|
252
|
+
return (0);
|
|
253
|
+
|
|
254
|
+
err0:
|
|
255
|
+
/* Failure! */
|
|
256
|
+
return (-1);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* events_timer_shutdown(void):
|
|
261
|
+
* Clean up and free memory. This call is not necessary on program exit and
|
|
262
|
+
* is only expected to be useful when checking for memory leaks.
|
|
263
|
+
*/
|
|
264
|
+
void
|
|
265
|
+
events_timer_shutdown(void)
|
|
266
|
+
{
|
|
267
|
+
|
|
268
|
+
/* If we have a queue and it is empty, free it. */
|
|
269
|
+
if ((Q != NULL) && (timerqueue_getmin(Q) == NULL)) {
|
|
270
|
+
timerqueue_free(Q);
|
|
271
|
+
Q = NULL;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
#ifndef _NETWORK_H_
|
|
2
|
+
#define _NETWORK_H_
|
|
3
|
+
|
|
4
|
+
#include <sys/select.h>
|
|
5
|
+
|
|
6
|
+
#include <stddef.h>
|
|
7
|
+
#include <stdint.h>
|
|
8
|
+
#include <unistd.h>
|
|
9
|
+
|
|
10
|
+
/* Opaque address structure. */
|
|
11
|
+
struct sock_addr;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* network_accept(fd, callback, cookie):
|
|
15
|
+
* Asynchronously accept a connection on the socket ${fd}, which must be
|
|
16
|
+
* already marked as listening and non-blocking. When a connection has been
|
|
17
|
+
* accepted or an error occurs, invoke ${callback}(${cookie}, s) where s is
|
|
18
|
+
* the accepted connection or -1 on error. Return a cookie which can be
|
|
19
|
+
* passed to network_accept_cancel in order to cancel the accept.
|
|
20
|
+
*/
|
|
21
|
+
void * network_accept(int, int (*)(void *, int), void *);
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* network_accept_cancel(cookie);
|
|
25
|
+
* Cancel the connection accept for which the cookie ${cookie} was returned
|
|
26
|
+
* by network_accept. Do not invoke the callback associated with the accept.
|
|
27
|
+
*/
|
|
28
|
+
void network_accept_cancel(void *);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* network_connect(sas, callback, cookie):
|
|
32
|
+
* Iterate through the addresses in ${sas}, attempting to create and connect
|
|
33
|
+
* a non-blocking socket. Once connected, invoke ${callback}(${cookie}, s)
|
|
34
|
+
* where s is the connected socket; upon fatal error or if there are no
|
|
35
|
+
* addresses remaining to attempt, invoke ${callback}(${cookie}, -1). Return
|
|
36
|
+
* a cookie which can be passed to network_connect_cancel in order to cancel
|
|
37
|
+
* the connection attempt.
|
|
38
|
+
*/
|
|
39
|
+
void * network_connect(struct sock_addr * const *,
|
|
40
|
+
int (*)(void *, int), void *);
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* network_connect_timeo(sas, timeo, callback, cookie):
|
|
44
|
+
* Behave as network_connect, but wait a duration of at most ${timeo} for
|
|
45
|
+
* each address which is being attempted.
|
|
46
|
+
*/
|
|
47
|
+
void * network_connect_timeo(struct sock_addr * const *, const struct timeval *,
|
|
48
|
+
int (*)(void *, int), void *);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* network_connect_cancel(cookie):
|
|
52
|
+
* Cancel the connection attempt for which ${cookie} was returned by
|
|
53
|
+
* network_connect. Do not invoke the associated callback.
|
|
54
|
+
*/
|
|
55
|
+
void network_connect_cancel(void *);
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* network_read(fd, buf, buflen, minread, callback, cookie):
|
|
59
|
+
* Asynchronously read up to ${buflen} bytes of data from ${fd} into ${buf}.
|
|
60
|
+
* When at least ${minread} bytes have been read or on error, invoke
|
|
61
|
+
* ${callback}(${cookie}, lenread), where lenread is 0 on EOF or -1 on error,
|
|
62
|
+
* and the number of bytes read (between ${minread} and ${buflen} inclusive)
|
|
63
|
+
* otherwise. Return a cookie which can be passed to network_read_cancel in
|
|
64
|
+
* order to cancel the read.
|
|
65
|
+
*/
|
|
66
|
+
void * network_read(int, uint8_t *, size_t, size_t,
|
|
67
|
+
int (*)(void *, ssize_t), void *);
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* network_read_cancel(cookie):
|
|
71
|
+
* Cancel the buffer read for which the cookie ${cookie} was returned by
|
|
72
|
+
* network_read. Do not invoke the callback associated with the read.
|
|
73
|
+
*/
|
|
74
|
+
void network_read_cancel(void *);
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* network_write(fd, buf, buflen, minwrite, callback, cookie):
|
|
78
|
+
* Asynchronously write up to ${buflen} bytes of data from ${buf} to ${fd}.
|
|
79
|
+
* When at least ${minwrite} bytes have been written or on error, invoke
|
|
80
|
+
* ${callback}(${cookie}, lenwrit), where lenwrit is -1 on error and the
|
|
81
|
+
* number of bytes written (between ${minwrite} and ${buflen} inclusive)
|
|
82
|
+
* otherwise. Return a cookie which can be passed to network_write_cancel in
|
|
83
|
+
* order to cancel the write.
|
|
84
|
+
*/
|
|
85
|
+
void * network_write(int, const uint8_t *, size_t, size_t,
|
|
86
|
+
int (*)(void *, ssize_t), void *);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* network_write_cancel(cookie):
|
|
90
|
+
* Cancel the buffer write for which the cookie ${cookie} was returned by
|
|
91
|
+
* network_write. Do not invoke the callback associated with the write.
|
|
92
|
+
*/
|
|
93
|
+
void network_write_cancel(void *);
|
|
94
|
+
|
|
95
|
+
#endif /* !_NETWORK_H_ */
|