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,56 @@
|
|
|
1
|
+
#ifndef _SOCK_H_
|
|
2
|
+
#define _SOCK_H_
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Address strings are of the following forms:
|
|
6
|
+
* /path/to/unix/socket
|
|
7
|
+
* [ip.v4.ad.dr]:port
|
|
8
|
+
* [ipv6:add::ress]:port
|
|
9
|
+
* host.name:port
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* Opaque address structure. */
|
|
13
|
+
struct sock_addr;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* sock_resolve(addr):
|
|
17
|
+
* Return a NULL-terminated array of pointers to sock_addr structures.
|
|
18
|
+
*/
|
|
19
|
+
struct sock_addr ** sock_resolve(const char *);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* sock_listener(sa):
|
|
23
|
+
* Create a socket, set SO_REUSEADDR, bind it to the socket address ${sa},
|
|
24
|
+
* mark it for listening, and mark it as non-blocking.
|
|
25
|
+
*/
|
|
26
|
+
int sock_listener(const struct sock_addr *);
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* sock_connect(sas):
|
|
30
|
+
* Iterate through the addresses in ${sas}, attempting to create a socket and
|
|
31
|
+
* connect (blockingly). Once connected, stop iterating, mark the socket as
|
|
32
|
+
* non-blocking, and return it.
|
|
33
|
+
*/
|
|
34
|
+
int sock_connect(struct sock_addr * const *);
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* sock_connect_nb(sa):
|
|
38
|
+
* Create a socket, mark it as non-blocking, and attempt to connect to the
|
|
39
|
+
* address ${sa}. Return the socket (connected or in the process of
|
|
40
|
+
* connecting) or -1 on error.
|
|
41
|
+
*/
|
|
42
|
+
int sock_connect_nb(const struct sock_addr *);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* sock_addr_free(sa):
|
|
46
|
+
* Free the provided sock_addr structure.
|
|
47
|
+
*/
|
|
48
|
+
void sock_addr_free(struct sock_addr *);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* sock_addr_freelist(sas):
|
|
52
|
+
* Free the provided NULL-terminated array of sock_addr structures.
|
|
53
|
+
*/
|
|
54
|
+
void sock_addr_freelist(struct sock_addr **);
|
|
55
|
+
|
|
56
|
+
#endif /* !_SOCK_H_ */
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#ifndef _SOCK_INTERNAL_H_
|
|
2
|
+
#define _SOCK_INTERNAL_H_
|
|
3
|
+
|
|
4
|
+
#include <sys/socket.h>
|
|
5
|
+
|
|
6
|
+
/* Socket address structure. */
|
|
7
|
+
struct sock_addr {
|
|
8
|
+
int ai_family;
|
|
9
|
+
int ai_socktype;
|
|
10
|
+
struct sockaddr * name;
|
|
11
|
+
socklen_t namelen;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
#endif /* !_SOCK_INTERNAL_H_ */
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
#include <sys/socket.h>
|
|
2
|
+
#include <sys/un.h>
|
|
3
|
+
|
|
4
|
+
#include <netinet/in.h>
|
|
5
|
+
|
|
6
|
+
#include <arpa/inet.h>
|
|
7
|
+
|
|
8
|
+
#include <stdlib.h>
|
|
9
|
+
#include <string.h>
|
|
10
|
+
|
|
11
|
+
#include "asprintf.h"
|
|
12
|
+
#include "sock.h"
|
|
13
|
+
|
|
14
|
+
#include "sock_util.h"
|
|
15
|
+
#include "sock_internal.h"
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* sock_addr_cmp(sa1, sa2):
|
|
19
|
+
* Return non-zero iff the socket addresses ${sa1} and ${sa2} are different.
|
|
20
|
+
*/
|
|
21
|
+
int
|
|
22
|
+
sock_addr_cmp(const struct sock_addr * sa1, const struct sock_addr * sa2)
|
|
23
|
+
{
|
|
24
|
+
|
|
25
|
+
/* Family, socket type, and name length must match. */
|
|
26
|
+
if ((sa1->ai_family != sa2->ai_family) ||
|
|
27
|
+
(sa1->ai_socktype != sa2->ai_socktype) ||
|
|
28
|
+
(sa1->namelen != sa2->namelen))
|
|
29
|
+
return (1);
|
|
30
|
+
|
|
31
|
+
/* The required length of the sockaddr must match. */
|
|
32
|
+
if (memcmp(sa1->name, sa2->name, sa1->namelen) != 0)
|
|
33
|
+
return (1);
|
|
34
|
+
|
|
35
|
+
/* Everything matched. */
|
|
36
|
+
return (0);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* sock_addr_dup(sa):
|
|
41
|
+
* Duplicate the provided socket address.
|
|
42
|
+
*/
|
|
43
|
+
struct sock_addr *
|
|
44
|
+
sock_addr_dup(const struct sock_addr * sa)
|
|
45
|
+
{
|
|
46
|
+
struct sock_addr * sa2;
|
|
47
|
+
|
|
48
|
+
/* Allocate a struct sock_addr and copy fields. */
|
|
49
|
+
if ((sa2 = malloc(sizeof(struct sock_addr))) == NULL)
|
|
50
|
+
goto err0;
|
|
51
|
+
sa2->ai_family = sa->ai_family;
|
|
52
|
+
sa2->ai_socktype = sa->ai_socktype;
|
|
53
|
+
sa2->namelen = sa->namelen;
|
|
54
|
+
|
|
55
|
+
/* Allocate and copy the sockaddr. */
|
|
56
|
+
if ((sa2->name = malloc(sa2->namelen)) == NULL)
|
|
57
|
+
goto err1;
|
|
58
|
+
memcpy(sa2->name, sa->name, sa2->namelen);
|
|
59
|
+
|
|
60
|
+
/* Success! */
|
|
61
|
+
return (sa2);
|
|
62
|
+
|
|
63
|
+
err1:
|
|
64
|
+
free(sa2);
|
|
65
|
+
err0:
|
|
66
|
+
/* Failure! */
|
|
67
|
+
return (NULL);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* sock_addr_duplist(sas):
|
|
72
|
+
* Duplicate the provided list of socket addresses.
|
|
73
|
+
*/
|
|
74
|
+
struct sock_addr **
|
|
75
|
+
sock_addr_duplist(struct sock_addr * const * sas)
|
|
76
|
+
{
|
|
77
|
+
struct sock_addr ** sas2;
|
|
78
|
+
size_t i;
|
|
79
|
+
|
|
80
|
+
/* Count socket addresses. */
|
|
81
|
+
for (i = 0; sas[i] != NULL; i++)
|
|
82
|
+
continue;
|
|
83
|
+
|
|
84
|
+
/* Allocate the list to hold addresses plus a NULL terminator. */
|
|
85
|
+
if ((sas2 = malloc((i + 1) * sizeof(struct sock_addr *))) == NULL)
|
|
86
|
+
goto err0;
|
|
87
|
+
|
|
88
|
+
/* Duplicate addresses and NULL-terminate. */
|
|
89
|
+
for (i = 0; sas[i] != NULL; i++) {
|
|
90
|
+
if ((sas2[i] = sock_addr_dup(sas[i])) == NULL)
|
|
91
|
+
goto err1;
|
|
92
|
+
}
|
|
93
|
+
sas2[i] = NULL;
|
|
94
|
+
|
|
95
|
+
/* Success! */
|
|
96
|
+
return (sas2);
|
|
97
|
+
|
|
98
|
+
err1:
|
|
99
|
+
/*
|
|
100
|
+
* Regardless of how many addresses we managed to duplicate before
|
|
101
|
+
* failing and being sent here, we have a valid socket address list,
|
|
102
|
+
* since the erroring sock_addr_dup call NULL-terminated it for us;
|
|
103
|
+
* so we can free it and its constituent addresses easily.
|
|
104
|
+
*/
|
|
105
|
+
sock_addr_freelist(sas2);
|
|
106
|
+
err0:
|
|
107
|
+
/* Failure! */
|
|
108
|
+
return (NULL);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* sock_addr_serialize(sa, buf, buflen):
|
|
113
|
+
* Allocate a buffer and serialize the socket address ${sa} into it. Return
|
|
114
|
+
* the buffer via ${buf} and its length via ${buflen}. The serialization is
|
|
115
|
+
* machine and operating system dependent.
|
|
116
|
+
*/
|
|
117
|
+
int
|
|
118
|
+
sock_addr_serialize(const struct sock_addr * sa,
|
|
119
|
+
uint8_t ** buf, size_t * buflen)
|
|
120
|
+
{
|
|
121
|
+
uint8_t * p;
|
|
122
|
+
|
|
123
|
+
/* Compute buffer length and allocate buffer. */
|
|
124
|
+
*buflen = 2 * sizeof(int) + sizeof(socklen_t) + sa->namelen;
|
|
125
|
+
if ((p = *buf = malloc(*buflen)) == NULL)
|
|
126
|
+
goto err0;
|
|
127
|
+
|
|
128
|
+
/* Copy in data. */
|
|
129
|
+
memcpy(p, &sa->ai_family, sizeof(int));
|
|
130
|
+
p += sizeof(int);
|
|
131
|
+
memcpy(p, &sa->ai_socktype, sizeof(int));
|
|
132
|
+
p += sizeof(int);
|
|
133
|
+
memcpy(p, &sa->namelen, sizeof(socklen_t));
|
|
134
|
+
p += sizeof(socklen_t);
|
|
135
|
+
memcpy(p, sa->name, sa->namelen);
|
|
136
|
+
|
|
137
|
+
/* Success! */
|
|
138
|
+
return (0);
|
|
139
|
+
|
|
140
|
+
err0:
|
|
141
|
+
/* Failure! */
|
|
142
|
+
return (-1);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* sock_addr_deserialize(buf, buflen):
|
|
147
|
+
* Deserialize the ${buflen}-byte serialized socket address from ${buf}.
|
|
148
|
+
*/
|
|
149
|
+
struct sock_addr *
|
|
150
|
+
sock_addr_deserialize(const uint8_t * buf, size_t buflen)
|
|
151
|
+
{
|
|
152
|
+
struct sock_addr * sa;
|
|
153
|
+
|
|
154
|
+
/* Sanity check. */
|
|
155
|
+
if (buflen < 2 * sizeof(int) + sizeof(socklen_t))
|
|
156
|
+
goto err0;
|
|
157
|
+
|
|
158
|
+
/* Allocate a structure and copy in fields. */
|
|
159
|
+
if ((sa = malloc(sizeof(struct sock_addr))) == NULL)
|
|
160
|
+
goto err0;
|
|
161
|
+
memcpy(&sa->ai_family, buf, sizeof(int));
|
|
162
|
+
buf += sizeof(int);
|
|
163
|
+
memcpy(&sa->ai_socktype, buf, sizeof(int));
|
|
164
|
+
buf += sizeof(int);
|
|
165
|
+
memcpy(&sa->namelen, buf, sizeof(socklen_t));
|
|
166
|
+
buf += sizeof(socklen_t);
|
|
167
|
+
|
|
168
|
+
/* Allocate and copy the sockaddr. */
|
|
169
|
+
if (buflen != 2 * sizeof(int) + sizeof(socklen_t) + sa->namelen)
|
|
170
|
+
goto err1;
|
|
171
|
+
if ((sa->name = malloc(sa->namelen)) == NULL)
|
|
172
|
+
goto err1;
|
|
173
|
+
memcpy(sa->name, buf, sa->namelen);
|
|
174
|
+
|
|
175
|
+
/* Success! */
|
|
176
|
+
return (sa);
|
|
177
|
+
|
|
178
|
+
err1:
|
|
179
|
+
free(sa);
|
|
180
|
+
err0:
|
|
181
|
+
/* Failure! */
|
|
182
|
+
return (NULL);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/* Prettyprint an IPv4 address. */
|
|
186
|
+
static char *
|
|
187
|
+
prettyprint_ipv4(struct sockaddr * name, size_t namelen)
|
|
188
|
+
{
|
|
189
|
+
struct sockaddr_in sa_in;
|
|
190
|
+
char addr[INET_ADDRSTRLEN];
|
|
191
|
+
char * s;
|
|
192
|
+
|
|
193
|
+
/* Check name length. */
|
|
194
|
+
if (namelen != sizeof(struct sockaddr_in))
|
|
195
|
+
return (NULL);
|
|
196
|
+
|
|
197
|
+
/* Copy into buffer for alignment. */
|
|
198
|
+
memcpy(&sa_in, name, namelen);
|
|
199
|
+
|
|
200
|
+
/* Convert IP address to string. */
|
|
201
|
+
if (inet_ntop(AF_INET, &sa_in.sin_addr, addr, sizeof(addr)) == NULL)
|
|
202
|
+
return (NULL);
|
|
203
|
+
|
|
204
|
+
/* Construct address string. */
|
|
205
|
+
if (asprintf(&s, "[%s]:%d", addr, ntohs(sa_in.sin_port)) == -1)
|
|
206
|
+
return (NULL);
|
|
207
|
+
|
|
208
|
+
/* Success! */
|
|
209
|
+
return (s);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Prettyprint an IPv6 address. */
|
|
213
|
+
static char *
|
|
214
|
+
prettyprint_ipv6(struct sockaddr * name, size_t namelen)
|
|
215
|
+
{
|
|
216
|
+
struct sockaddr_in6 sa_in6;
|
|
217
|
+
char addr[INET6_ADDRSTRLEN];
|
|
218
|
+
char * s;
|
|
219
|
+
|
|
220
|
+
/* Check name length. */
|
|
221
|
+
if (namelen != sizeof(struct sockaddr_in6))
|
|
222
|
+
return (NULL);
|
|
223
|
+
|
|
224
|
+
/* Copy into buffer for alignment. */
|
|
225
|
+
memcpy(&sa_in6, name, namelen);
|
|
226
|
+
|
|
227
|
+
/* Convert IPv6 address to string. */
|
|
228
|
+
if (inet_ntop(AF_INET6, &sa_in6.sin6_addr, addr, sizeof(addr)) == NULL)
|
|
229
|
+
return (NULL);
|
|
230
|
+
|
|
231
|
+
/* Construct address string. */
|
|
232
|
+
if (asprintf(&s, "[%s]:%d", addr, ntohs(sa_in6.sin6_port)) == -1)
|
|
233
|
+
return (NULL);
|
|
234
|
+
|
|
235
|
+
/* Success! */
|
|
236
|
+
return (s);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/* Prettyprint a UNIX address. */
|
|
240
|
+
static char *
|
|
241
|
+
prettyprint_unix(struct sockaddr_un * name)
|
|
242
|
+
{
|
|
243
|
+
|
|
244
|
+
/* Just strdup the path. */
|
|
245
|
+
return (strdup(name->sun_path));
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* sock_addr_prettyprint(sa):
|
|
250
|
+
* Allocate and return a string in one of the forms
|
|
251
|
+
* /path/to/unix/socket
|
|
252
|
+
* [ip.v4.ad.dr]:port
|
|
253
|
+
* [ipv6:add::ress]:port
|
|
254
|
+
* representing the provided socket address.
|
|
255
|
+
*/
|
|
256
|
+
char *
|
|
257
|
+
sock_addr_prettyprint(const struct sock_addr * sa)
|
|
258
|
+
{
|
|
259
|
+
|
|
260
|
+
/* Handle different types of addresses differently. */
|
|
261
|
+
switch (sa->ai_family) {
|
|
262
|
+
case AF_INET:
|
|
263
|
+
return (prettyprint_ipv4(sa->name, sa->namelen));
|
|
264
|
+
case AF_INET6:
|
|
265
|
+
return (prettyprint_ipv6(sa->name, sa->namelen));
|
|
266
|
+
case AF_UNIX:
|
|
267
|
+
return (prettyprint_unix((struct sockaddr_un *)(sa->name)));
|
|
268
|
+
default:
|
|
269
|
+
return (strdup("Unknown address"));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#ifndef _SOCK_UTIL_H_
|
|
2
|
+
#define _SOCK_UTIL_H_
|
|
3
|
+
|
|
4
|
+
#include <stdint.h>
|
|
5
|
+
|
|
6
|
+
/* Opaque address structure. */
|
|
7
|
+
struct sock_addr;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* sock_addr_cmp(sa1, sa2):
|
|
11
|
+
* Return non-zero iff the socket addresses ${sa1} and ${sa2} are different.
|
|
12
|
+
*/
|
|
13
|
+
int sock_addr_cmp(const struct sock_addr *, const struct sock_addr *);
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* sock_addr_dup(sa):
|
|
17
|
+
* Duplicate the provided socket address.
|
|
18
|
+
*/
|
|
19
|
+
struct sock_addr * sock_addr_dup(const struct sock_addr *);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* sock_addr_duplist(sas):
|
|
23
|
+
* Duplicate the provided list of socket addresses.
|
|
24
|
+
*/
|
|
25
|
+
struct sock_addr ** sock_addr_duplist(struct sock_addr * const *);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* sock_addr_serialize(sa, buf, buflen):
|
|
29
|
+
* Allocate a buffer and serialize the socket address ${sa} into it. Return
|
|
30
|
+
* the buffer via ${buf} and its length via ${buflen}. The serialization is
|
|
31
|
+
* machine and operating system dependent.
|
|
32
|
+
*/
|
|
33
|
+
int sock_addr_serialize(const struct sock_addr *, uint8_t **, size_t *);
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* sock_addr_deserialize(buf, buflen):
|
|
37
|
+
* Deserialize the ${buflen}-byte serialized socket address from ${buf}.
|
|
38
|
+
*/
|
|
39
|
+
struct sock_addr * sock_addr_deserialize(const uint8_t *, size_t);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* sock_addr_prettyprint(sa):
|
|
43
|
+
* Allocate and return a string in one of the forms
|
|
44
|
+
* /path/to/unix/socket
|
|
45
|
+
* [ip.v4.ad.dr]:port
|
|
46
|
+
* [ipv6:add::ress]:port
|
|
47
|
+
* representing the provided socket address.
|
|
48
|
+
*/
|
|
49
|
+
char * sock_addr_prettyprint(const struct sock_addr *);
|
|
50
|
+
|
|
51
|
+
#endif /* !_SOCK_H_ */
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#ifndef _SYSENDIAN_H_
|
|
2
|
+
#define _SYSENDIAN_H_
|
|
3
|
+
|
|
4
|
+
#include <stdint.h>
|
|
5
|
+
|
|
6
|
+
/* Avoid namespace collisions with BSD <sys/endian.h>. */
|
|
7
|
+
#define be16dec libcperciva_be16dec
|
|
8
|
+
#define be16enc libcperciva_be16enc
|
|
9
|
+
#define be32dec libcperciva_be32dec
|
|
10
|
+
#define be32enc libcperciva_be32enc
|
|
11
|
+
#define be64dec libcperciva_be64dec
|
|
12
|
+
#define be64enc libcperciva_be64enc
|
|
13
|
+
#define le16dec libcperciva_le16dec
|
|
14
|
+
#define le16enc libcperciva_le16enc
|
|
15
|
+
#define le32dec libcperciva_le32dec
|
|
16
|
+
#define le32enc libcperciva_le32enc
|
|
17
|
+
#define le64dec libcperciva_le64dec
|
|
18
|
+
#define le64enc libcperciva_le64enc
|
|
19
|
+
|
|
20
|
+
static inline uint16_t
|
|
21
|
+
be16dec(const void * pp)
|
|
22
|
+
{
|
|
23
|
+
const uint8_t * p = (uint8_t const *)pp;
|
|
24
|
+
|
|
25
|
+
return ((uint16_t)(p[1]) + ((uint16_t)(p[0]) << 8));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
static inline void
|
|
29
|
+
be16enc(void * pp, uint16_t x)
|
|
30
|
+
{
|
|
31
|
+
uint8_t * p = (uint8_t *)pp;
|
|
32
|
+
|
|
33
|
+
p[1] = x & 0xff;
|
|
34
|
+
p[0] = (x >> 8) & 0xff;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static inline uint32_t
|
|
38
|
+
be32dec(const void * pp)
|
|
39
|
+
{
|
|
40
|
+
const uint8_t * p = (uint8_t const *)pp;
|
|
41
|
+
|
|
42
|
+
return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) +
|
|
43
|
+
((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
static inline void
|
|
47
|
+
be32enc(void * pp, uint32_t x)
|
|
48
|
+
{
|
|
49
|
+
uint8_t * p = (uint8_t *)pp;
|
|
50
|
+
|
|
51
|
+
p[3] = x & 0xff;
|
|
52
|
+
p[2] = (x >> 8) & 0xff;
|
|
53
|
+
p[1] = (x >> 16) & 0xff;
|
|
54
|
+
p[0] = (x >> 24) & 0xff;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
static inline uint64_t
|
|
58
|
+
be64dec(const void * pp)
|
|
59
|
+
{
|
|
60
|
+
const uint8_t * p = (uint8_t const *)pp;
|
|
61
|
+
|
|
62
|
+
return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +
|
|
63
|
+
((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +
|
|
64
|
+
((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +
|
|
65
|
+
((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
static inline void
|
|
69
|
+
be64enc(void * pp, uint64_t x)
|
|
70
|
+
{
|
|
71
|
+
uint8_t * p = (uint8_t *)pp;
|
|
72
|
+
|
|
73
|
+
p[7] = x & 0xff;
|
|
74
|
+
p[6] = (x >> 8) & 0xff;
|
|
75
|
+
p[5] = (x >> 16) & 0xff;
|
|
76
|
+
p[4] = (x >> 24) & 0xff;
|
|
77
|
+
p[3] = (x >> 32) & 0xff;
|
|
78
|
+
p[2] = (x >> 40) & 0xff;
|
|
79
|
+
p[1] = (x >> 48) & 0xff;
|
|
80
|
+
p[0] = (x >> 56) & 0xff;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static inline uint16_t
|
|
84
|
+
le16dec(const void * pp)
|
|
85
|
+
{
|
|
86
|
+
const uint8_t * p = (uint8_t const *)pp;
|
|
87
|
+
|
|
88
|
+
return ((uint16_t)(p[0]) + ((uint16_t)(p[1]) << 8));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
static inline void
|
|
92
|
+
le16enc(void * pp, uint16_t x)
|
|
93
|
+
{
|
|
94
|
+
uint8_t * p = (uint8_t *)pp;
|
|
95
|
+
|
|
96
|
+
p[0] = x & 0xff;
|
|
97
|
+
p[1] = (x >> 8) & 0xff;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
static inline uint32_t
|
|
101
|
+
le32dec(const void * pp)
|
|
102
|
+
{
|
|
103
|
+
const uint8_t * p = (uint8_t const *)pp;
|
|
104
|
+
|
|
105
|
+
return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +
|
|
106
|
+
((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
static inline void
|
|
110
|
+
le32enc(void * pp, uint32_t x)
|
|
111
|
+
{
|
|
112
|
+
uint8_t * p = (uint8_t *)pp;
|
|
113
|
+
|
|
114
|
+
p[0] = x & 0xff;
|
|
115
|
+
p[1] = (x >> 8) & 0xff;
|
|
116
|
+
p[2] = (x >> 16) & 0xff;
|
|
117
|
+
p[3] = (x >> 24) & 0xff;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
static inline uint64_t
|
|
121
|
+
le64dec(const void * pp)
|
|
122
|
+
{
|
|
123
|
+
const uint8_t * p = (uint8_t const *)pp;
|
|
124
|
+
|
|
125
|
+
return ((uint64_t)(p[0]) + ((uint64_t)(p[1]) << 8) +
|
|
126
|
+
((uint64_t)(p[2]) << 16) + ((uint64_t)(p[3]) << 24) +
|
|
127
|
+
((uint64_t)(p[4]) << 32) + ((uint64_t)(p[5]) << 40) +
|
|
128
|
+
((uint64_t)(p[6]) << 48) + ((uint64_t)(p[7]) << 56));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
static inline void
|
|
132
|
+
le64enc(void * pp, uint64_t x)
|
|
133
|
+
{
|
|
134
|
+
uint8_t * p = (uint8_t *)pp;
|
|
135
|
+
|
|
136
|
+
p[0] = x & 0xff;
|
|
137
|
+
p[1] = (x >> 8) & 0xff;
|
|
138
|
+
p[2] = (x >> 16) & 0xff;
|
|
139
|
+
p[3] = (x >> 24) & 0xff;
|
|
140
|
+
p[4] = (x >> 32) & 0xff;
|
|
141
|
+
p[5] = (x >> 40) & 0xff;
|
|
142
|
+
p[6] = (x >> 48) & 0xff;
|
|
143
|
+
p[7] = (x >> 56) & 0xff;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
#endif /* !_SYSENDIAN_H_ */
|