summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorEric Andersen <andersen@codepoet.org>2000-08-10 19:47:55 +0000
committerEric Andersen <andersen@codepoet.org>2000-08-10 19:47:55 +0000
commit56e5d28c812ad3851c02d20df93cd6f00ada64bb (patch)
tree465c280227793f76ce052dfc33518a79b0753baa /libc
parentf6715fc37990a65ca16f09b4699459ff3eaa9902 (diff)
More stuff. Down to only 43 missing functions before BusyBox will
link. Fixed socket stuff so it doesn't pull in kernel headers and stubbed out fork and clone. A few other header file cleanups. -Erik
Diffstat (limited to 'libc')
-rw-r--r--libc/sysdeps/linux/common/glibcstat.h68
-rw-r--r--libc/sysdeps/linux/i386/Makefile2
-rw-r--r--libc/sysdeps/linux/i386/bits/uio.h46
-rw-r--r--libc/sysdeps/linux/i386/clone.S87
4 files changed, 202 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/common/glibcstat.h b/libc/sysdeps/linux/common/glibcstat.h
new file mode 100644
index 000000000..f5a2e7c91
--- /dev/null
+++ b/libc/sysdeps/linux/common/glibcstat.h
@@ -0,0 +1,68 @@
+/* Copyright (C) 1992, 1995, 1996, 1997 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 Library General Public License as
+ published by the Free Software Foundation; either version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _GLIBCSTAT_H
+#define _GLIBCSTAT_H 1
+
+/* Versions of the `struct stat' data structure. */
+#define _STAT_VER_LINUX_OLD 1
+#define _STAT_VER_SVR4 2
+#define _STAT_VER_LINUX 3
+#define _STAT_VER _STAT_VER_LINUX /* The one defined below. */
+
+/* Versions of the `xmknod' interface. */
+#define _MKNOD_VER_LINUX 1
+#define _MKNOD_VER_SVR4 2
+#define _MKNOD_VER _MKNOD_VER_LINUX /* The bits defined below. */
+
+typedef unsigned long long int __glibc_dev_t;
+typedef unsigned long int __glibc_ino_t;
+typedef unsigned int __glibc_mode_t;
+typedef unsigned int __glibc_nlink_t;
+typedef unsigned int __glibc_uid_t;
+typedef unsigned int __glibc_gid_t;
+typedef long int __glibc_off_t;
+typedef long int __glibc_time_t;
+
+struct glibcstat
+ {
+ __glibc_dev_t st_dev; /* Device. */
+ unsigned short int __pad1;
+ __glibc_ino_t st_ino; /* File serial number. */
+ __glibc_mode_t st_mode; /* File mode. */
+ __glibc_nlink_t st_nlink; /* Link count. */
+ __glibc_uid_t st_uid; /* User ID of the file's owner. */
+ __glibc_gid_t st_gid; /* Group ID of the file's group.*/
+ __glibc_dev_t st_rdev; /* Device number, if device. */
+ unsigned short int __pad2;
+ __glibc_off_t st_size; /* Size of file, in bytes. */
+ unsigned long int st_blksize; /* Optimal block size for I/O. */
+#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */
+
+ unsigned long int st_blocks; /* Number of 512-byte blocks allocated. */
+ __glibc_time_t st_atime; /* Time of last access. */
+ unsigned long int __unused1;
+ __glibc_time_t st_mtime; /* Time of last modification. */
+ unsigned long int __unused2;
+ __glibc_time_t st_ctime; /* Time of last status change. */
+ unsigned long int __unused3;
+ unsigned long int __unused4;
+ unsigned long int __unused5;
+ };
+
+#endif /* glibcstat.h */
diff --git a/libc/sysdeps/linux/i386/Makefile b/libc/sysdeps/linux/i386/Makefile
index 4db2b57fc..57fed3bf4 100644
--- a/libc/sysdeps/linux/i386/Makefile
+++ b/libc/sysdeps/linux/i386/Makefile
@@ -15,7 +15,7 @@ LIBC=$(TOPDIR)libc.a
$(CC) $(CFLAGS) -c -o $*.o $<
SSRC=syscalls.S
-OBJ= setjmp.o longjmp.o readdir.o _start.o _exit.o #select.o
+OBJ= setjmp.o longjmp.o readdir.o _start.o _exit.o fork.o #select.o
include makefile.objs
all: $(LIBC)
diff --git a/libc/sysdeps/linux/i386/bits/uio.h b/libc/sysdeps/linux/i386/bits/uio.h
new file mode 100644
index 000000000..38ac17baa
--- /dev/null
+++ b/libc/sysdeps/linux/i386/bits/uio.h
@@ -0,0 +1,46 @@
+/* Copyright (C) 1996, 1997 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 Library General Public License as
+ published by the Free Software Foundation; either version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#ifndef _SYS_UIO_H
+# error "Never include <bits/uio.h> directly; use <sys/uio.h> instead."
+#endif
+
+
+#include <sys/types.h>
+
+
+/* We should normally use the Linux kernel header file to define this
+ type and macros but this calls for trouble because of the header
+ includes other kernel headers. */
+
+/* Size of object which can be written atomically.
+
+ This macro has different values in different kernel versions. The
+ latest versions of ther kernel use 1024 and this is good choice. Since
+ the C library implementation of readv/writev is able to emulate the
+ functionality even if the currently running kernel does not support
+ this large value the readv/writev call will not fail because of this. */
+#define UIO_MAXIOV 1024
+
+
+/* Structure for scatter/gather I/O. */
+struct iovec
+ {
+ void *iov_base; /* Pointer to data. */
+ size_t iov_len; /* Length of data. */
+ };
diff --git a/libc/sysdeps/linux/i386/clone.S b/libc/sysdeps/linux/i386/clone.S
new file mode 100644
index 000000000..7a2025b53
--- /dev/null
+++ b/libc/sysdeps/linux/i386/clone.S
@@ -0,0 +1,87 @@
+/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Richard Henderson (rth@tamu.edu)
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 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
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+/* clone() is even more special than fork() as it mucks with stacks
+ and invokes a function in the right context after its all over. */
+
+#include <sysdep.h>
+#define _ERRNO_H 1
+#include <bits/errno.h>
+#include <asm-syntax.h>
+
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+
+ .text
+ENTRY(__clone)
+ /* Sanity check arguments. */
+ movl $-EINVAL,%eax
+ movl 4(%esp),%ecx /* no NULL function pointers */
+#ifdef PIC
+ jecxz SYSCALL_ERROR_LABEL
+#else
+ testl %ecx,%ecx
+ jz SYSCALL_ERROR_LABEL
+#endif
+ movl 8(%esp),%ecx /* no NULL stack pointers */
+#ifdef PIC
+ jecxz SYSCALL_ERROR_LABEL
+#else
+ testl %ecx,%ecx
+ jz SYSCALL_ERROR_LABEL
+#endif
+
+ /* Insert the argument onto the new stack. */
+ subl $8,%ecx
+ movl 16(%esp),%eax /* no negative argument counts */
+ movl %eax,4(%ecx)
+
+ /* Save the function pointer as the zeroth argument.
+ It will be popped off in the child in the ebx frobbing below. */
+ movl 4(%esp),%eax
+ movl %eax,0(%ecx)
+
+ /* Do the system call */
+ pushl %ebx
+ movl 16(%esp),%ebx
+ movl $SYS_ify(clone),%eax
+ int $0x80
+ popl %ebx
+
+ test %eax,%eax
+ jl SYSCALL_ERROR_LABEL
+ jz thread_start
+
+L(pseudo_end):
+ ret
+
+thread_start:
+ subl %ebp,%ebp /* terminate the stack frame */
+ call *%ebx
+#ifdef PIC
+ call L(here)
+L(here):
+ popl %ebx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-L(here)], %ebx
+#endif
+ pushl %eax
+ call JUMPTARGET (_exit)
+
+PSEUDO_END (__clone)
+
+weak_alias (__clone, clone)