summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2013-02-11 11:17:34 +0100
committerAndreas Schneider <asn@cryptomilk.org>2013-02-11 11:17:34 +0100
commit8d4c6be73caf02ff7d4cfcc6d378f4b09cefb8f6 (patch)
treec04c49668504eb92418580f43aef8f20ad6f88d1 /src
parenta5875a035f03432becd9ace64ab2c2be94c4a8d7 (diff)
downloadsocket_wrapper-8d4c6be73caf02ff7d4cfcc6d378f4b09cefb8f6.tar.gz
socket_wrapper-8d4c6be73caf02ff7d4cfcc6d378f4b09cefb8f6.tar.xz
socket_wrapper-8d4c6be73caf02ff7d4cfcc6d378f4b09cefb8f6.zip
Add ioctl() wrapper.
Diffstat (limited to 'src')
-rw-r--r--src/socket_wrapper.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/src/socket_wrapper.c b/src/socket_wrapper.c
index 95330d1..090fba8 100644
--- a/src/socket_wrapper.c
+++ b/src/socket_wrapper.c
@@ -61,6 +61,7 @@
#include <string.h>
#include <stdio.h>
#include <stdint.h>
+#include <stdarg.h>
#ifndef _PUBLIC_
#define _PUBLIC_
@@ -259,6 +260,23 @@ static int real_getsockopt(int sockfd,
return libc_getsockopt(sockfd, level, optname, optval, optlen);
}
+static int (*libc_ioctl)(int d, unsigned long int request, ...);
+
+static int real_ioctl(int d, unsigned long int request, ...) {
+ va_list va;
+ int rc;
+
+ if (libc_ioctl == NULL) {
+ *(void **)(&libc_ioctl) = libc_dlsym("ioctl");
+ }
+
+ va_start(va, request);
+ rc = libc_ioctl(d, request, va);
+ va_end(va);
+
+ return rc;
+}
+
static int (*libc_listen)(int sockfd, int backlog);
static int real_listen(int sockfd, int backlog)
@@ -2075,23 +2093,28 @@ int setsockopt(int s, int level, int optname,
}
}
-#if 0
-_PUBLIC_ int swrap_ioctl(int s, int r, void *p)
+int ioctl(int s, unsigned long int r, ...)
{
- int ret;
+ int rc;
struct socket_info *si = find_socket_info(s);
int value;
+ va_list va;
+
+ va_start(va, r);
if (!si) {
- return real_ioctl(s, r, p);
+ rc = real_ioctl(s, r, va);
+ va_end(va);
+
+ return rc;
}
- ret = real_ioctl(s, r, p);
+ rc = real_ioctl(s, r, va);
switch (r) {
case FIONREAD:
- value = *((int *)p);
- if (ret == -1 && errno != EAGAIN && errno != ENOBUFS) {
+ value = va_arg(va, int);
+ if (rc == -1 && errno != EAGAIN && errno != ENOBUFS) {
swrap_dump_packet(si, NULL, SWRAP_PENDING_RST, NULL, 0);
} else if (value == 0) { /* END OF FILE */
swrap_dump_packet(si, NULL, SWRAP_PENDING_RST, NULL, 0);
@@ -2099,9 +2122,12 @@ _PUBLIC_ int swrap_ioctl(int s, int r, void *p)
break;
}
- return ret;
+ va_end(va);
+
+ return rc;
}
+#if 0
static ssize_t swrap_sendmsg_before(int fd,
struct socket_info *si,
struct msghdr *msg,