1
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
* you may not use this file except in compliance with the License.
6
* You may obtain a copy of the License at
8
* http://www.apache.org/licenses/LICENSE-2.0
10
* Unless required by applicable law or agreed to in writing, software
11
* distributed under the License is distributed on an "AS IS" BASIS,
12
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
* See the License for the specific language governing permissions and
14
* limitations under the License.
17
#include "apr_network_io.h"
18
#include "apr_errno.h"
19
#include "apr_general.h"
25
static void tcp_socket(abts_case *tc, void *data)
28
apr_socket_t *sock = NULL;
31
rv = apr_socket_create(&sock, APR_INET, SOCK_STREAM, 0, p);
32
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
33
ABTS_PTR_NOTNULL(tc, sock);
35
rv = apr_socket_type_get(sock, &type);
36
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
37
ABTS_INT_EQUAL(tc, SOCK_STREAM, type);
39
apr_socket_close(sock);
42
static void udp_socket(abts_case *tc, void *data)
45
apr_socket_t *sock = NULL;
48
rv = apr_socket_create(&sock, APR_INET, SOCK_DGRAM, 0, p);
49
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
50
ABTS_PTR_NOTNULL(tc, sock);
52
rv = apr_socket_type_get(sock, &type);
53
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
54
ABTS_INT_EQUAL(tc, SOCK_DGRAM, type);
56
apr_socket_close(sock);
59
/* On recent Linux systems, whilst IPv6 is always supported by glibc,
60
* socket(AF_INET6, ...) calls will fail with EAFNOSUPPORT if the
61
* "ipv6" kernel module is not loaded. */
63
#define V6_NOT_ENABLED(e) ((e) == EAFNOSUPPORT)
65
#define V6_NOT_ENABLED(e) (0)
68
static void tcp6_socket(abts_case *tc, void *data)
72
apr_socket_t *sock = NULL;
74
rv = apr_socket_create(&sock, APR_INET6, SOCK_STREAM, 0, p);
75
if (V6_NOT_ENABLED(rv)) {
76
ABTS_NOT_IMPL(tc, "IPv6 not enabled");
79
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
80
ABTS_PTR_NOTNULL(tc, sock);
81
apr_socket_close(sock);
83
ABTS_NOT_IMPL(tc, "IPv6");
87
static void udp6_socket(abts_case *tc, void *data)
91
apr_socket_t *sock = NULL;
93
rv = apr_socket_create(&sock, APR_INET6, SOCK_DGRAM, 0, p);
94
if (V6_NOT_ENABLED(rv)) {
95
ABTS_NOT_IMPL(tc, "IPv6 not enabled");
98
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
99
ABTS_PTR_NOTNULL(tc, sock);
100
apr_socket_close(sock);
102
ABTS_NOT_IMPL(tc, "IPv6");
106
static void sendto_receivefrom(abts_case *tc, void *data)
109
apr_socket_t *sock = NULL;
110
apr_socket_t *sock2 = NULL;
111
char sendbuf[STRLEN] = "APR_INET, SOCK_DGRAM";
115
apr_sockaddr_t *from;
124
rv = apr_socket_create(&sock, family, SOCK_DGRAM, 0, p);
125
if (V6_NOT_ENABLED(rv)) {
129
rv = apr_socket_create(&sock, family, SOCK_DGRAM, 0, p);
133
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
134
rv = apr_socket_create(&sock2, family, SOCK_DGRAM, 0, p);
135
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
137
rv = apr_sockaddr_info_get(&to, addr, APR_UNSPEC, 7772, 0, p);
138
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
139
rv = apr_sockaddr_info_get(&from, addr, APR_UNSPEC, 7771, 0, p);
140
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
142
rv = apr_socket_opt_set(sock, APR_SO_REUSEADDR, 1);
143
APR_ASSERT_SUCCESS(tc, "Could not set REUSEADDR on socket", rv);
144
rv = apr_socket_opt_set(sock2, APR_SO_REUSEADDR, 1);
145
APR_ASSERT_SUCCESS(tc, "Could not set REUSEADDR on socket2", rv);
147
rv = apr_socket_bind(sock, to);
148
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
149
rv = apr_socket_bind(sock2, from);
150
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
153
rv = apr_socket_sendto(sock2, to, 0, sendbuf, &len);
154
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
155
ABTS_INT_EQUAL(tc, STRLEN, len);
158
rv = apr_socket_recvfrom(from, sock, 0, recvbuf, &len);
159
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
160
ABTS_INT_EQUAL(tc, STRLEN, len);
161
ABTS_STR_EQUAL(tc, "APR_INET, SOCK_DGRAM", recvbuf);
163
apr_sockaddr_ip_get(&ip_addr, from);
164
fromport = from->port;
165
ABTS_STR_EQUAL(tc, addr, ip_addr);
166
ABTS_INT_EQUAL(tc, 7771, fromport);
168
apr_socket_close(sock);
169
apr_socket_close(sock2);
172
static void socket_userdata(abts_case *tc, void *data)
174
apr_socket_t *sock1, *sock2;
177
const char *key = "GENERICKEY";
179
rv = apr_socket_create(&sock1, AF_INET, SOCK_STREAM, 0, p);
180
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
181
rv = apr_socket_create(&sock2, AF_INET, SOCK_STREAM, 0, p);
182
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
184
rv = apr_socket_data_set(sock1, "SOCK1", key, NULL);
185
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
186
rv = apr_socket_data_set(sock2, "SOCK2", key, NULL);
187
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
189
rv = apr_socket_data_get(&user, key, sock1);
190
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
191
ABTS_STR_EQUAL(tc, "SOCK1", user);
192
rv = apr_socket_data_get(&user, key, sock2);
193
ABTS_INT_EQUAL(tc, APR_SUCCESS, rv);
194
ABTS_STR_EQUAL(tc, "SOCK2", user);
197
abts_suite *testsockets(abts_suite *suite)
199
suite = ADD_SUITE(suite)
201
abts_run_test(suite, tcp_socket, NULL);
202
abts_run_test(suite, udp_socket, NULL);
204
abts_run_test(suite, tcp6_socket, NULL);
205
abts_run_test(suite, udp6_socket, NULL);
207
abts_run_test(suite, sendto_receivefrom, NULL);
209
abts_run_test(suite, socket_userdata, NULL);