#include <assert.h>
#include <ctype.h>
#include <errno.h>
+#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
_(recvfrom, ssize_t, (int, void *buf, size_t, int, \
struct sockaddr *from, socklen_t *fromlen)) \
_(sendmsg, ssize_t, (int, const struct msghdr *, int)) \
- _(recvmsg, ssize_t, (int, struct msghdr *, int))
+ _(recvmsg, ssize_t, (int, struct msghdr *, int)) \
+ _(ioctl, int, (int, unsigned long, ...))
/* Function pointers to set up. */
#define DECL(imp, ret, args) static ret (*real_##imp) args;
return (real_setsockopt(sk, lev, opt, p, len));
}
+int ioctl(int fd, unsigned long op, ...)
+{
+ va_list ap;
+ void *arg;
+ int sk;
+ int rc;
+
+ va_start(ap, op);
+ arg = va_arg(ap, void *);
+
+ switch (op) {
+ case SIOCGIFADDR:
+ case SIOCGIFBRDADDR:
+ case SIOCGIFDSTADDR:
+ case SIOCGIFNETMASK:
+ PRESERVING_ERRNO({
+ if (fixup_real_ip_socket(fd, AF_INET, &sk)) goto real;
+ });
+ rc = real_ioctl(sk, op, arg);
+ PRESERVING_ERRNO({ close(sk); });
+ break;
+ default:
+ real:
+ rc = real_ioctl(fd, op, arg);
+ break;
+ }
+ va_end(ap);
+ return (rc);
+}
+
/*----- Initialization ----------------------------------------------------*/
/* Clean up the socket directory, deleting stale sockets. */