Browse Source

Fixup ioctl so we can special case powerpc silliness

Eric Andersen 22 years ago
parent
commit
5efeef3b6d

+ 4 - 4
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)

+ 18 - 0
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);
+}
+

+ 8 - 17
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

+ 1 - 1
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)

+ 64 - 0
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;
+}