(root)/
findutils-4.9.0/
gnulib-tests/
ioctl.c
       1  /* ioctl.c --- wrappers for Windows ioctl function
       2  
       3     Copyright (C) 2008-2022 Free Software Foundation, Inc.
       4  
       5     This file is free software: you can redistribute it and/or modify
       6     it under the terms of the GNU Lesser General Public License as
       7     published by the Free Software Foundation; either version 2.1 of the
       8     License, or (at your option) any later version.
       9  
      10     This file 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 Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public License
      16     along with this program.  If not, see <https://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
      30  int
      31  rpl_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  # if GNULIB_MSVC_NOTHROW
      56  #  include "msvc-nothrow.h"
      57  # else
      58  #  include <io.h>
      59  # endif
      60  
      61  static int
      62  primary_ioctl (int fd, int request, void *arg)
      63  {
      64    /* We don't support FIONBIO on pipes here.  If you want to make pipe
      65       fds non-blocking, use the gnulib 'nonblocking' module, until
      66       gnulib implements fcntl F_GETFL / F_SETFL with O_NONBLOCK.  */
      67  
      68    if ((HANDLE) _get_osfhandle (fd) != INVALID_HANDLE_VALUE)
      69      errno = ENOSYS;
      70    else
      71      errno = EBADF;
      72    return -1;
      73  }
      74  
      75  int
      76  ioctl (int fd, int request, ... /* {void *,char *} arg */)
      77  {
      78    void *arg;
      79    va_list args;
      80  
      81    va_start (args, request);
      82    arg = va_arg (args, void *);
      83    va_end (args);
      84  
      85  # if WINDOWS_SOCKETS
      86    return execute_all_ioctl_hooks (primary_ioctl, fd, request, arg);
      87  # else
      88    return primary_ioctl (fd, request, arg);
      89  # endif
      90  }
      91  
      92  #endif