+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);
+}
+