diff options
| -rw-r--r-- | libc/sysdeps/linux/common/Makefile | 8 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/ioctl.c | 18 | ||||
| -rw-r--r-- | libc/sysdeps/linux/common/syscalls.c | 25 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/Makefile | 2 | ||||
| -rw-r--r-- | libc/sysdeps/linux/powerpc/ioctl.c | 64 | 
5 files changed, 95 insertions, 22 deletions
| diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile index c616ad8b2..5b9717f2b 100644 --- a/libc/sysdeps/linux/common/Makefile +++ b/libc/sysdeps/linux/common/Makefile @@ -19,11 +19,11 @@  TOPDIR=../../../../  include $(TOPDIR)Rules.mak -CSRC=	waitpid.c getdnnm.c gethstnm.c getcwd.c \ +CSRC=	waitpid.c getdnnm.c gethstnm.c getcwd.c ptrace.c \  	mkfifo.c setegid.c wait.c getpagesize.c seteuid.c \ -	wait3.c setpgrp.c getdtablesize.c create_module.c ptrace.c \ -	cmsg_nxthdr.c longjmp.c open64.c ftruncate64.c \ -	truncate64.c getrlimit64.c setrlimit64.c creat64.c mmap64.c \ +	wait3.c setpgrp.c getdtablesize.c create_module.c \ +	cmsg_nxthdr.c longjmp.c open64.c ftruncate64.c mmap64.c \ +	truncate64.c getrlimit64.c setrlimit64.c creat64.c \  	llseek.c pread_write.c _exit.c sync.c getdirname.c \  	sendfile64.c xstatconv.c getdents.c getdents64.c  ifneq ($(strip $(EXCLUDE_BRK)),y) diff --git a/libc/sysdeps/linux/common/ioctl.c b/libc/sysdeps/linux/common/ioctl.c new file mode 100644 index 000000000..d3cc617ac --- /dev/null +++ b/libc/sysdeps/linux/common/ioctl.c @@ -0,0 +1,18 @@ +#include <stdarg.h> +#include <sys/ioctl.h> + +extern int __syscall_ioctl(int fd, int request, void *arg); + +/* powerpc has its own special version... */ +int ioctl(int fd, unsigned long int request, ...) +{ +    void *arg; +    va_list list; + +    va_start(list, request); +    arg = va_arg(list, void *); + +    va_end(list); +    return __syscall_ioctl(fd, request, arg); +} + diff --git a/libc/sysdeps/linux/common/syscalls.c b/libc/sysdeps/linux/common/syscalls.c index 23690e4b7..63cef235b 100644 --- a/libc/sysdeps/linux/common/syscalls.c +++ b/libc/sysdeps/linux/common/syscalls.c @@ -575,25 +575,16 @@ _syscall1(int, acct, const char *, filename);  //#define __NR_lock             53  //#define __NR_ioctl            54 -#ifdef L__ioctl +#ifdef L___syscall_ioctl  #include <stdarg.h>  #include <sys/ioctl.h> -#define __NR__ioctl __NR_ioctl -extern int _ioctl(int fd, int request, void *arg); - -_syscall3(int, _ioctl, int, fd, int, request, void *, arg); - -int ioctl(int fd, unsigned long int request, ...) -{ -	void *arg; -	va_list list; - -	va_start(list, request); -	arg = va_arg(list, void *); - -	va_end(list); -	return _ioctl(fd, request, arg); -} +#define __NR___syscall_ioctl __NR_ioctl +extern int __syscall_ioctl(int fd, int request, void *arg); +_syscall3(int, __syscall_ioctl, int, fd, int, request, void *, arg); +#if !defined (__powerpc__) +#include "ioctl.c" +/* Also see ioctl.c and powerpc/ioctl.c */ +#endif  #endif  //#define __NR_fcntl            55 diff --git a/libc/sysdeps/linux/powerpc/Makefile b/libc/sysdeps/linux/powerpc/Makefile index 5b5967d91..9b79644e6 100644 --- a/libc/sysdeps/linux/powerpc/Makefile +++ b/libc/sysdeps/linux/powerpc/Makefile @@ -26,7 +26,7 @@ CRT0_OBJ = crt0.o crt1.o  SSRC=__longjmp.S setjmp.S bsd-setjmp.S bsd-_setjmp.S brk.S clone.S __uClibc_syscall.S  SOBJS=$(patsubst %.S,%.o, $(SSRC)) -CSRC=_mmap.c vfork.c __syscall_error.c pread_write.c +CSRC=_mmap.c vfork.c __syscall_error.c pread_write.c ioctl.c  COBJS=$(patsubst %.c,%.o, $(CSRC))  OBJS=$(SOBJS) $(COBJS) diff --git a/libc/sysdeps/linux/powerpc/ioctl.c b/libc/sysdeps/linux/powerpc/ioctl.c new file mode 100644 index 000000000..36a0d9144 --- /dev/null +++ b/libc/sysdeps/linux/powerpc/ioctl.c @@ -0,0 +1,64 @@ +/* Copyright (C) 1998 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, write to the Free +   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +   02111-1307 USA.  */ + +#include <stdarg.h> +#include <termios.h> +#include <unistd.h> +#include <sys/ioctl.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.  */ + +extern int __syscall_ioctl (int fd, unsigned long int request, ...); + +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 = __syscall_ioctl (fd, request, arg); +	    break; +    } + +    va_end (ap); + +    return result; +} | 
