Browse Source

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

Eric Andersen 24 years ago
parent
commit
56e5d28c81

+ 1 - 1
Makefile

@@ -1,5 +1,5 @@
 DIRS = headers error getent malloc-simple misc regex stdio2 \
-	    string sysdeps termios time #rpc
+	    string termios time sysdeps #rpc
 
 all: libc.a
 

+ 1 - 0
include/features.h

@@ -41,6 +41,7 @@
 #define __USE_BSD
 #define __USE_MISC
 #define __USE_POSIX
+#define __USE_POSIX2
 #define _POSIX_THREAD_SAFE_FUNCTIONS
 
 #include <sys/cdefs.h>

+ 2 - 1
include/getopt.h

@@ -9,8 +9,9 @@
 #include <features.h>
 
 extern char *optarg;
-extern int opterr;
 extern int optind;
+extern int opterr;
+extern int optopt;
 
 extern int getopt __P((int argc, char *const *argv, const char *shortopts));
 

+ 4 - 0
include/stdio.h

@@ -201,6 +201,10 @@ extern int vfscanf __P ((FILE *__restrict __s,
 /* Print a message describing the meaning of the value of errno.  */
 extern void perror __P ((__const char *__s));
 
+/* Like `getdelim', but reads up to a newline.  */
+extern int getline __P ((char **__restrict __lineptr,
+				 size_t *__restrict __n,
+				 FILE *__restrict __stream));
 
 
 #endif /* __STDIO_H */

+ 1 - 1
include/stdlib.h

@@ -58,6 +58,7 @@ extern int putenv __P ((__const char *__string));
 
 extern int setenv __P ((__const char *__name, __const char *__value,
                         int __replace));
+extern void unsetenv __P ((__const char *__name));
 
 extern int system __P ((__const char *__command));
 
@@ -87,7 +88,6 @@ extern void qsort __P ((__ptr_t __base, size_t __nmemb, size_t __size,
 #define atof(x) strtod((x),(char**)0)
 #define atoi(x) (int)strtol((x),(char**)0,10)
 #define atol(x) strtol((x),(char**)0,10)
-char* itoa(int i);
 
 /* Returned by `div'.  */
 typedef struct

+ 23 - 23
include/sys/stat.h

@@ -276,37 +276,37 @@ extern int mkfifo __P ((__const char *__path, __mode_t __mode));
 
 /* Wrappers for stat and mknod system calls.  */
 #ifndef __USE_FILE_OFFSET64
-extern int __fxstat __P ((int __ver, int __fildes,
+extern int _fxstat __P ((int __ver, int __fildes,
 			  struct stat *__stat_buf));
-extern int __xstat __P ((int __ver, __const char *__filename,
+extern int _xstat __P ((int __ver, __const char *__filename,
 			 struct stat *__stat_buf));
-extern int __lxstat __P ((int __ver, __const char *__filename,
+extern int _lxstat __P ((int __ver, __const char *__filename,
 			  struct stat *__stat_buf));
 #else
 # ifdef __REDIRECT
-extern int __REDIRECT (__fxstat, __P ((int __ver, int __fildes,
-				       struct stat *__stat_buf)), __fxstat64);
-extern int __REDIRECT (__xstat, __P ((int __ver, __const char *__filename,
-				      struct stat *__stat_buf)), __xstat64);
-extern int __REDIRECT (__lxstat, __P ((int __ver, __const char *__filename,
-				       struct stat *__stat_buf)), __lxstat64);
+extern int __REDIRECT (_fxstat, __P ((int __ver, int __fildes,
+				       struct stat *__stat_buf)), _fxstat64);
+extern int __REDIRECT (_xstat, __P ((int __ver, __const char *__filename,
+				      struct stat *__stat_buf)), _xstat64);
+extern int __REDIRECT (_lxstat, __P ((int __ver, __const char *__filename,
+				       struct stat *__stat_buf)), _lxstat64);
 
 # else
-#  define __fxstat __fxstat64
-#  define __xstat __xstat64
-#  define __lxstat __lxstat64
+#  define _fxstat _fxstat64
+#  define _xstat _xstat64
+#  define _lxstat _lxstat64
 # endif
 #endif
 
 #ifdef __USE_LARGEFILE64
-extern int __fxstat64 __P ((int __ver, int __fildes,
+extern int _fxstat64 __P ((int __ver, int __fildes,
 			    struct stat64 *__stat_buf));
-extern int __xstat64 __P ((int __ver, __const char *__filename,
+extern int _xstat64 __P ((int __ver, __const char *__filename,
 			   struct stat64 *__stat_buf));
-extern int __lxstat64 __P ((int __ver, __const char *__filename,
+extern int _lxstat64 __P ((int __ver, __const char *__filename,
 			    struct stat64 *__stat_buf));
 #endif
-extern int __xmknod __P ((int __ver, __const char *__path,
+extern int _xmknod __P ((int __ver, __const char *__path,
 			  __mode_t __mode, __dev_t *__dev));
 
 #if defined __GNUC__ && __GNUC__ >= 2
@@ -315,27 +315,27 @@ extern int __xmknod __P ((int __ver, __const char *__path,
 extern __inline__ int stat (__const char *__path,
 			    struct stat *__statbuf) 
 {
-  return __xstat (_STAT_VER, __path, __statbuf);
+  return _xstat (_STAT_VER, __path, __statbuf);
 }
 
 # if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
 extern __inline__ int lstat (__const char *__path,
 			     struct stat *__statbuf) 
 {
-  return __lxstat (_STAT_VER, __path, __statbuf);
+  return _lxstat (_STAT_VER, __path, __statbuf);
 }
 # endif
 
 extern __inline__ int fstat (int __fd, struct stat *__statbuf) 
 {
-  return __fxstat (_STAT_VER, __fd, __statbuf);
+  return _fxstat (_STAT_VER, __fd, __statbuf);
 }
 
 # if defined __USE_MISC || defined __USE_BSD
 extern __inline__ int mknod (__const char *__path, __mode_t __mode,
 			     __dev_t __dev) 
 {
-  return __xmknod (_MKNOD_VER, __path, __mode, &__dev);
+  return _xmknod (_MKNOD_VER, __path, __mode, &__dev);
 }
 # endif
 
@@ -343,20 +343,20 @@ extern __inline__ int mknod (__const char *__path, __mode_t __mode,
 extern __inline__ int stat64 (__const char *__path,
 			      struct stat64 *__statbuf) 
 {
-  return __xstat64 (_STAT_VER, __path, __statbuf);
+  return _xstat64 (_STAT_VER, __path, __statbuf);
 }
 
 #  if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
 extern __inline__ int lstat64 (__const char *__path,
 			       struct stat64 *__statbuf) 
 {
-  return __lxstat64 (_STAT_VER, __path, __statbuf);
+  return _lxstat64 (_STAT_VER, __path, __statbuf);
 }
 #  endif
 
 extern __inline__ int fstat64 (int __fd, struct stat64 *__statbuf) 
 {
-  return __fxstat64 (_STAT_VER, __fd, __statbuf);
+  return _fxstat64 (_STAT_VER, __fd, __statbuf);
 }
 # endif
 

+ 23 - 38
include/sys/uio.h

@@ -1,64 +1,49 @@
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* Copyright (C) 1991, 1992, 1996, 1997, 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 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 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.
+   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, 1992 Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   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
-
 #define _SYS_UIO_H	1
-#include <features.h>
-
-__BEGIN_DECLS
 
-#define	__need_size_t
-#include <stddef.h>
-
-/* That is a klude for Linux. */
-#ifdef __linux__
-#include <linux/socket.h>
-#endif
+#include <features.h>
 
-#ifndef __LINUX_UIO_H
+#include <sys/types.h>
 
-/* Structure describing a section of memory.  */
+__BEGIN_DECLS
 
-struct iovec
-{
-  /* Starting address.  */
-  __ptr_t iov_base;
-  /* Length in bytes.  */
-  size_t iov_len;
-};
+/* This file defines `struct iovec'.  */
+#include <bits/uio.h>
 
-#endif
 
 /* Read data from file descriptor FD, and put the result in the
    buffers described by VECTOR, which is a vector of COUNT `struct iovec's.
    The buffers are filled in the order specified.
    Operates just like `read' (see <unistd.h>) except that data are
    put in VECTOR instead of a contiguous buffer.  */
-int readv __P ((int __fd, __const struct iovec * __vector, size_t __count));
+extern ssize_t readv __P ((int __fd, __const struct iovec *__vector,
+			   int __count));
 
 /* Write data pointed by the buffers described by VECTOR, which
    is a vector of COUNT `struct iovec's, to file descriptor FD.
    The data is written in the order specified.
    Operates just like `write' (see <unistd.h>) except that the data
    are taken from VECTOR instead of a contiguous buffer.  */
-int writev __P ((int __fd, __const struct iovec * __vector, size_t __count));
-
+extern ssize_t writev __P ((int __fd, __const struct iovec *__vector,
+			    int __count));
 
 __END_DECLS
 

+ 72 - 2
include/unistd.h

@@ -65,13 +65,71 @@ extern char * mktemp __P ((char * __template));
 
 extern int _clone __P ((int (*fn)(void *arg), void *child_stack, int flags, void *arg));
 
+/* Return the current machine's Internet number.  */
+extern long int gethostid __P ((void));
 
-/* Make PATH be the root directory (the starting point for absolute paths).
+/* Put the name of the current host in no more than LEN bytes of NAME.
+   The result is null-terminated if LEN is large enough for the full
+   name and the terminator.  */
+extern int gethostname __P ((char *__name, size_t __len));
+
+/* Set the name of the current host to NAME, which is LEN bytes long.
    This call is restricted to the super-user.  */
-extern int chroot __P ((__const char *__path));
+extern int sethostname __P ((__const char *__name, size_t __len));
+
+
+/* Set the user ID of the calling process to UID.
+   If the calling process is the super-user, set the real
+   and effective user IDs, and the saved set-user-ID to UID;
+   if not, the effective user ID is set to UID.  */
+extern int setuid __P ((__uid_t __uid));
+
+/* Create a new session with the calling process as its leader.
+   The process group IDs of the session and the calling process
+   are set to the process ID of the calling process, which is returned.  */
+extern __pid_t setsid __P ((void));
+
+/* Get the real user ID of the calling process.  */
+extern __uid_t getuid __P ((void));
+
+/* Get the effective user ID of the calling process.  */
+extern __uid_t geteuid __P ((void));
+
+/* Get the real group ID of the calling process.  */
+extern __gid_t getgid __P ((void));
+
+/* Get the effective group ID of the calling process.  */
+extern __gid_t getegid __P ((void));
+
+/* If SIZE is zero, return the number of supplementary groups
+   the calling process is in.  Otherwise, fill in the group IDs
+   of its supplementary groups in LIST and return the number written.  */
+extern int getgroups __P ((int __size, __gid_t __list[]));
+
 
 
+/* Return the foreground process group ID of FD.  */
+extern __pid_t tcgetpgrp __P ((int __fd));
+/* Set the foreground process group ID of FD set PGRP_ID.  */
+extern int tcsetpgrp __P ((int __fd, __pid_t __pgrp_id));
 
+/* Get the process group ID of the calling process.
+   This function is different on old BSD. */
+extern __pid_t getpgrp __P ((void));
+/* Set the process group ID of the process matching PID to PGID.
+   If PID is zero, the current process's process group ID is set.
+   If PGID is zero, the process ID of the process is used.  */
+extern int setpgid __P ((__pid_t __pid, __pid_t __pgid));
+
+/* Get the process ID of the calling process.  */
+extern __pid_t getpid __P ((void));
+
+
+
+
+/* Make PATH be the root directory (the starting point for absolute paths).
+   This call is restricted to the super-user.  */
+extern int chroot __P ((__const char *__path));
 
 /* Execute PATH with all arguments after PATH until
    a NULL pointer and environment from `environ'.  */
@@ -113,6 +171,18 @@ extern __pid_t fork __P ((void));
  *          and the process ID of the new process to the old process.  */
 extern __pid_t vfork __P ((void));
 
+/* Return the number of bytes in a page.  This is the system's page size,
+   which is not necessarily the same as the hardware page size.  */
+extern int getpagesize __P ((void)) __attribute__ ((__const__));
+
+#ifdef	__USE_POSIX2
+/* Get definitions and prototypes for functions to process the
+   arguments in ARGV (ARGC of them, minus the program name) for
+   options given in OPTS.  */
+# define __need_getopt
+# include <getopt.h>
+#endif
+
 
 #ifndef SEEK_SET
 #define SEEK_SET 0

+ 68 - 0
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 */

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

+ 46 - 0
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.  */
+  };

+ 87 - 0
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)