Message ID | 20211119195852.166123-1-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux: Add generic ioctl implementation | expand |
On Fri, Nov 19, 2021 at 04:58:52PM -0300, Adhemerval Zanella wrote: > The powerpc is refactor to use the default implementation. > --- > sysdeps/unix/sysv/linux/internal-ioctl.h | 23 +++++++ > sysdeps/unix/sysv/linux/ioctl.c | 49 +++++++++++++ > .../unix/sysv/linux/powerpc/internal-ioctl.h | 46 +++++++++++++ > sysdeps/unix/sysv/linux/powerpc/ioctl.c | 68 ------------------- > 4 files changed, 118 insertions(+), 68 deletions(-) > create mode 100644 sysdeps/unix/sysv/linux/internal-ioctl.h > create mode 100644 sysdeps/unix/sysv/linux/ioctl.c > create mode 100644 sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h > delete mode 100644 sysdeps/unix/sysv/linux/powerpc/ioctl.c > > diff --git a/sysdeps/unix/sysv/linux/internal-ioctl.h b/sysdeps/unix/sysv/linux/internal-ioctl.h > new file mode 100644 > index 0000000000..697b086703 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/internal-ioctl.h > @@ -0,0 +1,23 @@ > +/* Linux internal definitions for ioctl. > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + Should we have a comment here explaining why this is needed. Something like: /* Architecture ports may choose to override this default implementation to provide architecture specific ioctl support. For example see powerpc. */ > +static inline bool > +__ioctl_arch (int *r, int fd, unsigned long request, void *arg) > +{ > + return false; > +} > diff --git a/sysdeps/unix/sysv/linux/ioctl.c b/sysdeps/unix/sysv/linux/ioctl.c > new file mode 100644 > index 0000000000..c4855d6302 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/ioctl.c > @@ -0,0 +1,49 @@ > +/* Control device. Linux generic implementation. > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <stdarg.h> > +#include <sys/ioctl.h> > +#include <sysdep.h> > +#include <internal-ioctl.h> > + > +int > +__ioctl (int fd, unsigned long int request, ...) > +{ > + va_list args; > + va_start (args, request); > + void *arg = va_arg (args, void *); > + va_end (args); > + > + int r; > + if (!__ioctl_arch (&r, fd, request, arg)) > + { > + r = INTERNAL_SYSCALL_CALL (ioctl, fd, request, arg); > + if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (r))) > + { > + __set_errno (-r); > + return -1; > + } > + } > + return r; > +} > +libc_hidden_def (__ioctl) > +weak_alias (__ioctl, ioctl) > + > +#if __TIMESIZE != 64 > +strong_alias (__ioctl, __ioctl_time64) > +#endif For what its worth this looks good to me. > diff --git a/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h > new file mode 100644 > index 0000000000..3a2adce7c3 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h > @@ -0,0 +1,46 @@ > +/* Linux internal definitions for ioctl. > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <termios.h> > + > +static inline bool > +__ioctl_arch (int *r, int fd, unsigned long request, void *arg) > +{ > + switch (request) > + { > + case TCGETS: > + *r = __tcgetattr (fd, (struct termios *) arg); > + break; > + > + case TCSETS: > + *r = __tcsetattr (fd, TCSANOW, (struct termios *) arg); > + break; > + > + case TCSETSW: > + *r = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); > + break; > + > + case TCSETSF: > + *r = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); > + break; > + > + default: > + return false; > + } > + return true; > +} > diff --git a/sysdeps/unix/sysv/linux/powerpc/ioctl.c b/sysdeps/unix/sysv/linux/powerpc/ioctl.c > deleted file mode 100644 > index a81c7ba54c..0000000000 > --- a/sysdeps/unix/sysv/linux/powerpc/ioctl.c > +++ /dev/null > @@ -1,68 +0,0 @@ > -/* Copyright (C) 1998-2021 Free Software Foundation, Inc. > - This file is part of the GNU C Library. > - > - The GNU C Library is free software; you can redistribute it and/or > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library; if not, see > - <https://www.gnu.org/licenses/>. */ > - > -#include <stdarg.h> > -#include <termios.h> > -#include <unistd.h> > -#include <sys/ioctl.h> > -#include <sysdep.h> > - > -/* The user-visible size of struct termios has changed. Catch ioctl calls > - using the new-style struct termios, and translate them to old-style. */ > - > -int > -__ioctl (int fd, unsigned long int request, ...) > -{ > - void *arg; > - va_list ap; > - int result; > - > - va_start (ap, request); > - arg = va_arg (ap, void *); > - > - switch (request) > - { > - case TCGETS: > - result = __tcgetattr (fd, (struct termios *) arg); > - break; > - > - case TCSETS: > - result = __tcsetattr (fd, TCSANOW, (struct termios *) arg); > - break; > - > - case TCSETSW: > - result = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); > - break; > - > - case TCSETSF: > - result = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); > - break; > - > - default: > - result = INLINE_SYSCALL (ioctl, 3, fd, request, arg); > - break; > - } > - > - va_end (ap); > - > - return result; > -} > -libc_hidden_def (__ioctl) > -weak_alias (__ioctl, ioctl) > -#if __TIMESIZE != 64 > -weak_alias (__ioctl, __ioctl_time64) > -#endif The powerpc bit look fine too. -Stafford
On 19/11/2021 21:11, Stafford Horne wrote: > On Fri, Nov 19, 2021 at 04:58:52PM -0300, Adhemerval Zanella wrote: >> The powerpc is refactor to use the default implementation. >> --- >> sysdeps/unix/sysv/linux/internal-ioctl.h | 23 +++++++ >> sysdeps/unix/sysv/linux/ioctl.c | 49 +++++++++++++ >> .../unix/sysv/linux/powerpc/internal-ioctl.h | 46 +++++++++++++ >> sysdeps/unix/sysv/linux/powerpc/ioctl.c | 68 ------------------- >> 4 files changed, 118 insertions(+), 68 deletions(-) >> create mode 100644 sysdeps/unix/sysv/linux/internal-ioctl.h >> create mode 100644 sysdeps/unix/sysv/linux/ioctl.c >> create mode 100644 sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h >> delete mode 100644 sysdeps/unix/sysv/linux/powerpc/ioctl.c >> >> diff --git a/sysdeps/unix/sysv/linux/internal-ioctl.h b/sysdeps/unix/sysv/linux/internal-ioctl.h >> new file mode 100644 >> index 0000000000..697b086703 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/internal-ioctl.h >> @@ -0,0 +1,23 @@ >> +/* Linux internal definitions for ioctl. >> + Copyright (C) 2021 Free Software Foundation, Inc. >> + This file is part of the GNU C Library. >> + >> + The GNU C Library is free software; you can redistribute it and/or >> + modify it under the terms of the GNU Lesser General Public >> + License as published by the Free Software Foundation; either >> + version 2.1 of the License, or (at your option) any later version. >> + >> + The GNU C Library is distributed in the hope that it will be useful, >> + but WITHOUT ANY WARRANTY; without even the implied warranty of >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + Lesser General Public License for more details. >> + >> + You should have received a copy of the GNU Lesser General Public >> + License along with the GNU C Library. If not, see >> + <https://www.gnu.org/licenses/>. */ >> + > > Should we have a comment here explaining why this is needed. > > Something like: > > /* Architecture ports may choose to override this default implementation > to provide architecture specific ioctl support. For example see powerpc. */ Sounds reasonable, I will update the patch.
On Fri, Nov 19, 2021 at 04:58:52PM -0300, Adhemerval Zanella via Libc-alpha wrote: > The powerpc is refactor to use the default implementation. > --- [snip] > diff --git a/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h > new file mode 100644 > index 0000000000..3a2adce7c3 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h > @@ -0,0 +1,46 @@ > +/* Linux internal definitions for ioctl. > + Copyright (C) 2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <termios.h> > + > +static inline bool > +__ioctl_arch (int *r, int fd, unsigned long request, void *arg) > +{ > + switch (request) > + { > + case TCGETS: > + *r = __tcgetattr (fd, (struct termios *) arg); > + break; > + > + case TCSETS: > + *r = __tcsetattr (fd, TCSANOW, (struct termios *) arg); > + break; > + > + case TCSETSW: > + *r = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); > + break; > + > + case TCSETSF: > + *r = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); > + break; > + > + default: > + return false; > + } > + return true; > +} > diff --git a/sysdeps/unix/sysv/linux/powerpc/ioctl.c b/sysdeps/unix/sysv/linux/powerpc/ioctl.c > deleted file mode 100644 > index a81c7ba54c..0000000000 > --- a/sysdeps/unix/sysv/linux/powerpc/ioctl.c > +++ /dev/null > @@ -1,68 +0,0 @@ > -/* Copyright (C) 1998-2021 Free Software Foundation, Inc. > - This file is part of the GNU C Library. > - > - The GNU C Library is free software; you can redistribute it and/or > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library; if not, see > - <https://www.gnu.org/licenses/>. */ > - > -#include <stdarg.h> > -#include <termios.h> > -#include <unistd.h> > -#include <sys/ioctl.h> > -#include <sysdep.h> > - > -/* The user-visible size of struct termios has changed. Catch ioctl calls > - using the new-style struct termios, and translate them to old-style. */ I don't know the history here, but the above comment did not move to the new location. Should it be preserved? PC > -int > -__ioctl (int fd, unsigned long int request, ...) > -{ > - void *arg; > - va_list ap; > - int result; > - > - va_start (ap, request); > - arg = va_arg (ap, void *); > - > - switch (request) > - { > - case TCGETS: > - result = __tcgetattr (fd, (struct termios *) arg); > - break; > - > - case TCSETS: > - result = __tcsetattr (fd, TCSANOW, (struct termios *) arg); > - break; > - > - case TCSETSW: > - result = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); > - break; > - > - case TCSETSF: > - result = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); > - break; > - > - default: > - result = INLINE_SYSCALL (ioctl, 3, fd, request, arg); > - break; > - } > - > - va_end (ap); > - > - return result; > -} > -libc_hidden_def (__ioctl) > -weak_alias (__ioctl, ioctl) > -#if __TIMESIZE != 64 > -weak_alias (__ioctl, __ioctl_time64) > -#endif > --
On 29/11/2021 12:23, Paul A. Clarke wrote: > On Fri, Nov 19, 2021 at 04:58:52PM -0300, Adhemerval Zanella via Libc-alpha wrote: >> The powerpc is refactor to use the default implementation. >> --- > [snip] >> diff --git a/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h >> new file mode 100644 >> index 0000000000..3a2adce7c3 >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h >> @@ -0,0 +1,46 @@ >> +/* Linux internal definitions for ioctl. >> + Copyright (C) 2021 Free Software Foundation, Inc. >> + This file is part of the GNU C Library. >> + >> + The GNU C Library is free software; you can redistribute it and/or >> + modify it under the terms of the GNU Lesser General Public >> + License as published by the Free Software Foundation; either >> + version 2.1 of the License, or (at your option) any later version. >> + >> + The GNU C Library is distributed in the hope that it will be useful, >> + but WITHOUT ANY WARRANTY; without even the implied warranty of >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + Lesser General Public License for more details. >> + >> + You should have received a copy of the GNU Lesser General Public >> + License along with the GNU C Library. If not, see >> + <https://www.gnu.org/licenses/>. */ >> + >> +#include <termios.h> >> + >> +static inline bool >> +__ioctl_arch (int *r, int fd, unsigned long request, void *arg) >> +{ >> + switch (request) >> + { >> + case TCGETS: >> + *r = __tcgetattr (fd, (struct termios *) arg); >> + break; >> + >> + case TCSETS: >> + *r = __tcsetattr (fd, TCSANOW, (struct termios *) arg); >> + break; >> + >> + case TCSETSW: >> + *r = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); >> + break; >> + >> + case TCSETSF: >> + *r = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); >> + break; >> + >> + default: >> + return false; >> + } >> + return true; >> +} >> diff --git a/sysdeps/unix/sysv/linux/powerpc/ioctl.c b/sysdeps/unix/sysv/linux/powerpc/ioctl.c >> deleted file mode 100644 >> index a81c7ba54c..0000000000 >> --- a/sysdeps/unix/sysv/linux/powerpc/ioctl.c >> +++ /dev/null >> @@ -1,68 +0,0 @@ >> -/* Copyright (C) 1998-2021 Free Software Foundation, Inc. >> - This file is part of the GNU C Library. >> - >> - The GNU C Library is free software; you can redistribute it and/or >> - modify it under the terms of the GNU Lesser General Public >> - License as published by the Free Software Foundation; either >> - version 2.1 of the License, or (at your option) any later version. >> - >> - The GNU C Library is distributed in the hope that it will be useful, >> - but WITHOUT ANY WARRANTY; without even the implied warranty of >> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> - Lesser General Public License for more details. >> - >> - You should have received a copy of the GNU Lesser General Public >> - License along with the GNU C Library; if not, see >> - <https://www.gnu.org/licenses/>. */ >> - >> -#include <stdarg.h> >> -#include <termios.h> >> -#include <unistd.h> >> -#include <sys/ioctl.h> >> -#include <sysdep.h> >> - >> -/* The user-visible size of struct termios has changed. Catch ioctl calls >> - using the new-style struct termios, and translate them to old-style. */ > > I don't know the history here, but the above comment did not move > to the new location. Should it be preserved? Agreed, I have adjusted locally.
diff --git a/sysdeps/unix/sysv/linux/internal-ioctl.h b/sysdeps/unix/sysv/linux/internal-ioctl.h new file mode 100644 index 0000000000..697b086703 --- /dev/null +++ b/sysdeps/unix/sysv/linux/internal-ioctl.h @@ -0,0 +1,23 @@ +/* Linux internal definitions for ioctl. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <https://www.gnu.org/licenses/>. */ + +static inline bool +__ioctl_arch (int *r, int fd, unsigned long request, void *arg) +{ + return false; +} diff --git a/sysdeps/unix/sysv/linux/ioctl.c b/sysdeps/unix/sysv/linux/ioctl.c new file mode 100644 index 0000000000..c4855d6302 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ioctl.c @@ -0,0 +1,49 @@ +/* Control device. Linux generic implementation. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <https://www.gnu.org/licenses/>. */ + +#include <stdarg.h> +#include <sys/ioctl.h> +#include <sysdep.h> +#include <internal-ioctl.h> + +int +__ioctl (int fd, unsigned long int request, ...) +{ + va_list args; + va_start (args, request); + void *arg = va_arg (args, void *); + va_end (args); + + int r; + if (!__ioctl_arch (&r, fd, request, arg)) + { + r = INTERNAL_SYSCALL_CALL (ioctl, fd, request, arg); + if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (r))) + { + __set_errno (-r); + return -1; + } + } + return r; +} +libc_hidden_def (__ioctl) +weak_alias (__ioctl, ioctl) + +#if __TIMESIZE != 64 +strong_alias (__ioctl, __ioctl_time64) +#endif diff --git a/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h new file mode 100644 index 0000000000..3a2adce7c3 --- /dev/null +++ b/sysdeps/unix/sysv/linux/powerpc/internal-ioctl.h @@ -0,0 +1,46 @@ +/* Linux internal definitions for ioctl. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <https://www.gnu.org/licenses/>. */ + +#include <termios.h> + +static inline bool +__ioctl_arch (int *r, int fd, unsigned long request, void *arg) +{ + switch (request) + { + case TCGETS: + *r = __tcgetattr (fd, (struct termios *) arg); + break; + + case TCSETS: + *r = __tcsetattr (fd, TCSANOW, (struct termios *) arg); + break; + + case TCSETSW: + *r = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); + break; + + case TCSETSF: + *r = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); + break; + + default: + return false; + } + return true; +} diff --git a/sysdeps/unix/sysv/linux/powerpc/ioctl.c b/sysdeps/unix/sysv/linux/powerpc/ioctl.c deleted file mode 100644 index a81c7ba54c..0000000000 --- a/sysdeps/unix/sysv/linux/powerpc/ioctl.c +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 1998-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <https://www.gnu.org/licenses/>. */ - -#include <stdarg.h> -#include <termios.h> -#include <unistd.h> -#include <sys/ioctl.h> -#include <sysdep.h> - -/* The user-visible size of struct termios has changed. Catch ioctl calls - using the new-style struct termios, and translate them to old-style. */ - -int -__ioctl (int fd, unsigned long int request, ...) -{ - void *arg; - va_list ap; - int result; - - va_start (ap, request); - arg = va_arg (ap, void *); - - switch (request) - { - case TCGETS: - result = __tcgetattr (fd, (struct termios *) arg); - break; - - case TCSETS: - result = __tcsetattr (fd, TCSANOW, (struct termios *) arg); - break; - - case TCSETSW: - result = __tcsetattr (fd, TCSADRAIN, (struct termios *) arg); - break; - - case TCSETSF: - result = __tcsetattr (fd, TCSAFLUSH, (struct termios *) arg); - break; - - default: - result = INLINE_SYSCALL (ioctl, 3, fd, request, arg); - break; - } - - va_end (ap); - - return result; -} -libc_hidden_def (__ioctl) -weak_alias (__ioctl, ioctl) -#if __TIMESIZE != 64 -weak_alias (__ioctl, __ioctl_time64) -#endif