1/* ioctl.c --- wrappers for Windows ioctl function 2 3 Copyright (C) 2008-2014 Free Software Foundation, Inc. 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18/* Written by Paolo Bonzini */ 19 20#include <config.h> 21 22#include <sys/ioctl.h> 23 24#include <stdarg.h> 25 26#if HAVE_IOCTL 27 28/* Provide a wrapper with the POSIX prototype. */ 29# undef ioctl 30int 31rpl_ioctl (int fd, int request, ... /* {void *,char *} arg */) 32{ 33 void *buf; 34 va_list args; 35 36 va_start (args, request); 37 buf = va_arg (args, void *); 38 va_end (args); 39 40 /* Cast 'request' so that when the system's ioctl function takes a 64-bit 41 request argument, the value gets zero-extended, not sign-extended. */ 42 return ioctl (fd, (unsigned int) request, buf); 43} 44 45#else /* mingw */ 46 47# include <errno.h> 48 49/* Get HANDLE. */ 50# define WIN32_LEAN_AND_MEAN 51# include <windows.h> 52 53# include "fd-hook.h" 54/* Get _get_osfhandle. */ 55# include "msvc-nothrow.h" 56 57static int 58primary_ioctl (int fd, int request, void *arg) 59{ 60 /* We don't support FIONBIO on pipes here. If you want to make pipe 61 fds non-blocking, use the gnulib 'nonblocking' module, until 62 gnulib implements fcntl F_GETFL / F_SETFL with O_NONBLOCK. */ 63 64 if ((HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE) 65 errno = ENOSYS; 66 else 67 errno = EBADF; 68 return -1; 69} 70 71int 72ioctl (int fd, int request, ... /* {void *,char *} arg */) 73{ 74 void *arg; 75 va_list args; 76 77 va_start (args, request); 78 arg = va_arg (args, void *); 79 va_end (args); 80 81# if WINDOWS_SOCKETS 82 return execute_all_ioctl_hooks (primary_ioctl, fd, request, arg); 83# else 84 return primary_ioctl (fd, request, arg); 85# endif 86} 87 88#endif 89