1 | /* ioctl.c --- wrappers for Windows ioctl function
|
---|
2 |
|
---|
3 | Copyright (C) 2008-2021 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
|
---|