[SCM] Socket Wrapper Repository - branch master updated
Michael Adam
obnox at samba.org
Wed Oct 14 08:28:10 UTC 2015
The branch, master has been updated
via 84a4e23 tests: Add test for TCP_NODELAY setsockopt()
via 96dbeb7 tests: Add test for TCP_NODELAY getsockopt()
via 1db6130 swrap: Add support for TCP_NODELAY in getsockopt()
via e9e0dac swrap: Add support for TCP_NODELAY in setsockopt()
from 40b1926 Bump version to 1.1.4
https://git.samba.org/?p=socket_wrapper.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 84a4e23728a558984f449610b9e84933acfb0515
Author: Andreas Schneider <asn at samba.org>
Date: Thu Oct 8 11:02:10 2015 +0200
tests: Add test for TCP_NODELAY setsockopt()
Signed-off-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Michael Adam <obnox at samba.org>
commit 96dbeb75f78665cf81a4ef8e3842e819043f8d51
Author: Andreas Schneider <asn at samba.org>
Date: Mon Sep 14 22:07:09 2015 +0200
tests: Add test for TCP_NODELAY getsockopt()
Signed-off-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Michael Adam <obnox at samba.org>
commit 1db61302b6036bdfabf0e3a1507e0e5573a57368
Author: Andreas Schneider <asn at samba.org>
Date: Mon Sep 14 22:06:52 2015 +0200
swrap: Add support for TCP_NODELAY in getsockopt()
Signed-off-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Michael Adam <obnox at samba.org>
commit e9e0dac6d719304af8174f4b9119709afe71f508
Author: Andreas Schneider <asn at samba.org>
Date: Thu Oct 8 10:51:02 2015 +0200
swrap: Add support for TCP_NODELAY in setsockopt()
Signed-off-by: Andreas Schneider <asn at samba.org>
Reviewed-by: Michael Adam <obnox at samba.org>
-----------------------------------------------------------------------
Summary of changes:
src/socket_wrapper.c | 53 ++++++++++++++++++++++++++++++++++++
tests/test_echo_tcp_socket_options.c | 49 +++++++++++++++++++++++++++++++++
2 files changed, 102 insertions(+)
Changeset truncated at 500 lines:
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 45282ed..aad5f3e 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -248,6 +248,7 @@ struct socket_info
int connected;
int defer_connect;
int pktinfo;
+ int tcp_nodelay;
/* The unix path so we can unlink it on close() */
struct sockaddr_un un_addr;
@@ -3350,6 +3351,29 @@ static int swrap_getsockopt(int s, int level, int optname,
optval,
optlen);
}
+ } else if (level == IPPROTO_TCP) {
+ switch (optname) {
+#ifdef TCP_NODELAY
+ case TCP_NODELAY:
+ /*
+ * This enables sending packets directly out over TCP.
+ * As a unix socket is doing that any way, report it as
+ * enabled.
+ */
+ if (optval == NULL || optlen == NULL ||
+ *optlen < (socklen_t)sizeof(int)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ *optlen = sizeof(int);
+ *(int *)optval = si->tcp_nodelay;
+
+ return 0;
+#endif /* TCP_NODELAY */
+ default:
+ break;
+ }
}
errno = ENOPROTOOPT;
@@ -3388,6 +3412,35 @@ static int swrap_setsockopt(int s, int level, int optname,
optname,
optval,
optlen);
+ } else if (level == IPPROTO_TCP) {
+ switch (optname) {
+#ifdef TCP_NODELAY
+ case TCP_NODELAY: {
+ int i;
+
+ /*
+ * This enables sending packets directly out over TCP.
+ * A unix socket is doing that any way.
+ */
+ if (optval == NULL || optlen == 0 ||
+ optlen < (socklen_t)sizeof(int)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ i = *discard_const_p(int, optval);
+ if (i != 0 && i != 1) {
+ errno = EINVAL;
+ return -1;
+ }
+ si->tcp_nodelay = i;
+
+ return 0;
+ }
+#endif /* TCP_NODELAY */
+ default:
+ break;
+ }
}
switch (si->family) {
diff --git a/tests/test_echo_tcp_socket_options.c b/tests/test_echo_tcp_socket_options.c
index f068fb8..dfa46fe 100644
--- a/tests/test_echo_tcp_socket_options.c
+++ b/tests/test_echo_tcp_socket_options.c
@@ -10,6 +10,7 @@
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
+#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
@@ -293,6 +294,51 @@ static void test_bind_ipv6_only(void **state)
}
#endif
+static void test_sockopt_tcp(void **state)
+{
+ struct torture_address addr = {
+ .sa_socklen = sizeof(struct sockaddr_in),
+ };
+ int opt = -1;
+ socklen_t optlen = sizeof(int);
+ int rc;
+
+ int s;
+
+ (void) state; /* unused */
+
+ s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ assert_int_not_equal(s, -1);
+
+ addr.sa.in.sin_family = AF_INET;
+ addr.sa.in.sin_port = htons(torture_server_port());
+
+ rc = inet_pton(addr.sa.in.sin_family,
+ torture_server_address(AF_INET),
+ &addr.sa.in.sin_addr);
+ assert_int_equal(rc, 1);
+
+ rc = connect(s, &addr.sa.s, addr.sa_socklen);
+ assert_int_equal(rc, 0);
+
+ rc = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, &optlen);
+ assert_return_code(rc, errno);
+ assert_int_equal(opt, 0);
+
+ opt = 1; /* Turn on TCP_NODELAY */
+ optlen = sizeof(int);
+ rc = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, optlen);
+ assert_return_code(rc, errno);
+
+ opt = -1;
+ optlen = sizeof(int);
+ rc = getsockopt(s, IPPROTO_TCP, TCP_NODELAY, &opt, &optlen);
+ assert_return_code(rc, errno);
+ assert_int_equal(opt, 1);
+
+ close(s);
+}
+
int main(void) {
int rc;
@@ -311,6 +357,9 @@ int main(void) {
setup_ipv6,
teardown),
#endif
+ cmocka_unit_test_setup_teardown(test_sockopt_tcp,
+ setup_echo_srv_tcp_ipv4,
+ teardown),
};
rc = cmocka_run_group_tests(sockopt_tests, NULL, NULL);
--
Socket Wrapper Repository
More information about the samba-cvs
mailing list