remove use of endian.h from arch reloc.h headers, clean up
[musl] / src / misc / ioctl.c
index 808b7c9..6f31d4b 100644 (file)
@@ -1,5 +1,8 @@
 #include <sys/ioctl.h>
 #include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <sys/time.h>
 #include "syscall.h"
 
 int ioctl(int fd, int req, ...)
@@ -9,5 +12,25 @@ int ioctl(int fd, int req, ...)
        va_start(ap, req);
        arg = va_arg(ap, void *);
        va_end(ap);
-       return syscall3(__NR_ioctl, fd, req, (long)arg);
+       int r = __syscall(SYS_ioctl, fd, req, arg);
+       if (r==-ENOTTY) switch (req) {
+       case SIOCGSTAMP:
+       case SIOCGSTAMPNS:
+               if (SIOCGSTAMP==SIOCGSTAMP_OLD) break;
+               if (req==SIOCGSTAMP) req=SIOCGSTAMP_OLD;
+               if (req==SIOCGSTAMPNS) req=SIOCGSTAMPNS_OLD;
+               long t32[2];
+               r = __syscall(SYS_ioctl, fd, req, t32);
+               if (r<0) break;
+               if (req==SIOCGSTAMP_OLD) {
+                       struct timeval *tv = arg;
+                       tv->tv_sec = t32[0];
+                       tv->tv_usec = t32[1];
+               } else {
+                       struct timespec *ts = arg;
+                       ts->tv_sec = t32[0];
+                       ts->tv_nsec = t32[1];
+               }
+       }
+       return __syscall_ret(r);
 }