├── .gitignore ├── LICENSE ├── Makefile ├── PKGBUILD ├── README.md ├── bin └── tcpsnitch ├── configure ├── constants.c ├── constants.h ├── constants ├── _sol_ip_options.h ├── errnos.h ├── fcntl_cmds.h ├── ioctl_requests.h ├── socket_domains.h ├── socket_types.h ├── sockopt_levels.h ├── sol_ip_options.h ├── sol_ipv6_options.h ├── sol_packet_options.h ├── sol_raw_options.h ├── sol_socket_options.h ├── sol_tcp_options.h └── sol_udp_options.h ├── init.c ├── init.h ├── json_builder.c ├── json_builder.h ├── lib.c ├── lib.h ├── libc_overrides.c ├── logger.c ├── logger.h ├── packet_sniffer.c ├── packet_sniffer.h ├── resizable_array.c ├── resizable_array.h ├── sock_events.c ├── sock_events.h ├── string_builders.c ├── string_builders.h ├── tests ├── .gitignore ├── Gemfile ├── README.md ├── Rakefile ├── c_programs │ ├── bind.c │ ├── bind_dgram.c │ ├── bind_fail.c │ ├── close.c │ ├── close_dgram.c │ ├── close_fail.c │ ├── concurrent_connections.c │ ├── connect.c │ ├── connect_dgram.c │ ├── connect_fail.c │ ├── consecutive_connections.c │ ├── dup.c │ ├── dup2.c │ ├── dup2_dgram.c │ ├── dup2_fail.c │ ├── dup3.c │ ├── dup3_dgram.c │ ├── dup3_fail.c │ ├── dup_dgram.c │ ├── dup_fail.c │ ├── epoll_ctl.c │ ├── epoll_ctl_dgram.c │ ├── epoll_ctl_fail.c │ ├── epoll_pwait.c │ ├── epoll_pwait_dgram.c │ ├── epoll_pwait_fail.c │ ├── epoll_wait.c │ ├── epoll_wait_dgram.c │ ├── epoll_wait_fail.c │ ├── fcntl.c │ ├── fcntl_dgram.c │ ├── fcntl_fail.c │ ├── fdopen.c │ ├── fdopen_dgram.c │ ├── fdopen_fail.c │ ├── fork.c │ ├── getpeername.c │ ├── getpeername_dgram.c │ ├── getpeername_fail.c │ ├── getsockname.c │ ├── getsockname_dgram.c │ ├── getsockname_fail.c │ ├── getsockopt.c │ ├── getsockopt_dgram.c │ ├── getsockopt_fail.c │ ├── ioctl.c │ ├── ioctl_dgram.c │ ├── ioctl_fail.c │ ├── isfdtype.c │ ├── isfdtype_dgram.c │ ├── isfdtype_fail.c │ ├── listen.c │ ├── listen_fail.c │ ├── poll.c │ ├── poll_dgram.c │ ├── ppoll.c │ ├── ppoll_dgram.c │ ├── pselect.c │ ├── pselect_dgram.c │ ├── pselect_fail.c │ ├── read.c │ ├── read_dgram.c │ ├── read_fail.c │ ├── readv.c │ ├── readv_dgram.c │ ├── readv_fail.c │ ├── recv.c │ ├── recv_dgram.c │ ├── recv_fail.c │ ├── recvfrom.c │ ├── recvfrom_dgram.c │ ├── recvfrom_fail.c │ ├── recvmmsg.c │ ├── recvmmsg_dgram.c │ ├── recvmmsg_fail.c │ ├── recvmsg.c │ ├── recvmsg_dgram.c │ ├── recvmsg_fail.c │ ├── select.c │ ├── select_dgram.c │ ├── select_fail.c │ ├── send.c │ ├── send_dgram.c │ ├── send_fail.c │ ├── sendfile.c │ ├── sendfile_dgram.c │ ├── sendfile_fail.c │ ├── sendmmsg.c │ ├── sendmmsg_dgram.c │ ├── sendmmsg_fail.c │ ├── sendmsg.c │ ├── sendmsg_dgram.c │ ├── sendmsg_fail.c │ ├── sendto.c │ ├── sendto_dgram.c │ ├── sendto_fail.c │ ├── setsockopt.c │ ├── setsockopt_dgram.c │ ├── setsockopt_fail.c │ ├── shutdown.c │ ├── shutdown_dgram.c │ ├── shutdown_fail.c │ ├── sockatmark.c │ ├── socket.c │ ├── socket_dgram.c │ ├── socket_fail.c │ ├── write.c │ ├── write_dgram.c │ ├── write_fail.c │ ├── writev.c │ ├── writev_dgram.c │ └── writev_fail.c ├── lib │ ├── constants.rb │ ├── cprog.rb │ ├── lib.rb │ ├── webserver.rb │ └── write_cprogs.rb ├── test_compatibility.rb ├── test_libc_overrides.rb ├── test_packet_sniffer.rb ├── test_sock_events.rb └── test_tcpsnitch.rb ├── verbose_mode.c └── verbose_mode.h /.gitignore: -------------------------------------------------------------------------------- 1 | *.so* 2 | *.sw* 3 | *.pyc 4 | *.py 5 | tags 6 | .config.in 7 | linux_git_hash 8 | android_git_hash 9 | enable_i386 10 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # Version 2 | MAJOR_VERSION=0 3 | MINOR_VERSION=1 4 | VERSION=$(MAJOR_VERSION).$(MINOR_VERSION) 5 | 6 | CONFIG=.config.in 7 | 8 | # ./bin names 9 | EXECUTABLE=tcpsnitch 10 | BASE_NAME=lib$(EXECUTABLE).so.$(VERSION) 11 | AMD64=x86-64 12 | I386=i386 13 | ARM=arm 14 | LIB_AMD64=$(BASE_NAME)-$(AMD64) 15 | LIB_I386=$(BASE_NAME)-$(I386) 16 | LIB_ARM=$(BASE_NAME)-$(ARM) 17 | LINUX_GIT_HASH=linux_git_hash 18 | ANDROID_GIT_HASH=android_git_hash 19 | ENABLE_I386=enable_i386 20 | 21 | # Installation paths 22 | BIN_PATH=$(DESTDIR)/usr/local/bin 23 | DEPS_PATH=$(BIN_PATH)/tcpsnitch_deps 24 | 25 | # Compiler & linker flags 26 | CC=gcc 27 | C_FLAGS=-g -fPIC --shared -Wl,-Bsymbolic -std=c11 -fvisibility=hidden 28 | W_FLAGS=-Wall -Wextra -Werror -Wfloat-equal -Wshadow -Wpointer-arith \ 29 | -Wstrict-prototypes -Wwrite-strings -Waggregate-return -Wcast-qual \ 30 | -Wunreachable-code 31 | 32 | # Dependencies 33 | # Note: The Debian packages "libpcap0.8-dev" and "libpcap0.8-dev:i386" are 34 | # incompatible. The header files contained in both packages are the same, the 35 | # packages are incompatible only because of a helper script used to generate 36 | # compiler flags, which we dont use anyway. We thus only need to install for a 37 | # single architecture and we must specify the library name explicitly since we 38 | # will miss the linker name symlink for the other architecture. 39 | DEBIAN_BASED_DEPS=-lpthread -ldl -ljansson -l:libpcap.so.0.8 40 | # Note: On Centos, there is no "jansson.devel" pacakge available. Thus for ease 41 | # of installation, we specify the library name. 42 | RPM_BASED_DEPS=-lpthread -ldl -l:libjansson.so.4 -lpcap 43 | # Fallback to standard names for other distributions 44 | OTHER_DEPS=-lpthread -ldl -lpcap -ljansson 45 | LINUX_DEPS=$(shell if rpm -q -f /usr/bin/rpm >/dev/null 2>&1; then echo $(RPM_BASED_DEPS); elif type apt-get >/dev/null 2>&1; then echo $(DEBIAN_BASED_DEPS); else echo $(OTHER_DEPS); fi) 46 | 47 | # Source files 48 | HEADERS=lib.h sock_events.h string_builders.h json_builder.h packet_sniffer.h \ 49 | logger.h init.h resizable_array.h verbose_mode.h constants.h 50 | SOURCES=libc_overrides.c lib.c sock_events.c string_builders.c json_builder.c \ 51 | packet_sniffer.c logger.c init.c resizable_array.c verbose_mode.c \ 52 | constants.c 53 | 54 | # $(1) is file name, $(2) is config value 55 | define set_file_opt 56 | echo $(2) > bin/$(1) 57 | endef 58 | 59 | default: linux 60 | 61 | linux: $(CONFIG) $(HEADERS) $(SOURCES) 62 | @echo "[-] Compiling Linux 64-bit lib version..." 63 | @$(CC) $(C_FLAGS) $(W_FLAGS) $(L_FLAGS) -o ./bin/$(LIB_AMD64) $(SOURCES) $(LINUX_DEPS) 64 | @if grep supports_i386=true .config.in >/dev/null 2>&1; then\ 65 | echo "[-] Compiling Linux 32-bit lib version...";\ 66 | $(CC) $(C_FLAGS) -m32 $(W_FLAGS) $(L_FLAGS) -o ./bin/$(LIB_I386) $(SOURCES) $(LINUX_DEPS);\ 67 | $(call set_file_opt,$(ENABLE_I386),true);\ 68 | else\ 69 | echo "[-] 32-bit support is disabled.";\ 70 | $(call set_file_opt,$(ENABLE_I386),false);\ 71 | fi 72 | @$(call set_file_opt,$(LINUX_GIT_HASH),$(shell git rev-parse HEAD)) 73 | 74 | android: $(HEADERS) $(SOURCES) 75 | ifndef CC_ANDROID 76 | $(error CC_ANDROID variable not set. See README for compilation instructions) 77 | endif 78 | @echo "[-] Compiling Android lib version..." 79 | @$(CC_ANDROID) $(C_FLAGS) $(W_FLAGS) $(L_FLAGS) -o ./bin/$(LIB_ARM) $(SOURCES) -Wl,-Bstatic -ljansson -lpcap -Wl,-Bdynamic -ldl -llog 80 | @$(call set_file_opt,$(ANDROID_GIT_HASH),$(shell git rev-parse HEAD)) 81 | 82 | install: 83 | mkdir -p $(DEPS_PATH) 84 | install -m 0444 ./bin/* $(DEPS_PATH) 85 | chmod 0755 $(DEPS_PATH)/$(EXECUTABLE) 86 | ln -fs ./tcpsnitch_deps/$(EXECUTABLE) $(BIN_PATH)/$(EXECUTABLE) 87 | 88 | uninstall: 89 | @rm -rf $(DEPS_PATH) 90 | @rm $(BIN_PATH)/$(EXECUTABLE) 91 | 92 | clean: 93 | @rm -f ./bin/*.so* ./bin/*hash ./bin/enable_i386 $(CONFIG) 94 | 95 | tests: linux install 96 | cd tests && rake 97 | 98 | index: 99 | ctags -R . 100 | 101 | $(CONFIG): 102 | @test -f $(CONFIG) || ./configure 103 | 104 | .PHONY: configure tests clean index android $(CONFIG) 105 | -------------------------------------------------------------------------------- /PKGBUILD: -------------------------------------------------------------------------------- 1 | # Maintainer: Your Name 2 | pkgname=tcpsnitch-git 3 | pkgver=r435.c1420a0 4 | pkgver() { 5 | cd "$pkgname" 6 | printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" 7 | } 8 | pkgrel=1 9 | pkgdesc="A tracing tool designed to investigate the interactions between an application, the TCP/IP stack and the network." 10 | arch=(i386 x86_64) 11 | url="https://github.com/GregoryVds/tcpsnitch" 12 | license=('unknown') 13 | depends=(jansson curl libpcap) 14 | makedepends=('git') 15 | install= 16 | source=('tcpsnitch-git::git+https://github.com/GregoryVds/tcpsnitch.git') 17 | md5sums=('SKIP') 18 | 19 | build() { 20 | cd "$srcdir/${pkgname}" 21 | ./configure 22 | make 23 | } 24 | 25 | package() { 26 | cd "$srcdir/${pkgname}" 27 | make DESTDIR="$pkgdir/" install 28 | } 29 | -------------------------------------------------------------------------------- /configure: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | readonly CONFIG=.config.in 3 | readonly TOP_PID=$$ 4 | readonly MISSING_LIB="Error: missing library dependency" 5 | readonly MISSING_JANSSON="$MISSING_LIB libjansson (see www.digip.org/jansson)" 6 | readonly MISSING_PCAP="$MISSING_LIB pcap (see www.tcpdump.org)" 7 | 8 | trap "exit 1" TERM 9 | 10 | error() { 11 | declare msg="$1" 12 | echo "$0: ${msg}." 13 | kill -s TERM $TOP_PID 14 | } 15 | 16 | supports_i386() { 17 | # Get gcc base settings 18 | declare cc_text="$(echo | (gcc -E -Wp,-v - > /dev/null) 2>&1)" 19 | 20 | # Extract include path 21 | declare prog="BEGIN { f=0 }; 22 | /include <\.\.\.> search starts here:/ { f=1; next }; 23 | /^End/ { f=0; next }; 24 | f { print}" 25 | 26 | declare include_path="$(echo "$cc_text" | awk "$prog")" 27 | 28 | echo "supports_i386=false" > "$CONFIG" 29 | while read -r line; do 30 | # Check if 32bits compatibility bits are there 31 | if [ -e "$line/gnu/stubs-32.h" ]; then 32 | sed -i -E "s/(supports_i386=).*/\1true/" "$CONFIG" 33 | exit 0 34 | fi 35 | done <<< "$include_path" 36 | exit 1 37 | } 38 | 39 | missing_lib_version() { 40 | declare lib="$1" 41 | declare version="$2" 42 | error "Error: missing library version (${version} version of ${lib})" 43 | } 44 | 45 | assert_lib_present() { 46 | declare lib="$1" 47 | declare error_msg="$2" 48 | if ! /sbin/ldconfig -p | grep "$lib" >/dev/null 2>&1; then 49 | error "$error_msg" 50 | fi 51 | } 52 | 53 | assert_lib_version_present() { 54 | declare lib="$1" 55 | declare version="$2" 56 | if ! file $(readlink -f $(/sbin/ldconfig -p | grep "$lib" | awk '{print $NF}')) | grep "$version" >/dev/null; then 57 | missing_lib_version $lib $version 58 | fi 59 | } 60 | 61 | echo "[-] Checking presence of library dependencies..." 62 | assert_lib_present "libjansson" "$MISSING_JANSSON" 63 | assert_lib_present "libpcap" "$MISSING_PCAP" 64 | echo "[-] Checking presence of 64-bit versions..." 65 | assert_lib_version_present "libjansson" 64-bit 66 | assert_lib_version_present "libpcap" 64-bit 67 | if $(supports_i386); then 68 | echo "[-] Checking presence of 32-bit versions..." 69 | assert_lib_version_present "libjansson" 32-bit 70 | assert_lib_version_present "libpcap" 32-bit 71 | else 72 | echo "[-] 32-bit support is disabled." 73 | fi 74 | echo "[-] Ok! Dependencies present." 75 | echo "[-] Issue \"make && make install\" to compile & install tcpsnitch." 76 | -------------------------------------------------------------------------------- /constants.c: -------------------------------------------------------------------------------- 1 | #include "constants.h" 2 | #include 3 | #include 4 | #include "logger.h" 5 | 6 | bool alloc_string_from_cons(int cons, const IntStrPair *map, int map_size, 7 | char **str_ptr) { 8 | static const int str_size = MEMBER_SIZE(IntStrPair, str); 9 | *str_ptr = (char *)my_malloc(str_size); 10 | 11 | // Search for const in map. 12 | const IntStrPair *cur; 13 | for (int i = 0; i < map_size; i++) { 14 | cur = (map + i); 15 | if (cur->cons == cons) { 16 | strncpy(*str_ptr, cur->str, str_size); 17 | return true; 18 | } 19 | } 20 | 21 | // No match found, just write the constant digit. 22 | LOG_FUNC_WARN; 23 | LOG(WARN, "No match found for %d.", cons); 24 | snprintf(*str_ptr, str_size, "%d", cons); 25 | return false; 26 | } 27 | 28 | #define MAP_GET(MAP, KEY) \ 29 | { \ 30 | char *str; \ 31 | int map_size = sizeof(MAP) / sizeof(IntStrPair); \ 32 | if (!alloc_string_from_cons(KEY, MAP, map_size, &str)) \ 33 | LOG_FUNC_WARN; \ 34 | return str; \ 35 | } 36 | 37 | char *alloc_sock_domain_str(int domain) { MAP_GET(SOCKET_DOMAINS, domain); } 38 | 39 | char *alloc_sock_type_str(int type) { MAP_GET(SOCKET_TYPES, type); } 40 | 41 | char *alloc_sockopt_level(int level) { MAP_GET(SOCKOPT_LEVELS, level); } 42 | 43 | char *alloc_sockopt_name(int level, int optname) { 44 | switch (level) { 45 | case SOL_SOCKET: 46 | MAP_GET(SOL_SOCKET_OPTIONS, optname); 47 | case SOL_TCP: 48 | MAP_GET(SOL_TCP_OPTIONS, optname); 49 | case SOL_UDP: 50 | MAP_GET(SOL_UDP_OPTIONS, optname); 51 | case SOL_IP: 52 | MAP_GET(SOL_IP_OPTIONS, optname); 53 | case SOL_IPV6: 54 | MAP_GET(SOL_IPV6_OPTIONS, optname); 55 | case SOL_PACKET: 56 | MAP_GET(SOL_PACKET_OPTIONS, optname); 57 | case SOL_RAW: 58 | MAP_GET(SOL_RAW_OPTIONS, optname); 59 | default: 60 | LOG(WARN, "Unknown sockopt level: %d.", level); 61 | LOG_FUNC_WARN; 62 | MAP_GET(SOL_SOCKET_OPTIONS, optname); 63 | } 64 | // Unreachable 65 | return NULL; 66 | } 67 | 68 | char *alloc_fcntl_cmd_str(int cmd) { MAP_GET(FCNTL_CMDS, cmd); } 69 | 70 | char *alloc_ioctl_request_str(int request) { MAP_GET(IOCTL_REQUESTS, request); } 71 | 72 | char *alloc_errno_str(int err) { MAP_GET(ERRNOS, err); } 73 | -------------------------------------------------------------------------------- /constants.h: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | 3 | #ifndef CONSTANTS_H 4 | #define CONSTANTS_H 5 | 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #ifdef __ANDROID__ 23 | #include 24 | #else 25 | #include 26 | #endif 27 | #include 28 | #include "lib.h" 29 | 30 | #define MEMBER_SIZE(type, member) sizeof(((type *)0)->member) 31 | 32 | #define ADD(constant) \ 33 | { constant, #constant } 34 | /* We use #ifdef directives to produce code that is easily portable on multiple 35 | * libc versions which may define different set of constants. */ 36 | 37 | typedef struct { 38 | int cons; 39 | const char str[40]; 40 | } IntStrPair; 41 | 42 | #include "constants/errnos.h" 43 | #include "constants/fcntl_cmds.h" 44 | #include "constants/ioctl_requests.h" 45 | #include "constants/socket_domains.h" 46 | #include "constants/socket_types.h" 47 | #include "constants/sockopt_levels.h" 48 | #include "constants/sol_socket_options.h" 49 | #include "constants/sol_tcp_options.h" 50 | #include "constants/sol_udp_options.h" 51 | #include "constants/sol_ip_options.h" 52 | #include "constants/sol_ipv6_options.h" 53 | #include "constants/sol_packet_options.h" 54 | #include "constants/sol_raw_options.h" 55 | 56 | char *alloc_errno_str(int err); 57 | char *alloc_fcntl_cmd_str(int cmd); 58 | char *alloc_ioctl_request_str(int request); 59 | char *alloc_sockopt_name(int level, int optname); 60 | char *alloc_sockopt_level(int level); 61 | char *alloc_sock_domain_str(int domain); 62 | char *alloc_sock_type_str(int type); 63 | 64 | #endif 65 | -------------------------------------------------------------------------------- /constants/_sol_ip_options.h: -------------------------------------------------------------------------------- 1 | #ifdef IP_TOS 2 | ADD(IP_TOS), 3 | #endif 4 | #ifdef IP_TTL 5 | ADD(IP_TTL), 6 | #endif 7 | #ifdef IP_HDRINCL 8 | ADD(IP_HDRINCL), 9 | #endif 10 | #ifdef IP_OPTIONS 11 | ADD(IP_OPTIONS), 12 | #endif 13 | #ifdef IP_ROUTER_ALERT 14 | ADD(IP_ROUTER_ALERT), 15 | #endif 16 | #ifdef IP_RECVOPTS 17 | ADD(IP_RECVOPTS), 18 | #endif 19 | #ifdef IP_RETOPTS 20 | ADD(IP_RETOPTS), 21 | #endif 22 | #ifdef IP_PKTINFO 23 | ADD(IP_PKTINFO), 24 | #endif 25 | #ifdef IP_PKTOPTIONS 26 | ADD(IP_PKTOPTIONS), 27 | #endif 28 | #ifdef IP_MTU_DISCOVER 29 | ADD(IP_MTU_DISCOVER), 30 | #endif 31 | #ifdef IP_RECVERR 32 | ADD(IP_RECVERR), 33 | #endif 34 | #ifdef IP_RECVTTL 35 | ADD(IP_RECVTTL), 36 | #endif 37 | #ifdef IP_RECVTOS 38 | ADD(IP_RECVTOS), 39 | #endif 40 | #ifdef IP_MTU 41 | ADD(IP_MTU), 42 | #endif 43 | #ifdef IP_FREEBIND 44 | ADD(IP_FREEBIND), 45 | #endif 46 | #ifdef IP_IPSEC_POLICY 47 | ADD(IP_IPSEC_POLICY), 48 | #endif 49 | #ifdef IP_XFRM_POLICY 50 | ADD(IP_XFRM_POLICY), 51 | #endif 52 | #ifdef IP_PASSSEC 53 | ADD(IP_PASSSEC), 54 | #endif 55 | #ifdef IP_TRANSPARENT 56 | ADD(IP_TRANSPARENT), 57 | #endif 58 | #ifdef IP_RECVRETOPTS 59 | ADD(IP_RECVRETOPTS), 60 | #endif 61 | #ifdef IP_ORIGDSTADDR 62 | ADD(IP_ORIGDSTADDR), 63 | #endif 64 | #ifdef IP_RECVORIGDSTADDR 65 | ADD(IP_RECVORIGDSTADDR), 66 | #endif 67 | #ifdef IP_MINTTL 68 | ADD(IP_MINTTL), 69 | #endif 70 | #ifdef IP_NODEFRAG 71 | ADD(IP_NODEFRAG), 72 | #endif 73 | #ifdef IP_MULTICAST_IF 74 | ADD(IP_MULTICAST_IF), 75 | #endif 76 | #ifdef IP_MULTICAST_TTL 77 | ADD(IP_MULTICAST_TTL), 78 | #endif 79 | #ifdef IP_MULTICAST_LOOP 80 | ADD(IP_MULTICAST_LOOP), 81 | #endif 82 | #ifdef IP_ADD_MEMBERSHIP 83 | ADD(IP_ADD_MEMBERSHIP), 84 | #endif 85 | #ifdef IP_DROP_MEMBERSHIP 86 | ADD(IP_DROP_MEMBERSHIP), 87 | #endif 88 | #ifdef IP_UNBLOCK_SOURCE 89 | ADD(IP_UNBLOCK_SOURCE), 90 | #endif 91 | #ifdef IP_BLOCK_SOURCE 92 | ADD(IP_BLOCK_SOURCE), 93 | #endif 94 | #ifdef IP_ADD_SOURCE_MEMBERSHIP 95 | ADD(IP_ADD_SOURCE_MEMBERSHIP), 96 | #endif 97 | #ifdef IP_DROP_SOURCE_MEMBERSHIP 98 | ADD(IP_DROP_SOURCE_MEMBERSHIP), 99 | #endif 100 | #ifdef IP_MSFILTER 101 | ADD(IP_MSFILTER), 102 | #endif 103 | #ifdef MCAST_JOIN_GROUP 104 | ADD(MCAST_JOIN_GROUP), 105 | #endif 106 | #ifdef MCAST_BLOCK_SOURCE 107 | ADD(MCAST_BLOCK_SOURCE), 108 | #endif 109 | #ifdef MCAST_UNBLOCK_SOURCE 110 | ADD(MCAST_UNBLOCK_SOURCE), 111 | #endif 112 | #ifdef MCAST_LEAVE_GROUP 113 | ADD(MCAST_LEAVE_GROUP), 114 | #endif 115 | #ifdef MCAST_JOIN_SOURCE_GROUP 116 | ADD(MCAST_JOIN_SOURCE_GROUP), 117 | #endif 118 | #ifdef MCAST_LEAVE_SOURCE_GROUP 119 | ADD(MCAST_LEAVE_SOURCE_GROUP), 120 | #endif 121 | #ifdef MCAST_MSFILTER 122 | ADD(MCAST_MSFILTER), 123 | #endif 124 | #ifdef IP_MULTICAST_ALL 125 | ADD(IP_MULTICAST_ALL), 126 | #endif 127 | #ifdef IP_UNICAST_IF 128 | ADD(IP_UNICAST_IF), 129 | #endif 130 | -------------------------------------------------------------------------------- /constants/fcntl_cmds.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair FCNTL_CMDS[] = { 2 | #ifdef F_GETFD 3 | ADD(F_GETFD), 4 | #endif 5 | #ifdef F_GETFL 6 | ADD(F_GETFL), 7 | #endif 8 | #ifdef F_GETOWN 9 | ADD(F_GETOWN), 10 | #endif 11 | #ifdef F_GETSIG 12 | ADD(F_GETSIG), 13 | #endif 14 | #ifdef F_GETLEASE 15 | ADD(F_GETLEASE), 16 | #endif 17 | #ifdef F_GETPIPE_SZ 18 | ADD(F_GETPIPE_SZ), 19 | #endif 20 | #ifdef F_DUPFD 21 | ADD(F_DUPFD), 22 | #endif 23 | #ifdef F_DUPFD_CLOEXEC 24 | ADD(F_DUPFD_CLOEXEC), 25 | #endif 26 | #ifdef F_SETFD 27 | ADD(F_SETFD), 28 | #endif 29 | #ifdef F_SETFL 30 | ADD(F_SETFL), 31 | #endif 32 | #ifdef F_SETOWN 33 | ADD(F_SETOWN), 34 | #endif 35 | #ifdef F_SETSIG 36 | ADD(F_SETSIG), 37 | #endif 38 | #ifdef F_SETLEASE 39 | ADD(F_SETLEASE), 40 | #endif 41 | #ifdef F_NOTIFY 42 | ADD(F_NOTIFY), 43 | #endif 44 | #ifdef F_SETPIPE_SZ 45 | ADD(F_SETPIPE_SZ), 46 | #endif 47 | #ifdef F_SETLK 48 | ADD(F_SETLK), 49 | #endif 50 | #ifdef F_SETLKW 51 | ADD(F_SETLKW), 52 | #endif 53 | #ifdef F_GETLK 54 | ADD(F_GETLK), 55 | #endif 56 | #ifdef F_GETLK64 57 | ADD(F_GETLK64), 58 | #endif 59 | #ifdef F_SETLK64 60 | ADD(F_SETLK64), 61 | #endif 62 | #ifdef F_SETLKW64 63 | ADD(F_SETLKW64), 64 | #endif 65 | #ifdef F_OFD_SETLK 66 | ADD(F_OFD_SETLK), 67 | #endif 68 | #ifdef F_OFD_SETLKW 69 | ADD(F_OFD_SETLKW), 70 | #endif 71 | #ifdef F_OFD_GETLK 72 | ADD(F_OFD_GETLK), 73 | #endif 74 | #ifdef F_GETOWN_EX 75 | ADD(F_GETOWN_EX), 76 | #endif 77 | #ifdef F_SETOWN_EX 78 | ADD(F_SETOWN_EX) 79 | #endif 80 | }; 81 | -------------------------------------------------------------------------------- /constants/socket_domains.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOCKET_DOMAINS[] = { 2 | #ifdef AF_UNIX 3 | ADD(AF_UNIX), 4 | #endif 5 | #ifdef AF_INET 6 | ADD(AF_INET), 7 | #endif 8 | #ifdef AF_INET6 9 | ADD(AF_INET6), 10 | #endif 11 | #ifdef AF_IPX 12 | ADD(AF_IPX), 13 | #endif 14 | #ifdef AF_NETLINK 15 | ADD(AF_NETLINK), 16 | #endif 17 | #ifdef AF_PACKET 18 | ADD(AF_PACKET) 19 | #endif 20 | }; 21 | -------------------------------------------------------------------------------- /constants/socket_types.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOCKET_TYPES[] = { 2 | #ifdef SOCK_STREAM 3 | ADD(SOCK_STREAM), 4 | #endif 5 | #ifdef SOCK_DGRAM 6 | ADD(SOCK_DGRAM), 7 | #endif 8 | #ifdef SOCK_SEQPACKET 9 | ADD(SOCK_SEQPACKET), 10 | #endif 11 | #ifdef SOCK_RAW 12 | ADD(SOCK_RAW), 13 | #endif 14 | #ifdef SOCK_RDM 15 | ADD(SOCK_RDM), 16 | #endif 17 | #ifdef SOCK_PACKET 18 | ADD(SOCK_PACKET) 19 | #endif 20 | }; 21 | -------------------------------------------------------------------------------- /constants/sockopt_levels.h: -------------------------------------------------------------------------------- 1 | #include "asm-generic/socket.h" 2 | #include "netinet/tcp.h" 3 | #include "linux/tipc.h" 4 | #include "linux/can.h" 5 | #include "linux/can/raw.h" 6 | #include "linux/irda.h" 7 | #include "linux/rds.h" 8 | #ifndef __ANDROID__ 9 | #include "netrose/rose.h" 10 | #include "netatalk/at.h" 11 | #include "netinet/udp.h" 12 | #endif 13 | 14 | static const IntStrPair SOCKOPT_LEVELS[] = { 15 | // /usr/include/asm-generic/socket.h 16 | #ifdef SOL_SOCKET 17 | ADD(SOL_SOCKET), 18 | #endif 19 | // /usr/include/netinet/tcp.h 20 | #ifdef SOL_TCP 21 | ADD(SOL_TCP), 22 | #endif 23 | // /usr/include/netinet/udp.h 24 | #ifdef SOL_UDP 25 | ADD(SOL_UDP), 26 | #endif 27 | // /usr/include/x86_64-linux-gnu/bits/in.h 28 | #ifdef SOL_IP 29 | ADD(SOL_IP), 30 | #endif 31 | #ifdef SOL_IPV6 32 | ADD(SOL_IPV6), 33 | #endif 34 | #ifdef SOL_ICMPV6 35 | ADD(SOL_ICMPV6), 36 | #endif 37 | // /usr/include/x86_64-linux-gnu/bits/socket.h 38 | #ifdef SOL_RAW 39 | ADD(SOL_RAW), 40 | #endif 41 | #ifdef SOL_DECNET 42 | ADD(SOL_DECNET), 43 | #endif 44 | #ifdef SOL_X25 45 | ADD(SOL_X25), 46 | #endif 47 | #ifdef SOL_PACKET 48 | ADD(SOL_PACKET), 49 | #endif 50 | #ifdef SOL_ATM 51 | ADD(SOL_ATM), 52 | #endif 53 | #ifdef SOL_AAL 54 | ADD(SOL_AAL), 55 | #endif 56 | #ifdef SOL_IRDA 57 | ADD(SOL_IRDA), 58 | #endif 59 | // /usr/include/netatalk/at.h 60 | #ifdef SOL_ATALK 61 | ADD(SOL_ATALK), 62 | #endif 63 | // /usr/include/netrose/rose.h 64 | #ifdef SOL_ROSE 65 | ADD(SOL_ROSE), 66 | #endif 67 | // /usr/include/netrose/netrom.h 68 | #ifdef SOL_NETROM 69 | ADD(SOL_NETROM), 70 | #endif 71 | // /usr/include/netax25/ax25.h 72 | #ifdef SOL_AX25 73 | ADD(SOL_AX25), 74 | #endif 75 | // /usr/include/netipx/ipx.h 76 | #ifdef SOL_IPX 77 | ADD(SOL_IPX), 78 | #endif 79 | // /usr/include/linux/tipc.h 80 | #ifdef SOL_TIPC 81 | ADD(SOL_TIPC), 82 | #endif 83 | #ifdef SOL_CAN_BASE 84 | // /usr/include/linux/can.h 85 | ADD(SOL_CAN_BASE), 86 | #endif 87 | // /usr/include/linux/can/raw.h 88 | #ifdef SOL_CAN_RAW 89 | ADD(SOL_CAN_RAW), 90 | #endif 91 | // /usr/include/linux/irda.h 92 | #ifdef SOL_IRLMP 93 | ADD(SOL_IRLMP), 94 | #endif 95 | #ifdef SOL_IRTTP 96 | ADD(SOL_IRTTP), 97 | #endif 98 | // /usr/include/linux/rds.h 99 | #ifdef SOL_RDS 100 | ADD(SOL_RDS) 101 | #endif 102 | }; 103 | -------------------------------------------------------------------------------- /constants/sol_ip_options.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOL_IP_OPTIONS[] = { 2 | #include "_sol_ip_options.h" 3 | }; 4 | -------------------------------------------------------------------------------- /constants/sol_ipv6_options.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOL_IPV6_OPTIONS[] = { 2 | #ifdef IPV6_ADDRFORM 3 | ADD(IPV6_ADDRFORM), 4 | #endif 5 | #ifdef IPV6_2292PKTINFO 6 | ADD(IPV6_2292PKTINFO), 7 | #endif 8 | #ifdef IPV6_2292HOPOPTS 9 | ADD(IPV6_2292HOPOPTS), 10 | #endif 11 | #ifdef IPV6_2292DSTOPTS 12 | ADD(IPV6_2292DSTOPTS), 13 | #endif 14 | #ifdef IPV6_2292RTHDR 15 | ADD(IPV6_2292RTHDR), 16 | #endif 17 | #ifdef IPV6_2292PKTOPTIONS 18 | ADD(IPV6_2292PKTOPTIONS), 19 | #endif 20 | #ifdef IPV6_CHECKSUM 21 | ADD(IPV6_CHECKSUM), 22 | #endif 23 | #ifdef IPV6_HOPLIMIT 24 | ADD(IPV6_HOPLIMIT), 25 | #endif 26 | #ifdef IPV6_NEXTHOP 27 | ADD(IPV6_NEXTHOP), 28 | #endif 29 | #ifdef IPV6_AUTHHDR 30 | ADD(IPV6_AUTHHDR), 31 | #endif 32 | #ifdef IPV6_FLOWINFO 33 | ADD(IPV6_FLOWINFO), 34 | #endif 35 | #ifdef IPV6_UNICAST_HOPS 36 | ADD(IPV6_UNICAST_HOPS), 37 | #endif 38 | #ifdef IPV6_MULTICAST_IF 39 | ADD(IPV6_MULTICAST_IF), 40 | #endif 41 | #ifdef IPV6_MULTICAST_HOPS 42 | ADD(IPV6_MULTICAST_HOPS), 43 | #endif 44 | #ifdef IPV6_MULTICAST_LOOP 45 | ADD(IPV6_MULTICAST_LOOP), 46 | #endif 47 | #ifdef IPV6_ADD_MEMBERSHIP 48 | ADD(IPV6_ADD_MEMBERSHIP), 49 | #endif 50 | #ifdef IPV6_DROP_MEMBERSHIP 51 | ADD(IPV6_DROP_MEMBERSHIP), 52 | #endif 53 | #ifdef IPV6_ROUTER_ALERT 54 | ADD(IPV6_ROUTER_ALERT), 55 | #endif 56 | #ifdef IPV6_MTU_DISCOVER 57 | ADD(IPV6_MTU_DISCOVER), 58 | #endif 59 | #ifdef IPV6_MTU 60 | ADD(IPV6_MTU), 61 | #endif 62 | #ifdef IPV6_RECVERR 63 | ADD(IPV6_RECVERR), 64 | #endif 65 | #ifdef IPV6_V6ONLY 66 | ADD(IPV6_V6ONLY), 67 | #endif 68 | #ifdef IPV6_JOIN_ANYCAST 69 | ADD(IPV6_JOIN_ANYCAST), 70 | #endif 71 | #ifdef IPV6_LEAVE_ANYCAST 72 | ADD(IPV6_LEAVE_ANYCAST), 73 | #endif 74 | #ifdef IPV6_FLOWLABEL_MGR 75 | ADD(IPV6_FLOWLABEL_MGR), 76 | #endif 77 | #ifdef IPV6_FLOWINFO_SEND 78 | ADD(IPV6_FLOWINFO_SEND), 79 | #endif 80 | #ifdef IPV6_IPSEC_POLICY 81 | ADD(IPV6_IPSEC_POLICY), 82 | #endif 83 | #ifdef IPV6_XFRM_POLICY 84 | ADD(IPV6_XFRM_POLICY), 85 | #endif 86 | #ifdef IPV6_RECVPKTINFO 87 | ADD(IPV6_RECVPKTINFO), 88 | #endif 89 | #ifdef IPV6_PKTINFO 90 | ADD(IPV6_PKTINFO), 91 | #endif 92 | #ifdef IPV6_RECVHOPLIMIT 93 | ADD(IPV6_RECVHOPLIMIT), 94 | #endif 95 | #ifdef IPV6_HOPLIMIT 96 | ADD(IPV6_HOPLIMIT), 97 | #endif 98 | #ifdef IPV6_RECVHOPOPTS 99 | ADD(IPV6_RECVHOPOPTS), 100 | #endif 101 | #ifdef IPV6_HOPOPTS 102 | ADD(IPV6_HOPOPTS), 103 | #endif 104 | #ifdef IPV6_RTHDRDSTOPTS 105 | ADD(IPV6_RTHDRDSTOPTS), 106 | #endif 107 | #ifdef IPV6_RECVRTHDR 108 | ADD(IPV6_RECVRTHDR), 109 | #endif 110 | #ifdef IPV6_RTHDR 111 | ADD(IPV6_RTHDR), 112 | #endif 113 | #ifdef IPV6_RECVDSTOPTS 114 | ADD(IPV6_RECVDSTOPTS), 115 | #endif 116 | #ifdef IPV6_DSTOPTS 117 | ADD(IPV6_DSTOPTS), 118 | #endif 119 | #ifdef IPV6_RECVPATHMTU 120 | ADD(IPV6_RECVPATHMTU), 121 | #endif 122 | #ifdef IPV6_PATHMTU 123 | ADD(IPV6_PATHMTU), 124 | #endif 125 | #ifdef IPV6_DONTFRAG 126 | ADD(IPV6_DONTFRAG), 127 | #endif 128 | #ifdef IPV6_RECVTCLASS 129 | ADD(IPV6_RECVTCLASS), 130 | #endif 131 | #ifdef IPV6_TCLASS 132 | ADD(IPV6_TCLASS), 133 | #endif 134 | #ifdef IPV6_ADDR_PREFERENCES 135 | ADD(IPV6_ADDR_PREFERENCES), 136 | #endif 137 | #ifdef IPV6_MINHOPCOUNT 138 | ADD(IPV6_MINHOPCOUNT), 139 | #endif 140 | #ifdef IPV6_ORIGDSTADDR 141 | ADD(IPV6_ORIGDSTADDR), 142 | #endif 143 | #ifdef IPV6_TRANSPARENT 144 | ADD(IPV6_TRANSPARENT), 145 | #endif 146 | #ifdef IPV6_UNICAST_IF 147 | ADD(IPV6_UNICAST_IF) 148 | #endif 149 | }; 150 | -------------------------------------------------------------------------------- /constants/sol_packet_options.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOL_PACKET_OPTIONS[] = { 2 | #ifdef PACKET_ADD_MEMBERSHIP 3 | ADD(PACKET_ADD_MEMBERSHIP), 4 | #endif 5 | #ifdef PACKET_DROP_MEMBERSHIP 6 | ADD(PACKET_DROP_MEMBERSHIP), 7 | #endif 8 | #ifdef PACKET_RECV_OUTPUT 9 | ADD(PACKET_RECV_OUTPUT), 10 | #endif 11 | #ifdef PACKET_RX_RING 12 | ADD(PACKET_RX_RING), 13 | #endif 14 | #ifdef PACKET_STATISTICS 15 | ADD(PACKET_STATISTICS), 16 | #endif 17 | #ifdef PACKET_COPY_THRESH 18 | ADD(PACKET_COPY_THRESH), 19 | #endif 20 | #ifdef PACKET_AUXDATA 21 | ADD(PACKET_AUXDATA), 22 | #endif 23 | #ifdef PACKET_ORIGDEV 24 | ADD(PACKET_ORIGDEV), 25 | #endif 26 | #ifdef PACKET_VERSION 27 | ADD(PACKET_VERSION), 28 | #endif 29 | #ifdef PACKET_HDRLEN 30 | ADD(PACKET_HDRLEN), 31 | #endif 32 | #ifdef PACKET_RESERVE 33 | ADD(PACKET_RESERVE), 34 | #endif 35 | #ifdef PACKET_TX_RING 36 | ADD(PACKET_TX_RING), 37 | #endif 38 | #ifdef PACKET_LOSS 39 | ADD(PACKET_LOSS), 40 | #endif 41 | #ifdef PACKET_VNET_HDR 42 | ADD(PACKET_VNET_HDR), 43 | #endif 44 | #ifdef PACKET_TX_TIMESTAMP 45 | ADD(PACKET_TX_TIMESTAMP), 46 | #endif 47 | #ifdef PACKET_TIMESTAMP 48 | ADD(PACKET_TIMESTAMP), 49 | #endif 50 | #ifdef PACKET_FANOUT 51 | ADD(PACKET_FANOUT), 52 | #endif 53 | #ifdef PACKET_TX_HAS_OFF 54 | ADD(PACKET_TX_HAS_OFF), 55 | #endif 56 | #ifdef PACKET_QDISC_BYPASS 57 | ADD(PACKET_QDISC_BYPASS), 58 | #endif 59 | #ifdef PACKET_ROLLOVER_STATS 60 | ADD(PACKET_ROLLOVER_STATS), 61 | #endif 62 | #ifdef PACKET_FANOUT_DATA 63 | ADD(PACKET_FANOUT_DATA) 64 | #endif 65 | }; 66 | -------------------------------------------------------------------------------- /constants/sol_raw_options.h: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | static const IntStrPair SOL_RAW_OPTIONS[] = { 4 | #ifdef ICMP_FILTER 5 | ADD(ICMP_FILTER), 6 | #endif 7 | #include "_sol_ip_options.h" 8 | }; 9 | -------------------------------------------------------------------------------- /constants/sol_socket_options.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOL_SOCKET_OPTIONS[] = { 2 | #ifdef SO_DEBUG 3 | ADD(SO_DEBUG), 4 | #endif 5 | #ifdef SO_REUSEADDR 6 | ADD(SO_REUSEADDR), 7 | #endif 8 | #ifdef SO_TYPE 9 | ADD(SO_TYPE), 10 | #endif 11 | #ifdef SO_ERROR 12 | ADD(SO_ERROR), 13 | #endif 14 | #ifdef SO_DONTROUTE 15 | ADD(SO_DONTROUTE), 16 | #endif 17 | #ifdef SO_BROADCAST 18 | ADD(SO_BROADCAST), 19 | #endif 20 | #ifdef SO_SNDBUF 21 | ADD(SO_SNDBUF), 22 | #endif 23 | #ifdef SO_RCVBUF 24 | ADD(SO_RCVBUF), 25 | #endif 26 | #ifdef SO_SNDBUFFORCE 27 | ADD(SO_SNDBUFFORCE), 28 | #endif 29 | #ifdef SO_RCVBUFFORCE 30 | ADD(SO_RCVBUFFORCE), 31 | #endif 32 | #ifdef SO_KEEPALIVE 33 | ADD(SO_KEEPALIVE), 34 | #endif 35 | #ifdef SO_OOBINLINE 36 | ADD(SO_OOBINLINE), 37 | #endif 38 | #ifdef SO_NO_CHECK 39 | ADD(SO_NO_CHECK), 40 | #endif 41 | #ifdef SO_PRIORITY 42 | ADD(SO_PRIORITY), 43 | #endif 44 | #ifdef SO_LINGER 45 | ADD(SO_LINGER), 46 | #endif 47 | #ifdef SO_BSDCOMPAT 48 | ADD(SO_BSDCOMPAT), 49 | #endif 50 | #ifdef SO_REUSEPORT 51 | ADD(SO_REUSEPORT), 52 | #endif 53 | #ifdef SO_PASSCRED 54 | ADD(SO_PASSCRED), 55 | #endif 56 | #ifdef SO_PASSCRED 57 | ADD(SO_PASSCRED), 58 | #endif 59 | #ifdef SO_PEERCRED 60 | ADD(SO_PEERCRED), 61 | #endif 62 | #ifdef SO_RCVLOWAT 63 | ADD(SO_RCVLOWAT), 64 | #endif 65 | #ifdef SO_SNDLOWAT 66 | ADD(SO_SNDLOWAT), 67 | #endif 68 | #ifdef SO_RCVTIMEO 69 | ADD(SO_RCVTIMEO), 70 | #endif 71 | #ifdef SO_SNDTIMEO 72 | ADD(SO_SNDTIMEO), 73 | #endif 74 | #ifdef SO_SECURITY_AUTHENTICATION 75 | ADD(SO_SECURITY_AUTHENTICATION), 76 | #endif 77 | #ifdef SO_SECURITY_ENCRYPTION_TRANSPORT 78 | ADD(SO_SECURITY_ENCRYPTION_TRANSPORT), 79 | #endif 80 | #ifdef SO_SECURITY_ENCRYPTION_NETWORK 81 | ADD(SO_SECURITY_ENCRYPTION_NETWORK), 82 | #endif 83 | #ifdef SO_BINDTODEVICE 84 | ADD(SO_BINDTODEVICE), 85 | #endif 86 | #ifdef SO_ATTACH_FILTER 87 | ADD(SO_ATTACH_FILTER), 88 | #endif 89 | #ifdef SO_DETACH_FILTER 90 | ADD(SO_DETACH_FILTER), 91 | #endif 92 | #ifdef SO_GET_FILTER 93 | ADD(SO_GET_FILTER), 94 | #endif 95 | #ifdef SO_PEERNAME 96 | ADD(SO_PEERNAME), 97 | #endif 98 | #ifdef SO_TIMESTAMP 99 | ADD(SO_TIMESTAMP), 100 | #endif 101 | #ifdef SO_TIMESTAMP 102 | ADD(SO_TIMESTAMP), 103 | #endif 104 | #ifdef SO_ACCEPTCONN 105 | ADD(SO_ACCEPTCONN), 106 | #endif 107 | #ifdef SO_PEERSEC 108 | ADD(SO_PEERSEC), 109 | #endif 110 | #ifdef SO_PASSSEC 111 | ADD(SO_PASSSEC), 112 | #endif 113 | #ifdef SO_TIMESTAMPNS 114 | ADD(SO_TIMESTAMPNS), 115 | #endif 116 | #ifdef SO_MARK 117 | ADD(SO_MARK), 118 | #endif 119 | #ifdef SO_TIMESTAMPING 120 | ADD(SO_TIMESTAMPING), 121 | #endif 122 | #ifdef SO_PROTOCOL 123 | ADD(SO_PROTOCOL), 124 | #endif 125 | #ifdef SO_DOMAIN 126 | ADD(SO_DOMAIN), 127 | #endif 128 | #ifdef SO_RXQ_OVFL 129 | ADD(SO_RXQ_OVFL), 130 | #endif 131 | #ifdef SO_WIFI_STATUS 132 | ADD(SO_WIFI_STATUS), 133 | #endif 134 | #ifdef SO_PEEK_OFF 135 | ADD(SO_PEEK_OFF), 136 | #endif 137 | #ifdef SO_NOFCS 138 | ADD(SO_NOFCS), 139 | #endif 140 | #ifdef SO_LOCK_FILTER 141 | ADD(SO_LOCK_FILTER), 142 | #endif 143 | #ifdef SO_SELECT_ERR_QUEUE 144 | ADD(SO_SELECT_ERR_QUEUE), 145 | #endif 146 | #ifdef SO_BUSY_POLL 147 | ADD(SO_BUSY_POLL), 148 | #endif 149 | #ifdef SO_MAX_PACING_RATE 150 | ADD(SO_MAX_PACING_RATE), 151 | #endif 152 | #ifdef SO_BPF_EXTENSIONS 153 | ADD(SO_BPF_EXTENSIONS) 154 | #endif 155 | }; 156 | -------------------------------------------------------------------------------- /constants/sol_tcp_options.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOL_TCP_OPTIONS[] = { 2 | #ifdef TCP_NODELAY 3 | ADD(TCP_NODELAY), 4 | #endif 5 | #ifdef TCP_MAXSEG 6 | ADD(TCP_MAXSEG), 7 | #endif 8 | #ifdef TCP_CORK 9 | ADD(TCP_CORK), 10 | #endif 11 | #ifdef TCP_KEEPIDLE 12 | ADD(TCP_KEEPIDLE), 13 | #endif 14 | #ifdef TCP_KEEPINTVL 15 | ADD(TCP_KEEPINTVL), 16 | #endif 17 | #ifdef TCP_KEEPCNT 18 | ADD(TCP_KEEPCNT), 19 | #endif 20 | #ifdef TCP_SYNCNT 21 | ADD(TCP_SYNCNT), 22 | #endif 23 | #ifdef TCP_LINGER2 24 | ADD(TCP_LINGER2), 25 | #endif 26 | #ifdef TCP_DEFER_ACCEPT 27 | ADD(TCP_DEFER_ACCEPT), 28 | #endif 29 | #ifdef TCP_WINDOW_CLAMP 30 | ADD(TCP_WINDOW_CLAMP), 31 | #endif 32 | #ifdef TCP_INFO 33 | ADD(TCP_INFO), 34 | #endif 35 | #ifdef TCP_QUICKACK 36 | ADD(TCP_QUICKACK), 37 | #endif 38 | #ifdef TCP_CONGESTION 39 | ADD(TCP_CONGESTION), 40 | #endif 41 | #ifdef TCP_MD5SIG 42 | ADD(TCP_MD5SIG), 43 | #endif 44 | #ifdef TCP_THIN_LINEAR_TIMEOUTS 45 | ADD(TCP_THIN_LINEAR_TIMEOUTS), 46 | #endif 47 | #ifdef TCP_THIN_DUPACK 48 | ADD(TCP_THIN_DUPACK), 49 | #endif 50 | #ifdef TCP_USER_TIMEOUT 51 | ADD(TCP_USER_TIMEOUT), 52 | #endif 53 | #ifdef TCP_REPAIR 54 | ADD(TCP_REPAIR), 55 | #endif 56 | #ifdef TCP_REPAIR_QUEUE 57 | ADD(TCP_REPAIR_QUEUE), 58 | #endif 59 | #ifdef TCP_QUEUE_SEQ 60 | ADD(TCP_QUEUE_SEQ), 61 | #endif 62 | #ifdef TCP_REPAIR_OPTIONS 63 | ADD(TCP_REPAIR_OPTIONS), 64 | #endif 65 | #ifdef TCP_FASTOPEN 66 | ADD(TCP_FASTOPEN), 67 | #endif 68 | #ifdef TCP_TIMESTAMP 69 | ADD(TCP_TIMESTAMP), 70 | #endif 71 | #ifdef TCP_NOTSENT_LOWAT 72 | ADD(TCP_NOTSENT_LOWAT) 73 | #endif 74 | }; 75 | -------------------------------------------------------------------------------- /constants/sol_udp_options.h: -------------------------------------------------------------------------------- 1 | static const IntStrPair SOL_UDP_OPTIONS[] = { 2 | #ifdef UDP_CORK 3 | ADD(UDP_CORK) 4 | #endif 5 | }; 6 | -------------------------------------------------------------------------------- /init.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | 3 | #include "init.h" 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #ifdef __ANDROID__ 12 | #include 13 | #include 14 | #endif 15 | #include "lib.h" 16 | #include "logger.h" 17 | #include "sock_events.h" 18 | #include "string_builders.h" 19 | 20 | long conf_opt_b; 21 | long conf_opt_c; 22 | char *conf_opt_d; 23 | long conf_opt_f; 24 | long conf_opt_l; 25 | long conf_opt_u; 26 | long conf_opt_t; 27 | long conf_opt_v; 28 | 29 | char *logs_dir_path; 30 | 31 | #ifndef __ANDROID__ 32 | FILE *_stdout; 33 | FILE *_stderr; 34 | #endif 35 | 36 | static bool initialized = false; 37 | 38 | #ifdef __ANDROID__ 39 | static pthread_mutex_t init_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER; 40 | #else 41 | static pthread_mutex_t init_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; 42 | #endif 43 | 44 | /* Private functions */ 45 | 46 | /* This function creates the directory where the traces of the current process 47 | * will be placed. We start from [base_path], which is the number of the process 48 | * and try to find the first directory available by concatenating increasing 49 | * integers. */ 50 | static char *create_logs_dir_at_path(const char *path) { 51 | char *app_name, *base_path, *full_path; 52 | int i = 0; 53 | DIR *dir; 54 | if (!(app_name = alloc_app_name())) goto error_out; 55 | if (!(base_path = alloc_concat_path(path, app_name))) goto error1; 56 | free(app_name); 57 | full_path = alloc_append_int_to_path(base_path, i); 58 | 59 | while (true) { 60 | if ((dir = opendir(full_path))) { // Already exists. 61 | free(full_path); 62 | i++; 63 | full_path = alloc_append_int_to_path(base_path, i); 64 | } else if (!dir && errno == ENOENT) 65 | break; // Free. 66 | else if (!dir) 67 | goto error2; // Failure for some other reason. 68 | } 69 | 70 | free(base_path); 71 | // Finally, create dir at full_path. 72 | if (mkdir(full_path, 0777)) goto error3; 73 | return full_path; 74 | error3: 75 | LOG(ERROR, "mkdir() failed for %s. %s.", path, strerror(errno)); 76 | free(full_path); 77 | goto error_out; 78 | error2: 79 | LOG(ERROR, "opendir() failed. %s.", strerror(errno)); 80 | free(full_path); 81 | free(base_path); 82 | goto error_out; 83 | error1: 84 | free(app_name); 85 | error_out: 86 | LOG_FUNC_ERROR; 87 | return NULL; 88 | } 89 | 90 | static void tcpsnitch_free(void) { 91 | free(conf_opt_d); 92 | free(logs_dir_path); 93 | #ifndef __ANDROID__ 94 | if (_stdout) fclose(_stdout); 95 | if (_stderr) fclose(_stderr); 96 | #endif 97 | // We don't check for errors on this one. This is called after fork() 98 | // will logically fail if the mutex was locked at the time of forking. 99 | pthread_mutex_destroy(&init_mutex); 100 | } 101 | 102 | #ifndef __ANDROID__ 103 | static void open_std_streams(void) { 104 | /* We need a way to unweave the main process and tcpsnitch standard 105 | * streams. To this purpose, we create 2 additionnal fds (3 & 4) with 106 | * bash redirections that this lib use as standard streams. */ 107 | _stdout = my_fdopen(STDOUT_FD, "w"); 108 | _stderr = my_fdopen(STDERR_FD, "w"); 109 | } 110 | #endif 111 | 112 | static void get_options(void) { 113 | conf_opt_b = get_long_opt_or_defaultval(OPT_B, 4096); 114 | #ifdef __ANDROID__ 115 | conf_opt_d = alloc_android_opt_d(); 116 | #else 117 | conf_opt_c = get_long_opt_or_defaultval(OPT_C, 0); 118 | conf_opt_d = alloc_str_opt(OPT_D); 119 | #endif 120 | conf_opt_f = get_long_opt_or_defaultval(OPT_F, WARN); 121 | conf_opt_l = get_long_opt_or_defaultval(OPT_L, WARN); 122 | conf_opt_t = get_long_opt_or_defaultval(OPT_T, 1000); 123 | conf_opt_u = get_long_opt_or_defaultval(OPT_U, 0); 124 | conf_opt_v = get_long_opt_or_defaultval(OPT_V, 0); 125 | } 126 | 127 | static void log_options(void) { 128 | LOG(INFO, "Option b: %lu.", conf_opt_b); 129 | #ifndef __ANDROID__ 130 | LOG(INFO, "Option c: %lu.", conf_opt_c); 131 | #endif 132 | LOG(INFO, "Option d: %s", conf_opt_d); 133 | LOG(INFO, "Option f: %lu.", conf_opt_f); 134 | LOG(INFO, "Option l: %lu.", conf_opt_l); 135 | LOG(INFO, "Option t: %lu.", conf_opt_t); 136 | LOG(INFO, "Option u: %lu.", conf_opt_u); 137 | LOG(INFO, "Option v: %lu.", conf_opt_v); 138 | } 139 | 140 | static void init_logs(void) { 141 | char *log_file_path; 142 | if (!(log_file_path = alloc_concat_path(logs_dir_path, "logs.txt"))) 143 | goto error; 144 | logger_init(log_file_path, conf_opt_l, conf_opt_f); 145 | free(log_file_path); 146 | return; 147 | error: 148 | LOG_FUNC_ERROR; 149 | LOG(ERROR, "No logs to file."); 150 | } 151 | 152 | static void *json_dumper_thread(void *arg) { 153 | UNUSED(arg); 154 | LOG_FUNC_INFO; 155 | 156 | struct timespec time; 157 | time.tv_sec = conf_opt_t / 1000; 158 | time.tv_nsec = (conf_opt_t % 1000) * 1000 * 1000; // opt_t is in ms 159 | 160 | while (true) { 161 | dump_all_sock_events(); 162 | nanosleep(&time, NULL); 163 | } 164 | // Unreachable 165 | return NULL; 166 | } 167 | 168 | void start_json_dumper_thread(void) { 169 | pthread_t thread; 170 | my_pthread_create(&thread, NULL, json_dumper_thread, NULL); 171 | } 172 | 173 | /* Public functions */ 174 | 175 | /* This function is used to reset the library after a fork() call. If a fork() 176 | * is not followed by exec(), the global variables are not reinitialized. 177 | * However, we would like to distinguish the traces by process. */ 178 | 179 | void reset_tcpsnitch(void) { 180 | if (!initialized) return; // Nothing to do. 181 | tcpsnitch_free(); 182 | logger_init(NULL, WARN, WARN); 183 | initialized = false; 184 | mutex_init(&init_mutex); 185 | sock_ev_reset(); 186 | } 187 | 188 | void init_tcpsnitch(void) { 189 | mutex_lock(&init_mutex); 190 | if (initialized) goto exit; 191 | 192 | #ifndef __ANDROID__ 193 | open_std_streams(); 194 | #endif 195 | get_options(); 196 | if (!conf_opt_d) goto exit1; 197 | if (!(logs_dir_path = create_logs_dir_at_path(conf_opt_d))) goto exit1; 198 | init_logs(); 199 | log_options(); 200 | if (conf_opt_t) start_json_dumper_thread(); 201 | goto exit; 202 | exit1: 203 | LOG(ERROR, "Nothing will be written to file (log, pcap, json)."); 204 | exit: 205 | initialized = true; 206 | mutex_unlock(&init_mutex); 207 | return; 208 | } 209 | 210 | __attribute__((destructor)) static void cleanup(void) { 211 | LOG(INFO, "Performing library cleanup before end of process."); 212 | dump_all_sock_events(); 213 | // tcp_free(); 214 | // tcpsnitch_free(); 215 | } 216 | -------------------------------------------------------------------------------- /init.h: -------------------------------------------------------------------------------- 1 | #ifndef INIT_H 2 | #define INIT_H 3 | 4 | #include 5 | #include 6 | 7 | #define STDOUT_FD 3 8 | #define STDERR_FD 4 9 | 10 | #ifdef __ANDROID__ 11 | #define OPT_B "be.ucl.tcpsnitch.opt_b" 12 | #define OPT_C "be.ucl.tcpsnitch.opt_c" 13 | #define OPT_D "be.ucl.tcpsnitch.opt_d" 14 | #define OPT_F "be.ucl.tcpsnitch.opt_f" 15 | #define OPT_L "be.ucl.tcpsnitch.opt_l" 16 | #define OPT_T "be.ucl.tcpsnitch.opt_t" 17 | #define OPT_U "be.ucl.tcpsnitch.opt_u" 18 | #define OPT_V "be.ucl.tcpsnitch.opt_v" 19 | #else 20 | #define OPT_B "TCPSNITCH_OPT_B" 21 | #define OPT_C "TCPSNITCH_OPT_C" 22 | #define OPT_D "TCPSNITCH_OPT_D" 23 | #define OPT_F "TCPSNITCH_OPT_F" 24 | #define OPT_L "TCPSNITCH_OPT_L" 25 | #define OPT_T "TCPSNITCH_OPT_T" 26 | #define OPT_U "TCPSNITCH_OPT_U" 27 | #define OPT_V "TCPSNITCH_OPT_V" 28 | #endif 29 | 30 | extern long conf_opt_b; 31 | extern long conf_opt_c; 32 | extern char *conf_opt_d; 33 | extern long conf_opt_f; 34 | extern long conf_opt_l; 35 | extern long conf_opt_p; 36 | extern long conf_opt_u; 37 | extern long conf_opt_t; 38 | extern long conf_opt_v; 39 | 40 | extern char *logs_dir_path; 41 | 42 | #ifndef __ANDROID__ 43 | extern FILE *_stdout; 44 | extern FILE *_stderr; 45 | #endif 46 | 47 | void reset_tcpsnitch(void); 48 | void init_tcpsnitch(void); 49 | 50 | #endif 51 | -------------------------------------------------------------------------------- /json_builder.h: -------------------------------------------------------------------------------- 1 | #ifndef TCP_SPY_JSON_H 2 | #define TCP_SPY_JSON_H 3 | 4 | #include "sock_events.h" 5 | 6 | char *alloc_sock_ev_json(const SockEvent *ev); 7 | 8 | #endif 9 | -------------------------------------------------------------------------------- /lib.h: -------------------------------------------------------------------------------- 1 | #ifndef LIB_H 2 | #define LIB_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | 13 | #define UNUSED(x) (void)(x) 14 | 15 | int my_getsockopt(int sockfd, int level, int optname, void *optval, 16 | socklen_t *optlen); 17 | 18 | FILE *my_fdopen(int fd, const char *mode); 19 | 20 | #ifdef __ANDROID__ 21 | int my_ioctl(int fd, int request, ...); 22 | #else 23 | int my_ioctl(int fd, unsigned long int request, ...); 24 | #endif 25 | 26 | bool is_fd(int fd); 27 | bool is_socket(int fd); 28 | bool is_inet_socket(int fd); 29 | bool is_tcp_socket(int fd); 30 | 31 | int append_string_to_file(const char *str, const char *path); 32 | 33 | int fill_tcp_info(int fd, struct tcp_info *info); 34 | int fill_timeval(struct timeval *timeval); 35 | 36 | time_t get_time_sec(void); 37 | unsigned long get_time_micros(void); 38 | 39 | long parse_long(const char *str); 40 | long get_env_as_long(const char *env_var); 41 | char *get_str_env(const char *env_var); 42 | #ifdef __ANDROID__ 43 | long get_property_as_long(const char *property); 44 | #endif 45 | long get_long_opt_or_defaultval(const char *opt, long def_val); 46 | int get_int_len(int i); 47 | 48 | bool mutex_lock(pthread_mutex_t *mutex); 49 | bool mutex_unlock(pthread_mutex_t *mutex); 50 | bool mutex_destroy(pthread_mutex_t *mutex); 51 | bool mutex_init(pthread_mutex_t *mutex); 52 | 53 | int my_pthread_create(pthread_t *thread, const pthread_attr_t *attr, 54 | void *(*start_routine)(void *), void *arg); 55 | void *my_malloc(size_t size); 56 | void *my_calloc(size_t size); 57 | int my_fputs(const char *s, FILE *stream); 58 | 59 | bool is_dir_writable(const char *path); 60 | 61 | #endif 62 | -------------------------------------------------------------------------------- /logger.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | 3 | #include "logger.h" 4 | #ifdef __ANDROID__ 5 | #include 6 | #endif 7 | #include 8 | #include 9 | #ifndef __ANDROID__ 10 | #include 11 | #endif 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include "constants.h" 21 | #include "init.h" 22 | #include "lib.h" 23 | #include "sock_events.h" 24 | 25 | #define ANSI_COLOR_WHITE "\x1b[37m" 26 | #define ANSI_COLOR_RED "\x1b[31m" 27 | #define ANSI_COLOR_YELLOW "\x1b[33m" 28 | #define ANSI_COLOR_GREEN "\x1b[32m" 29 | #define ANSI_COLOR_RESET "\x1b[0m" 30 | 31 | typedef struct { 32 | int year; 33 | int mon; 34 | int day; 35 | int hour; 36 | int min; 37 | int sec; 38 | int usec; 39 | } Timestamp; 40 | 41 | #ifndef __ANDROID__ 42 | static const char *colors[] = {ANSI_COLOR_GREEN, ANSI_COLOR_RED, 43 | ANSI_COLOR_YELLOW, ANSI_COLOR_WHITE, 44 | ANSI_COLOR_WHITE}; 45 | #else 46 | static const int android_log_priorities_map[] = { 47 | ANDROID_LOG_FATAL, ANDROID_LOG_ERROR, ANDROID_LOG_WARN, ANDROID_LOG_INFO, 48 | ANDROID_LOG_DEBUG}; 49 | #endif 50 | 51 | /* We do not want to open/close a new stream each time we log a single line to 52 | file. Instead we open it once, and let the system automatically close the 53 | stream when the process ends. Not sure this is the best solution? */ 54 | static FILE *log_file = NULL; 55 | static LogLevel stderr_lvl = WARN; 56 | static LogLevel file_lvl = WARN; 57 | 58 | /* Private functions */ 59 | 60 | static const char *log_level_str(LogLevel lvl) { 61 | static const char *strings[] = {"ALWAYS", "ERROR", "WARN", "INFO", 62 | "DEBUG"}; 63 | assert(sizeof(strings) / sizeof(char *) == DEBUG + 1); 64 | return strings[lvl]; 65 | } 66 | 67 | static void fill_timestamp(Timestamp *timestamp) { 68 | time_t rawtime; 69 | if ((rawtime = time(NULL)) == -1) return; 70 | 71 | struct tm timeinfo; 72 | if (!localtime_r(&rawtime, &timeinfo)) return; 73 | 74 | timestamp->year = timeinfo.tm_year + 1900; 75 | timestamp->mon = timeinfo.tm_mon + 1; 76 | timestamp->day = timeinfo.tm_mday; 77 | timestamp->hour = timeinfo.tm_hour; 78 | timestamp->min = timeinfo.tm_min; 79 | timestamp->sec = timeinfo.tm_sec; 80 | 81 | struct timespec now; 82 | if (clock_gettime(CLOCK_MONOTONIC, &now) < 0) return; 83 | timestamp->usec = now.tv_nsec / 10000000; 84 | } 85 | 86 | static void log_to_file(LogLevel log_lvl, const char *formated_str, 87 | const char *file, int line, FILE *stream) { 88 | Timestamp ts; 89 | fill_timestamp(&ts); 90 | fprintf(stream, 91 | "%02d.%02d.%02d-%02d:%02d:%02d.%02d - [%s] - %d (%s:%d) " 92 | "%s\n", 93 | ts.year, ts.mon, ts.day, ts.hour, ts.min, ts.sec, ts.usec, 94 | log_level_str(log_lvl), getpid(), file, line, formated_str); 95 | } 96 | 97 | #ifdef __ANDROID__ 98 | static void log_to_logcat(LogLevel log_lvl, const char *str, const char *file, 99 | int line) { 100 | __android_log_print(android_log_priorities_map[log_lvl], "tcpsnitch", 101 | "(%s:%d) %s", file, line, str); 102 | } 103 | #else 104 | static void log_to_stderr(LogLevel log_lvl, const char *formated_str, 105 | const char *file, int line) { 106 | FILE *stream = (_stderr ? _stderr : stderr); 107 | Timestamp ts; 108 | fill_timestamp(&ts); 109 | fprintf(stream, 110 | "%s%02d.%02d.%02d-%02d:%02d:%02d.%02d - [%s] - %d (%s:%d) " 111 | "%s%s\n", 112 | colors[log_lvl], ts.year, ts.mon, ts.day, ts.hour, ts.min, 113 | ts.sec, ts.usec, log_level_str(log_lvl), getpid(), file, line, 114 | formated_str, ANSI_COLOR_RESET); 115 | } 116 | #endif 117 | 118 | static void set_log_file(const char *path) { 119 | if (log_file != NULL) fclose(log_file); 120 | 121 | if (!path) { // reset_tcpsnitch pass a NULL pointer. 122 | log_file = NULL; 123 | return; 124 | } 125 | 126 | log_file = fopen(path, "a"); 127 | if (!log_file) { 128 | char str[1024]; 129 | snprintf(str, sizeof(str), "fopen() failed on %s. %s.", path, 130 | strerror(errno)); 131 | #ifdef __ANDROID__ 132 | log_to_logcat(ERROR, str, __FILE__, __LINE__); 133 | #else 134 | log_to_stderr(ERROR, str, __FILE__, __LINE__); 135 | #endif 136 | } 137 | } 138 | 139 | /* Public functions */ 140 | 141 | void logger_init(const char *path, LogLevel _stdout_lvl, LogLevel _file_lvl) { 142 | set_log_file(path); 143 | stderr_lvl = _stdout_lvl; 144 | file_lvl = _file_lvl; 145 | } 146 | 147 | void logger(LogLevel log_lvl, const char *str, const char *file, int line) { 148 | if (log_lvl <= stderr_lvl) 149 | #ifdef __ANDROID__ 150 | log_to_logcat(log_lvl, str, file, line); 151 | #else 152 | log_to_stderr(log_lvl, str, file, line); 153 | #endif 154 | if (log_file && log_lvl <= file_lvl) 155 | log_to_file(log_lvl, str, file, line, log_file); 156 | } 157 | 158 | #ifndef __ANDROID__ 159 | void print_trace(void) { 160 | void *array[10]; 161 | size_t size; 162 | char **strings; 163 | size_t i; 164 | 165 | size = backtrace(array, 10); 166 | if (!(strings = backtrace_symbols(array, size))) return; 167 | 168 | printf("Obtained %zd stack frames.\n", size); 169 | for (i = 0; i < size; i++) fprintf(_stderr, " %s\n", strings[i]); 170 | free(strings); 171 | } 172 | #endif 173 | -------------------------------------------------------------------------------- /logger.h: -------------------------------------------------------------------------------- 1 | #ifndef LOGGER_H 2 | #define LOGGER_H 3 | 4 | #include "logger.h" 5 | 6 | typedef enum LogLevel { ALWAYS, ERROR, WARN, INFO, DEBUG } LogLevel; 7 | 8 | void logger_init(const char *path, LogLevel stdout_lvl, LogLevel file_lvl); 9 | 10 | void logger(LogLevel lvl, const char *str, const char *file, int line); 11 | 12 | #ifndef __ANDROID__ 13 | void print_trace(void); 14 | #endif 15 | 16 | #define LOG(lvl, format, args...) \ 17 | { \ 18 | char _buf[1024]; \ 19 | snprintf(_buf, sizeof(_buf), format, ##args); \ 20 | logger(lvl, _buf, __FILE__, __LINE__); \ 21 | } 22 | 23 | #ifdef __ANDROID__ 24 | #define LOG_FUNC_ERROR LOG(ERROR, "%s failed.", __func__) 25 | #else 26 | #define LOG_FUNC_ERROR \ 27 | { \ 28 | LOG(ERROR, "%s failed.", __func__) \ 29 | print_trace(); \ 30 | } 31 | #endif 32 | 33 | #define LOG_FUNC_WARN LOG(WARN, "%s", __func__) 34 | #define LOG_FUNC_INFO LOG(INFO, "%s", __func__) 35 | 36 | #define D(format, args...) LOG(ALWAYS, format, ##args) 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /packet_sniffer.h: -------------------------------------------------------------------------------- 1 | #ifndef PACKET_SNIFFER_H 2 | #define PACKET_SNIFFER_H 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | char *alloc_capture_filter(const struct sockaddr *addr1, 10 | const struct sockaddr *addr2); 11 | 12 | bool *start_capture(const char *filters, const char *path); 13 | int stop_capture(bool *switch_flag, int delay_ms); 14 | 15 | #endif 16 | -------------------------------------------------------------------------------- /resizable_array.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | 3 | #include "resizable_array.h" 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include "lib.h" 9 | #include "logger.h" 10 | #include "sock_events.h" 11 | 12 | typedef struct { 13 | ELEM_TYPE elem; 14 | pthread_mutex_t mutex; 15 | } ElemWrapper; 16 | 17 | static pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER; 18 | static ElemWrapper **array = NULL; 19 | static int size = 0; 20 | 21 | // Private functions 22 | 23 | ElemWrapper **allocate_array(int _size) { 24 | return (ElemWrapper **)my_calloc(sizeof(ElemWrapper *) * _size); 25 | } 26 | 27 | static bool init(int init_size) { 28 | if (init_size < MIN_INIT_SIZE) init_size = MIN_INIT_SIZE; 29 | LOG(INFO, "Resizable array initialized to size %d.", init_size); 30 | if (!(array = allocate_array(init_size))) goto error; 31 | size = init_size; 32 | return true; 33 | error: 34 | LOG_FUNC_ERROR; 35 | return false; 36 | } 37 | 38 | static bool double_size(int index) { 39 | // Compute new size 40 | int new_size, normal_new_size = size * GROWTH_FACTOR; 41 | new_size = normal_new_size > index + 1 ? normal_new_size : index + 1; 42 | LOG(INFO, "Resizable array doubling size to %d.", new_size); 43 | 44 | ElemWrapper **new_a; 45 | if (!(new_a = allocate_array(new_size))) goto error; 46 | 47 | for (int i = 0; i < size; i++) new_a[i] = array[i]; 48 | 49 | free(array); 50 | array = new_a; 51 | size = new_size; 52 | return true; 53 | error: 54 | LOG_FUNC_ERROR; 55 | return false; 56 | } 57 | 58 | static bool is_index_in_bounds(int index) { return index < size; } 59 | 60 | /* Public functions */ 61 | 62 | bool ra_put_elem(int index, ELEM_TYPE elem) { 63 | pthread_rwlock_wrlock(&rwlock); 64 | if (!array && !init(index + 1)) goto error; 65 | if (index > size - 1 && !double_size(index)) goto error; 66 | 67 | ElemWrapper *ew = (ElemWrapper *)my_malloc(sizeof(ElemWrapper)); 68 | mutex_init(&ew->mutex); 69 | ew->elem = elem; 70 | 71 | array[index] = ew; 72 | pthread_rwlock_unlock(&rwlock); 73 | return true; 74 | error: 75 | pthread_rwlock_unlock(&rwlock); 76 | LOG_FUNC_ERROR; 77 | return false; 78 | } 79 | 80 | ELEM_TYPE ra_get_and_lock_elem(int index) { 81 | pthread_rwlock_rdlock(&rwlock); 82 | if (!is_index_in_bounds(index)) goto error; 83 | if (!array[index]) { 84 | LOG(WARN, "Null in array at index %d.", index); 85 | pthread_rwlock_unlock(&rwlock); 86 | return NULL; 87 | } 88 | ElemWrapper *ew = array[index]; 89 | mutex_lock(&ew->mutex); 90 | return ew->elem; 91 | error: 92 | LOG(ERROR, "OOB (index %d, bound %d).", index, size - 1); 93 | pthread_rwlock_unlock(&rwlock); 94 | LOG_FUNC_ERROR; 95 | return NULL; 96 | } 97 | 98 | void ra_unlock_elem(int index) { 99 | if (!is_index_in_bounds(index)) goto error1; 100 | if (!array[index]) goto error2; 101 | mutex_unlock(&(array[index]->mutex)); 102 | pthread_rwlock_unlock(&rwlock); 103 | return; 104 | error1: 105 | LOG(ERROR, "OOB (index %d, bound %d).", index, size - 1); 106 | goto error_out; 107 | error2: 108 | LOG(ERROR, "No item at index %d.", index); 109 | error_out: 110 | pthread_rwlock_unlock(&rwlock); 111 | LOG_FUNC_ERROR; 112 | } 113 | 114 | ELEM_TYPE ra_remove_elem(int index) { 115 | pthread_rwlock_wrlock(&rwlock); 116 | if (!is_index_in_bounds(index)) goto error; 117 | if (!array[index]) { 118 | pthread_rwlock_unlock(&rwlock); 119 | return NULL; 120 | } 121 | ElemWrapper *ew = array[index]; 122 | // No need to lock it. Having the rwlock in write mode means no other 123 | // thread has a valid el or will be able to acquire one. 124 | mutex_destroy(&ew->mutex); 125 | ELEM_TYPE el = ew->elem; 126 | array[index] = NULL; 127 | free(ew); 128 | pthread_rwlock_unlock(&rwlock); 129 | return el; 130 | error: 131 | LOG(ERROR, "OOB (index %d, bound %d).", index, size - 1); 132 | pthread_rwlock_unlock(&rwlock); 133 | LOG_FUNC_ERROR; 134 | return NULL; 135 | } 136 | 137 | bool ra_is_present(int index) { 138 | pthread_rwlock_rdlock(&rwlock); 139 | if (!is_index_in_bounds(index)) goto out_false; 140 | bool ret = (array[index] != NULL); 141 | pthread_rwlock_unlock(&rwlock); 142 | return ret; 143 | out_false: 144 | pthread_rwlock_unlock(&rwlock); 145 | return false; 146 | } 147 | 148 | int ra_get_size(void) { 149 | pthread_rwlock_rdlock(&rwlock); 150 | int ret = size; 151 | pthread_rwlock_unlock(&rwlock); 152 | return ret; 153 | } 154 | 155 | void ra_free() { 156 | pthread_rwlock_rdlock(&rwlock); 157 | for (int i = 0; i < size; i++) { 158 | if (array[i]) { 159 | // We don't check for errors on this one. This is called 160 | // after fork() and will logically failed if the mutex 161 | // was lock at the time of forking. This is normal. 162 | pthread_mutex_destroy(&array[i]->mutex); 163 | FREE_ELEM(array[i]->elem); 164 | free(array[i]); 165 | } 166 | } 167 | free(array); 168 | pthread_rwlock_unlock(&rwlock); 169 | pthread_rwlock_destroy(&rwlock); 170 | } 171 | -------------------------------------------------------------------------------- /resizable_array.h: -------------------------------------------------------------------------------- 1 | #ifndef RESIABLZE_ARRAY_H 2 | #define RESIABLZE_ARRAY_H 3 | 4 | #include "sock_events.h" 5 | 6 | #define ELEM_TYPE Socket* // Elements stored in the array. 7 | #define FREE_ELEM(elem) \ 8 | free_socket(elem) // Routine for freeing an element. 9 | #define MIN_INIT_SIZE 16 // Starting size of array. 10 | #define GROWTH_FACTOR 2 // Minimum growth factor when the array is expanded. 11 | 12 | bool ra_put_elem(int index, ELEM_TYPE elem); 13 | ELEM_TYPE ra_remove_elem(int index); 14 | ELEM_TYPE ra_get_and_lock_elem(int index); 15 | void ra_unlock_elem(int index); 16 | 17 | bool ra_is_present(int index); 18 | int ra_get_size(void); 19 | 20 | void ra_free(void); // Free state. 21 | 22 | #endif 23 | -------------------------------------------------------------------------------- /string_builders.h: -------------------------------------------------------------------------------- 1 | #ifndef STRING_BUILDERS_H 2 | #define STRING_BUILDERS_H 3 | 4 | #include "sock_events.h" 5 | 6 | char *alloc_ip_str(const struct sockaddr *addr); 7 | char *alloc_port_str(const struct sockaddr *addr); 8 | char *alloc_addr_str(const struct sockaddr *addr); 9 | bool alloc_name_str(const struct sockaddr *addr, socklen_t len, char **name, 10 | char **serv); 11 | 12 | char *alloc_concat_path(const char *path1, const char *path2); 13 | char *alloc_append_int_to_path(const char *path1, int i); 14 | 15 | char *alloc_android_opt_d(void); 16 | char *alloc_pcap_path_str(Socket *con); 17 | char *alloc_json_path_str(Socket *con); 18 | 19 | char *alloc_cmdline_str(void); 20 | char *alloc_app_name(void); 21 | 22 | char *alloc_error_str(int err); 23 | 24 | char *alloc_str_from_int(int n); 25 | 26 | #ifdef __ANDROID__ 27 | char *alloc_property(const char *property); 28 | #endif 29 | 30 | char *alloc_str_opt(const char *opt); 31 | 32 | char *alloc_iface_name(int fd, int iface_index); 33 | #endif 34 | -------------------------------------------------------------------------------- /tests/.gitignore: -------------------------------------------------------------------------------- 1 | Gemfile.lock 2 | udp.pkt 3 | tcp.pkt 4 | c_programs/*.out 5 | -------------------------------------------------------------------------------- /tests/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'minitest-reporters' 4 | gem 'json_expressions' 5 | gem 'm' 6 | -------------------------------------------------------------------------------- /tests/README.md: -------------------------------------------------------------------------------- 1 | # Tests 2 | 3 | ## Run the tests 4 | 5 | - Execute `rake` to run all tests. 6 | - Execute `make tests` from root directory. 7 | 8 | ## Dependencies 9 | 10 | - Requires Ruby 2.x 11 | - Requires Bundler 12 | 13 | ## Installation 14 | 15 | - Run `bundle install`. 16 | -------------------------------------------------------------------------------- /tests/Rakefile: -------------------------------------------------------------------------------- 1 | require 'rake/testtask' 2 | require 'webrick' 3 | require './lib/lib.rb' 4 | 5 | task default: [:test] 6 | 7 | Rake::TestTask.new do |t| 8 | t.pattern = "test*.rb" 9 | end 10 | 11 | task :write_cprogs do 12 | system("rm -rf ./c_programs/*.c") 13 | require('./lib/write_cprogs.rb') 14 | end 15 | 16 | task :compile_cprogs do 17 | system("rm -rf ./c_programs/*.out") 18 | Dir.glob('./c_programs/*.c') do |c_file| 19 | system("gcc -Wall -Wextra #{c_file} -o #{c_file.chomp(".c")}.out") 20 | end 21 | end 22 | 23 | task :verify_cprogs do 24 | WebServer.start 25 | Dir.glob('./c_programs/*.out') do |c_file| 26 | if !system(c_file) then puts "#{c_file} failed!" end 27 | sleep 0.03 # Throttle to avoid failed connect() 28 | end 29 | WebServer.stop 30 | end 31 | 32 | task :prepare_cprogs => [:write_cprogs, :compile_cprogs, :verify_cprogs] 33 | -------------------------------------------------------------------------------- /tests/c_programs/bind.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(55555); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "bind() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | return(EXIT_SUCCESS); 38 | } 39 | -------------------------------------------------------------------------------- /tests/c_programs/bind_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(55555); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "bind() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | return(EXIT_SUCCESS); 38 | } 39 | -------------------------------------------------------------------------------- /tests/c_programs/bind_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) != -1) 33 | return(EXIT_FAILURE); 34 | 35 | return(EXIT_SUCCESS); 36 | } 37 | -------------------------------------------------------------------------------- /tests/c_programs/close.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (close(sock) < 0) { 28 | fprintf(stderr, "close() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/close_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (close(sock) < 0) { 28 | fprintf(stderr, "close() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/close_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | if (close(42) != -1) 22 | return(EXIT_FAILURE); 23 | 24 | return(EXIT_SUCCESS); 25 | } 26 | -------------------------------------------------------------------------------- /tests/c_programs/concurrent_connections.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | close(sock1); 27 | close(sock2); 28 | 29 | return(EXIT_SUCCESS); 30 | } 31 | -------------------------------------------------------------------------------- /tests/c_programs/connect.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | return(EXIT_SUCCESS); 38 | } 39 | -------------------------------------------------------------------------------- /tests/c_programs/connect_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | return(EXIT_SUCCESS); 38 | } 39 | -------------------------------------------------------------------------------- /tests/c_programs/connect_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(1234); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) != -1) 33 | return(EXIT_FAILURE); 34 | 35 | return(EXIT_SUCCESS); 36 | } 37 | -------------------------------------------------------------------------------- /tests/c_programs/consecutive_connections.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | close(sock1); 25 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 26 | return(EXIT_FAILURE); 27 | close(sock2); 28 | 29 | return(EXIT_SUCCESS); 30 | } 31 | -------------------------------------------------------------------------------- /tests/c_programs/dup.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup(sock) < 0) { 28 | fprintf(stderr, "dup() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/dup2.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup2(sock, 42) < 0) { 28 | fprintf(stderr, "dup2() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/dup2_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup2(sock, 42) < 0) { 28 | fprintf(stderr, "dup2() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/dup2_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup2(sock, 9999999) != -1) 28 | return(EXIT_FAILURE); 29 | 30 | return(EXIT_SUCCESS); 31 | } 32 | -------------------------------------------------------------------------------- /tests/c_programs/dup3.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup3(sock, 42, O_CLOEXEC) < 0) { 28 | fprintf(stderr, "dup3() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/dup3_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup3(sock, 42, O_CLOEXEC) < 0) { 28 | fprintf(stderr, "dup3() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/dup3_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup3(sock, 999999, O_CLOEXEC) != -1) 28 | return(EXIT_FAILURE); 29 | 30 | return(EXIT_SUCCESS); 31 | } 32 | -------------------------------------------------------------------------------- /tests/c_programs/dup_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup(sock) < 0) { 28 | fprintf(stderr, "dup() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/dup_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (dup(42) != -1) 28 | return(EXIT_FAILURE); 29 | 30 | return(EXIT_SUCCESS); 31 | } 32 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_ctl.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | return(EXIT_SUCCESS); 37 | } 38 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_ctl_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | return(EXIT_SUCCESS); 37 | } 38 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_ctl_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_MOD, sock, &event) == 0) 32 | return(EXIT_FAILURE); 33 | 34 | return(EXIT_SUCCESS); 35 | } 36 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_pwait.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | struct epoll_event events[2]; 37 | if (epoll_pwait(efd, events, 2, 0, NULL) < 0) { 38 | fprintf(stderr, "epoll_pwait() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_pwait_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | struct epoll_event events[2]; 37 | if (epoll_pwait(efd, events, 2, 0, NULL) < 0) { 38 | fprintf(stderr, "epoll_pwait() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_pwait_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | struct epoll_event events[2]; 37 | if (epoll_pwait(efd, events, -1, 0, NULL) != -1) 38 | return(EXIT_FAILURE); 39 | 40 | return(EXIT_SUCCESS); 41 | } 42 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_wait.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | struct epoll_event events[2]; 37 | if (epoll_wait(efd, events, 2, 0) < 0) { 38 | fprintf(stderr, "epoll_wait() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_wait_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | struct epoll_event events[2]; 37 | if (epoll_wait(efd, events, 2, 0) < 0) { 38 | fprintf(stderr, "epoll_wait() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/epoll_wait_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int efd = epoll_create1(0); 28 | struct epoll_event event; 29 | event.data.fd = sock; 30 | event.events = EPOLLIN|EPOLLOUT; 31 | if (epoll_ctl(efd, EPOLL_CTL_ADD, sock, &event) < 0) { 32 | fprintf(stderr, "epoll_ctl() failed: %s\n.", strerror(errno)); 33 | return(EXIT_FAILURE); 34 | } 35 | 36 | struct epoll_event events[2]; 37 | if (epoll_wait(efd, events, -1, 0) != -1) 38 | return(EXIT_FAILURE); 39 | 40 | return(EXIT_SUCCESS); 41 | } 42 | -------------------------------------------------------------------------------- /tests/c_programs/fcntl.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) { 28 | fprintf(stderr, "fcntl() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/fcntl_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) { 28 | fprintf(stderr, "fcntl() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/fcntl_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (fcntl(42, F_SETFL) != -1) 28 | return(EXIT_FAILURE); 29 | 30 | return(EXIT_SUCCESS); 31 | } 32 | -------------------------------------------------------------------------------- /tests/c_programs/fdopen.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (fdopen(sock, "w") == NULL) { 28 | fprintf(stderr, "fdopen() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/fdopen_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (fdopen(sock, "w") == NULL) { 28 | fprintf(stderr, "fdopen() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/fdopen_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (fdopen(sock, "Z") != NULL) 28 | return(EXIT_FAILURE); 29 | 30 | return(EXIT_SUCCESS); 31 | } 32 | -------------------------------------------------------------------------------- /tests/c_programs/fork.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | pid_t pid; 28 | pid = fork(); 29 | if (pid < 0) return (EXIT_FAILURE); 30 | if (pid == 0) { // Child 31 | int sock; 32 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 33 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | } else { // Parent 38 | int status; 39 | waitpid(pid, &status, 0); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/getpeername.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | struct sockaddr_storage sa; 38 | socklen_t sa_len = sizeof(sa); 39 | 40 | if (getpeername(sock, (struct sockaddr *)&sa, &sa_len) < 0) { 41 | fprintf(stderr, "getpeername() failed: %s\n.", strerror(errno)); 42 | return(EXIT_FAILURE); 43 | } 44 | 45 | return(EXIT_SUCCESS); 46 | } 47 | -------------------------------------------------------------------------------- /tests/c_programs/getpeername_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | struct sockaddr_storage sa; 38 | socklen_t sa_len = sizeof(sa); 39 | 40 | if (getpeername(sock, (struct sockaddr *)&sa, &sa_len) < 0) { 41 | fprintf(stderr, "getpeername() failed: %s\n.", strerror(errno)); 42 | return(EXIT_FAILURE); 43 | } 44 | 45 | return(EXIT_SUCCESS); 46 | } 47 | -------------------------------------------------------------------------------- /tests/c_programs/getpeername_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | struct sockaddr_storage sa; 38 | socklen_t sa_len = -1; 39 | if (getpeername(sock, (struct sockaddr *)&sa, &sa_len) != -1) 40 | return(EXIT_FAILURE); 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/getsockname.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | struct sockaddr_storage sa; 38 | socklen_t sa_len = sizeof(sa); 39 | 40 | if (getsockname(sock, (struct sockaddr *)&sa, &sa_len) < 0) { 41 | fprintf(stderr, "getsockname() failed: %s\n.", strerror(errno)); 42 | return(EXIT_FAILURE); 43 | } 44 | 45 | return(EXIT_SUCCESS); 46 | } 47 | -------------------------------------------------------------------------------- /tests/c_programs/getsockname_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | struct sockaddr_storage sa; 38 | socklen_t sa_len = sizeof(sa); 39 | 40 | if (getsockname(sock, (struct sockaddr *)&sa, &sa_len) < 0) { 41 | fprintf(stderr, "getsockname() failed: %s\n.", strerror(errno)); 42 | return(EXIT_FAILURE); 43 | } 44 | 45 | return(EXIT_SUCCESS); 46 | } 47 | -------------------------------------------------------------------------------- /tests/c_programs/getsockname_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | struct sockaddr_storage sa; 38 | socklen_t sa_len = -1; 39 | if (getsockname(sock, (struct sockaddr *)&sa, &sa_len) != -1) 40 | return(EXIT_FAILURE); 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/getsockopt.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int optval; 28 | socklen_t optlen = sizeof(optval); 29 | if (getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, &optlen) < 0) { 30 | fprintf(stderr, "getsockopt() failed: %s\n.", strerror(errno)); 31 | return(EXIT_FAILURE); 32 | } 33 | 34 | return(EXIT_SUCCESS); 35 | } 36 | -------------------------------------------------------------------------------- /tests/c_programs/getsockopt_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int optval; 28 | socklen_t optlen = sizeof(optval); 29 | if (getsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, &optlen) < 0) { 30 | fprintf(stderr, "getsockopt() failed: %s\n.", strerror(errno)); 31 | return(EXIT_FAILURE); 32 | } 33 | 34 | return(EXIT_SUCCESS); 35 | } 36 | -------------------------------------------------------------------------------- /tests/c_programs/getsockopt_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int optval; 28 | socklen_t optlen = sizeof(optval); 29 | if (getsockopt(sock, -42, SO_REUSEADDR, &optval, &optlen) != -1) 30 | return(EXIT_FAILURE); 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/ioctl.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | int bytes; 41 | if (ioctl(sock, FIONREAD, &bytes) < 0) { 42 | fprintf(stderr, "ioctl() failed: %s\n.", strerror(errno)); 43 | return(EXIT_FAILURE); 44 | } 45 | 46 | return(EXIT_SUCCESS); 47 | } 48 | -------------------------------------------------------------------------------- /tests/c_programs/ioctl_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int bytes; 28 | if (ioctl(sock, FIONREAD, &bytes) < 0) { 29 | fprintf(stderr, "ioctl() failed: %s\n.", strerror(errno)); 30 | return(EXIT_FAILURE); 31 | } 32 | 33 | return(EXIT_SUCCESS); 34 | } 35 | -------------------------------------------------------------------------------- /tests/c_programs/ioctl_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int bytes; 28 | if (ioctl(sock, 42, &bytes) != -1) 29 | return(EXIT_FAILURE); 30 | 31 | return(EXIT_SUCCESS); 32 | } 33 | -------------------------------------------------------------------------------- /tests/c_programs/isfdtype.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (isfdtype(sock, S_IFSOCK) < 0) { 28 | fprintf(stderr, "isfdtype() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/isfdtype_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (isfdtype(sock, S_IFSOCK) < 0) { 28 | fprintf(stderr, "isfdtype() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/isfdtype_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | if (isfdtype(42, S_IFSOCK) != -1) 38 | return(EXIT_FAILURE); 39 | 40 | return(EXIT_SUCCESS); 41 | } 42 | -------------------------------------------------------------------------------- /tests/c_programs/listen.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (listen(sock, 10) < 0) { 28 | fprintf(stderr, "listen() failed: %s\n.", strerror(errno)); 29 | return(EXIT_FAILURE); 30 | } 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/listen_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (listen(42, 10) != -1) 28 | return(EXIT_FAILURE); 29 | 30 | return(EXIT_SUCCESS); 31 | } 32 | -------------------------------------------------------------------------------- /tests/c_programs/poll.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | struct pollfd pollfds[2]; 28 | pollfds[0].fd = sock1; 29 | pollfds[0].events = POLLHUP; 30 | pollfds[1].fd = sock2; 31 | pollfds[1].events = POLLIN; 32 | 33 | if (poll(pollfds, sizeof(pollfds)/sizeof(struct pollfd), 1) < 0) { 34 | fprintf(stderr, "poll() failed: %s\n.", strerror(errno)); 35 | return(EXIT_FAILURE); 36 | } 37 | 38 | return(EXIT_SUCCESS); 39 | } 40 | -------------------------------------------------------------------------------- /tests/c_programs/poll_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | struct pollfd pollfds[2]; 28 | pollfds[0].fd = sock1; 29 | pollfds[0].events = POLLHUP; 30 | pollfds[1].fd = sock2; 31 | pollfds[1].events = POLLIN; 32 | 33 | if (poll(pollfds, sizeof(pollfds)/sizeof(struct pollfd), 1) < 0) { 34 | fprintf(stderr, "poll() failed: %s\n.", strerror(errno)); 35 | return(EXIT_FAILURE); 36 | } 37 | 38 | return(EXIT_SUCCESS); 39 | } 40 | -------------------------------------------------------------------------------- /tests/c_programs/ppoll.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | struct pollfd pollfds[2]; 28 | pollfds[0].fd = sock1; 29 | pollfds[0].events = POLLHUP; 30 | pollfds[1].fd = sock2; 31 | pollfds[1].events = POLLIN; 32 | 33 | struct timespec timeout; 34 | timeout.tv_sec = 1; 35 | timeout.tv_nsec = 1000; 36 | 37 | if (ppoll(pollfds, sizeof(pollfds)/sizeof(struct pollfd), &timeout, NULL) < 0) { 38 | fprintf(stderr, "ppoll() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/ppoll_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | struct pollfd pollfds[2]; 28 | pollfds[0].fd = sock1; 29 | pollfds[0].events = POLLHUP; 30 | pollfds[1].fd = sock2; 31 | pollfds[1].events = POLLIN; 32 | 33 | struct timespec timeout; 34 | timeout.tv_sec = 1; 35 | timeout.tv_nsec = 1000; 36 | 37 | if (ppoll(pollfds, sizeof(pollfds)/sizeof(struct pollfd), &timeout, NULL) < 0) { 38 | fprintf(stderr, "ppoll() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/pselect.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | fd_set fdset; 28 | FD_ZERO(&fdset); 29 | FD_SET(sock1, &fdset); 30 | FD_SET(sock2, &fdset); 31 | 32 | struct timespec timeout; 33 | timeout.tv_sec = 1; 34 | timeout.tv_nsec = 1000; 35 | 36 | if (pselect(sock2+1, &fdset, NULL, NULL, &timeout, NULL) < 0) { 37 | fprintf(stderr, "pselect() failed: %s\n.", strerror(errno)); 38 | return(EXIT_FAILURE); 39 | } 40 | 41 | return(EXIT_SUCCESS); 42 | } 43 | -------------------------------------------------------------------------------- /tests/c_programs/pselect_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | fd_set fdset; 28 | FD_ZERO(&fdset); 29 | FD_SET(sock1, &fdset); 30 | FD_SET(sock2, &fdset); 31 | 32 | struct timespec timeout; 33 | timeout.tv_sec = 1; 34 | timeout.tv_nsec = 1000; 35 | 36 | if (pselect(sock2+1, &fdset, NULL, NULL, &timeout, NULL) < 0) { 37 | fprintf(stderr, "pselect() failed: %s\n.", strerror(errno)); 38 | return(EXIT_FAILURE); 39 | } 40 | 41 | return(EXIT_SUCCESS); 42 | } 43 | -------------------------------------------------------------------------------- /tests/c_programs/pselect_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | fd_set fdset; 28 | FD_ZERO(&fdset); 29 | FD_SET(sock1, &fdset); 30 | FD_SET(sock2, &fdset); 31 | 32 | struct timespec timeout; 33 | timeout.tv_sec = 1; 34 | timeout.tv_nsec = 1000; 35 | 36 | close(sock2); 37 | if (pselect(sock2+1, &fdset, NULL, NULL, &timeout, NULL) != -1) 38 | return(EXIT_FAILURE); 39 | 40 | return(EXIT_SUCCESS); 41 | } 42 | -------------------------------------------------------------------------------- /tests/c_programs/read.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | char buf[42]; 41 | if (read(sock, &buf, sizeof(buf)) < 0) { 42 | fprintf(stderr, "read() failed: %s\n.", strerror(errno)); 43 | return(EXIT_FAILURE); 44 | } 45 | 46 | return(EXIT_SUCCESS); 47 | } 48 | -------------------------------------------------------------------------------- /tests/c_programs/read_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | fcntl(sock, F_SETFL, O_NONBLOCK); 28 | char buf[42]; 29 | if (read(sock, &buf, sizeof(buf)) != -1) 30 | return(EXIT_FAILURE); 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/read_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | fcntl(sock, F_SETFL, O_NONBLOCK); 38 | char buf[42]; 39 | if (read(sock, &buf, -1) != -1) 40 | return(EXIT_FAILURE); 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/readv.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | char iovec_buf0[20]; 41 | char iovec_buf1[30]; 42 | char iovec_buf2[40]; 43 | struct iovec iovec[3]; 44 | 45 | iovec[0].iov_base = iovec_buf0; 46 | iovec[0].iov_len = sizeof(iovec_buf0); 47 | iovec[1].iov_base = iovec_buf1; 48 | iovec[1].iov_len = sizeof(iovec_buf1); 49 | iovec[2].iov_base = iovec_buf2; 50 | iovec[2].iov_len = sizeof(iovec_buf2); 51 | 52 | if (readv(sock, iovec, sizeof(iovec)/sizeof(struct iovec)) < 0) { 53 | fprintf(stderr, "readv() failed: %s\n.", strerror(errno)); 54 | return(EXIT_FAILURE); 55 | } 56 | 57 | return(EXIT_SUCCESS); 58 | } 59 | -------------------------------------------------------------------------------- /tests/c_programs/readv_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | char iovec_buf0[20]; 28 | char iovec_buf1[30]; 29 | char iovec_buf2[40]; 30 | struct iovec iovec[3]; 31 | 32 | iovec[0].iov_base = iovec_buf0; 33 | iovec[0].iov_len = sizeof(iovec_buf0); 34 | iovec[1].iov_base = iovec_buf1; 35 | iovec[1].iov_len = sizeof(iovec_buf1); 36 | iovec[2].iov_base = iovec_buf2; 37 | iovec[2].iov_len = sizeof(iovec_buf2); 38 | 39 | fcntl(sock, F_SETFL, O_NONBLOCK); 40 | if (readv(sock, iovec, sizeof(iovec)/sizeof(struct iovec)) != -1) 41 | return(EXIT_FAILURE); 42 | 43 | return(EXIT_SUCCESS); 44 | } 45 | -------------------------------------------------------------------------------- /tests/c_programs/readv_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | char iovec_buf0[20]; 41 | char iovec_buf1[30]; 42 | char iovec_buf2[40]; 43 | struct iovec iovec[3]; 44 | 45 | iovec[0].iov_base = iovec_buf0; 46 | iovec[0].iov_len = sizeof(iovec_buf0); 47 | iovec[1].iov_base = iovec_buf1; 48 | iovec[1].iov_len = sizeof(iovec_buf1); 49 | iovec[2].iov_base = iovec_buf2; 50 | iovec[2].iov_len = sizeof(iovec_buf2); 51 | 52 | if (readv(sock, iovec, -1) != -1) 53 | return(EXIT_FAILURE); 54 | 55 | return(EXIT_SUCCESS); 56 | } 57 | -------------------------------------------------------------------------------- /tests/c_programs/recv.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | char buf[42]; 41 | if (recv(sock, &buf, sizeof(buf), 0) < 0) { 42 | fprintf(stderr, "recv() failed: %s\n.", strerror(errno)); 43 | return(EXIT_FAILURE); 44 | } 45 | 46 | return(EXIT_SUCCESS); 47 | } 48 | -------------------------------------------------------------------------------- /tests/c_programs/recv_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | fcntl(sock, F_SETFL, O_NONBLOCK); 28 | char buf[42]; 29 | if (recv(sock, &buf, sizeof(buf), 0) != -1) 30 | return(EXIT_FAILURE); 31 | 32 | return(EXIT_SUCCESS); 33 | } 34 | -------------------------------------------------------------------------------- /tests/c_programs/recv_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | fcntl(sock, F_SETFL, O_NONBLOCK); 38 | char buf[42]; 39 | if (recv(sock, &buf, sizeof(buf), 0) != -1) 40 | return(EXIT_FAILURE); 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/recvfrom.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | char buf[42]; 41 | struct sockaddr_storage addrfrom; 42 | socklen_t fromlen = sizeof(addrfrom); 43 | if (recvfrom(sock, &buf, sizeof(buf), 0, (struct sockaddr *)&addrfrom, 44 | &fromlen) < 0) { 45 | fprintf(stderr, "recvfrom() failed: %s\n.", strerror(errno)); 46 | return(EXIT_FAILURE); 47 | } 48 | 49 | return(EXIT_SUCCESS); 50 | } 51 | -------------------------------------------------------------------------------- /tests/c_programs/recvfrom_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | fcntl(sock, F_SETFL, O_NONBLOCK); 38 | char buf[42]; 39 | struct sockaddr_storage addrfrom; 40 | socklen_t fromlen = sizeof(addrfrom); 41 | if (recvfrom(sock, &buf, sizeof(buf), 0, (struct sockaddr *)&addrfrom, 42 | &fromlen) != -1) { 43 | fprintf(stderr, "recvfrom() failed: %s\n.", strerror(errno)); 44 | return(EXIT_FAILURE); 45 | } 46 | 47 | return(EXIT_SUCCESS); 48 | } 49 | -------------------------------------------------------------------------------- /tests/c_programs/recvfrom_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | fcntl(sock, F_SETFL, O_NONBLOCK); 38 | char buf[42]; 39 | struct sockaddr_storage addrfrom; 40 | socklen_t fromlen = sizeof(addrfrom); 41 | if (recvfrom(sock, &buf, sizeof(buf), 0, (struct sockaddr *)&addrfrom, 42 | &fromlen) != -1) { 43 | return(EXIT_FAILURE); 44 | } 45 | 46 | return(EXIT_SUCCESS); 47 | } 48 | -------------------------------------------------------------------------------- /tests/c_programs/recvmmsg.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char iovec1_buf0[20]; 38 | char iovec1_buf1[30]; 39 | char iovec1_buf2[40]; 40 | struct iovec iovec1[3]; 41 | 42 | iovec1[0].iov_base = iovec1_buf0; 43 | iovec1[0].iov_len = sizeof(iovec1_buf0); 44 | iovec1[1].iov_base = iovec1_buf1; 45 | iovec1[1].iov_len = sizeof(iovec1_buf1); 46 | iovec1[2].iov_base = iovec1_buf2; 47 | iovec1[2].iov_len = sizeof(iovec1_buf2); 48 | 49 | struct msghdr msg1; 50 | memset(&msg1, '\0', sizeof(msg1)); 51 | msg1.msg_iov = iovec1; 52 | msg1.msg_iovlen = sizeof(iovec1)/sizeof(struct iovec); 53 | 54 | char iovec2_buf0[20]; 55 | char iovec2_buf1[30]; 56 | char iovec2_buf2[40]; 57 | struct iovec iovec2[3]; 58 | 59 | iovec2[0].iov_base = iovec2_buf0; 60 | iovec2[0].iov_len = sizeof(iovec2_buf0); 61 | iovec2[1].iov_base = iovec2_buf1; 62 | iovec2[1].iov_len = sizeof(iovec2_buf1); 63 | iovec2[2].iov_base = iovec2_buf2; 64 | iovec2[2].iov_len = sizeof(iovec2_buf2); 65 | 66 | struct msghdr msg2; 67 | memset(&msg2, '\0', sizeof(msg2)); 68 | msg2.msg_iov = iovec2; 69 | msg2.msg_iovlen = sizeof(iovec2)/sizeof(struct iovec); 70 | 71 | struct mmsghdr mmsg[2]; 72 | memset(mmsg, 0, sizeof(mmsg)); 73 | mmsg[0].msg_hdr = msg1; 74 | mmsg[1].msg_hdr = msg2; 75 | 76 | char *req = "GET / HTTP/1.0\r\n\r\n"; 77 | send(sock, req, sizeof(char)*strlen(req), 0); 78 | 79 | if (recvmmsg(sock, mmsg, 2, 0, NULL) < 0) { 80 | fprintf(stderr, "recvmmsg() failed: %s\n.", strerror(errno)); 81 | return(EXIT_FAILURE); 82 | } 83 | 84 | return(EXIT_SUCCESS); 85 | } 86 | -------------------------------------------------------------------------------- /tests/c_programs/recvmmsg_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char iovec1_buf0[20]; 38 | char iovec1_buf1[30]; 39 | char iovec1_buf2[40]; 40 | struct iovec iovec1[3]; 41 | 42 | iovec1[0].iov_base = iovec1_buf0; 43 | iovec1[0].iov_len = sizeof(iovec1_buf0); 44 | iovec1[1].iov_base = iovec1_buf1; 45 | iovec1[1].iov_len = sizeof(iovec1_buf1); 46 | iovec1[2].iov_base = iovec1_buf2; 47 | iovec1[2].iov_len = sizeof(iovec1_buf2); 48 | 49 | struct msghdr msg1; 50 | memset(&msg1, '\0', sizeof(msg1)); 51 | msg1.msg_iov = iovec1; 52 | msg1.msg_iovlen = sizeof(iovec1)/sizeof(struct iovec); 53 | 54 | char iovec2_buf0[20]; 55 | char iovec2_buf1[30]; 56 | char iovec2_buf2[40]; 57 | struct iovec iovec2[3]; 58 | 59 | iovec2[0].iov_base = iovec2_buf0; 60 | iovec2[0].iov_len = sizeof(iovec2_buf0); 61 | iovec2[1].iov_base = iovec2_buf1; 62 | iovec2[1].iov_len = sizeof(iovec2_buf1); 63 | iovec2[2].iov_base = iovec2_buf2; 64 | iovec2[2].iov_len = sizeof(iovec2_buf2); 65 | 66 | struct msghdr msg2; 67 | memset(&msg2, '\0', sizeof(msg2)); 68 | msg2.msg_iov = iovec2; 69 | msg2.msg_iovlen = sizeof(iovec2)/sizeof(struct iovec); 70 | 71 | struct mmsghdr mmsg[2]; 72 | memset(mmsg, 0, sizeof(mmsg)); 73 | mmsg[0].msg_hdr = msg1; 74 | mmsg[1].msg_hdr = msg2; 75 | 76 | fcntl(sock, F_SETFL, O_NONBLOCK); 77 | if (recvmmsg(sock, mmsg, 2, 0, NULL) != -1) 78 | return(EXIT_FAILURE); 79 | 80 | return(EXIT_SUCCESS); 81 | } 82 | -------------------------------------------------------------------------------- /tests/c_programs/recvmmsg_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char iovec1_buf0[20]; 38 | char iovec1_buf1[30]; 39 | char iovec1_buf2[40]; 40 | struct iovec iovec1[3]; 41 | 42 | iovec1[0].iov_base = iovec1_buf0; 43 | iovec1[0].iov_len = sizeof(iovec1_buf0); 44 | iovec1[1].iov_base = iovec1_buf1; 45 | iovec1[1].iov_len = sizeof(iovec1_buf1); 46 | iovec1[2].iov_base = iovec1_buf2; 47 | iovec1[2].iov_len = sizeof(iovec1_buf2); 48 | 49 | struct msghdr msg1; 50 | memset(&msg1, '\0', sizeof(msg1)); 51 | msg1.msg_iov = iovec1; 52 | msg1.msg_iovlen = sizeof(iovec1)/sizeof(struct iovec); 53 | 54 | char iovec2_buf0[20]; 55 | char iovec2_buf1[30]; 56 | char iovec2_buf2[40]; 57 | struct iovec iovec2[3]; 58 | 59 | iovec2[0].iov_base = iovec2_buf0; 60 | iovec2[0].iov_len = sizeof(iovec2_buf0); 61 | iovec2[1].iov_base = iovec2_buf1; 62 | iovec2[1].iov_len = sizeof(iovec2_buf1); 63 | iovec2[2].iov_base = iovec2_buf2; 64 | iovec2[2].iov_len = sizeof(iovec2_buf2); 65 | 66 | struct msghdr msg2; 67 | memset(&msg2, '\0', sizeof(msg2)); 68 | msg2.msg_iov = iovec2; 69 | msg2.msg_iovlen = sizeof(iovec2)/sizeof(struct iovec); 70 | 71 | struct mmsghdr mmsg[2]; 72 | memset(mmsg, 0, sizeof(mmsg)); 73 | mmsg[0].msg_hdr = msg1; 74 | mmsg[1].msg_hdr = msg2; 75 | 76 | char *req = "GET / HTTP/1.0\r\n\r\n"; 77 | send(sock, req, sizeof(char)*strlen(req), 0); 78 | 79 | if (recvmmsg(sock, mmsg, 2, -1, NULL) != -1) 80 | return(EXIT_FAILURE); 81 | 82 | return(EXIT_SUCCESS); 83 | } 84 | -------------------------------------------------------------------------------- /tests/c_programs/recvmsg.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | char iovec_buf0[20]; 41 | char iovec_buf1[30]; 42 | char iovec_buf2[40]; 43 | struct iovec iovec[3]; 44 | 45 | iovec[0].iov_base = iovec_buf0; 46 | iovec[0].iov_len = sizeof(iovec_buf0); 47 | iovec[1].iov_base = iovec_buf1; 48 | iovec[1].iov_len = sizeof(iovec_buf1); 49 | iovec[2].iov_base = iovec_buf2; 50 | iovec[2].iov_len = sizeof(iovec_buf2); 51 | 52 | struct msghdr msg; 53 | memset(&msg, '\0', sizeof(msg)); 54 | msg.msg_iov = iovec; 55 | msg.msg_iovlen = sizeof(iovec)/sizeof(struct iovec); 56 | 57 | if (recvmsg(sock, &msg, 0) < 0) { 58 | fprintf(stderr, "recvmsg() failed: %s\n.", strerror(errno)); 59 | return(EXIT_FAILURE); 60 | } 61 | 62 | return(EXIT_SUCCESS); 63 | } 64 | -------------------------------------------------------------------------------- /tests/c_programs/recvmsg_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char iovec_buf0[20]; 38 | char iovec_buf1[30]; 39 | char iovec_buf2[40]; 40 | struct iovec iovec[3]; 41 | 42 | iovec[0].iov_base = iovec_buf0; 43 | iovec[0].iov_len = sizeof(iovec_buf0); 44 | iovec[1].iov_base = iovec_buf1; 45 | iovec[1].iov_len = sizeof(iovec_buf1); 46 | iovec[2].iov_base = iovec_buf2; 47 | iovec[2].iov_len = sizeof(iovec_buf2); 48 | 49 | struct msghdr msg; 50 | memset(&msg, '\0', sizeof(msg)); 51 | msg.msg_iov = iovec; 52 | msg.msg_iovlen = sizeof(iovec)/sizeof(struct iovec); 53 | 54 | fcntl(sock, F_SETFL, O_NONBLOCK); 55 | if (recvmsg(sock, &msg, 0) != -1) 56 | return(EXIT_FAILURE); 57 | 58 | return(EXIT_SUCCESS); 59 | } 60 | -------------------------------------------------------------------------------- /tests/c_programs/recvmsg_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *req = "GET / HTTP/1.0\r\n\r\n"; 38 | send(sock, req, sizeof(char)*strlen(req), 0); 39 | 40 | char iovec_buf0[20]; 41 | char iovec_buf1[30]; 42 | char iovec_buf2[40]; 43 | struct iovec iovec[3]; 44 | 45 | iovec[0].iov_base = iovec_buf0; 46 | iovec[0].iov_len = sizeof(iovec_buf0); 47 | iovec[1].iov_base = iovec_buf1; 48 | iovec[1].iov_len = sizeof(iovec_buf1); 49 | iovec[2].iov_base = iovec_buf2; 50 | iovec[2].iov_len = sizeof(iovec_buf2); 51 | 52 | struct msghdr msg; 53 | memset(&msg, '\0', sizeof(msg)); 54 | msg.msg_iov = iovec; 55 | msg.msg_iovlen = sizeof(iovec)/sizeof(struct iovec); 56 | 57 | if (recvmsg(sock, &msg, -1) != -1) 58 | return(EXIT_FAILURE); 59 | 60 | return(EXIT_SUCCESS); 61 | } 62 | -------------------------------------------------------------------------------- /tests/c_programs/select.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | fd_set fdset; 28 | FD_ZERO(&fdset); 29 | FD_SET(sock1, &fdset); 30 | FD_SET(sock2, &fdset); 31 | 32 | struct timeval timeout; 33 | timeout.tv_sec = 1; 34 | timeout.tv_usec = 1; 35 | 36 | if (select(sock2+1, &fdset, NULL, NULL, &timeout) < 0) { 37 | fprintf(stderr, "select() failed: %s\n.", strerror(errno)); 38 | return(EXIT_FAILURE); 39 | } 40 | 41 | return(EXIT_SUCCESS); 42 | } 43 | -------------------------------------------------------------------------------- /tests/c_programs/select_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | fd_set fdset; 28 | FD_ZERO(&fdset); 29 | FD_SET(sock1, &fdset); 30 | FD_SET(sock2, &fdset); 31 | 32 | struct timeval timeout; 33 | timeout.tv_sec = 1; 34 | timeout.tv_usec = 1; 35 | 36 | if (select(sock2+1, &fdset, NULL, NULL, &timeout) < 0) { 37 | fprintf(stderr, "select() failed: %s\n.", strerror(errno)); 38 | return(EXIT_FAILURE); 39 | } 40 | 41 | return(EXIT_SUCCESS); 42 | } 43 | -------------------------------------------------------------------------------- /tests/c_programs/select_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock1, sock2; 22 | if ((sock1 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 23 | return(EXIT_FAILURE); 24 | if ((sock2 = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) 25 | return(EXIT_FAILURE); 26 | 27 | fd_set fdset; 28 | FD_ZERO(&fdset); 29 | FD_SET(sock1, &fdset); 30 | FD_SET(sock2, &fdset); 31 | 32 | struct timeval timeout; 33 | timeout.tv_sec = 1; 34 | timeout.tv_usec = 1; 35 | 36 | close(sock2); 37 | if (select(sock2+1, &fdset, NULL, NULL, &timeout) != -1) 38 | return(EXIT_FAILURE); 39 | 40 | return(EXIT_SUCCESS); 41 | } 42 | -------------------------------------------------------------------------------- /tests/c_programs/send.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int data = 42; 38 | if (send(sock, &data, sizeof(data), 0) < 0) { 39 | fprintf(stderr, "send() failed: %s\n.", strerror(errno)); 40 | return(EXIT_FAILURE); 41 | } 42 | 43 | return(EXIT_SUCCESS); 44 | } 45 | -------------------------------------------------------------------------------- /tests/c_programs/send_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int data = 42; 38 | if (send(sock, &data, sizeof(data), 0) < 0) { 39 | fprintf(stderr, "send() failed: %s\n.", strerror(errno)); 40 | return(EXIT_FAILURE); 41 | } 42 | 43 | return(EXIT_SUCCESS); 44 | } 45 | -------------------------------------------------------------------------------- /tests/c_programs/send_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int data = 42; 28 | if (send(sock, &data, sizeof(data), -1) != -1) 29 | return(EXIT_FAILURE); 30 | 31 | return(EXIT_SUCCESS); 32 | } 33 | -------------------------------------------------------------------------------- /tests/c_programs/sendfile.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int fd = open("file.txt", O_RDWR|O_CREAT); 38 | if (fd == -1) { 39 | fprintf(stderr, "open() failed: %s\n.", strerror(errno)); 40 | return(EXIT_FAILURE); 41 | } 42 | write(fd, "Blablabla", 9); 43 | if (sendfile(sock, fd, NULL, 10) < 0) { 44 | fprintf(stderr, "sendfile() failed: %s\n.", strerror(errno)); 45 | return(EXIT_FAILURE); 46 | } 47 | if (unlink("file.txt")) { 48 | fprintf(stderr, "unlink() failed: %s\n.", strerror(errno)); 49 | return(EXIT_FAILURE); 50 | } 51 | 52 | return(EXIT_SUCCESS); 53 | } 54 | -------------------------------------------------------------------------------- /tests/c_programs/sendfile_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int fd = open("./c_programs/sendfile_dgram.c", O_RDONLY); 38 | if (sendfile(sock, fd, NULL, 10) < 0) { 39 | fprintf(stderr, "sendfile() failed: %s\n.", strerror(errno)); 40 | return(EXIT_FAILURE); 41 | } 42 | 43 | return(EXIT_SUCCESS); 44 | } 45 | -------------------------------------------------------------------------------- /tests/c_programs/sendfile_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | if (sendfile(sock, 42, NULL, 10) != -1) 28 | return(EXIT_FAILURE); 29 | 30 | return(EXIT_SUCCESS); 31 | } 32 | -------------------------------------------------------------------------------- /tests/c_programs/sendmmsg.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec1_buf0 = "short string\n"; 38 | char *iovec1_buf1 = "This is a longer string\n"; 39 | char *iovec1_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec1[3]; 42 | iovec1[0].iov_base = iovec1_buf0; 43 | iovec1[0].iov_len = strlen(iovec1_buf0); 44 | iovec1[1].iov_base = iovec1_buf1; 45 | iovec1[1].iov_len = strlen(iovec1_buf1); 46 | iovec1[2].iov_base = iovec1_buf2; 47 | iovec1[2].iov_len = strlen(iovec1_buf2); 48 | 49 | struct msghdr msg1; 50 | memset(&msg1, '\0', sizeof(msg1)); 51 | msg1.msg_iov = iovec1; 52 | msg1.msg_iovlen = sizeof(iovec1)/sizeof(struct iovec); 53 | 54 | char *iovec2_buf0 = "short string\n"; 55 | char *iovec2_buf1 = "This is a longer string\n"; 56 | char *iovec2_buf2 = "This is the longest string in this example\n"; 57 | 58 | struct iovec iovec2[3]; 59 | iovec2[0].iov_base = iovec2_buf0; 60 | iovec2[0].iov_len = strlen(iovec2_buf0); 61 | iovec2[1].iov_base = iovec2_buf1; 62 | iovec2[1].iov_len = strlen(iovec2_buf1); 63 | iovec2[2].iov_base = iovec2_buf2; 64 | iovec2[2].iov_len = strlen(iovec2_buf2); 65 | 66 | struct msghdr msg2; 67 | memset(&msg2, '\0', sizeof(msg2)); 68 | msg2.msg_iov = iovec2; 69 | msg2.msg_iovlen = sizeof(iovec2)/sizeof(struct iovec); 70 | 71 | struct mmsghdr mmsg[2]; 72 | memset(mmsg, 0, sizeof(mmsg)); 73 | mmsg[0].msg_hdr = msg1; 74 | mmsg[1].msg_hdr = msg2; 75 | 76 | if (sendmmsg(sock, mmsg, 2, 0) < 0) 77 | return(EXIT_FAILURE); 78 | 79 | return(EXIT_SUCCESS); 80 | } 81 | -------------------------------------------------------------------------------- /tests/c_programs/sendmmsg_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec1_buf0 = "short string\n"; 38 | char *iovec1_buf1 = "This is a longer string\n"; 39 | char *iovec1_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec1[3]; 42 | iovec1[0].iov_base = iovec1_buf0; 43 | iovec1[0].iov_len = strlen(iovec1_buf0); 44 | iovec1[1].iov_base = iovec1_buf1; 45 | iovec1[1].iov_len = strlen(iovec1_buf1); 46 | iovec1[2].iov_base = iovec1_buf2; 47 | iovec1[2].iov_len = strlen(iovec1_buf2); 48 | 49 | struct msghdr msg1; 50 | memset(&msg1, '\0', sizeof(msg1)); 51 | msg1.msg_iov = iovec1; 52 | msg1.msg_iovlen = sizeof(iovec1)/sizeof(struct iovec); 53 | 54 | char *iovec2_buf0 = "short string\n"; 55 | char *iovec2_buf1 = "This is a longer string\n"; 56 | char *iovec2_buf2 = "This is the longest string in this example\n"; 57 | 58 | struct iovec iovec2[3]; 59 | iovec2[0].iov_base = iovec2_buf0; 60 | iovec2[0].iov_len = strlen(iovec2_buf0); 61 | iovec2[1].iov_base = iovec2_buf1; 62 | iovec2[1].iov_len = strlen(iovec2_buf1); 63 | iovec2[2].iov_base = iovec2_buf2; 64 | iovec2[2].iov_len = strlen(iovec2_buf2); 65 | 66 | struct msghdr msg2; 67 | memset(&msg2, '\0', sizeof(msg2)); 68 | msg2.msg_iov = iovec2; 69 | msg2.msg_iovlen = sizeof(iovec2)/sizeof(struct iovec); 70 | 71 | struct mmsghdr mmsg[2]; 72 | memset(mmsg, 0, sizeof(mmsg)); 73 | mmsg[0].msg_hdr = msg1; 74 | mmsg[1].msg_hdr = msg2; 75 | 76 | if (sendmmsg(sock, mmsg, 2, 0) < 0) { 77 | fprintf(stderr, "sendmmsg() failed: %s\n.", strerror(errno)); 78 | return(EXIT_FAILURE); 79 | } 80 | 81 | return(EXIT_SUCCESS); 82 | } 83 | -------------------------------------------------------------------------------- /tests/c_programs/sendmmsg_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec1_buf0 = "short string\n"; 38 | char *iovec1_buf1 = "This is a longer string\n"; 39 | char *iovec1_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec1[3]; 42 | iovec1[0].iov_base = iovec1_buf0; 43 | iovec1[0].iov_len = strlen(iovec1_buf0); 44 | iovec1[1].iov_base = iovec1_buf1; 45 | iovec1[1].iov_len = strlen(iovec1_buf1); 46 | iovec1[2].iov_base = iovec1_buf2; 47 | iovec1[2].iov_len = strlen(iovec1_buf2); 48 | 49 | struct msghdr msg1; 50 | memset(&msg1, '\0', sizeof(msg1)); 51 | msg1.msg_iov = iovec1; 52 | msg1.msg_iovlen = sizeof(iovec1)/sizeof(struct iovec); 53 | 54 | char *iovec2_buf0 = "short string\n"; 55 | char *iovec2_buf1 = "This is a longer string\n"; 56 | char *iovec2_buf2 = "This is the longest string in this example\n"; 57 | 58 | struct iovec iovec2[3]; 59 | iovec2[0].iov_base = iovec2_buf0; 60 | iovec2[0].iov_len = strlen(iovec2_buf0); 61 | iovec2[1].iov_base = iovec2_buf1; 62 | iovec2[1].iov_len = strlen(iovec2_buf1); 63 | iovec2[2].iov_base = iovec2_buf2; 64 | iovec2[2].iov_len = strlen(iovec2_buf2); 65 | 66 | struct msghdr msg2; 67 | memset(&msg2, '\0', sizeof(msg2)); 68 | msg2.msg_iov = iovec2; 69 | msg2.msg_iovlen = sizeof(iovec2)/sizeof(struct iovec); 70 | 71 | struct mmsghdr mmsg[2]; 72 | memset(mmsg, 0, sizeof(mmsg)); 73 | mmsg[0].msg_hdr = msg1; 74 | mmsg[1].msg_hdr = msg2; 75 | 76 | if (sendmmsg(sock, mmsg, 2, -1) != -1) 77 | return(EXIT_FAILURE); 78 | 79 | return(EXIT_SUCCESS); 80 | } 81 | -------------------------------------------------------------------------------- /tests/c_programs/sendmsg.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec_buf0 = "short string\n"; 38 | char *iovec_buf1 = "This is a longer string\n"; 39 | char *iovec_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec[3]; 42 | iovec[0].iov_base = iovec_buf0; 43 | iovec[0].iov_len = strlen(iovec_buf0); 44 | iovec[1].iov_base = iovec_buf1; 45 | iovec[1].iov_len = strlen(iovec_buf1); 46 | iovec[2].iov_base = iovec_buf2; 47 | iovec[2].iov_len = strlen(iovec_buf2); 48 | 49 | struct msghdr msg; 50 | memset(&msg, '\0', sizeof(msg)); 51 | msg.msg_iov = iovec; 52 | msg.msg_iovlen = sizeof(iovec)/sizeof(struct iovec); 53 | 54 | if (sendmsg(sock, &msg, 0) < 0) { 55 | fprintf(stderr, "sendmsg() failed: %s\n.", strerror(errno)); 56 | return(EXIT_FAILURE); 57 | } 58 | 59 | return(EXIT_SUCCESS); 60 | } 61 | -------------------------------------------------------------------------------- /tests/c_programs/sendmsg_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec_buf0 = "short string\n"; 38 | char *iovec_buf1 = "This is a longer string\n"; 39 | char *iovec_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec[3]; 42 | iovec[0].iov_base = iovec_buf0; 43 | iovec[0].iov_len = strlen(iovec_buf0); 44 | iovec[1].iov_base = iovec_buf1; 45 | iovec[1].iov_len = strlen(iovec_buf1); 46 | iovec[2].iov_base = iovec_buf2; 47 | iovec[2].iov_len = strlen(iovec_buf2); 48 | 49 | struct msghdr msg; 50 | memset(&msg, '\0', sizeof(msg)); 51 | msg.msg_iov = iovec; 52 | msg.msg_iovlen = sizeof(iovec)/sizeof(struct iovec); 53 | 54 | if (sendmsg(sock, &msg, 0) < 0) { 55 | fprintf(stderr, "sendmsg() failed: %s\n.", strerror(errno)); 56 | return(EXIT_FAILURE); 57 | } 58 | 59 | return(EXIT_SUCCESS); 60 | } 61 | -------------------------------------------------------------------------------- /tests/c_programs/sendmsg_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec_buf0 = "short string\n"; 38 | char *iovec_buf1 = "This is a longer string\n"; 39 | char *iovec_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec[3]; 42 | iovec[0].iov_base = iovec_buf0; 43 | iovec[0].iov_len = strlen(iovec_buf0); 44 | iovec[1].iov_base = iovec_buf1; 45 | iovec[1].iov_len = strlen(iovec_buf1); 46 | iovec[2].iov_base = iovec_buf2; 47 | iovec[2].iov_len = strlen(iovec_buf2); 48 | 49 | struct msghdr msg; 50 | memset(&msg, '\0', sizeof(msg)); 51 | msg.msg_iov = iovec; 52 | msg.msg_iovlen = sizeof(iovec)/sizeof(struct iovec); 53 | 54 | if (sendmsg(sock, &msg, -1) != -1) 55 | return(EXIT_FAILURE); 56 | 57 | return(EXIT_SUCCESS); 58 | } 59 | -------------------------------------------------------------------------------- /tests/c_programs/sendto.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int data = 42; 38 | if (sendto(sock, &data, sizeof(data), 0, (struct sockaddr *)&addr, 39 | sizeof(addr)) < 0) { 40 | fprintf(stderr, "sendto() failed: %s\n.", strerror(errno)); 41 | return(EXIT_FAILURE); 42 | } 43 | 44 | return(EXIT_SUCCESS); 45 | } 46 | -------------------------------------------------------------------------------- /tests/c_programs/sendto_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | int data = 42; 33 | if (sendto(sock, &data, sizeof(data), 0, (struct sockaddr *)&addr, 34 | sizeof(addr)) < 0) { 35 | fprintf(stderr, "sendto() failed: %s\n.", strerror(errno)); 36 | return(EXIT_FAILURE); 37 | } 38 | 39 | return(EXIT_SUCCESS); 40 | } 41 | -------------------------------------------------------------------------------- /tests/c_programs/sendto_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int data = 42; 38 | if (sendto(sock, &data, sizeof(data), -1, (struct sockaddr *)&addr, 39 | sizeof(addr)) != -1) { 40 | return(EXIT_FAILURE); 41 | } 42 | 43 | return(EXIT_SUCCESS); 44 | } 45 | -------------------------------------------------------------------------------- /tests/c_programs/setsockopt.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int optval = 1; 28 | if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { 29 | fprintf(stderr, "setsockopt() failed: %s\n.", strerror(errno)); 30 | return(EXIT_FAILURE); 31 | } 32 | 33 | return(EXIT_SUCCESS); 34 | } 35 | -------------------------------------------------------------------------------- /tests/c_programs/setsockopt_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int optval = 1; 28 | if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)) < 0) { 29 | fprintf(stderr, "setsockopt() failed: %s\n.", strerror(errno)); 30 | return(EXIT_FAILURE); 31 | } 32 | 33 | return(EXIT_SUCCESS); 34 | } 35 | -------------------------------------------------------------------------------- /tests/c_programs/setsockopt_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | int optval = 1; 28 | if (setsockopt(sock, -42, SO_REUSEADDR, &optval, sizeof(optval)) != -1) 29 | return(EXIT_FAILURE); 30 | 31 | return(EXIT_SUCCESS); 32 | } 33 | -------------------------------------------------------------------------------- /tests/c_programs/shutdown.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | if (shutdown(sock, SHUT_WR) < 0) { 38 | fprintf(stderr, "shutdown() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/shutdown_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | if (shutdown(sock, SHUT_WR) < 0) { 38 | fprintf(stderr, "shutdown() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/shutdown_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | if (shutdown(sock, -1) != -1) 38 | return(EXIT_FAILURE); 39 | 40 | return(EXIT_SUCCESS); 41 | } 42 | -------------------------------------------------------------------------------- /tests/c_programs/sockatmark.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | if (sockatmark(sock) < 0) { 38 | fprintf(stderr, "sockatmark() failed: %s\n.", strerror(errno)); 39 | return(EXIT_FAILURE); 40 | } 41 | 42 | return(EXIT_SUCCESS); 43 | } 44 | -------------------------------------------------------------------------------- /tests/c_programs/socket.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | return(EXIT_SUCCESS); 28 | } 29 | -------------------------------------------------------------------------------- /tests/c_programs/socket_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | return(EXIT_SUCCESS); 28 | } 29 | -------------------------------------------------------------------------------- /tests/c_programs/socket_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_UDP)) != -1) 23 | return(EXIT_FAILURE); 24 | 25 | return(EXIT_SUCCESS); 26 | } 27 | -------------------------------------------------------------------------------- /tests/c_programs/write.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int data = 42; 38 | if (write(sock, &data, sizeof(data)) < 0) { 39 | fprintf(stderr, "write() failed: %s\n.", strerror(errno)); 40 | return(EXIT_FAILURE); 41 | } 42 | 43 | return(EXIT_SUCCESS); 44 | } 45 | -------------------------------------------------------------------------------- /tests/c_programs/write_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int data = 42; 38 | if (write(sock, &data, sizeof(data)) < 0) { 39 | fprintf(stderr, "write() failed: %s\n.", strerror(errno)); 40 | return(EXIT_FAILURE); 41 | } 42 | 43 | return(EXIT_SUCCESS); 44 | } 45 | -------------------------------------------------------------------------------- /tests/c_programs/write_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | int data = 42; 38 | if (write(sock, &data, -1) != -1) 39 | return(EXIT_FAILURE); 40 | 41 | return(EXIT_SUCCESS); 42 | } 43 | -------------------------------------------------------------------------------- /tests/c_programs/writev.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec_buf0 = "short string\n"; 38 | char *iovec_buf1 = "This is a longer string\n"; 39 | char *iovec_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec[3]; 42 | iovec[0].iov_base = iovec_buf0; 43 | iovec[0].iov_len = strlen(iovec_buf0); 44 | iovec[1].iov_base = iovec_buf1; 45 | iovec[1].iov_len = strlen(iovec_buf1); 46 | iovec[2].iov_base = iovec_buf2; 47 | iovec[2].iov_len = strlen(iovec_buf2); 48 | 49 | if (writev(sock, iovec, sizeof(iovec)/sizeof(struct iovec)) < 0) { 50 | fprintf(stderr, "writev() failed: %s\n.", strerror(errno)); 51 | return(EXIT_FAILURE); 52 | } 53 | 54 | return(EXIT_SUCCESS); 55 | } 56 | -------------------------------------------------------------------------------- /tests/c_programs/writev_dgram.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec_buf0 = "short string\n"; 38 | char *iovec_buf1 = "This is a longer string\n"; 39 | char *iovec_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec[3]; 42 | iovec[0].iov_base = iovec_buf0; 43 | iovec[0].iov_len = strlen(iovec_buf0); 44 | iovec[1].iov_base = iovec_buf1; 45 | iovec[1].iov_len = strlen(iovec_buf1); 46 | iovec[2].iov_base = iovec_buf2; 47 | iovec[2].iov_len = strlen(iovec_buf2); 48 | 49 | if (writev(sock, iovec, sizeof(iovec)/sizeof(struct iovec)) < 0) { 50 | fprintf(stderr, "writev() failed: %s\n.", strerror(errno)); 51 | return(EXIT_FAILURE); 52 | } 53 | 54 | return(EXIT_SUCCESS); 55 | } 56 | -------------------------------------------------------------------------------- /tests/c_programs/writev_fail.c: -------------------------------------------------------------------------------- 1 | #define _GNU_SOURCE 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | int main(void) { 21 | int sock; 22 | if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { 23 | fprintf(stderr, "socket() failed: %s\n.", strerror(errno)); 24 | return(EXIT_FAILURE); 25 | } 26 | 27 | struct sockaddr_in addr; 28 | addr.sin_family = AF_INET; 29 | addr.sin_port = htons(8000); 30 | inet_aton("127.0.0.1", &addr.sin_addr); 31 | 32 | if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 33 | fprintf(stderr, "connect() failed: %s\n.", strerror(errno)); 34 | return(EXIT_FAILURE); 35 | } 36 | 37 | char *iovec_buf0 = "short string\n"; 38 | char *iovec_buf1 = "This is a longer string\n"; 39 | char *iovec_buf2 = "This is the longest string in this example\n"; 40 | 41 | struct iovec iovec[3]; 42 | iovec[0].iov_base = iovec_buf0; 43 | iovec[0].iov_len = strlen(iovec_buf0); 44 | iovec[1].iov_base = iovec_buf1; 45 | iovec[1].iov_len = strlen(iovec_buf1); 46 | iovec[2].iov_base = iovec_buf2; 47 | iovec[2].iov_len = strlen(iovec_buf2); 48 | 49 | if (writev(sock, iovec, -1) != -1) 50 | return(EXIT_FAILURE); 51 | 52 | return(EXIT_SUCCESS); 53 | } 54 | -------------------------------------------------------------------------------- /tests/lib/constants.rb: -------------------------------------------------------------------------------- 1 | EXECUTABLE="../bin/tcpsnitch" 2 | LD_PRELOAD="LD_PRELOAD=../libtcpsnitch.so.1.0" 3 | TEST_DIR="/tmp/netspy" 4 | 5 | # LOGS 6 | PROCESS_DIR_REGEX="*.out*" 7 | LOG_FILE="logs.txt" 8 | LOG_LABEL_ERROR="ERROR" 9 | LOG_LABEL_WARN="WARN" 10 | LOG_LABEL_INFO="INFO" 11 | 12 | # EVENTS 13 | # sys/socket.h 14 | SOCK_EV_SOCKET="socket" 15 | SOCK_EV_BIND="bind" 16 | SOCK_EV_CONNECT="connect" 17 | SOCK_EV_SHUTDOWN="shutdown" 18 | SOCK_EV_LISTEN="listen" 19 | SOCK_EV_ACCEPT="accept" 20 | SOCK_EV_ACCEPT4="accept4" 21 | SOCK_EV_GETSOCKOPT="getsockopt" 22 | SOCK_EV_SETSOCKOPT="setsockopt" 23 | SOCK_EV_SEND="send" 24 | SOCK_EV_RECV="recv" 25 | SOCK_EV_SENDTO="sendto" 26 | SOCK_EV_RECVFROM="recvfrom" 27 | SOCK_EV_SENDMSG="sendmsg" 28 | SOCK_EV_RECVMSG="recvmsg" 29 | SOCK_EV_SENDMMSG="sendmmsg" 30 | SOCK_EV_RECVMMSG="recvmmsg" 31 | SOCK_EV_GETSOCKNAME="getsockname" 32 | SOCK_EV_GETPEERNAME="getpeername" 33 | SOCK_EV_SOCKATMARK="sockatmark" 34 | SOCK_EV_ISFDTYPE="isfdtype" 35 | 36 | # unistd.h 37 | SOCK_EV_WRITE="write" 38 | SOCK_EV_READ="read" 39 | SOCK_EV_CLOSE="close" 40 | SOCK_EV_DUP="dup" 41 | SOCK_EV_DUP2="dup2" 42 | SOCK_EV_DUP3="dup3" 43 | 44 | # sys/uio.h 45 | SOCK_EV_WRITEV="writev" 46 | SOCK_EV_READV="readv" 47 | SOCK_EV_IOCTL="ioctl" 48 | 49 | # sys/sendfile.h 50 | SOCK_EV_SENDFILE="sendfile" 51 | 52 | # poll.h 53 | SOCK_EV_POLL="poll" 54 | SOCK_EV_PPOLL="ppoll" 55 | 56 | # sys/select.h 57 | SOCK_EV_SELECT="select" 58 | SOCK_EV_PSELECT="pselect" 59 | 60 | # fcntl.h 61 | SOCK_EV_FCNTL="fcntl" 62 | 63 | # epoll.h 64 | SOCK_EV_EPOLL_CTL="epoll_ctl" 65 | SOCK_EV_EPOLL_WAIT="epoll_wait" 66 | SOCK_EV_EPOLL_PWAIT="epoll_pwait" 67 | 68 | # stdio.h 69 | SOCK_EV_FDOPEN="fdopen" 70 | 71 | SOCK_EV_TCP_INFO="tcp_info" 72 | 73 | SOCKET_SYSCALLS = [ 74 | SOCK_EV_SOCKET, 75 | SOCK_EV_BIND, 76 | SOCK_EV_CONNECT, 77 | SOCK_EV_SHUTDOWN, 78 | SOCK_EV_LISTEN, 79 | # SOCK_EV_ACCEPT, 80 | # SOCK_EV_ACCEPT4, 81 | SOCK_EV_GETSOCKOPT, 82 | SOCK_EV_SETSOCKOPT, 83 | SOCK_EV_SEND, 84 | SOCK_EV_RECV, 85 | SOCK_EV_SENDTO, 86 | SOCK_EV_RECVFROM, 87 | SOCK_EV_SENDMSG, 88 | SOCK_EV_RECVMSG, 89 | SOCK_EV_SENDMMSG, 90 | SOCK_EV_RECVMMSG, 91 | SOCK_EV_GETSOCKNAME, 92 | SOCK_EV_GETPEERNAME, 93 | SOCK_EV_SOCKATMARK, 94 | SOCK_EV_ISFDTYPE, 95 | SOCK_EV_WRITE, 96 | SOCK_EV_READ, 97 | SOCK_EV_CLOSE, 98 | SOCK_EV_DUP, 99 | SOCK_EV_DUP2, 100 | SOCK_EV_DUP3, 101 | SOCK_EV_WRITEV, 102 | SOCK_EV_READV, 103 | SOCK_EV_IOCTL, 104 | SOCK_EV_SENDFILE, 105 | SOCK_EV_POLL, 106 | SOCK_EV_PPOLL, 107 | SOCK_EV_SELECT, 108 | SOCK_EV_PSELECT, 109 | SOCK_EV_FCNTL, 110 | SOCK_EV_EPOLL_CTL, 111 | SOCK_EV_EPOLL_WAIT, 112 | SOCK_EV_EPOLL_PWAIT, 113 | SOCK_EV_ISFDTYPE 114 | ] 115 | 116 | 117 | -------------------------------------------------------------------------------- /tests/lib/cprog.rb: -------------------------------------------------------------------------------- 1 | class CProg 2 | @@programs_path = "./c_programs/" 3 | @@count = 0 4 | 5 | def initialize(instructions, name) 6 | @instructions = instructions 7 | @name = name 8 | write_to_file 9 | @@count += 1 10 | end 11 | 12 | def program 13 | <<-EOT 14 | #define _GNU_SOURCE 15 | #include 16 | #include 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | 33 | int main(void) { 34 | #{@instructions} 35 | return(EXIT_SUCCESS); 36 | } 37 | EOT 38 | end 39 | 40 | def path 41 | @@programs_path + @name + ".c" 42 | end 43 | 44 | def write_to_file 45 | f = File.open(path, "w") 46 | f.puts program 47 | f.close 48 | end 49 | 50 | def to_s 51 | @instructions 52 | end 53 | 54 | def assert_success 55 | if !system(exec_path) then puts "#{exec_path} failed!" end 56 | end 57 | end 58 | 59 | -------------------------------------------------------------------------------- /tests/lib/lib.rb: -------------------------------------------------------------------------------- 1 | require 'json_expressions/minitest' 2 | require 'tempfile' 3 | require './lib/constants.rb' 4 | require './lib/webserver.rb' 5 | 6 | # Create Boolean module as suggested by Jansson library. 7 | # http://stackoverflow.com/questions/3028243/check-if-ruby-object-is-a-boolean 8 | module Boolean; end 9 | class TrueClass; include Boolean; end 10 | class FalseClass; include Boolean; end 11 | 12 | ########################### 13 | # Directory manipulations # 14 | ########################### 15 | 16 | def mkdir(path) 17 | system("test -d #{path} || mkdir #{path}") 18 | end 19 | 20 | def rmdir(path) 21 | system("rm -rf #{path}") 22 | end 23 | 24 | def file_exists?(path) 25 | system("test -f #{path}") 26 | end 27 | 28 | def contains?(dir, el) 29 | system("ls #{dir}/#{el} >/dev/null 2>&1") 30 | end 31 | 32 | def dir_empty?(path) 33 | !system("ls #{path}/* >/dev/null 2>&1") 34 | end 35 | 36 | def reset_dir(path) 37 | rmdir(path) 38 | mkdir(path) 39 | end 40 | 41 | ########################### 42 | # Log files manipulations # 43 | ########################### 44 | 45 | def process_dirs 46 | Dir[TEST_DIR+"/"+PROCESS_DIR_REGEX].sort 47 | end 48 | 49 | # Assumes the TEST_DIR was cleared before running the prog. 50 | def dir_str 51 | process_dirs.last 52 | end 53 | 54 | def log_file_str 55 | dir_str+"/"+LOG_FILE 56 | end 57 | 58 | def json_file_str(con_id=0) 59 | dir_str+"/#{con_id}.json" 60 | end 61 | 62 | def pcap_file_str(con_id=0) 63 | dir_str+"/#{con_id}.pcap" 64 | end 65 | 66 | def read_json_trace(con_id=0) 67 | File.read(json_file_str(con_id)) 68 | end 69 | 70 | def wrap_as_array(json_trace) 71 | json_trace.split("\n").join(',').insert(0,"[").insert(-1,"]") 72 | end 73 | 74 | # This builds a valid JSON array from the JSON object in the file 75 | def read_json_as_array(con_id=0) 76 | wrap_as_array(read_json_trace(con_id)) 77 | end 78 | 79 | ################## 80 | # Others helpers # 81 | ################## 82 | 83 | def run_exec(exec, env='') 84 | system("#{env} #{LD_PRELOAD} #{exec} >/dev/null 2>&1") 85 | end 86 | 87 | def tcpsnitch(options='', cmd='') 88 | system("#{EXECUTABLE} -n #{options} #{cmd} >/dev/null 2>&1") 89 | end 90 | 91 | def tcpsnitch_output(options='', cmd='') 92 | `#{EXECUTABLE} -n #{options} #{cmd} 2>&1` 93 | end 94 | 95 | def run_c_program(name, opts='') 96 | reset_dir(TEST_DIR) 97 | tcpsnitch("-d #{TEST_DIR} #{opts}", "./c_programs/#{name}.out") 98 | end 99 | 100 | def run_curl 101 | run_exec("curl -s google.com", "NETSPY_DEV=enp0s3") 102 | # system("#{LD_PRELOAD} NETSPY_DEV=enp0s3 curl -s google.com > /dev/null 2>&1") 103 | end 104 | 105 | def errors_in_log?(log_file=log_file_str) 106 | system("grep \"#{LOG_LABEL_ERROR}\" #{log_file}") 107 | end 108 | 109 | ####################### 110 | # Packetdrill helpers # 111 | ####################### 112 | 113 | PKT_CONNECTED_SOCKET = <<-EOT 114 | 0 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 115 | 0.0...0.1 connect(3, ..., ...) = 0 116 | * > S 0:0(0) <...> 117 | +0 < S. 0:0(0) ack 1 win 1000 118 | * > . 1:1(0) ack 1 119 | EOT 120 | -------------------------------------------------------------------------------- /tests/lib/webserver.rb: -------------------------------------------------------------------------------- 1 | class WebServer 2 | PORT = 8000 3 | @@started = false 4 | 5 | def self.start 6 | unless @@started 7 | cmd = "ruby -run -e httpd . -p #{PORT} >/dev/null 2>&1 & echo $!" 8 | @@pid = `#{cmd}`.chomp("\n") 9 | @@started = true 10 | sleep 0.01 11 | end 12 | end 13 | 14 | def self.stop 15 | system("kill #{@@pid}") 16 | @@started = false 17 | end 18 | end 19 | 20 | -------------------------------------------------------------------------------- /tests/test_compatibility.rb: -------------------------------------------------------------------------------- 1 | # Purpose: test compatibility with some applications 2 | require 'minitest/autorun' 3 | require 'minitest/spec' 4 | require 'minitest/reporters' 5 | require './lib/lib.rb' 6 | 7 | Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new 8 | 9 | def stderr(cmd, log_lvl) 10 | `#{EXECUTABLE} -l #{log_lvl} #{cmd} 2>&1 >/dev/null` 11 | end 12 | 13 | describe "compatibility tests" do 14 | before do WebServer.start end 15 | MiniTest::Unit.after_tests { WebServer.stop } 16 | 17 | describe "curl" do 18 | curl = "curl localhost:8000" 19 | 20 | it "should not crash" do 21 | assert tcpsnitch(curl) 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /tests/test_libc_overrides.rb: -------------------------------------------------------------------------------- 1 | # Purpose: test that all libc overrides do not crash the main process, do not 2 | # generate any error log and are present in the JSON trace. 3 | require 'minitest/autorun' 4 | require 'minitest/spec' 5 | require 'minitest/reporters' 6 | require './lib/lib.rb' 7 | 8 | Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new 9 | 10 | def no_error_log(log_file=log_file_str) 11 | !errors_in_log?(log_file) 12 | end 13 | 14 | def assert_event_present(type, success=true,json= read_json_as_array) 15 | pattern = [ 16 | { 17 | type: type, 18 | success: success 19 | }.ignore_extra_keys! 20 | ].ignore_extra_values! 21 | assert_json_match(pattern, json) 22 | end 23 | 24 | describe "libc overrides" do 25 | before do WebServer.start end 26 | MiniTest::Unit.after_tests { WebServer.stop } 27 | 28 | SOCKET_SYSCALLS.each do |syscall| 29 | describe "when calling #{syscall}()" do 30 | stream = "#{syscall}" 31 | dgram = "#{syscall}_dgram" 32 | failing = "#{syscall}_fail" 33 | 34 | it "#{stream} should not crash" do 35 | assert run_c_program(stream) 36 | end 37 | 38 | it "#{stream} should log no ERROR" do 39 | run_c_program(stream) 40 | assert no_error_log 41 | end 42 | 43 | it "should be in JSON with #{stream}" do 44 | run_c_program(stream) 45 | assert_event_present(syscall) 46 | end 47 | 48 | # LISTEN: Cannot listen() on DGRAM socket 49 | unless [SOCK_EV_LISTEN, SOCK_EV_SOCKATMARK].include?(syscall) 50 | it "#{dgram} should not crash" do 51 | assert run_c_program(dgram) 52 | end 53 | 54 | it "should be in JSON with #{dgram}" do 55 | run_c_program(stream) 56 | assert_event_present(syscall) 57 | end 58 | end 59 | 60 | unless [SOCK_EV_POLL, SOCK_EV_PPOLL, SOCK_EV_SOCKATMARK].include?(syscall) 61 | it "#{failing} should not crash" do 62 | assert run_c_program(failing) 63 | end 64 | end 65 | 66 | # SOCKET: No log file if no TCP connection. 67 | # CLOSE: No log file if no TCP connection. How to fail close() with con? 68 | unless [SOCK_EV_SOCKET, SOCK_EV_CLOSE, SOCK_EV_POLL, 69 | SOCK_EV_PPOLL, SOCK_EV_SOCKATMARK].include?(syscall) 70 | it "#{failing} should log no ERROR" do 71 | run_c_program(failing) 72 | assert no_error_log 73 | end 74 | end 75 | 76 | # SOCKET: No JSON if no TCP connection. 77 | # LISTEN: How to fail listen() on valid TCP socket? 78 | # CLOSE: How to fail close() on valid TCP socket? 79 | unless [SOCK_EV_SOCKET, SOCK_EV_LISTEN, SOCK_EV_CLOSE, SOCK_EV_DUP, 80 | SOCK_EV_POLL, SOCK_EV_PPOLL, SOCK_EV_FCNTL, SOCK_EV_EPOLL_WAIT, 81 | SOCK_EV_EPOLL_PWAIT, SOCK_EV_SOCKATMARK, 82 | SOCK_EV_ISFDTYPE].include?(syscall) 83 | it "should be in JSON with #{failing}" do 84 | run_c_program(failing) 85 | assert_event_present(syscall, false) 86 | end 87 | end 88 | end 89 | end 90 | 91 | describe "when calling fork()" do 92 | prog = "fork" 93 | 94 | it "#{prog} should not crash" do 95 | assert run_c_program(prog) 96 | end 97 | 98 | it "#{prog} should create a log dir for both processes" do 99 | run_c_program(prog) 100 | assert_equal(process_dirs.size, 2) 101 | end 102 | 103 | it "#{prog} should create a con 0 for both processes" do 104 | run_c_program(prog) 105 | dir0 = process_dirs[0] 106 | dir1 = process_dirs[1] 107 | assert file_exists?(dir0+"/0.json") 108 | assert file_exists?(dir1+"/0.json") 109 | end 110 | 111 | it "#{prog} should log no ERROR for both processes" do 112 | run_c_program(prog) 113 | dir0 = process_dirs[0] 114 | dir1 = process_dirs[1] 115 | assert no_error_log(dir0+"/"+LOG_FILE) 116 | assert no_error_log(dir1+"/"+LOG_FILE) 117 | end 118 | 119 | it "socket() should be in JSON for both processes" do 120 | run_c_program(prog) 121 | trace1 = File.read(process_dirs[0]+"/0.json") 122 | trace2 = File.read(process_dirs[1]+"/0.json") 123 | trace3 = File.read(process_dirs[1]+"/1.json") 124 | assert_event_present("socket", true, wrap_as_array(trace1)) 125 | assert_event_present("forked_socket", true, wrap_as_array(trace2)) 126 | assert_event_present("socket", true, wrap_as_array(trace3)) 127 | end 128 | end 129 | 130 | [SOCK_EV_DUP, SOCK_EV_DUP2, SOCK_EV_DUP3].each do |syscall| 131 | describe "a #{syscall} event which creates a new socket" do 132 | it "#{syscall} should have the correct JSON fields" do 133 | run_c_program(syscall) 134 | pattern = [{ type: syscall }.ignore_extra_keys!].ignore_extra_values! 135 | assert_json_match(pattern, read_json_as_array(0)) 136 | assert_json_match(pattern, read_json_as_array(1)) 137 | end 138 | end 139 | end 140 | end 141 | -------------------------------------------------------------------------------- /tests/test_packet_sniffer.rb: -------------------------------------------------------------------------------- 1 | # Purpose: test that we properly capture all packets in the PCAP trace. 2 | require 'minitest/autorun' 3 | require 'minitest/spec' 4 | require 'minitest/reporters' 5 | require 'packetfu' 6 | require './lib/lib.rb' 7 | 8 | Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new 9 | 10 | def get_pcap 11 | PacketFu::PcapFile.file_to_array(pcap_file_str) 12 | end 13 | 14 | def get_packet(pcap, pkt_id) 15 | PacketFu::Packet.parse(pcap[pkt_id]) 16 | end 17 | 18 | describe "packet_sniffer.c" do 19 | before do WebServer.start end 20 | MiniTest::Unit.after_tests { WebServer.stop } 21 | 22 | it "should create a PCAP file on CONNECT" do 23 | run_c_program(SOCK_EV_CONNECT, "-c") 24 | assert contains?(dir_str, "0.pcap") 25 | end 26 | 27 | # Need to capture on a single interface to use packetfu 28 | # Otherwises issues with layer 2 header. 29 | it "should capture the 3-way handshake on CONNECT" do 30 | skip 31 | run_c_program(SOCK_EV_CONNECT, "-c") 32 | cap = get_pcap 33 | assert cap.size >= 3 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /tests/test_tcpsnitch.rb: -------------------------------------------------------------------------------- 1 | # Purpose: test bash interface & initialization (init.c) of Netspy lib. 2 | require 'minitest/autorun' 3 | require 'minitest/spec' 4 | require 'minitest/reporters' 5 | require './lib/lib.rb' 6 | 7 | Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new 8 | 9 | describe "tcpsnitch" do 10 | before do WebServer.start end 11 | MiniTest::Unit.after_tests { WebServer.stop } 12 | 13 | let(:cmd) { "./c_programs/socket.out" } 14 | 15 | describe "when no option is set" do 16 | it "should not crash" do 17 | assert tcpsnitch('', cmd) 18 | end 19 | end 20 | 21 | describe "when no command is passed" do 22 | it "should report 'too few arguments'" do 23 | assert_match(/too few arguments/, tcpsnitch_output('', '')) 24 | assert_match(/too few arguments/, tcpsnitch_output('-b 42', '')) 25 | end 26 | end 27 | 28 | ["-b", "-f", "-l", "-t", "-u"].each do |opt| 29 | describe "when #{opt} is set" do 30 | it "should report 'invalid #{opt} argument'" do 31 | assert_match(/invalid #{opt} argument/, tcpsnitch_output("#{opt} -42", cmd)) 32 | assert_match(/invalid #{opt} argument/, tcpsnitch_output("#{opt} foo", cmd)) 33 | end 34 | 35 | it "should not crash with a valid arg" do 36 | assert tcpsnitch("#{opt} 5", cmd) 37 | end 38 | end 39 | end 40 | 41 | describe "option -c" do 42 | it "should not crash with -c" do 43 | assert tcpsnitch("-c", cmd) 44 | end 45 | 46 | it "should capture with -c" do 47 | run_c_program(SOCK_EV_SEND, "-c") 48 | assert contains?(dir_str, "0.pcap") 49 | end 50 | 51 | it "should not capture without -c" do 52 | assert run_c_program(SOCK_EV_SEND) 53 | assert !contains?(dir_str, "0.pcap") 54 | end 55 | # Rest is tested in test_packet_sniffer.rb 56 | end 57 | 58 | describe "when -d is set" do 59 | it "should report 'invalid argument' with invalid dir" do 60 | assert_match(/invalid -d argument/, tcpsnitch_output("-d 1234", cmd)) 61 | assert_match(/invalid -d argument/, tcpsnitch_output("-d /crazy/path", cmd)) 62 | end 63 | 64 | it "should not crash with a valid arg" do 65 | assert tcpsnitch("-d #{TEST_DIR}", cmd) 66 | end 67 | 68 | it "should write to a valid dir" do 69 | reset_dir(TEST_DIR) 70 | tcpsnitch("-d #{TEST_DIR}", cmd) 71 | assert !dir_empty?(TEST_DIR) 72 | end 73 | end 74 | 75 | describe "when -l is set" do 76 | it "should show logs at 3" do 77 | assert_match(/#{LOG_LABEL_INFO}/, tcpsnitch_output("-l 3", cmd)) 78 | end 79 | end 80 | 81 | describe "when -h is set" do 82 | it "should not crash" do 83 | assert tcpsnitch("-h", '') 84 | end 85 | 86 | it "should print usage dialog" do 87 | assert_match(/Usage/, tcpsnitch_output('-h', '')) 88 | end 89 | end 90 | 91 | describe "when -v is set" do 92 | it "should show verbose output" do 93 | assert_match(/[pid \d*] [a-z]*()/, tcpsnitch_output("-v", cmd)) 94 | end 95 | end 96 | 97 | describe "when --version is set" do 98 | it "should not crash" do 99 | assert tcpsnitch("--version", '') 100 | end 101 | 102 | it "should print version" do 103 | assert_match(/version/, tcpsnitch_output('--version', '')) 104 | end 105 | end 106 | end 107 | -------------------------------------------------------------------------------- /verbose_mode.h: -------------------------------------------------------------------------------- 1 | #ifndef VERBOSE_MODE_H 2 | #define VERBOSE_MODE_H 3 | 4 | #include "sock_events.h" 5 | 6 | void output_event(const SockEvent *ev); 7 | 8 | #endif 9 | --------------------------------------------------------------------------------