1997-07-13 01:18  Ulrich Drepper  <drepper@cygnus.com>

	* setjmp/setjmp.h: Define _setjmp and _longjmp also if __USE_XOPEN.

	* sysdeps/unix/sysv/linux/bits/ipc.h: Fix comment.
	* sysdeps/unix/sysv/linux/bits/msq.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/sem.h: Likewise.
	* sysdeps/unix/sysv/linux/bits/shm.h: Likewise.

	* time/Makefile (routines): Add getdate.
	* time/time.h: Add prototype for getdate and getdate_r.
	* time/getdate.c: New file.
	Provided by Mark Kettenis <kettenis@phys.uva.nl>.

1997-06-30 14:49  H.J. Lu  <hjl@gnu.ai.mit.edu>

	From Ralf Baechle <ralf@informatik.uni-koblenz.de> on
	Sat Jun 21 18:11:21 1997:

	* sysdeps/unix/sysv/linux/syscalls.list (swapon): Add __swapon alias.
	(swapoff): New.

	* elf/Makefile: Add linker script support.
	(headers): Add bits/dlfcn.h.

	* elf/dl-load.c (MAP_BASE_ADDR): New.

	* elf/dlfcn.h: Include <bits/dlfcn.h>.

	* elf/elf.h: Add MIPS support.

	* sysdeps/generic/Dist: Add entry.h.
	* sysdeps/generic/entry.h: New, define the entry symbol.

	* elf/rtld.c (_start): Include <entry.h>.  Change to ENTRY_POINT.
	* sysdeps/generic/dl-sysdep.c (_start): Likewise.
	* mips/elf/start.S (_start): Likewise.

	* sysdeps/mips/bsd-_setjmp.S: Fix PIC.
	* sysdeps/mips/bsd-setjmp.S: Likewise.
	* sysdeps/mips/setjmp.S: Likewise.
	* mips/elf/start.S: Likewise.
	* sysdeps/unix/mips/brk.S: Likewise.
	* sysdeps/unix/mips/sysdep.S: Likewise.
	* sysdeps/unix/mips/sysdep.h: Likewise.
	* sysdeps/unix/mips/wait.S: Likewise.

	* sysdeps/mips/dl-machine.h: Update for Linux/MIPS.
	* sysdeps/mips/fpu_control.h: Likewise.

	* sysdeps/generic/bits/dlfcn.h: New file.

	* sysdeps/mips/rtld-ldscript.in: New for Linux/MIPS.
	* sysdeps/mips/rtld-parms: Likewise.
	* sysdeps/mips/bits/dlfcn.h: Likewise.
	* sysdeps/mips/mips64/rtld-parms: Likewise.
	* sysdeps/mips/mipsel/rtld-parms: Likewise.
	* sysdeps/unix/sysv/linux/mips/Dist: Likewise.
	* sysdeps/unix/sysv/linux/mips/Makefile: Likewise.
	* sysdeps/unix/sysv/linux/mips/clone.S: Likewise.
	* sysdeps/unix/sysv/linux/mips/entry.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/fpregdef.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/fxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/kernel_sigaction.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/kernel_stat.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/kernel_termios.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/lxstat.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/regdef.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sgidefs.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise.
	* sysdeps/unix/sysv/linux/mips/ustat.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/xmknod.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/xstat.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/endian.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/fcntl.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/ioctl-types.h:
	* sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/shm.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/signum.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/socket.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/stat.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/statfs.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/termios.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/bits/time.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/acct.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/asm.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/cachectl.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/fpregdef.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/procfs.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/regdef.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/syscall.h: Likewise.
	* sysdeps/unix/sysv/linux/mips/sys/sysmips.h: Likewise.

1997-04-09 19:05  H.J. Lu (hjl@gnu.ai.mit.edu)

	* isomac.c (xstrndup): New, use it instead of strndup ().

1997-07-02 08:55  H.J. Lu  <hjl@gnu.ai.mit.edu>

	* sysdeps/i386/dl-machine.h (elf_machine_rel): Print
	the program name for different sizes.

1997-07-10 15:47  Fila Kolodny  <fila@ibi.com>

	* nis/ypclnt.c: Change references to MAXHOSTNAMELEN to NIS_MAXNAMELEN.
	Add include of rpcsvc/nis.h.
	* inet/getnameinfo.c: Delete references to MAXHOSTNAMELEN.
	* sysdeps/posix/getaddrinfo.c: Likewise.
	Change size of variable buffer to be big enough to hold an IPv6
	address in printable format.

1997-07-12 18:47  Ulrich Drepper  <drepper@cygnus.com>

	* assert/assert.h [!NDEBUG] (assert, assert_perror): Don't use ||
	and && in tests to allow use in C++ code which overloads these
	operators.  Reported by Istvan Marko <istvan@cmdmail.amd.com>.

	* configure.in: Move mips64* recognition before mips*.
	Patch by Zack Weinberg <zack@rabi.phys.columbia.edu>.

1997-07-03 20:44  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makerules (lib%.so, $(common-objpfx)libc.so): Don't use
	automatic variables in dependency lists.
	(build-shlib): Always filter out the version script file.
	* extra-lib.mk ($(objpfx)$(lib).so): Depend on version script.

1997-07-12 17:56  Ulrich Drepper  <drepper@cygnus.com>

	* login/login.c (tty_name): Test return value of ttyname_r for !=
	0, not < 0.
	* misc/ttyslot.c (ttyslot): Test return value of ttyname_r for ==
	0, not >= 0.
	* sysdeps/unix/getlogin.c (getlogin): Test return value of
	ttyname_r for != 0.
	* sysdeps/unix/getlogin_r.c (getlogin_r): Likewise.

1997-07-10  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* login/utmp_file.c (getutline_r_file): Fix type: compare with
	*result.

1997-07-11 00:21  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/Makefile (headers): Add utmpx.h and bits/utmpx.h.

1997-07-09 19:21  Mark Kettenis  <kettenis@phys.uva.nl>

	* login/programs/utmpd.c, login/programs/database.c,
	login/programs/request.c: Prepare messages for
	internationalization.

	* login/programs/utmpd.c:
	(main): Change handling of errors in opening the database.
	* login/programs/database.c:
	(open_database, synchronize_dtatabase, initialize_database):
	Properly handle errors.
	(get_mtime): Use fstat instead of stat.  All callers changed.

	* login/getutent_r.c: Make setutxent a weak alias for __setutxent.
	* login/getutent.c: Rename getutent to __getutent and make
	getutent a weak alias.
	Make getutxent a weak alias for	__getutent.
	* login/utmpx.h: New file.
	* sysdeps/gnu/bits/utmp.h: Cleanup.  Added comments.
	* sysdeps/gnu/bits/utmpx.h: New file.

	* stdio-common/strops.c: Partialy undo last change.  Will need
	more investigation.
This commit is contained in:
Ulrich Drepper 1997-07-12 23:35:19 +00:00
parent 2d7da676f3
commit f21acc89c0
95 changed files with 4750 additions and 3295 deletions

171
ChangeLog
View File

@ -1,3 +1,171 @@
1997-07-13 01:18 Ulrich Drepper <drepper@cygnus.com>
* setjmp/setjmp.h: Define _setjmp and _longjmp also if __USE_XOPEN.
* sysdeps/unix/sysv/linux/bits/ipc.h: Fix comment.
* sysdeps/unix/sysv/linux/bits/msq.h: Likewise.
* sysdeps/unix/sysv/linux/bits/sem.h: Likewise.
* sysdeps/unix/sysv/linux/bits/shm.h: Likewise.
* time/Makefile (routines): Add getdate.
* time/time.h: Add prototype for getdate and getdate_r.
* time/getdate.c: New file.
Provided by Mark Kettenis <kettenis@phys.uva.nl>.
1997-06-30 14:49 H.J. Lu <hjl@gnu.ai.mit.edu>
From Ralf Baechle <ralf@informatik.uni-koblenz.de> on
Sat Jun 21 18:11:21 1997:
* sysdeps/unix/sysv/linux/syscalls.list (swapon): Add __swapon alias.
(swapoff): New.
* elf/Makefile: Add linker script support.
(headers): Add bits/dlfcn.h.
* elf/dl-load.c (MAP_BASE_ADDR): New.
* elf/dlfcn.h: Include <bits/dlfcn.h>.
* elf/elf.h: Add MIPS support.
* sysdeps/generic/Dist: Add entry.h.
* sysdeps/generic/entry.h: New, define the entry symbol.
* elf/rtld.c (_start): Include <entry.h>. Change to ENTRY_POINT.
* sysdeps/generic/dl-sysdep.c (_start): Likewise.
* mips/elf/start.S (_start): Likewise.
* sysdeps/mips/bsd-_setjmp.S: Fix PIC.
* sysdeps/mips/bsd-setjmp.S: Likewise.
* sysdeps/mips/setjmp.S: Likewise.
* mips/elf/start.S: Likewise.
* sysdeps/unix/mips/brk.S: Likewise.
* sysdeps/unix/mips/sysdep.S: Likewise.
* sysdeps/unix/mips/sysdep.h: Likewise.
* sysdeps/unix/mips/wait.S: Likewise.
* sysdeps/mips/dl-machine.h: Update for Linux/MIPS.
* sysdeps/mips/fpu_control.h: Likewise.
* sysdeps/generic/bits/dlfcn.h: New file.
* sysdeps/mips/rtld-ldscript.in: New for Linux/MIPS.
* sysdeps/mips/rtld-parms: Likewise.
* sysdeps/mips/bits/dlfcn.h: Likewise.
* sysdeps/mips/mips64/rtld-parms: Likewise.
* sysdeps/mips/mipsel/rtld-parms: Likewise.
* sysdeps/unix/sysv/linux/mips/Dist: Likewise.
* sysdeps/unix/sysv/linux/mips/Makefile: Likewise.
* sysdeps/unix/sysv/linux/mips/clone.S: Likewise.
* sysdeps/unix/sysv/linux/mips/entry.h: Likewise.
* sysdeps/unix/sysv/linux/mips/fpregdef.h: Likewise.
* sysdeps/unix/sysv/linux/mips/fxstat.c: Likewise.
* sysdeps/unix/sysv/linux/mips/kernel_sigaction.h: Likewise.
* sysdeps/unix/sysv/linux/mips/kernel_stat.h: Likewise.
* sysdeps/unix/sysv/linux/mips/kernel_termios.h: Likewise.
* sysdeps/unix/sysv/linux/mips/lxstat.c: Likewise.
* sysdeps/unix/sysv/linux/mips/regdef.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sgidefs.h: Likewise.
* sysdeps/unix/sysv/linux/mips/syscalls.list: Likewise.
* sysdeps/unix/sysv/linux/mips/ustat.c: Likewise.
* sysdeps/unix/sysv/linux/mips/xmknod.c: Likewise.
* sysdeps/unix/sysv/linux/mips/xstat.c: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/endian.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/fcntl.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/ioctl-types.h:
* sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/shm.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/sigaction.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/signum.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/socket.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/stat.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/statfs.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/termios.h: Likewise.
* sysdeps/unix/sysv/linux/mips/bits/time.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/acct.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/asm.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/cachectl.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/fpregdef.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/procfs.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/regdef.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/syscall.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sys/sysmips.h: Likewise.
1997-04-09 19:05 H.J. Lu (hjl@gnu.ai.mit.edu)
* isomac.c (xstrndup): New, use it instead of strndup ().
1997-07-02 08:55 H.J. Lu <hjl@gnu.ai.mit.edu>
* sysdeps/i386/dl-machine.h (elf_machine_rel): Print
the program name for different sizes.
1997-07-10 15:47 Fila Kolodny <fila@ibi.com>
* nis/ypclnt.c: Change references to MAXHOSTNAMELEN to NIS_MAXNAMELEN.
Add include of rpcsvc/nis.h.
* inet/getnameinfo.c: Delete references to MAXHOSTNAMELEN.
* sysdeps/posix/getaddrinfo.c: Likewise.
Change size of variable buffer to be big enough to hold an IPv6
address in printable format.
1997-07-12 18:47 Ulrich Drepper <drepper@cygnus.com>
* assert/assert.h [!NDEBUG] (assert, assert_perror): Don't use ||
and && in tests to allow use in C++ code which overloads these
operators. Reported by Istvan Marko <istvan@cmdmail.amd.com>.
* configure.in: Move mips64* recognition before mips*.
Patch by Zack Weinberg <zack@rabi.phys.columbia.edu>.
1997-07-03 20:44 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makerules (lib%.so, $(common-objpfx)libc.so): Don't use
automatic variables in dependency lists.
(build-shlib): Always filter out the version script file.
* extra-lib.mk ($(objpfx)$(lib).so): Depend on version script.
1997-07-12 17:56 Ulrich Drepper <drepper@cygnus.com>
* login/login.c (tty_name): Test return value of ttyname_r for !=
0, not < 0.
* misc/ttyslot.c (ttyslot): Test return value of ttyname_r for ==
0, not >= 0.
* sysdeps/unix/getlogin.c (getlogin): Test return value of
ttyname_r for != 0.
* sysdeps/unix/getlogin_r.c (getlogin_r): Likewise.
1997-07-10 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* login/utmp_file.c (getutline_r_file): Fix type: compare with
*result.
1997-07-11 00:21 Mark Kettenis <kettenis@phys.uva.nl>
* login/Makefile (headers): Add utmpx.h and bits/utmpx.h.
1997-07-09 19:21 Mark Kettenis <kettenis@phys.uva.nl>
* login/programs/utmpd.c, login/programs/database.c,
login/programs/request.c: Prepare messages for
internationalization.
* login/programs/utmpd.c:
(main): Change handling of errors in opening the database.
* login/programs/database.c:
(open_database, synchronize_dtatabase, initialize_database):
Properly handle errors.
(get_mtime): Use fstat instead of stat. All callers changed.
* login/getutent_r.c: Make setutxent a weak alias for __setutxent.
* login/getutent.c: Rename getutent to __getutent and make
getutent a weak alias.
Make getutxent a weak alias for __getutent.
* login/utmpx.h: New file.
* sysdeps/gnu/bits/utmp.h: Cleanup. Added comments.
* sysdeps/gnu/bits/utmpx.h: New file.
1997-07-11 03:00 Ulrich Drepper <drepper@cygnus.com>
* inet/inet_ntoa.c: Prevent looking for thread data key if we found
@ -23,6 +191,9 @@
function with return value.
Reported by Andreas Jaeger.
* stdio-common/strops.c: Partialy undo last change. Will need
more investigation.
1997-07-10 Marcus G. Daniels <marcus@cathcart.sysc.pdx.edu>
* sysdeps/mach/hurd/select.c (__select): Need bit count for

View File

@ -344,7 +344,7 @@ endif
# build shared libraries in place from the installed *_pic.a files.
# $(LDLIBS-%.so) may contain -l switches to generate run-time dependencies
# on other shared objects.
lib%.so: lib%_pic.a $(load-map-file); $(build-shlib)
lib%.so: lib%_pic.a; $(build-shlib)
ifeq ($(have-no-whole-archive),yes)
no-whole-archive = -Wl,--no-whole-archive
@ -367,7 +367,7 @@ $(LINK.o) -shared -o $@ $(sysdep-LDFLAGS) $(config-LDFLAGS) \
-Wl,-soname=lib$(libprefix)$(@F:lib%.so=%).so$($(@F)-version) \
$(LDFLAGS.so) $(LDFLAGS-$(@F:lib%.so=%).so) \
-L$(subst :, -L,$(rpath-link)) -Wl,-rpath-link=$(rpath-link) \
-Wl,--whole-archive $(filter-out $(load-map-file),$^) \
-Wl,--whole-archive $(filter-out $($(@F:.so=)-map),$^) \
$(no-whole-archive) $(LDLIBS-$(@F:lib%.so=%).so)
endef
@ -385,7 +385,7 @@ libc-map = $(..)libc.map
$(common-objpfx)libc.so: $(elfobjdir)/soinit.so \
$(common-objpfx)libc_pic.a \
$(elfobjdir)/sofini.so $(elfobjdir)/ld.so \
$(load-map-file)
$(libc-map)
$(build-shlib)
ifdef libc.so-version
$(common-objpfx)libc.so$(libc.so-version): $(common-objpfx)libc.so

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 92, 94, 95, 96 Free Software Foundation, Inc.
/* Copyright (C) 1991, 92, 94, 95, 96, 97 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
@ -37,7 +37,7 @@
#ifdef NDEBUG
#define assert(expr) ((void) 0)
# define assert(expr) ((void) 0)
/* void assert_perror (int errnum);
@ -45,14 +45,12 @@
error message with the error text for ERRNUM and abort.
(This is a GNU extension.) */
#ifdef __USE_GNU
#define assert_perror(errnum) ((void) 0)
#endif
# ifdef __USE_GNU
# define assert_perror(errnum) ((void) 0)
# endif
#else /* Not NDEBUG. */
#include <sys/cdefs.h>
__BEGIN_DECLS
/* This prints an "Assertion failed" message and aborts. */
@ -71,27 +69,27 @@ extern void __assert_perror_fail __P ((int __errnum,
__END_DECLS
#define assert(expr) \
((void) ((expr) || \
# define assert(expr) \
((void) ((expr) ? 0 : \
(__assert_fail (__STRING(expr), \
__FILE__, __LINE__, __ASSERT_FUNCTION), 0)))
#ifdef __USE_GNU
#define assert_perror(errnum) \
((void) ((errnum) && (__assert_perror_fail ((errnum), \
__FILE__, __LINE__, \
__ASSERT_FUNCTION), 0)))
#endif
# ifdef __USE_GNU
# define assert_perror(errnum) \
((void) ((errnum) ? 0 : (__assert_perror_fail ((errnum), \
__FILE__, __LINE__, \
__ASSERT_FUNCTION), 0)))
# endif
/* Version 2.4 and later of GCC define a magical variable `__PRETTY_FUNCTION__'
which contains the name of the function currently being defined.
This is broken in G++ before version 2.6. */
#if (!defined (__GNUC__) || __GNUC__ < 2 || \
__GNUC_MINOR__ < (defined (__cplusplus) ? 6 : 4))
#define __ASSERT_FUNCTION ((__const char *) 0)
#else
#define __ASSERT_FUNCTION __PRETTY_FUNCTION__
#endif
# if (!defined __GNUC__ || __GNUC__ < 2 || \
__GNUC_MINOR__ < (defined __cplusplus ? 6 : 4))
# define __ASSERT_FUNCTION ((__const char *) 0)
# else
# define __ASSERT_FUNCTION __PRETTY_FUNCTION__
# endif
#endif /* NDEBUG. */

33
bits/dlfcn.h Normal file
View File

@ -0,0 +1,33 @@
/* System dependand definitions for run-time dynamic loading.
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 _BITS_DLFCN_H
#define _BITS_DLFCN_H 1
/* The MODE argument to `dlopen' contains one of the following: */
#define RTLD_LAZY 0x001 /* Lazy function call binding. */
#define RTLD_NOW 0x002 /* Immediate function call binding. */
#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */
/* If the following bit is set in the MODE argument to `dlopen',
the symbols of the loaded object and its dependencies are made
visible as if the object were linked directly into the program. */
#define RTLD_GLOBAL 0x100
#endif /* bits/dlfcn.h */

2754
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -155,8 +155,8 @@ m680?0) base_machine=m68k machine=m68k/$machine ;;
m68k) base_machine=m68k machine=m68k/m68020 ;;
m88???) base_machine=m88k machine=m88k/$machine ;;
m88k) base_machine=m88k machine=m88k/m88100 ;;
mips*) base_machine=mips machine=mips/$machine ;;
mips64*) base_machine=mips64 machine=mips/mips64/$machine ;;
mips*) base_machine=mips machine=mips/$machine ;;
sparc[6789]) base_machine=sparc machine=sparc/$machine ;;
supersparc) base_machine=sparc machine=sparc/sparc8 ;;
sparc64) base_machine=sparc64 machine=sparc64/$machine ;;

View File

@ -20,7 +20,7 @@
subdir := elf
headers = elf.h bits/elfclass.h link.h dlfcn.h
headers = elf.h bits/elfclass.h bits/dlfcn.h link.h dlfcn.h
routines = $(dl-routines) dl-open dl-close dl-symbol dl-support \
dl-version enbl-secure
@ -88,6 +88,30 @@ $(objpfx)dl-allobjs.so: $(rtld-routines:%=$(objpfx)%.so)
$(objpfx)librtld.so: $(objpfx)dl-allobjs.so $(common-objpfx)libc_pic.a
$(reloc-link) '-Wl,-(' $^ -lgcc '-Wl,-)'
# Do we need a linker script?
rtld-ldscript-in := $(firstword $(wildcard $(+sysdep_dirs:%=%/rtld-ldscript.in)))
ifneq (,$(rtld-ldscript-in))
LDFLAGS-rtld = -T $(objpfx)rtld-ldscript
before-compile += $(objpfx)rtld-ldscript
rtld-parms = $(wildcard $(+sysdep_dirs:%=%/rtld-parms))
include $(rtld-parms)
generated += rtld-ldscript
$(objpfx)rtld-ldscript: $(rtld-ldscript-in) $(rtld-parms)
sed -e 's#@@rtld-oformat@@#$(rtld-oformat)#' \
-e 's#@@rtld-arch@@#$(rtld-arch)#' \
-e 's#@@rtld-entry@@#$(rtld-entry)#' \
-e 's#@@rtld-base@@#$(rtld-base)#' $< >$@
$(objpfx)ld.so: $(objpfx)librtld.so $(objpfx)rtld-ldscript
$(rtld-link) -Wl,-soname=$(rtld-installed-name)
define rtld-link
$(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
-Wl,-rpath=$(default-rpath) $(LDFLAGS-rtld) \
$(filter-out $(objpfx)rtld-ldscript,$^)
endef
else
$(objpfx)ld.so: $(objpfx)librtld.so
$(rtld-link) -Wl,-soname=$(rtld-installed-name)
@ -95,6 +119,7 @@ define rtld-link
$(LINK.o) -nostdlib -nostartfiles -shared -o $@ \
-Wl,-rpath=$(default-rpath) $^
endef
endif
# The dl code in the static libc needs a default library path.
CFLAGS-dl-support.c = -D'DEFAULT_RPATH="$(default-rpath)"'

View File

@ -44,6 +44,15 @@
#define MAP_COPY MAP_PRIVATE
#endif
/* Some systems link their relocatable objects for another base address
than 0. We want to know the base address for these such that we can
subtract this address from the segment addresses during mapping.
This results in a more efficient address space usage. Defaults to
zero for almost all systems. */
#ifndef MAP_BASE_ADDR
#define MAP_BASE_ADDR(l) 0
#endif
#include <endian.h>
#if BYTE_ORDER == BIG_ENDIAN
@ -335,7 +344,8 @@ _dl_map_object_from_fd (char *name, int fd, char *realname,
caddr_t mapat;
ElfW(Addr) mappref;
size_t maplength = loadcmds[nloadcmds - 1].allocend - c->mapstart;
mappref = ELF_PREFERRED_ADDRESS (loader, maplength, c->mapstart);
mappref = (ELF_PREFERRED_ADDRESS (loader, maplength, c->mapstart)
- MAP_BASE_ADDR (l));
mapat = map_segment (mappref, maplength, c->prot, 0, c->mapoff);
l->l_addr = (ElfW(Addr)) mapat - c->mapstart;

View File

@ -22,15 +22,8 @@
#include <features.h>
/* The MODE argument to `dlopen' contains one of the following: */
#define RTLD_LAZY 0x001 /* Lazy function call binding. */
#define RTLD_NOW 0x002 /* Immediate function call binding. */
#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */
/* If the following bit is set in the MODE argument to `dlopen',
the symbols of the loaded object and its dependencies are made
visible as if the object were linked directly into the program. */
#define RTLD_GLOBAL 0x100
/* Collect various system dependand definitions and declarations. */
#include <bits/dlfcn.h>
/* If the first argument of `dlsym' is set to RTLD_NEXT the run-time
address of the symbol called NAME in the next shared object is

View File

@ -741,6 +741,8 @@ typedef struct
#define E_MIPS_ARCH_1 0x00000000 /* -mips1 code. */
#define E_MIPS_ARCH_2 0x10000000 /* -mips2 code. */
#define E_MIPS_ARCH_3 0x20000000 /* -mips3 code. */
#define E_MIPS_ARCH_4 0x30000000 /* -mips4 code. */
#define E_MIPS_ARCH_5 0x40000000 /* -mips5 code. */
/* Special section indices. */
@ -810,6 +812,8 @@ typedef struct
/* Legal values for p_type field of Elf32_Phdr. */
#define PT_MIPS_REGINFO 0x70000000 /* Register usage information */
#define PT_MIPS_RTPROC 0x70000001 /* Runtime procedure table. */
#define PT_MIPS_OPTIONS 0x70000002
/* Legal values for d_tag field of Elf32_Dyn. */

View File

@ -25,6 +25,7 @@
#include <sys/mman.h> /* Check if MAP_ANON is defined. */
#include <stdio-common/_itoa.h>
#include <assert.h>
#include <entry.h>
#include "dynamic-link.h"
@ -137,7 +138,7 @@ _dl_start (void *arg)
/* Now life is peachy; we can do all normal operations.
On to the real work. */
void _start (void);
void ENTRY_POINT (void);
/* Some helper functions. */
@ -268,7 +269,7 @@ dl_main (const ElfW(Phdr) *phdr,
/* Set up a flag which tells we are just starting. */
_dl_starting_up = 1;
if (*user_entry == (ElfW(Addr)) &_start)
if (*user_entry == (ElfW(Addr)) &ENTRY_POINT)
{
/* Ho ho. We are not the program interpreter! We are the program
itself! This means someone ran ld.so as a command. Well, that

View File

@ -49,4 +49,7 @@ endef
object-suffixes-left = $(object-suffixes-$(lib))
include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-$(lib)))
# Add the version script to the dependencies of the shared library.
$(objpfx)$(lib).so: $($(lib)-map)
endif

View File

@ -72,16 +72,11 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
struct hostent *_addr2hostname_hosts(const char *, int, int);
#endif /* HOSTTABLE */
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 128
#endif
#ifndef min
#define min(x,y) (((x) > (y)) ? (y) : (x))
#endif /* min */
static char *domain;
static char domainbuffer[MAXHOSTNAMELEN];
static const char *domain;
static char *nrl_domainname(void)
{
@ -114,32 +109,34 @@ static char *nrl_domainname(void)
}
if (h && (c = strchr(h->h_name, '.'))) {
strcpy(domain = domainbuffer, ++c);
domain = __strdup (++c);
goto ret;
}
if (!gethostname(domainbuffer, sizeof(domainbuffer))) {
if (c = strchr(domainbuffer, '.')) {
domain = ++c;
goto ret;
}
while (gethostname (tmpbuf, tmpbuflen)) {
tmpbuflen *= 2;
tmpbuf = __alloca (tmpbuflen);
}
if (c = strchr(tmpbuf, '.')) {
domain = __strdup(++c);
goto ret;
}
while (__gethostbyname_r(domainbuffer, &th, tmpbuf, tmpbuflen, &h,
&herror)) {
if (herror == NETDB_INTERNAL) {
if (errno == ERANGE) {
tmpbuflen *= 2;
tmpbuf = __alloca(tmpbuflen);
}
} else {
break;
while (__gethostbyname_r(tmpbuf, &th, tmpbuf, tmpbuflen, &h,
&herror)) {
if (herror == NETDB_INTERNAL) {
if (errno == ERANGE) {
tmpbuflen *= 2;
tmpbuf = __alloca(tmpbuflen);
}
} else {
break;
}
}
if (h && (c = strchr(h->h_name, '.'))) {
strcpy(domain = domainbuffer, ++c);
goto ret;
}
if (h && (c = strchr(h->h_name, '.'))) {
domain = __strdup(++c);
goto ret;
}
{
@ -147,7 +144,9 @@ static char *nrl_domainname(void)
in_addr.s_addr = htonl(0x7f000001);
while (__gethostbyaddr_r((const char *)&in_addr, sizeof(struct in_addr), AF_INET, &th, tmpbuf, tmpbuflen, &h, &herror)) {
while (__gethostbyaddr_r((const char *)&in_addr,
sizeof(struct in_addr), AF_INET, &th, tmpbuf,
tmpbuflen, &h, &herror)) {
if (herror == NETDB_INTERNAL) {
if (errno == ERANGE) {
tmpbuflen *= 2;
@ -159,7 +158,7 @@ static char *nrl_domainname(void)
}
if (h && (c = strchr(h->h_name, '.'))) {
domain = domainbuffer, ++c;
domain = __strdup(++c);
goto ret;
}
}
@ -168,7 +167,7 @@ static char *nrl_domainname(void)
ret:
__libc_lock_unlock (lock);
};
}
return domain;
};

View File

@ -185,6 +185,7 @@ char *CC;
/* The -I parameters for CC to find all headers. */
char *INC;
static char *xstrndup (const char *, size_t);
static const char **get_null_defines (void);
static int check_header (const char *, const char **);
@ -222,6 +223,20 @@ main (int argc, char *argv[])
}
static char *
xstrndup (const char *s, size_t n)
{
size_t len = n;
char *new = malloc (len + 1);
if (new == NULL)
return NULL;
new[len] = '\0';
return memcpy (new, s, len);
}
static const char **
get_null_defines (void)
{
@ -285,7 +300,7 @@ get_null_defines (void)
start = &line[8];
for (end = start + 1; !isspace (*end) && *end != '\0'; ++end)
;
result[result_len++] = strndup (start, end - start);
result[result_len++] = xstrndup (start, end - start);
if (first)
{

View File

@ -88,7 +88,7 @@ DEFUN(_IO_str_init_static, (fp, ptr, size, pstart),
if (pstart)
{
fp->_IO_write_ptr = pstart;
fp->_IO_write_end = pstart;
fp->_IO_write_end = ptr + size;
fp->_IO_read_end = pstart;
}
else
@ -158,7 +158,7 @@ DEFUN(_IO_str_overflow, (fp, c),
fp->_IO_write_ptr = new_buf + (fp->_IO_write_ptr - old_buf);
fp->_IO_write_base = new_buf;
fp->_IO_write_end = new_buf + (fp->_IO_write_end - old_buf);
fp->_IO_write_end = fp->_IO_buf_end;
}
}

View File

@ -22,7 +22,7 @@
subdir := login
headers := utmp.h bits/utmp.h lastlog.h pty.h
headers := utmp.h bits/utmp.h utmpx.h bits/utmpx.h lastlog.h pty.h
routines := getutent getutent_r getutid getutline getutid_r getutline_r \
utmp_file utmp_daemon utmpname updwtmp

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1996 Free Software Foundation, Inc.
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@ -25,7 +25,7 @@ static struct utmp buffer;
struct utmp *
getutent (void)
__getutent (void)
{
struct utmp *result;
@ -34,3 +34,5 @@ getutent (void)
return result;
}
weak_alias (__getutent, getutent)
weak_alias (__getutent, getutxent)

View File

@ -63,6 +63,7 @@ __setutent (void)
__libc_lock_unlock (__libc_utmp_lock);
}
weak_alias (__setutent, setutent)
weak_alias (__setutent, setutxent)
static int
@ -105,6 +106,7 @@ __endutent (void)
__libc_lock_unlock (__libc_utmp_lock);
}
weak_alias (__endutent, endutent)
weak_alias (__endutent, endutxent)
static void
@ -154,8 +156,9 @@ __pututline (const struct utmp *data)
return buffer;
}
weak_alias (__pututline, pututline)
weak_alias (__pututline, pututxline)
static struct utmp *
pututline_unknown (const struct utmp *data)
{

View File

@ -43,7 +43,7 @@ tty_name (int fd, char **tty, size_t buf_len)
{
rv = ttyname_r (fd, buf, buf_len);
if (rv < 0 || memchr (buf, '\0', buf_len))
if (rv != 0 || memchr (buf, '\0', buf_len))
/* We either got an error, or we succeeded and the
returned name fit in the buffer. */
break;

View File

@ -42,13 +42,13 @@ static int replace_entry (utmp_database *database, int old_position,
int new_position, const struct utmp *entry);
static int store_entry (utmp_database *database, int position,
const struct utmp *entry);
static int get_mtime (const char *file, time_t *timer);
static int get_mtime (int filedes, time_t *timer);
/* Open the database specified by FILE and merge it with the
contents of the old format file specified by OLD_FILE. Returns a
pointer to a newly allocated structure describing the database, or
NULL on error. */
/* Open the database specified by FILE and merge it with the contents
of the old format file specified by OLD_FILE. Returns a pointer to
a newly allocated structure describing the database, or NULL on
error. */
utmp_database *
open_database (const char *file, const char *old_file)
{
@ -57,31 +57,54 @@ open_database (const char *file, const char *old_file)
/* Allocate memory. */
database = (utmp_database *) malloc (sizeof (utmp_database));
if (database == NULL)
return NULL;
{
error (0, 0, _("memory exhausted"));
return NULL;
}
memset (database, 0, sizeof (utmp_database));
/* Open database. */
database->fd = open (file, O_RDWR);
/* Open database, create it if it doesn't exist already. */
database->fd = open (file, O_RDWR | O_CREAT);
if (database->fd < 0)
goto fail;
{
error (0, errno, "%s", file);
goto return_error;
}
database->old_fd = open (old_file, O_RDWR);
if (database->old_fd < 0)
goto fail;
database->file = strdup (file);
if (database->file == NULL)
{
error (0, 0, _("memory exhausted"));
goto return_error;
}
if (old_file)
{
database->old_fd = open (old_file, O_RDWR);
if (database->old_fd < 0)
{
error (0, errno, "%s", old_file);
goto return_error;
}
if ((file && !(database->file = strdup (file)))
|| (old_file && !(database->old_file = strdup (old_file))))
goto fail;
database->old_file = strdup (old_file);
if (database->old_file == NULL)
{
error (0, 0, _("memory exhausted"));
goto return_error;
}
}
if (initialize_database (database) < 0
|| synchronize_database (database) < 0)
goto fail;
/* Initialize database. */
if (initialize_database (database) < 0)
goto return_error;
return database;
fail:
return_error:
close_database (database);
return NULL;
}
@ -100,8 +123,12 @@ synchronize_database (utmp_database *database)
curtime = time (NULL);
if (get_mtime (database->old_file, &mtime) < 0)
return -1;
if (get_mtime (database->old_fd, &mtime) < 0)
{
error (0, errno, _("%s: cannot get modification time"),
database->old_file);
return -1;
}
if (mtime >= database->mtime)
{
@ -118,7 +145,10 @@ synchronize_database (utmp_database *database)
|| !compare_entry (&old_entry, &entry))
{
if (write_entry (database, position, &old_entry) < 0)
return -1;
{
error (0, errno, "%s", database->file);
return -1;
}
}
position++;
@ -325,13 +355,19 @@ initialize_database (utmp_database *database)
|| entry.ut_type == OLD_TIME || entry.ut_type == NEW_TIME)
{
if (store_state_entry (database, position, &entry) < 0)
return -1;
{
error (0, errno, "%s", database->file);
return -1;
}
}
else
#endif
{
if (store_process_entry (database, position, &entry) < 0)
return -1;
{
error (0, errno, "%s", database->file);
return -1;
}
}
/* Update position. */
@ -344,14 +380,17 @@ initialize_database (utmp_database *database)
break;
if (write_old_entry (database, position, &entry) < 0)
return -1;
{
error (0, errno, "%s", database->file);
return -1;
}
/* Update position. */
position++;
}
}
return 0;
return synchronize_database (database);
}
@ -472,14 +511,14 @@ store_entry (utmp_database *database, int position,
}
/* Get modification time of FILE and put it in TIMER. returns 0 if
successful, -1 if not. */
/* Get modification time of the file with file descriptor FILEDES and
put it in TIMER. Returns 0 if successful, -1 if not. */
static int
get_mtime (const char *file, time_t *timer)
get_mtime (int filedes, time_t *timer)
{
struct stat st;
if (stat (file, &st) < 0)
if (fstat (filedes, &st) < 0)
return -1;
*timer = st.st_mtime;

View File

@ -88,7 +88,7 @@ read_data (client_connection *connection)
}
if (nbytes < 0)
error (0, errno, "cannot read from client");
error (0, errno, _("cannot read from client"));
return -1;
}
@ -117,7 +117,7 @@ write_data (client_connection *connection)
}
if (nbytes < 0)
error (0, errno, "cannot write to client");
error (0, errno, _("cannot write to client"));
return -1;
}
@ -164,7 +164,7 @@ send_reply (client_connection *connection, const reply_header *reply)
/* Check if the reply fits in the buffer. */
if ((size_t) (connection->write_end - connection->write_ptr) < reply->size)
{
error (0, 0, "buffer overflow");
error (0, 0, _("buffer overflow"));
return -1;
}

View File

@ -139,12 +139,12 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
/* Check if we are already running. */
if (check_pid (_PATH_UTMPDPID))
error (EXIT_FAILURE, 0, "already running");
error (EXIT_FAILURE, 0, _("already running"));
/* Open UTMP database. */
utmp_db = open_database (_PATH_UTMP "x", _PATH_UTMP);
if (utmp_db == NULL)
error (EXIT_FAILURE, errno, "%s", _PATH_UTMP);
exit (EXIT_FAILURE);
/* Create sockets, with the right permissions. */
mask = umask (S_IXUSR | S_IXGRP | S_IXOTH);
@ -156,7 +156,8 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
/* Set the sockets up to accept connections. */
if (listen (ro_sock, MAX_CONNECTIONS) < 0
|| listen (rw_sock, MAX_CONNECTIONS) < 0)
error (EXIT_FAILURE, errno, "cannot enable socket to accept connections");
error (EXIT_FAILURE, errno,
_("cannot enable socket to accept connections"));
/* Behave like a daemon. */
if (!debug)
@ -164,7 +165,7 @@ warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
openlog ("utmpd", LOG_CONS | LOG_ODELAY, LOG_DAEMON);
if (daemon (0, 0) < 0)
error (EXIT_FAILURE, errno, "cannot auto-background");
error (EXIT_FAILURE, errno, _("cannot auto-background"));
forked = 1;
if (write_pid (_PATH_UTMPDPID) < 0)
@ -235,7 +236,7 @@ make_socket (const char *name)
/* Create the socket. */
sock = socket (PF_UNIX, SOCK_STREAM, 0);
if (sock < 0)
error (EXIT_FAILURE, errno, "cannot create socket");
error (EXIT_FAILURE, errno, _("cannot create socket"));
/* Bind a name to the socket. */
addr.sun_family = AF_UNIX;
@ -277,7 +278,7 @@ void handle_requests (void)
read_fd_set = active_read_fd_set;
write_fd_set = active_write_fd_set;
if (select (FD_SETSIZE, &read_fd_set, &write_fd_set, NULL, NULL) < 0)
error (EXIT_FAILURE, errno, "cannot get input on sockets");
error (EXIT_FAILURE, errno, _("cannot get input on sockets"));
/* Service all the sockets with input pending. */
for (fd = 0; fd < FD_SETSIZE; fd++)
@ -290,7 +291,7 @@ void handle_requests (void)
connection = accept_connection (fd, access);
if (connection == NULL)
error (0, errno, "cannot accept connection");
error (0, errno, _("cannot accept connection"));
FD_SET (connection->sock, &active_read_fd_set);
}
@ -298,7 +299,7 @@ void handle_requests (void)
{
connection = find_connection (fd);
if (connection == NULL)
error (EXIT_FAILURE, 0, "cannot find connection");
error (EXIT_FAILURE, 0, _("cannot find connection"));
if (read_data (connection) < 0)
{
@ -316,7 +317,7 @@ void handle_requests (void)
{
connection = find_connection (fd);
if (connection == NULL)
error (EXIT_FAILURE, 0, "cannot find connection");
error (EXIT_FAILURE, 0, _("cannot find connection"));
if (write_data (connection) < 0)
{

View File

@ -170,7 +170,7 @@ getutline_r_file (const struct utmp *line, struct utmp *buffer,
struct utmp **result)
{
struct flock fl;
if (file_fd < 0 || file_offset == -1l)
{
*result = NULL;
@ -215,7 +215,7 @@ unlock_return:
fl.l_type = F_UNLCK;
fcntl (file_fd, F_SETLKW, &fl);
return ((result == NULL) ? -1 : 0);
return ((*result == NULL) ? -1 : 0);
}
@ -251,7 +251,7 @@ internal_getut_r (const struct utmp *id, struct utmp *buffer)
{
int result = -1;
struct flock fl;
/* Try to get the lock. */
memset (&fl, '\0', sizeof (struct flock));
fl.l_type = F_RDLCK;
@ -432,7 +432,7 @@ updwtmp_file (const char *file, const struct utmp *utmp)
struct flock fl;
off_t offset;
int fd;
/* Open WTMP file. */
fd = open (file, O_WRONLY);
if (fd < 0)
@ -443,7 +443,7 @@ updwtmp_file (const char *file, const struct utmp *utmp)
fl.l_type = F_WRLCK;
fl.l_whence = SEEK_SET;
fcntl (fd, F_SETLKW, &fl);
/* Remember original size of log file. */
offset = lseek (fd, 0, SEEK_END);
if (offset % sizeof (struct utmp) != 0)
@ -465,7 +465,7 @@ updwtmp_file (const char *file, const struct utmp *utmp)
}
result = 0;
unlock_return:
/* And unlock the file. */
fl.l_type = F_UNLCK;

50
login/utmpx.h Normal file
View File

@ -0,0 +1,50 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
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 _UTMPX_H
#define _UTMPX_H 1
#include <features.h>
__BEGIN_DECLS
/* Get system dependent values and data structures. */
#include <bits/utmpx.h>
/* Open user accounting database. */
extern void *setutxent __P ((void));
/* Close user accounting database. */
extern void endutxent __P ((void));
/* Get the next entry from the user accounting database. */
extern struct utmpx *getutxent __P ((void));
/* Get the user accounting database entry corresponding to ID. */
extern struct utmpx *getutxid __P ((const struct utmpx *__id));
/* Get the user accounting database entry corresponding to LINE. */
extern struct utmpx *getutxline __P ((const struct utmpx *__line));
/* Write the entry UTMPX into the user accounting database. */
extern struct utmpx *pututxline __P ((const struct utmpx *__utmpx));
__END_DECLS
#endif /* utmpx.h */

View File

@ -59,7 +59,7 @@ ttyslot()
setttyent();
for (cnt = 0; cnt < 3; ++cnt)
if (__ttyname_r (cnt, name, buflen) >= 0) {
if (__ttyname_r (cnt, name, buflen) == 0) {
if (p = rindex(name, '/'))
++p;
else

View File

@ -22,6 +22,7 @@
#include <fcntl.h>
#include <bits/libc-lock.h>
#include <rpc/rpc.h>
#include <rpcsvc/nis.h>
#include <rpcsvc/yp.h>
#include <rpcsvc/ypclnt.h>
#include <rpcsvc/ypupd.h>
@ -39,7 +40,7 @@ typedef struct dom_binding dom_binding;
static struct timeval TIMEOUT = {25, 0};
static int const MAXTRIES = 5;
static char __ypdomainname[MAXHOSTNAMELEN + 1] = "\0";
static char __ypdomainname[NIS_MAXNAMELEN + 1] = "\0";
__libc_lock_define_initialized (static, ypbindlist_lock)
static dom_binding *__ypbindlist = NULL;
@ -305,7 +306,7 @@ yp_get_default_domain (char **outdomain)
if (__ypdomainname[0] == '\0')
{
if (getdomainname (__ypdomainname, MAXHOSTNAMELEN))
if (getdomainname (__ypdomainname, NIS_MAXNAMELEN))
result = YPERR_NODOM;
else
*outdomain = __ypdomainname;

View File

@ -51,17 +51,17 @@ extern int __sigsetjmp __P ((jmp_buf __env, int __savemask));
/* Set ENV to the current position and return 0, not saving the signal mask.
This is just like `sigsetjmp (ENV, 0)'.
The ISO C standard says `setjmp' is a macro. */
#define setjmp(env) __sigsetjmp ((env), 0)
# define setjmp(env) __sigsetjmp ((env), 0)
#else
/* We are in 4.3 BSD-compatibility mode in which `setjmp'
saves the signal mask like `sigsetjmp (ENV, 1)'. */
#define setjmp(env) __sigsetjmp ((env), 1)
# define setjmp(env) __sigsetjmp ((env), 1)
#endif /* Favor BSD. */
#ifdef __USE_BSD
#if defined __USE_BSD || defined __USE_XOPEN
/* Set ENV to the current position and return 0, not saving the signal mask.
This is the 4.3 BSD name for ISO `setjmp'. */
#define _setjmp(env) __sigsetjmp ((env), 0)
# define _setjmp(env) __sigsetjmp ((env), 0)
#endif
@ -69,13 +69,13 @@ extern int __sigsetjmp __P ((jmp_buf __env, int __savemask));
`setjmp' call there return VAL, or 1 if VAL is 0. */
extern void longjmp __P ((jmp_buf __env, int __val))
__attribute__ ((__noreturn__));
#ifdef __USE_BSD
#if defined __USE_BSD || defined __USE_XOPEN
/* Same. Usually `_longjmp' is used with `_setjmp', which does not save
the signal mask. But it is how ENV was saved that determines whether
`longjmp' restores the mask; `_longjmp' is just an alias. */
extern void _longjmp __P ((jmp_buf __env, int __val))
__attribute__ ((__noreturn__));
#endif /* Use BSD. */
#endif
/* Internal machine-dependent function to restore context sans signal mask. */
extern void __longjmp __P ((__jmp_buf __env, int __val))
@ -96,7 +96,7 @@ typedef jmp_buf sigjmp_buf;
/* Store the calling environment in ENV, also saving the
signal mask if SAVEMASK is nonzero. Return 0. */
#define sigsetjmp(env, savemask) __sigsetjmp ((env), (savemask))
# define sigsetjmp(env, savemask) __sigsetjmp ((env), (savemask))
/* Jump to the environment saved in ENV, making the
sigsetjmp call there return VAL, or 1 if VAL is 0.

View File

@ -1,2 +1,3 @@
make_siglist.c signame.c signame.h
det_endian.c
entry.h

View File

@ -0,0 +1,33 @@
/* System dependand definitions for run-time dynamic loading.
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 _BITS_DLFCN_H
#define _BITS_DLFCN_H 1
/* The MODE argument to `dlopen' contains one of the following: */
#define RTLD_LAZY 0x001 /* Lazy function call binding. */
#define RTLD_NOW 0x002 /* Immediate function call binding. */
#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */
/* If the following bit is set in the MODE argument to `dlopen',
the symbols of the loaded object and its dependencies are made
visible as if the object were linked directly into the program. */
#define RTLD_GLOBAL 0x100
#endif /* bits/dlfcn.h */

View File

@ -18,6 +18,7 @@
Boston, MA 02111-1307, USA. */
#include <elf.h>
#include <entry.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
@ -52,7 +53,7 @@ _dl_sysdep_start (void **start_argptr,
gid_t egid = 0;
unsigned int seen;
user_entry = (ElfW(Addr)) &_start;
user_entry = (ElfW(Addr)) &ENTRY_POINT;
_dl_argc = *(long *) start_argptr;
_dl_argv = (char **) start_argptr + 1;
_environ = &_dl_argv[_dl_argc + 1];

1
sysdeps/generic/entry.h Normal file
View File

@ -0,0 +1 @@
#define ENTRY_POINT _start

View File

@ -16,35 +16,22 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _UTMPBITS_H
#define _UTMPBITS_H 1
#include <features.h>
#ifndef _UTMP_H
#error "Never use <bits/utmp.h> directly; include <utmpx.h> instead."
#endif
#include <paths.h>
#include <sys/time.h>
#include <sys/types.h>
#define UT_UNKNOWN 0 /* for ut_type field */
#define RUN_LVL 1
#define BOOT_TIME 2
#define NEW_TIME 3
#define OLD_TIME 4
#define INIT_PROCESS 5
#define LOGIN_PROCESS 6
#define USER_PROCESS 7
#define DEAD_PROCESS 8
#define ACCOUNTING 9
#define UT_LINESIZE 32
#define UT_NAMESIZE 32
#define UT_HOSTSIZE 256
__BEGIN_DECLS
/* The structure describing an entry in the database of
previous logins. */
struct lastlog
{
time_t ll_time;
@ -53,28 +40,8 @@ struct lastlog
};
/* XXX We are not ready to use this now. It needs some more research.
Simly copying the behaviour of other implementations is no big
help. */
#if 0
/* Which program created the record. */
enum utlogin
{
unknown,
X,
local,
rlogin,
telnet,
rsh,
ftp,
screen,
splitvt,
xterm
/* More could be added here. */
};
#endif
/* The structure describing the status of a terminated process. This
type is used in `struct utmp' below. */
struct exit_status
{
short int e_termination; /* Process termination status. */
@ -82,16 +49,16 @@ struct exit_status
};
/* The structure describing an entry in the user accounting database. */
struct utmp
{
short int ut_type; /* Type of login. */
pid_t ut_pid; /* Pid of login process. */
char ut_line[UT_LINESIZE]; /* NUL-terminated devicename of tty. */
char ut_id[4]; /* Inittab id. */
char ut_user[UT_NAMESIZE]; /* Username (not NUL terminated). */
#define ut_name ut_user /* Compatible field name for same. */
pid_t ut_pid; /* Process ID of login process. */
char ut_line[UT_LINESIZE]; /* Devicename. */
char ut_id[4]; /* Inittab ID. */
char ut_user[UT_NAMESIZE]; /* Username. */
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login. */
struct exit_status ut_exit; /* The exit status of a process marked
struct exit_status ut_exit; /* Exit status of a process marked
as DEAD_PROCESS. */
long ut_session; /* Session ID, used for windowing. */
struct timeval ut_tv; /* Time entry was made. */
@ -100,6 +67,7 @@ struct utmp
};
/* Backwards compatibility hacks. */
#define ut_name ut_user
#ifndef _NO_UT_TIME
/* We have a problem here: `ut_time' is also used otherwise. Define
_NO_UT_TIME if the compiler complains. */
@ -108,6 +76,26 @@ struct utmp
#define ut_xtime ut_tv.tv_sec
#define ut_addr ut_addr_v6[0]
/* Values for the `ut_type' field of a `struct utmp'. */
#define EMPTY 0 /* No valid user accounting information. */
#define RUN_LVL 1 /* The system's runlevel. */
#define BOOT_TIME 2 /* Time of system boot. */
#define NEW_TIME 3 /* Time after system clock changed. */
#define OLD_TIME 4 /* Time when system clock changed. */
#define INIT_PROCESS 5 /* Process spawned by the init process. */
#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
#define USER_PROCESS 7 /* Normal process. */
#define DEAD_PROCESS 8 /* Terminated process. */
#define ACCOUNTING 9
/* Old Linux name for the EMPTY type. */
#define UT_UNKNOWN EMPTY
/* Tell the user that we have a modern system with UT_HOST, UT_PID,
UT_TYPE, UT_ID and UT_TV fields. */
#define _HAVE_UT_TYPE 1
@ -115,7 +103,3 @@ struct utmp
#define _HAVE_UT_ID 1
#define _HAVE_UT_TV 1
#define _HAVE_UT_HOST 1
__END_DECLS
#endif /* !_UTMP_H_ */

79
sysdeps/gnu/bits/utmpx.h Normal file
View File

@ -0,0 +1,79 @@
/* Structures and defenitions for the user accounting database. GNU version.
Copyright (C) 1997 Free Software Foundation, Inc.
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
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 _UTMPX_H
#error "Never use <bits/utmpx.h> directly; include <utmpx.h> instead."
#endif
#include <bits/types.h>
#include <sys/time.h>
#define __UT_LINESIZE 32
#define __UT_NAMESIZE 32
#define __UT_HOSTSIZE 256
/* The structure describing the status of a terminated process. This
type is used in `struct utmpx' below. */
struct __exit_status
{
short int e_termination; /* Process termination status. */
short int e_exit; /* Process exit status. */
};
/* The structure describing an entry in the user accounting database. */
struct utmpx
{
short int ut_type; /* Type of login. */
__pid_t ut_pid; /* Process ID of login process. */
char ut_line[__UT_LINESIZE]; /* Devicename. */
char ut_id[4]; /* Inittab ID. */
char ut_user[__UT_NAMESIZE]; /* Username. */
char ut_host[__UT_HOSTSIZE]; /* Hostname for remote login. */
struct __exit_status ut_exit; /* Exit status of a process marked
as DEAD_PROCESS. */
long ut_session; /* Session ID, used for windowing. */
struct timeval ut_tv; /* Time entry was made. */
__int32_t ut_addr_v6[4]; /* Internet address of remote host. */
char pad[20]; /* Reserved for future use. */
};
/* Values for the `ut_type' field of a `struct utmp'. */
#define EMPTY 0 /* No valid user accounting information. */
#define RUN_LVL 1 /* The system's runlevel. */
#define BOOT_TIME 2 /* Time of system boot. */
#define NEW_TIME 3 /* Time after system clock changed. */
#define OLD_TIME 4 /* Time when system clock changed. */
#define INIT_PROCESS 5 /* Process spawned by the init process. */
#define LOGIN_PROCESS 6 /* Session leader of a logged in user. */
#define USER_PROCESS 7 /* Normal process. */
#define DEAD_PROCESS 8 /* Terminated process. */

View File

@ -237,6 +237,8 @@ _dl_start_user:\n\
#ifdef RESOLVE
extern char **_dl_argv;
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
MAP is the object containing the reloc. */
@ -275,6 +277,8 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
strtab = ((void *) map->l_addr
+ map->l_info[DT_STRTAB]->d_un.d_ptr);
_dl_sysdep_error ("Symbol `", strtab + refsym->st_name,
"' in `",
_dl_argv[0] ?: "<program name unknown>",
"' has different size in shared object, "
"consider re-linking\n", NULL);
}

42
sysdeps/mips/bits/dlfcn.h Normal file
View File

@ -0,0 +1,42 @@
/* System dependand definitions for run-time dynamic loading.
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 _BITS_DLFCN_H
#define _BITS_DLFCN_H 1
/* The MODE argument to `dlopen' contains one of the following: */
#define RTLD_LAZY 0x001 /* Lazy function call binding. */
#define RTLD_NOW 0x002 /* Immediate function call binding. */
#define RTLD_BINDING_MASK 0x3 /* Mask of binding time value. */
/* If the following bit is set in the MODE argument to `dlopen',
the symbols of the loaded object and its dependencies are made
visible as if the object were linked directly into the program. */
#define RTLD_GLOBAL 0x004
__BEGIN_DECLS
/* Some SGI specific calls that aren't implemented yet. */
extern void *sgidladd __P ((const char *, int));
extern void *sgidlopen_version __P ((const char *, int, const char *, int));
extern char *sgigetdsoversion __P ((const char *));
__END_DECLS
#endif /* bits/dlfcn.h */

View File

@ -23,14 +23,19 @@
#include <sysdep.h>
/* XXX Must this be __PIC__ ? --drepper */
#ifdef PIC
.option pic2
#endif
ENTRY (_setjmp)
.set noreorder
#ifdef PIC
.cpload t9
la t9, C_SYMBOL_NAME (__sigsetjmp)
jr t9
#else
j C_SYMBOL_NAME (__sigsetjmp)
#endif
la t9, C_SYMBOL_NAME (__sigsetjmp)
nop
jr t9
li a1, 0 /* Pass a second argument of zero. */
move a1,zero /* Pass a second argument of zero. */
.set reorder
.end _setjmp

View File

@ -23,14 +23,19 @@
#include <sysdep.h>
/* XXX Must this be __PIC__ ? --drepper */
#ifdef PIC
.option pic2
#endif
ENTRY (setjmp)
.set noreorder
#ifdef PIC
.cpload t9
la t9, C_SYMBOL_NAME (__sigsetjmp)
jr t9
#else
j C_SYMBOL_NAME (__sigsetjmp)
#endif
la t9, C_SYMBOL_NAME (__sigsetjmp)
nop
jr t9
li a1, 1 /* Pass a second argument of one. */
li a1, 1 /* Pass a second argument of one. */
.set reorder
.end setjmp

View File

@ -24,6 +24,34 @@
#define ELF_MACHINE_NAME "MIPS"
#include <assert.h>
#include <entry.h>
#ifndef ENTRY_POINT
#error ENTRY_POINT needs to be defined for MIPS.
#endif
#ifndef _RTLD_PROLOGUE
#ifdef __STDC__
#define _RTLD_PROLOGUE(entry) "\n\t.globl " #entry \
"\n\t.ent " #entry \
"\n\t" #entry ":\n\t"
#else
#define _RTLD_PROLOGUE(entry) "\n\t.globl entry\n\t.ent entry\n\t entry:\n\t"
#endif
#endif
#ifndef _RTLD_EPILOGUE
#ifdef __STDC__
#define _RTLD_EPILOGUE(entry) "\t.end " #entry "\n"
#else
#define _RTLD_EPILOGUE(entry) "\t.end entry\n"
#endif
#endif
/* I have no idea what I am doing. */
#define ELF_MACHINE_RELOC_NOPLT -1
#define elf_machine_lookup_noplt_p(type) (1)
#define elf_machine_lookup_noexec_p(type) (0)
/* Translate a processor specific dynamic tag to the index
in l_info array. */
@ -34,6 +62,18 @@
#define ELF_MACHINE_ALIGN_MASK 0xffff
#endif
/*
* MIPS libraries are usually linked to a non-zero base address. We
* subtrace the base address from the address where we map the object
* to. This results in more efficient address space usage.
*/
#if 0
#define MAP_BASE_ADDR(l) ((l)->l_info[DT_MIPS(BASE_ADDRESS)] ? \
(l)->l_info[DT_MIPS(BASE_ADDRESS)]->d_un.d_ptr : 0)
#else
#define MAP_BASE_ADDR(l) 0x5ffe0000
#endif
/* If there is a DT_MIPS_RLD_MAP entry in the dynamic section, fill it in
with the run-time address of the r_debug structure */
#define ELF_MACHINE_DEBUG_SETUP(l,r) \
@ -43,7 +83,7 @@ do { if ((l)->l_info[DT_MIPS (RLD_MAP)]) \
} while (0)
/* Return nonzero iff E_MACHINE is compatible with the running host. */
static inline int
static inline int __attribute__ ((unused))
elf_machine_matches_host (ElfW(Half) e_machine)
{
switch (e_machine)
@ -56,6 +96,16 @@ elf_machine_matches_host (ElfW(Half) e_machine)
}
}
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
+ first element of the GOT. This must be inlined in a function which
+ uses global data. */
+static inline ElfW(Addr)
+elf_machine_dynamic (void)
+{
+ register ElfW(Addr) gp asm ("$28");
+ return * (ElfW(Addr) *) (gp - 0x7ff0);
+}
+
static inline ElfW(Addr) *
elf_mips_got_from_gpreg (ElfW(Addr) gpreg)
{
@ -75,6 +125,16 @@ elf_machine_got (void)
}
/* Return the link-time address of _DYNAMIC. Conveniently, this is the
first element of the GOT. This must be inlined in a function which
uses global data. */
static inline ElfW(Addr)
elf_machine_dynamic (void)
{
register ElfW(Addr) gp asm ("$28");
return * (ElfW(Addr) *) (gp - 0x7ff0);
}
/* Return the run-time load address of the shared object. */
static inline ElfW(Addr)
elf_machine_load_address (void)
@ -87,7 +147,9 @@ elf_machine_load_address (void)
" nop\n"
"here: dsubu %0, $31, %0\n"
" .set reorder\n"
: "=r" (addr));
: "=r" (addr)
: /* No inputs */
: "$31");
#else
asm (" .set noreorder\n"
" la %0, here\n"
@ -95,7 +157,9 @@ elf_machine_load_address (void)
" nop\n"
"here: subu %0, $31, %0\n"
" .set reorder\n"
: "=r" (addr));
: "=r" (addr)
: /* No inputs */
: "$31");
#endif
return addr;
}
@ -105,7 +169,7 @@ elf_machine_load_address (void)
/* Relocate GOT. */
static inline void
elf_machine_got_rel (struct link_map *map)
elf_machine_got_rel (struct link_map *map, int lazy)
{
ElfW(Addr) *got;
ElfW(Sym) *sym;
@ -119,7 +183,7 @@ elf_machine_got_rel (struct link_map *map)
const ElfW(Sym) *ref = sym; \
ElfW(Addr) sym_loadaddr; \
sym_loadaddr = _dl_lookup_symbol (strtab + sym->st_name, &ref, scope, \
map->l_name, DL_LOOKUP_NOPLT); \
map->l_name, ELF_MACHINE_RELOC_NOPLT);\
(ref)? sym_loadaddr + ref->st_value: 0; \
})
@ -151,7 +215,7 @@ elf_machine_got_rel (struct link_map *map)
{
if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC)
{
if (sym->st_value /* && maybe_stub (sym->st_value) */)
if (sym->st_value && lazy)
*got = sym->st_value + map->l_addr;
else
*got = RESOLVE_GOTSYM (sym);
@ -163,7 +227,7 @@ elf_machine_got_rel (struct link_map *map)
*got = RESOLVE_GOTSYM (sym);
else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC
&& *got != sym->st_value
/* && maybe_stub (*got) */)
&& lazy)
*got += map->l_addr;
else if (ELFW(ST_TYPE) (sym->st_info) == STT_SECTION)
{
@ -193,6 +257,11 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
extern void _dl_runtime_resolve (ElfW(Word));
extern int _dl_mips_gnu_objects;
#ifdef RTLD_BOOTSTRAP
{
return lazy;
}
#endif
if (lazy)
{
/* The GOT entries for functions have not yet been filled in.
@ -216,7 +285,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
}
/* Relocate global offset table. */
elf_machine_got_rel (l);
elf_machine_got_rel (l, lazy);
return lazy;
}
@ -282,6 +351,7 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
}
_dl_signal_error (0, NULL, "cannot find runtime link map");
return NULL;
}
/* Mips has no PLT but define elf_machine_relplt to be elf_machine_rel. */
@ -295,211 +365,220 @@ elf_machine_runtime_link_map (ElfW(Addr) gpreg, ElfW(Addr) stub_pc)
to usual c arguments. */
#ifdef __mips64
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \
generated by the gnu linker. */\
int _dl_mips_gnu_objects = 1;\
\
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \
generated by the gnu linker. */ \
int _dl_mips_gnu_objects = 1; \
\
/* This is called from assembly stubs below which the compiler can't see. */ \
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr)) \
__attribute__ ((unused)); \
\
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word) sym_index,\
ElfW(Word) return_address,\
ElfW(Addr) old_gpreg,\
ElfW(Addr) stub_pc)\
{\
struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc);\
const ElfW(Sym) *const symtab\
= (const ElfW(Sym) *) (l->l_addr + l->l_info[DT_SYMTAB]->d_un.d_ptr);\
const char *strtab\
= (void *) (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr);\
const ElfW(Addr) *got\
= (const ElfW(Addr) *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr);\
const ElfW(Word) local_gotno\
= (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;\
const ElfW(Word) gotsym\
= (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val;\
const ElfW(Sym) *definer;\
ElfW(Addr) loadbase;\
ElfW(Addr) funcaddr;\
struct link_map **scope;\
\
/* Look up the symbol's run-time value. */\
scope = _dl_object_relocation_scope (l);\
definer = &symtab[sym_index];\
\
loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer,\
scope, l->l_name, DL_LOOKUP_NOPLT);\
\
*_dl_global_scope_end = NULL;\
\
/* Apply the relocation with that value. */\
funcaddr = loadbase + definer->st_value;\
*(got + local_gotno + sym_index - gotsym) = funcaddr;\
\
return funcaddr;\
}\
\
asm ("\n\
.text\n\
.align 3\n\
.globl _dl_runtime_resolve\n\
.type _dl_runtime_resolve,@function\n\
.ent _dl_runtime_resolve\n\
_dl_runtime_resolve:\n\
.set noreorder\n\
# Save old GP to $3.\n\
move $3,$28\n\
# Modify t9 ($25) so as to point .cpload instruction.\n\
daddu $25,2*8\n\
# Compute GP.\n\
.cpload $25\n\
.set reorder\n\
# Save slot call pc.\n\
move $2, $31\n\
# Save arguments and sp value in stack.\n\
dsubu $29, 10*8\n\
.cprestore 8*8\n\
sd $15, 9*8($29)\n\
sd $4, 3*8($29)\n\
sd $5, 4*8($29)\n\
sd $6, 5*8($29)\n\
sd $7, 6*8($29)\n\
sd $16, 7*8($29)\n\
move $16, $29\n\
move $4, $24\n\
move $5, $15\n\
move $6, $3\n\
move $7, $2\n\
jal __dl_runtime_resolve\n\
move $29, $16\n\
ld $31, 9*8($29)\n\
ld $4, 3*8($29)\n\
ld $5, 4*8($29)\n\
ld $6, 5*8($29)\n\
ld $7, 6*8($29)\n\
ld $16, 7*8($29)\n\
daddu $29, 10*8\n\
move $25, $2\n\
jr $25\n\
.end _dl_runtime_resolve\n\
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr)) \
__attribute__ ((unused)); \
\
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word) sym_index, \
ElfW(Word) return_address, \
ElfW(Addr) old_gpreg, \
ElfW(Addr) stub_pc) \
{ \
struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc); \
const ElfW(Sym) *const symtab \
= (const ElfW(Sym) *) (l->l_addr + l->l_info[DT_SYMTAB]->d_un.d_ptr); \
const char *strtab \
= (void *) (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr); \
const ElfW(Addr) *got \
= (const ElfW(Addr) *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); \
const ElfW(Word) local_gotno \
= (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; \
const ElfW(Word) gotsym \
= (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; \
const ElfW(Sym) *definer; \
ElfW(Addr) loadbase; \
ElfW(Addr) funcaddr; \
struct link_map **scope; \
\
/* Look up the symbol's run-time value. */ \
scope = _dl_object_relocation_scope (l); \
definer = &symtab[sym_index]; \
\
loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer, \
scope, l->l_name, ELF_MACHINE_RELOC_NOPLT); \
\
*_dl_global_scope_end = NULL; \
\
/* Apply the relocation with that value. */ \
funcaddr = loadbase + definer->st_value; \
*(got + local_gotno + sym_index - gotsym) = funcaddr; \
\
return funcaddr; \
} \
\
asm ("\n \
.text\n \
.align 3\n \
.globl _dl_runtime_resolve\n \
.type _dl_runtime_resolve,@function\n \
.ent _dl_runtime_resolve\n \
_dl_runtime_resolve:\n \
.set noreorder\n \
# Save old GP to $3.\n \
move $3,$28\n \
# Modify t9 ($25) so as to point .cpload instruction.\n \
daddu $25,2*8\n \
# Compute GP.\n \
.cpload $25\n \
.set reorder\n \
# Save slot call pc.\n \
move $2, $31\n \
# Save arguments and sp value in stack.\n \
dsubu $29, 10*8\n \
.cprestore 8*8\n \
sd $15, 9*8($29)\n \
sd $4, 3*8($29)\n \
sd $5, 4*8($29)\n \
sd $6, 5*8($29)\n \
sd $7, 6*8($29)\n \
sd $16, 7*8($29)\n \
move $16, $29\n \
move $4, $24\n \
move $5, $15\n \
move $6, $3\n \
move $7, $2\n \
jal __dl_runtime_resolve\n \
move $29, $16\n \
ld $31, 9*8($29)\n \
ld $4, 3*8($29)\n \
ld $5, 4*8($29)\n \
ld $6, 5*8($29)\n \
ld $7, 6*8($29)\n \
ld $16, 7*8($29)\n \
daddu $29, 10*8\n \
move $25, $2\n \
jr $25\n \
.end _dl_runtime_resolve\n \
");
#else
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \
generated by the gnu linker. */\
int _dl_mips_gnu_objects = 1;\
\
#define ELF_MACHINE_RUNTIME_TRAMPOLINE \
/* The flag _dl_mips_gnu_objects is set if all dynamic objects are \
generated by the gnu linker. */ \
int _dl_mips_gnu_objects = 1; \
\
/* This is called from assembly stubs below which the compiler can't see. */ \
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr)) \
__attribute__ ((unused)); \
\
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word) sym_index,\
ElfW(Word) return_address,\
ElfW(Addr) old_gpreg,\
ElfW(Addr) stub_pc)\
{\
struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc);\
const ElfW(Sym) *const symtab\
= (const ElfW(Sym) *) (l->l_addr + l->l_info[DT_SYMTAB]->d_un.d_ptr);\
const char *strtab\
= (void *) (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr);\
const ElfW(Addr) *got\
= (const ElfW(Addr) *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr);\
const ElfW(Word) local_gotno\
= (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val;\
const ElfW(Word) gotsym\
= (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val;\
const ElfW(Sym) *definer;\
ElfW(Addr) loadbase;\
ElfW(Addr) funcaddr;\
struct link_map **scope;\
\
/* Look up the symbol's run-time value. */\
scope = _dl_object_relocation_scope (l);\
definer = &symtab[sym_index];\
\
loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer,\
scope, l->l_name, DL_LOOKUP_NOPLT);\
\
*_dl_global_scope_end = NULL;\
\
/* Apply the relocation with that value. */\
funcaddr = loadbase + definer->st_value;\
*(got + local_gotno + sym_index - gotsym) = funcaddr;\
\
return funcaddr;\
}\
\
asm ("\n\
.text\n\
.align 2\n\
.globl _dl_runtime_resolve\n\
.type _dl_runtime_resolve,@function\n\
.ent _dl_runtime_resolve\n\
_dl_runtime_resolve:\n\
.set noreorder\n\
# Save old GP to $3.\n\
move $3,$28\n\
# Modify t9 ($25) so as to point .cpload instruction.\n\
addu $25,8\n\
# Compute GP.\n\
.cpload $25\n\
.set reorder\n\
# Save slot call pc.\n\
move $2, $31\n\
# Save arguments and sp value in stack.\n\
subu $29, 40\n\
.cprestore 32\n\
sw $15, 36($29)\n\
sw $4, 12($29)\n\
sw $5, 16($29)\n\
sw $6, 20($29)\n\
sw $7, 24($29)\n\
sw $16, 28($29)\n\
move $16, $29\n\
move $4, $24\n\
move $5, $15\n\
move $6, $3\n\
move $7, $2\n\
jal __dl_runtime_resolve\n\
move $29, $16\n\
lw $31, 36($29)\n\
lw $4, 12($29)\n\
lw $5, 16($29)\n\
lw $6, 20($29)\n\
lw $7, 24($29)\n\
lw $16, 28($29)\n\
addu $29, 40\n\
move $25, $2\n\
jr $25\n\
.end _dl_runtime_resolve\n\
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word), ElfW(Word), ElfW(Addr), ElfW(Addr)) \
__attribute__ ((unused)); \
\
static ElfW(Addr) \
__dl_runtime_resolve (ElfW(Word) sym_index, \
ElfW(Word) return_address, \
ElfW(Addr) old_gpreg, \
ElfW(Addr) stub_pc) \
{ \
struct link_map *l = elf_machine_runtime_link_map (old_gpreg, stub_pc); \
const ElfW(Sym) *const symtab \
= (const ElfW(Sym) *) (l->l_addr + l->l_info[DT_SYMTAB]->d_un.d_ptr); \
const char *strtab \
= (void *) (l->l_addr + l->l_info[DT_STRTAB]->d_un.d_ptr); \
const ElfW(Addr) *got \
= (const ElfW(Addr) *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr); \
const ElfW(Word) local_gotno \
= (const ElfW(Word)) l->l_info[DT_MIPS (LOCAL_GOTNO)]->d_un.d_val; \
const ElfW(Word) gotsym \
= (const ElfW(Word)) l->l_info[DT_MIPS (GOTSYM)]->d_un.d_val; \
const ElfW(Sym) *definer; \
ElfW(Addr) loadbase; \
ElfW(Addr) funcaddr; \
struct link_map **scope; \
\
/* Look up the symbol's run-time value. */ \
scope = _dl_object_relocation_scope (l); \
definer = &symtab[sym_index]; \
\
loadbase = _dl_lookup_symbol (strtab + definer->st_name, &definer, \
scope, l->l_name, ELF_MACHINE_RELOC_NOPLT); \
\
*_dl_global_scope_end = NULL; \
\
/* Apply the relocation with that value. */ \
funcaddr = loadbase + definer->st_value; \
*(got + local_gotno + sym_index - gotsym) = funcaddr; \
\
return funcaddr; \
} \
\
asm ("\n \
.text\n \
.align 2\n \
.globl _dl_runtime_resolve\n \
.type _dl_runtime_resolve,@function\n \
.ent _dl_runtime_resolve\n \
_dl_runtime_resolve:\n \
.set noreorder\n \
# Save slot call pc.\n \
move $3, $31\n \
# Modify t9 ($25) so as to point .cpload instruction.\n \
addu $25,8\n \
# Compute GP.\n \
.cpload $25\n \
.set reorder\n \
# Save slot call pc.\n \
move $2, $31\n \
# Save arguments and sp value in stack.\n \
subu $29, 40\n \
.cprestore 32\n \
sw $15, 36($29)\n \
sw $4, 12($29)\n \
sw $5, 16($29)\n \
sw $6, 20($29)\n \
sw $7, 24($29)\n \
sw $16, 28($29)\n \
move $16, $29\n \
move $4, $24\n \
move $5, $15\n \
move $6, $3\n \
move $7, $2\n \
jal __dl_runtime_resolve\n \
move $29, $16\n \
lw $31, 36($29)\n \
lw $4, 12($29)\n \
lw $5, 16($29)\n \
lw $6, 20($29)\n \
lw $7, 24($29)\n \
lw $16, 28($29)\n \
addu $29, 40\n \
move $25, $2\n \
jr $25\n \
.end _dl_runtime_resolve\n \
");
#endif
/* Mask identifying addresses reserved for the user program,
where the dynamic linker should not map anything. */
#define ELF_MACHINE_USER_ADDRESS_MASK 0x00000000UL
#define ELF_MACHINE_USER_ADDRESS_MASK 0x80000000UL
/* Initial entry point code for the dynamic linker.
The C function `_dl_start' is the real entry point;
its return value is the user program's entry point. */
its return value is the user program's entry point.
Note how we have to be careful about two things:
1) That we allocate a minimal stack of 24 bytes for
every function call, the MIPS ABI states that even
if all arguments are passed in registers the procedure
called can use the 16 byte area pointed to by $sp
when it is called to store away the arguments passed
to it.
2) That under Linux the entry is named __start
and not just plain _start. */
#ifdef __mips64
#define RTLD_START asm ("\
.text\n\
.align 3\n\
.globl _start\n\
.globl _dl_start_user\n\
.ent _start\n\
_start:\n\
.align 3\n"\
_RTLD_PROLOGUE (ENTRY_POINT)\
" .globl _dl_start_user\n\
.set noreorder\n\
bltzal $0, 0f\n\
nop\n\
@ -561,16 +640,15 @@ _dl_start_user:\n\
ld $5, 1*8($29)\n\
ld $6, 2*8$29)\n\
ld $7, 3*8($29)\n\
jr $25\n\
.end _start\n\
");
jr $25\n"\
_RTLD_EPILOGUE(ENTRY_POINT) \
);
#else
#define RTLD_START asm ("\
.text\n\
.globl _start\n\
.globl _dl_start_user\n\
.ent _start\n\
_start:\n\
.text\n"\
_RTLD_PROLOGUE(ENTRY_POINT)\
" .globl _dl_start_user\n\
.set noreorder\n\
bltzal $0, 0f\n\
nop\n\
@ -582,7 +660,9 @@ _start:\n\
la $4, _DYNAMIC\n\
sw $4, -0x7ff0($28)\n\
move $4, $29\n\
subu $29, 16\n\
jal _dl_start\n\
addiu $29, 16\n\
# Get the value of label '_dl_start_user' in t9 ($25).\n\
la $25, _dl_start_user\n\
_dl_start_user:\n\
@ -610,7 +690,9 @@ _dl_start_user:\n\
lw $4, 8($2)\n\
# Call _dl_init_next to return the address of an initializer\n\
# function to run.\n\
subu $29, 16\n\
jal _dl_init_next\n\
addiu $29, 16\n\
move $28, $16\n\
# Check for zero return, when out of initializers.\n\
beq $2, $0, 2f\n\
@ -624,16 +706,18 @@ _dl_start_user:\n\
move $28, $16\n\
# Loop to call _dl_init_next for the next initializer.\n\
b 1b\n\
2: # Clear the startup flag. Assumes 32 bit ints.\n\
sw $0, _dl_starting_up\n\
# Pass our finalizer function to the user in ra.\n\
2: la $31, _dl_fini\n\
la $31, _dl_fini\n\
# Jump to the user entry point.\n\
move $25, $17\n\
lw $4, 0($29)\n\
lw $5, 4($29)\n\
lw $6, 8($29)\n\
lw $7, 12($29)\n\
jr $25\n\
.end _start\n\
jr $25\n"\
_RTLD_EPILOGUE(ENTRY_POINT)\
");
#endif

View File

@ -17,6 +17,12 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <entry.h>
#ifndef ENTRY_POINT
#error ENTRY_POINT needs to be defined for start.S on MIPS/ELF.
#endif
/* This is the canonical entry point, usually the first thing in the text
segment. The SVR4/Mips ABI (pages 3-31, 3-32) says that when the entry
point runs, most registers' values are unspecified, except for:
@ -53,8 +59,8 @@
#endif
.text
.globl _start
_start:
.globl ENTRY_POINT
ENTRY_POINT:
#ifdef PIC
SET_GP
#endif
@ -81,20 +87,9 @@ nofini:
the prologue of __libc_init_first, we preload them to
prevent clobbering the stack tops. In Hurd case, stack pointer
($29) may be VM_MAX_ADDRESS here. If so, we must modify it. */
#if (__mips64)
dli $4, 0x10000000000
bne $29, $4, 1f
dsubu $29, 32
sd $0, 0($29)
sd $0, 8($29)
sd $0, 16($29)
sd $0, 24($29)
1:
ld $4, 0($29)
ld $5, 8($29)
ld $6, 16($29)
ld $7, 24($29)
#else /* __mips64 */
#if 0
jal mach_host_self
#endif
li $4, 0x80000000
bne $29, $4, 1f
subu $29, 16
@ -107,23 +102,14 @@ nofini:
lw $5, 4($29)
lw $6, 8($29)
lw $7, 12($29)
#endif /* __mips64 */
jal __libc_init_first
#ifdef PIC
SET_GP
#endif
#if (__mips64)
ld $4, 0($29)
ld $5, 8($29)
ld $6, 16($29)
ld $7, 24($29)
#else /* __mips64 */
lw $4, 0($29)
lw $5, 4($29)
lw $6, 8($29)
lw $7, 12($29)
#endif /* __mips64 */
/* Call `_init', which is the entry point to our own `.init'
section; and register with `atexit' to have `exit' call
@ -145,19 +131,11 @@ nofini:
/* Extract the arguments and environment as encoded on the stack
and set up the arguments for `main': argc, argv, envp. */
#if (__mips64)
ld $4, 0($29) /* argc */
daddu $5, $29, 8 /* argv */
dsll $6, $4, 3
daddu $6, $6, 8
daddu $6, $5, $6 /* envp = &argv[argc + 1] */
#else /* __mips64 */
lw $4, 0($29) /* argc */
addu $5, $29, 4 /* argv */
sll $6, $4, 2
addu $6, $6, 4
addu $6, $5, $6 /* envp = &argv[argc + 1] */
#endif /* __mips64 */
/* Call the user's main function, and exit with its value. */
jal main
@ -172,10 +150,11 @@ hlt: b hlt /* Crash if somehow it does return. */
.data
.globl __data_start
__data_start:
#if (__mips64)
.dword 0
#else /* __mips64 */
.word 0
#endif /* __mips64 */
.long 0
.weak data_start
data_start = __data_start
.comm errno, 4, 4
#ifdef __ELF__
.type errno, @object
#endif

View File

@ -1,7 +1,7 @@
/* FPU control word bits. Mips version.
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Olaf Flebbe.
Contributed by Olaf Flebbe and Ralf Baechle.
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
@ -21,74 +21,84 @@
#ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H
/* FP control/status register bit assignments.
/* MIPS FPU floating point control register bits.
*
* 31-25 24 23 22-18 17-12 11-7 6-2 1-0
* (cause) (enables) (flags)
* | reserved | FS | C | reserved | E V Z O U I | V Z O U I | V Z O U I | RM
* 31-25 -> floating point conditions code bits 7-1. These bits are only
* available in MIPS IV.
* 24 -> flush denormalized results to zero instead of
* causing unimplemented operation exception. This bit is only
* available for MIPS III and newer.
* 23 -> Condition bit
* 22-18 -> reserved (read as 0, write with 0)
* 17 -> cause bit for unimplemented operation
* 16 -> cause bit for invalid exception
* 15 -> cause bit for division by zero exception
* 14 -> cause bit for overflow exception
* 13 -> cause bit for underflow exception
* 12 -> cause bit for inexact exception
* 11 -> enable exception for invalid exception
* 10 -> enable exception for division by zero exception
* 9 -> enable exception for overflow exception
* 8 -> enable exception for underflow exception
* 7 -> enable exception for inexact exception
* 6 -> flag invalid exception
* 5 -> flag division by zero exception
* 4 -> flag overflow exception
* 3 -> flag underflow exception
* 2 -> flag inexact exception
* 1-0 -> rounding control
*
* FS: When set, denormalized results are flushed to zero instead of
* causing an unimplemented operation exception.
* C: Condition bit.
* E: Unimplemented Operation.
* V: Invalid Operation.
* Z: Division by zero.
* O: Overflow.
* U: Underflow.
* I: Inexact Operation
* RM: Rounding mode bits
* 00 (RN) - rounding to nearest
* 01 (RZ) - rounding toward zero
* 10 (RP) - rounding down (toward - infinity)
* 11 (RM) - rounding up (toward + infinity)
*
* Rounding Control:
* 00 - rounding to nearest (RN)
* 01 - rounding toward zero (RZ)
* 01 - rounding (up) toward plus infinity (RP)
* 11 - rounding (down)toward minus infinity (RM)
*/
#include <features.h>
/* masking of interrupts */
#define _FPU_MASK_IM (1 << 11)
#define _FPU_MASK_DM (1 << 24) /* XXX */
#define _FPU_MASK_ZM (1 << 10)
#define _FPU_MASK_OM (1 << 9)
#define _FPU_MASK_UM (1 << 8)
#define _FPU_MASK_PM (1 << 7)
#define _FPU_MASK_V 0x0800 /* Invalid operation */
#define _FPU_MASK_Z 0x0400 /* Division by zero */
#define _FPU_MASK_O 0x0200 /* Overflow */
#define _FPU_MASK_U 0x0100 /* Underflow */
#define _FPU_MASK_I 0x0080 /* Inexact operation */
/* precision control */
#define _FPU_EXTENDED 0
#define _FPU_DOUBLE 0
#define _FPU_SINGLE 0
/* flush denormalized numbers to zero */
#define _FPU_FLUSH_TZ 0x1000000
/* rounding control */
#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */
#define _FPU_RC_DOWN 0x2
#define _FPU_RC_UP 0x3
#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */
#define _FPU_RC_ZERO 0x1
#define _FPU_RC_UP 0x2
#define _FPU_RC_DOWN 0x3
#define _FPU_RESERVED 0xfe7c0000 /* Reserved bits */
#define _FPU_RESERVED 0xfe3c0000 /* Reserved bits in cw */
/* The fdlibm code requires strict IEEE double precision arithmetic,
and no interrupts for exceptions, rounding to nearest. */
#define _FPU_DEFAULT 0x0
#define _FPU_DEFAULT 0x00000600
/* IEEE: same as above, but exceptions */
#define _FPU_IEEE (0x1f << 7)
#define _FPU_IEEE 0x00000F80
/* Type of the control word. */
typedef unsigned int fpu_control_t;
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
/* Macros for accessing the hardware control word. */
#define _FPU_GETCW(cw) __asm__ ("cfc1 %0, $31; nop; nop" : "=r" (cw))
#define _FPU_SETCW(cw) __asm__ ("ctc1 %0, $31; nop; nop" : : "r" (cw))
#define _FPU_GETCW(cw) __asm__ ("cfc1 %0,$31" : "=r" (cw) : )
#define _FPU_SETCW(cw) __asm__ ("ctc1 %0,$31" : : "r" (cw))
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;
__BEGIN_DECLS
/* Called at startup. It can be used to manipulate fpu control register. */
/* Called at startup. It can be used to manipulate the fpu control
register. */
extern void __setfpucw __P ((fpu_control_t));
__END_DECLS

View File

@ -0,0 +1,3 @@
ifndef rtld-wordsize
rtld-wordsize = 64
endif

View File

@ -0,0 +1,3 @@
ifndef rtld-oformat
rtld-oformat = elf32-littlemips
endif

View File

@ -0,0 +1,106 @@
OUTPUT_FORMAT("@@rtld-oformat@@")
OUTPUT_ARCH(@@rtld-arch@@)
ENTRY(@@rtld-entry@@)
SECTIONS
{
/* Read-only sections, merged into text segment: */
. = @@rtld-base@@;
.reginfo : { *(.reginfo) }
.dynamic : { *(.dynamic) }
.dynstr : { *(.dynstr) }
.dynsym : { *(.dynsym) }
.hash : { *(.hash) }
.rel.text : { *(.rel.text) }
.rela.text : { *(.rela.text) }
.rel.data : { *(.rel.data) }
.rela.data : { *(.rela.data) }
.rel.rodata : { *(.rel.rodata) }
.rela.rodata : { *(.rela.rodata) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.init : { *(.rel.init) }
.rela.init : { *(.rela.init) }
.rel.fini : { *(.rel.fini) }
.rela.fini : { *(.rela.fini) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
.rodata : { *(.rodata) }
.rodata1 : { *(.rodata1) }
.init : { *(.init) } =0
.text :
{
*(.text)
*(.stub)
/* .gnu.warning sections are handled specially by elf32.em. */
*(.gnu.warning)
} =0
.fini : { *(.fini) } =0
/* Adjust the address for the data segment. We want to adjust up to
the same address within the page on the next page up. It would
be more correct to do this:
. = 0x10000000;
The current expression does not correctly handle the case of a
text segment ending precisely at the end of a page; it causes the
data segment to skip a page. The above expression does not have
this problem, but it will currently (2/95) cause BFD to allocate
a single segment, combining both text and data, for this case.
This will prevent the text segment from being shared among
multiple executions of the program; I think that is more
important than losing a page of the virtual address space (note
that no actual memory is lost; the page which is skipped can not
be referenced). */
. += 0x10000;
.data :
{
*(.data)
CONSTRUCTORS
}
.data1 : { *(.data1) }
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
_gp = ALIGN(16) + 0x7ff0;
.got :
{
*(.got.plt) *(.got)
}
/* We want the small data sections together, so single-instruction offsets
can access them all, and initialized data all before uninitialized, so
we can shorten the on-disk segment size. */
.sdata : { *(.sdata) }
.lit8 : { *(.lit8) }
.lit4 : { *(.lit4) }
.sbss : { *(.sbss) *(.scommon) }
.bss :
{
*(.dynbss)
*(.bss)
*(COMMON)
}
/* The normal linker scripts created by the binutils doesn't have the
symbols end and _end which breaks ld.so's dl-minimal.c. */
_end = . ;
PROVIDE (end = .);
/* These are needed for ELF backends which have not yet been
converted to the new style linker. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
/* DWARF debug sections.
Symbols in the .debug DWARF section are relative to the beginning of the
section so we begin .debug at 0. It's not clear yet what needs to happen
for the others. */
.debug 0 : { *(.debug) }
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
.debug_sfnames 0 : { *(.debug_sfnames) }
.line 0 : { *(.line) }
/* These must appear regardless of . */
.gptab.sdata : { *(.gptab.data) *(.gptab.sdata) }
.gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) }
}

View File

@ -26,10 +26,20 @@
#endif
ENTRY (__sigsetjmp)
#ifdef PIC
.cpload t9
.set noreorder
.cpload t9
.set reorder
#endif
move a2, sp
move a3, fp
la t9, __sigsetjmp_aux
nop
jr t9
move a2, sp
#ifdef fp
move a3, fp
#else
move a3, $fp
#endif
#ifdef PIC
la t9, __sigsetjmp_aux
jr t9
#else
j __sigsetjmp_aux
#endif
.end __sigsetjmp

View File

@ -436,10 +436,10 @@ static int gaih_inet(const char *name, const struct gaih_service *service,
struct gaih_servtuple *st2;
struct gaih_addrtuple *at2 = at;
int j;
#ifndef MAXHOSTNAMELEN
#define MAXHOSTNAMELEN 128
#endif /* MAXHOSTNAMELEN */
char buffer[MAXHOSTNAMELEN];
/*
buffer is the size of an unformatted IPv6 address in printable format.
*/
char buffer[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];
while(at2) {
if (req->ai_flags & AI_CANONNAME) {

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
/* Copyright (C) 1991, 1992, 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
@ -46,7 +46,7 @@ getlogin (void)
thing to do. Note that ttyname(open("/dev/tty")) on those
systems returns /dev/tty, so that is not a possible solution for
getlogin(). */
if (__ttyname_r (0, real_tty_path, sizeof (tty_pathname)) < 0)
if (__ttyname_r (0, real_tty_path, sizeof (tty_pathname)) != 0)
return NULL;
real_tty_path += 5; /* Remove "/dev/". */

View File

@ -1,5 +1,5 @@
/* Reentrant function to return the current login name. Unix version.
Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
Copyright (C) 1991, 1992, 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
@ -41,19 +41,17 @@ getlogin_r (name, name_len)
struct utmp *ut, line, buffer;
{
int err;
int d = __open ("/dev/tty", 0);
if (d < 0)
return errno;
result = ttyname_r (d, real_tty_path, sizeof (tty_pathname));
err = errno;
(void) close (d);
if (result < 0)
if (result != 0)
{
__set_errno (err);
return err;
__set_errno (result);
return result;
}
}

View File

@ -24,46 +24,24 @@
#endif
#ifndef HAVE_GNU_LD
#define __end end
#define _end end
#endif
.data
.sdata
.data
ENTRY(__curbrk)
.word __end
.word 0
.end __curbrk
.text
.set noreorder
.set noat
ENTRY(__brk)
/* Minimum is one page. */
lui v0, 4096
lw v0, __end
nop
/* If they ask for less than a page, givvem the whole
thing anyway. */
sltu AT, a0, v0
beq AT, zero, down1
nop
move a0, v0
down1:
li v0, SYS_brk
syscall
bne a3, zero, error
/* Update __curbrk and exit cleanly. */
lui AT, 4096
.text
SYSCALL__(brk, 1)
.set reorder
/* Handle the query case. */
bnez a0, 1f
move a0,v0
1: /* Update __curbrk and exit cleanly. */
sw a0, __curbrk
j ra
move v0, zero
/* What a horrible way to die. */
error: j syscall_error
nop
nop
nop
jr ra
.end __brk
weak_alias (__brk, brk)

View File

@ -21,10 +21,23 @@
#define _ERRNO_H
#include <bits/errno.h>
/* .globl errno */
.set noreorder
.comm errno, 4
#ifdef __ELF__
.type errno, @object
#endif
ENTRY(syscall_error)
.set noreorder
ENTRY(__syscall_error)
#ifdef __PIC__
.set noat
move $1, $31
bltzal $0, 0f
nop
0: .cpload $31
move $31, $1
.set at
#endif
#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
/* We translate the system's EWOULDBLOCK error into EAGAIN.
The GNU C library always defines EWOULDBLOCK==EAGAIN.
@ -40,4 +53,8 @@ skip:
/* And just kick back a -1. */
j ra
li v0, -1
.end syscall_error
END(__syscall_error)
/* We provide this alias for compatilility with other Unices
like IRIX 5 */
weak_alias (__syscall_error, syscall_error)

View File

@ -32,19 +32,41 @@
/* Note that while it's better structurally, going back to call syscall_error
can make things confusing if you're debugging---it looks like it's jumping
backwards into the previous fn. */
#ifdef __PIC__
#define PSEUDO(name, syscall_name, args) \
.align 2; \
99: la t9,syscall_error; \
jr t9; \
ENTRY(name) \
.set noreorder; \
.cpload t9; \
li v0, SYS_##syscall_name; \
syscall; \
.set reorder; \
bne a3, zero, 99b; \
syse1:
#else
#define PSEUDO(name, syscall_name, args) \
.set noreorder; \
.align 2; \
99: j syscall_error; \
nop; \
ENTRY(name) \
.set noreorder; \
li v0, SYS_##syscall_name; \
syscall; \
.set reorder; \
bne a3, zero, 99b; \
nop; \
syse1:
#endif
#undef PSEUDO_END
#define PSEUDO_END(sym) .end sym
#define ret j ra ; nop
#undef END
#define END(sym) .end sym
#define r0 v0
#define r1 v1
/* The mips move insn is d,s. */

View File

@ -28,14 +28,14 @@ ENTRY(__wait)
li v0, SYS_wait
syscall
beq a3, zero, noerror
beqz a3, noerror
nop
j syscall_error
j __syscall_error
nop
noerror:
/* If the arg is not NULL, store v1 there. */
beq a0, zero, noarg
beqz a0, noarg
nop
sw v1, 0(a0)
nop

View File

@ -82,4 +82,4 @@ extern int __ipc __P ((int __call, int __first, int __second, int __third,
__END_DECLS
#endif /* _SYS_IPC_BUF_H */
#endif /* bits/ipc_buf.h */

View File

@ -75,4 +75,4 @@ struct msginfo
__END_DECLS
#endif /* _SYS_MSQ_BUF_H */
#endif /* bits/msq_buf.h */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@ -85,4 +85,4 @@ struct seminfo
__END_DECLS
#endif /* _SYS_SEM_BUF_H */
#endif /* bits/sem_buf.h */

View File

@ -89,4 +89,4 @@ struct shm_info
__END_DECLS
#endif /* _SYS_SHM_BUF_H */
#endif /* bits/shm_buf.h */

View File

@ -0,0 +1,3 @@
clone.S
kernel_sigaction.h
kernel_stat.h

View File

@ -0,0 +1,10 @@
ifeq ($(subdir),signal)
#sysdep_routines += sigsuspend
endif
ifeq ($(subdir),misc)
sysdep_routines += cachectl cacheflush sysmips
headers += regdef.h fpregdef.h sys/asm.h sys/cachectl.h sys/fpregdef.h \
sys/regdef.h sys/sysmips.h
endif

View File

@ -0,0 +1,12 @@
/* The MIPS architecture has selectable endianness.
Linux/MIPS exists in two both little and big endian flavours and we
want to be able to share the installed headerfiles between both,
so we define __BYTE_ORDER based on GCC's predefines. */
#ifdef __MIPSEB__
#define __BYTE_ORDER __BIG_ENDIAN
#else
#ifdef __MIPSEL__
#define __BYTE_ORDER __LITTLE_ENDIAN
#endif
#endif

View File

@ -0,0 +1,100 @@
/* O_*, F_*, FD_* bit values for Linux.
Copyright (C) 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 _FCNTL_H
#error "Never use <bits/fcntl.h> directly; include <fcntl.h> instead."
#endif
#include <sys/types.h>
/* In GNU, read and write are bits (unlike BSD). */
#ifdef __USE_GNU
#define O_READ O_RDONLY /* Open for reading. */
#define O_WRITE O_WRONLY /* Open for writing. */
#endif
/* open/fcntl - O_SYNC is only implemented on blocks devices and on files
located on an ext2 file system */
#define O_ACCMODE 0x0003
#define O_RDONLY 0x0000
#define O_WRONLY 0x0001
#define O_RDWR 0x0002
#define O_APPEND 0x0008
#define O_SYNC 0x0010
#define O_NONBLOCK 0x0080
#define O_CREAT 0x0100 /* not fcntl */
#define O_TRUNC 0x0200 /* not fcntl */
#define O_EXCL 0x0400 /* not fcntl */
#define O_NOCTTY 0x0800 /* not fcntl */
#define O_FSYNC O_SYNC
#define O_ASYNC 020000
#define O_NDELAY O_NONBLOCK
#define F_DUPFD 0 /* dup */
#define F_GETFD 1 /* get f_flags */
#define F_SETFD 2 /* set f_flags */
#define F_GETFL 3 /* more flags (cloexec) */
#define F_SETFL 4
#define F_GETLK 14
#define F_SETLK 6
#define F_SETLKW 7
#define F_SETOWN 24 /* for sockets. */
#define F_GETOWN 23 /* for sockets. */
/* for F_[GET|SET]FL */
#define FD_CLOEXEC 1 /* actually anything with low bit set goes */
/* for posix fcntl() and lockf() */
#define F_RDLCK 0
#define F_WRLCK 1
#define F_UNLCK 2
/* for old implementation of bsd flock () */
#define F_EXLCK 4 /* or 3 */
#define F_SHLCK 8 /* or 4 */
/* operations for bsd flock(), also used by the kernel implementation */
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
#define LOCK_NB 4 /* or'd with one of the above to prevent XXXXXXXXXXXXXXXXXX
blocking */
#define LOCK_UN 8 /* remove lock */
typedef struct flock {
short l_type;
short l_whence;
__off_t l_start;
__off_t l_len;
long l_sysid; /* XXX */
__pid_t l_pid;
long pad[4]; /* XXX */
} flock_t;
/* Define some more compatibility macros to be backward compatible with
BSD systems which did not managed to hide these kernel macros. */
#ifdef __USE_BSD
#define FAPPEND O_APPEND
#define FFSYNC O_FSYNC
#define FASYNC O_ASYNC
#define FNONBLOCK O_NONBLOCK
#define FNDELAY O_NDELAY
#endif /* Use BSD. */

View File

@ -0,0 +1,71 @@
/* Structure types for pre-termios terminal ioctls. Linux/MIPS version.
Copyright (C) 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. */
/*
* Never include this file directly; use <sys/ioctl.h> instead.
*/
#ifndef _BITS_IOCTL_TYPES_H
#define _BITS_IOCTL_TYPES_H 1
/* Get definition of constants for use with `ioctl'. */
#include <asm/ioctls.h>
struct winsize
{
unsigned short ws_row;
unsigned short ws_col;
unsigned short ws_xpixel;
unsigned short ws_ypixel;
};
#define NCC 8
struct termio
{
unsigned short c_iflag; /* input mode flags */
unsigned short c_oflag; /* output mode flags */
unsigned short c_cflag; /* control mode flags */
unsigned short c_lflag; /* local mode flags */
char c_line; /* line discipline */
/* Yes, this is really NCCS. */
unsigned char c_cc[32 /* NCCS */]; /* control characters */
};
/* modem lines */
#define TIOCM_LE 0x001 /* line enable */
#define TIOCM_DTR 0x002 /* data terminal ready */
#define TIOCM_RTS 0x004 /* request to send */
#define TIOCM_ST 0x010 /* secondary transmit */
#define TIOCM_SR 0x020 /* secondary receive */
#define TIOCM_CTS 0x040 /* clear to send */
#define TIOCM_CAR 0x100 /* carrier detect */
#define TIOCM_CD TIOCM_CAR
#define TIOCM_RNG 0x200 /* ring */
#define TIOCM_RI TIOCM_RNG
#define TIOCM_DSR 0x400 /* data set ready */
/* line disciplines */
#define N_TTY 0
#define N_SLIP 1
#define N_MOUSE 2
#define N_PPP 3
#define N_STRIP 4
#define N_AX25 5
#endif /* bits/ioctl-types.h */

View File

@ -0,0 +1,85 @@
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
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_IPC_BUF_H
#define _SYS_IPC_BUF_H 1
#include <features.h>
#include <sys/types.h>
/* Mode bits for `msgget', `semget', and `shmget'. */
#define IPC_CREAT 01000 /* Create key if key does not exist. */
#define IPC_EXCL 02000 /* Fail if key exists. */
#define IPC_NOWAIT 04000 /* Return error on wait. */
/* Control commands for `msgctl', `semctl', and `shmctl'. */
#define IPC_RMID 0 /* Remove identifier. */
#define IPC_SET 1 /* Set `ipc_perm' options. */
#define IPC_STAT 2 /* Get `ipc_perm' options. */
#define IPC_INFO 3 /* See ipcs. */
__BEGIN_DECLS
/* Special key values. */
#define IPC_PRIVATE ((__key_t) 0) /* Private key. */
/* Data structure used to pass permission information to IPC operations. */
struct ipc_perm
{
__key_t __key; /* Key. */
long uid; /* Owner's user ID. */
long gid; /* Owner's group ID. */
long cuid; /* Creator's user ID. */
long cgid; /* Creator's group ID. */
unsigned long mode; /* Read/write permission. */
unsigned short int __seq; /* Sequence number. */
};
/* Kludge to work around Linux' restriction of only up to five
arguments to a system call. */
struct ipc_kludge
{
void *msgp;
long int msgtyp;
};
/* The actual system call: all functions are multiplexed by this. */
extern int __ipc __P ((int __call, int __first, int __second, int __third,
void *__ptr));
/* The codes for the functions to use the multiplexer `__ipc'. */
#define IPCOP_semop 1
#define IPCOP_semget 2
#define IPCOP_semctl 3
#define IPCOP_msgsnd 11
#define IPCOP_msgrcv 12
#define IPCOP_msgget 13
#define IPCOP_msgctl 14
#define IPCOP_shmat 21
#define IPCOP_shmdt 22
#define IPCOP_shmget 23
#define IPCOP_shmctl 24
__END_DECLS
#endif /* bits/ipc_buf.h */

View File

@ -0,0 +1,92 @@
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
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_SHM_BUF_H
#define _SYS_SHM_BUF_H 1
#include <features.h>
#include <sys/types.h>
/* Permission flag for shmget. */
#define SHM_R 0400 /* or S_IRUGO from <linux/stat.h> */
#define SHM_W 0200 /* or S_IWUGO from <linux/stat.h> */
/* Flags for `shmat'. */
#define SHM_RDONLY 010000 /* attach read-only else read-write */
#define SHM_RND 020000 /* round attach address to SHMLBA */
#define SHM_REMAP 040000 /* take-over region on attach */
/* Commands for `shmctl'. */
#define SHM_LOCK 11 /* lock segment (root only) */
#define SHM_UNLOCK 12 /* unlock segment (root only) */
__BEGIN_DECLS
/* Data structure describing a set of semaphores. */
struct shmid_ds
{
struct ipc_perm shm_perm; /* operation permission struct */
int shm_segsz; /* size of segment in bytes */
__time_t shm_atime; /* time of last shmat() */
__time_t shm_dtime; /* time of last shmdt() */
__time_t shm_ctime; /* time of last change by shmctl() */
long shm_cpid; /* pid of creator */
long shm_lpid; /* pid of last shmop */
unsigned short int shm_nattch; /* number of current attaches */
unsigned short int __shm_npages; /* size of segment (pages) */
unsigned long int *__shm_pages; /* array of ptrs to frames -> SHMMAX */
struct vm_area_struct *__attaches; /* descriptors for attaches */
};
#ifdef __USE_MISC
/* ipcs ctl commands */
#define SHM_STAT 13
#define SHM_INFO 14
/* shm_mode upper byte flags */
#define SHM_DEST 01000 /* segment will be destroyed on last detach */
#define SHM_LOCKED 02000 /* segment will not be swapped */
struct shminfo
{
int shmmax;
int shmmin;
int shmmni;
int shmseg;
int shmall;
};
struct shm_info
{
int used_ids;
ulong shm_tot; /* total allocated shm */
ulong shm_rss; /* total resident shm */
ulong shm_swp; /* total swapped shm */
ulong swap_attempts;
ulong swap_successes;
};
#endif /* __USE_MISC */
__END_DECLS
#endif /* bits/shm_buf.h */

View File

@ -0,0 +1,62 @@
/* The proper definitions for Linux/MIPS's sigaction.
Copyright (C) 1993, 1994, 1995, 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. */
/* Structure describing the action to be taken when a signal arrives. */
struct sigaction
{
/* Special flags. */
unsigned int sa_flags;
/* Signal handler. */
__sighandler_t sa_handler;
/* Additional set of signals to be blocked. */
__sigset_t sa_mask;
/* The ABI says here are two unused ints following. */
/* Restore handler. */
void (*sa_restorer) __P ((void));
#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
int sa_resv[1];
#endif
};
/* Bits in `sa_flags'. */
#define SA_NOCLDSTOP 1 /* Don't send SIGCHLD when children stop. */
#ifdef __USE_MISC
#define SA_STACK 0x08000000 /* Use signal stack by using `sa_restorer'. */
#define SA_RESTART 0x10000000 /* Don't restart syscall on signal return. */
#define SA_INTERRUPT 0x20000000 /* Historical no-op. */
#define SA_NODEFER 0x40000000 /* Don't automatically block the signal when
its handler is being executed. */
#define SA_RESETHAND 0x80000000 /* Reset to SIG_DFL on entry to handler. */
/* Some aliases for the SA_ constants. */
#define SA_NOMASK SA_NODEFER
#define SA_ONESHOT SA_RESETHAND
#endif
/* Values for the HOW argument to `sigprocmask'. */
#define SIG_NOP 0 /* 0 is unused to catch errors */
#define SIG_BLOCK 1 /* Block signals. */
#define SIG_UNBLOCK 2 /* Unblock signals. */
#define SIG_SETMASK 3 /* Set the set of blocked signals. */
#define SIG_SETMASK32 256 /* Goodie from SGI for BSD compatibility:
set only the low 32 bit of the sigset. */

View File

@ -0,0 +1,30 @@
/* Signal number definitions. Linux version.
Copyright (C) 1995, 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. */
#ifdef _SIGNAL_H
/* Take these architecture specific stuff from the kernel header files. */
#define __need_fake_sigfuns
#define __need_signums
#include <asm/signal.h>
#endif /* <signal.h> included. */
#define __need__nsig
#include <asm/signal.h>

View File

@ -0,0 +1,178 @@
/* System-specific socket constants and types. Linux version.
Copyright (C) 1991, 92, 94, 95, 96, 97 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_SOCKET_H
#error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif
#include <features.h>
#define __need_size_t
#define __need_NULL
#include <stddef.h>
__BEGIN_DECLS
/* Supported address families. */
#define PF_UNSPEC 0
#define PF_UNIX 1 /* Unix domain sockets */
#define PF_LOCAL 1 /* POSIX name for AF_UNIX */
#define PF_FILE PF_LOCAL /* POSIX name for PF_LOCAL. */
#define PF_INET 2 /* Internet IP Protocol */
#define PF_AX25 3 /* Amateur Radio AX.25 */
#define PF_IPX 4 /* Novell IPX */
#define PF_APPLETALK 5 /* Appletalk DDP */
#define PF_NETROM 6 /* Amateur Radio NET/ROM */
#define PF_BRIDGE 7 /* Multiprotocol bridge */
#define PF_AAL5 8 /* Reserved for Werner's ATM */
#define PF_X25 9 /* Reserved for X.25 project */
#define PF_INET6 10 /* IP version 6 */
#define PF_ROSE 11 /* Amateur Radio X.25 PLP */
#define PF_DECNET 12 /* Reserved for DECnet project */
#define PF_NETBEUI 13 /* Reserved for 802.2LLC project*/
#define PF_MAX 32 /* For now.. */
/* Protocol families, same as address families. */
#define AF_UNSPEC PF_UNSPEC
#define AF_UNIX PF_UNIX
#define AF_LOCAL PF_LOCAL
#define AF_FILE PF_FILE
#define AF_INET PF_INET
#define AF_AX25 PF_AX25
#define AF_IPX PF_IPX
#define AF_APPLETALK PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_AAL5 PF_AAL5
#define AF_X25 PF_X25
#define AF_INET6 PF_INET6
#define AF_ROSE PF_ROSE
#define AF_DECNET PF_DECNET
#define AF_NETBEUI PF_NETBEUI
#define AF_MAX PF_MAX
/* Raw IP packet level. */
#define SOL_RAW 255
/* Maximum queue length specifiable by listen. */
#define SOMAXCONN 128
/* Get the definition of the macro to define the common sockaddr members. */
#include <bits/sockaddr.h>
/* Structure describing a generic socket address. */
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
/* Bits in the FLAGS argument to `send', `recv', et al. */
enum
{
MSG_OOB = 0x01, /* Process out-of-band data. */
MSG_PEEK = 0x02, /* Peek at incoming messages. */
MSG_DONTROUTE = 0x04, /* Don't use local routing. */
MSG_CTRUNC = 0x08, /* Control data lost before delivery. */
MSG_PROXY = 0x10 /* Supply or ask second address. */
};
/* Structure describing messages sent by
`sendmsg' and received by `recvmsg'. */
struct msghdr
{
__ptr_t msg_name; /* Address to send to/receive from. */
int msg_namelen; /* Length of address data. */
/* XXX Should be type `size_t' according to POSIX.1g. */
struct iovec *msg_iov; /* Vector of data to send/receive into. */
int msg_iovlen; /* Number of elements in the vector. */
/* XXX Should be type `size_t' according to POSIX.1g. */
__ptr_t msg_control; /* Ancillary data (eg BSD filedesc passing). */
int msg_controllen; /* Ancillary data buffer length. */
/* XXX Should be type `size_t' according to POSIX.1g. */
int msg_flags; /* Flags on received message. */
};
/* Structure used for storage of ancillary data object information. */
struct cmsghdr
{
int cmsg_len; /* Length of data in cmsg_data plus length
of cmsghdr structure. */
/* XXX Should be type `size_t' according to POSIX.1g. */
int cmsg_level; /* Originating protocol. */
int cmsg_type; /* Protocol specific type. */
#if !defined __STRICT_ANSI__ && defined __GNUC__ && __GNUC__ >= 2
unsigned char __cmsg_data[0]; /* Ancillary data. */
#endif
};
/* Ancillary data object manipulation macros. */
#if !defined __STRICT_ANSI__ && defined __GNUC__ && __GNUC__ >= 2
# define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data)
#else
# define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1))
#endif
#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
#define CMSG_FIRSTHDR(mhdr) \
((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr) \
? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL)
#ifndef _EXTERN_INLINE
# define _EXTERN_INLINE extern __inline
#endif
extern struct cmsghdr *__cmsg_nxthdr __P ((struct msghdr *__mhdr,
struct cmsghdr *__cmsg));
_EXTERN_INLINE struct cmsghdr *
__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg)
{
unsigned char *__p;
if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
/* The kernel header does this so there may be a reason. */
return NULL;
__p = (((unsigned char *) __cmsg)
+ ((__cmsg->cmsg_len + sizeof (long int) - 1) & ~sizeof (long int)));
if (__p >= (unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)
/* No more entries. */
return NULL;
return (struct cmsghdr *) __p;
}
/* Get socket manipulation related informations from kernel headers. */
#include <asm/socket.h>
/* Structure used to manipulate the SO_LINGER option. */
struct linger
{
int l_onoff; /* Nonzero to linger on close. */
int l_linger; /* Time to linger. */
};
__END_DECLS

View File

@ -0,0 +1,97 @@
/* 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. */
/*
* Never include this file directly; use <sys/stat.h> instead.
*/
#ifndef _BITS_STAT_H
#define _BITS_STAT_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. */
/* Structure describing file characteristics. */
struct stat
{
unsigned long int st_dev;
long int st_pad1[3];
__ino_t st_ino; /* File serial number. */
__mode_t st_mode; /* File mode. */
__nlink_t st_nlink; /* Link count. */
__uid_t st_uid; /* User ID of the file's owner. */
__gid_t st_gid; /* Group ID of the file's group.*/
unsigned long int st_rdev; /* Device number, if device. */
long int st_pad2[2];
__off_t st_size; /* Size of file, in bytes. */
/* SVR4 added this extra long to allow for expansion of off_t. */
long int st_pad3;
/*
* Actually this should be timestruc_t st_atime, st_mtime and
* st_ctime but we don't have it under Linux.
*/
__time_t st_atime; /* Time of last access. */
long int __reserved0;
__time_t st_mtime; /* Time of last modification. */
long int __reserved1;
__time_t st_ctime; /* Time of last status change. */
long int __reserved2;
long int st_blksize; /* Optimal block size for I/O. */
#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */
long int st_blocks; /* Number of 512-byte blocks allocated. */
char st_fstype[16]; /* Filesystem type name */
long int st_pad4[8];
/* Linux specific fields */
unsigned int st_flags;
unsigned int st_gen;
};
/* Encoding of the file mode. */
#define __S_IFMT 0170000 /* These bits determine file type. */
/* File types. */
#define __S_IFDIR 0040000 /* Directory. */
#define __S_IFCHR 0020000 /* Character device. */
#define __S_IFBLK 0060000 /* Block device. */
#define __S_IFREG 0100000 /* Regular file. */
#define __S_IFIFO 0010000 /* FIFO. */
/* These don't actually exist on System V, but having them doesn't hurt. */
#define __S_IFLNK 0120000 /* Symbolic link. */
#define __S_IFSOCK 0140000 /* Socket. */
/* Protection bits. */
#define __S_ISUID 04000 /* Set user ID on execution. */
#define __S_ISGID 02000 /* Set group ID on execution. */
#define __S_ISVTX 01000 /* Save swapped text after use (sticky). */
#define __S_IREAD 0400 /* Read by owner. */
#define __S_IWRITE 0200 /* Write by owner. */
#define __S_IEXEC 0100 /* Execute by owner. */
#endif /* bits/stat.h */

View File

@ -0,0 +1,44 @@
/* Copyright (C) 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. */
/*
* Never include this file directly; use <sys/statfs.h> instead.
*/
#ifndef _BITS_STATFS_H
#define _BITS_STATFS_H
struct statfs
{
long int f_type;
#define f_fstyp f_type
long int f_bsize;
long int f_frsize; /* Fragment size - unsupported */
long int f_blocks;
long int f_bfree;
long int f_files;
long int f_ffree;
/* Linux specials */
long int f_bavail;
__fsid_t f_fsid;
long int f_namelen;
long int f_spare[6];
};
#endif /* bits/statfs.h */

View File

@ -0,0 +1,260 @@
/* termios type and macro definitions. Linux/MIPS version.
Copyright (C) 1993, 1994, 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. */
/*
* Never include this file directly; use <termios.h> instead.
*/
#ifndef _BITS_TERMIOS_H
#define _BITS_TERMIOS_H 1
typedef unsigned char cc_t;
typedef unsigned int speed_t;
typedef unsigned int tcflag_t;
#if defined __USE_BSD
struct sgttyb
{
char sg_ispeed;
char sg_ospeed;
char sg_erase;
char sg_kill;
int sg_flags; /* SGI special - int, not short */
};
struct tchars
{
char t_intrc;
char t_quitc;
char t_startc;
char t_stopc;
char t_eofc;
char t_brkc;
};
struct ltchars
{
char t_suspc; /* stop process signal */
char t_dsuspc; /* delayed stop process signal */
char t_rprntc; /* reprint line */
char t_flushc; /* flush output (toggles) */
char t_werasc; /* word erase */
char t_lnextc; /* literal next character */
};
#endif /* defined(__BSD) */
#define NCCS 32
struct termios
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
};
/* c_cc characters */
#define VINTR 0 /* Interrupt character [ISIG]. */
#define VQUIT 1 /* Quit character [ISIG]. */
#define VERASE 2 /* Erase character [ICANON]. */
#define VKILL 3 /* Kill-line character [ICANON]. */
#define VMIN 4 /* Minimum number of bytes read at once [!ICANON]. */
#define VTIME 5 /* Time-out value (tenths of a second) [!ICANON]. */
#if defined (__USE_BSD)
#define VEOL2 6 /* Second EOL character [ICANON]. */
/* The next two are guesses ... */
#define VSWTC 7 /* ??? */
#endif
#define VSWTCH VSWTC
#define VSTART 8 /* Start (X-ON) character [IXON, IXOFF]. */
#define VSTOP 9 /* Stop (X-OFF) character [IXON, IXOFF]. */
#define VSUSP 10 /* Suspend character [ISIG]. */
#if 0
/*
* VDSUSP is not supported
*/
#if defined (__USE_BSD)
#define VDSUSP 11 /* Delayed suspend character [ISIG]. */
#endif
#endif
#if defined (__USE_BSD)
#define VREPRINT 12 /* Reprint-line character [ICANON]. */
#endif
#if defined (__USE_BSD)
#define VDISCARD 13 /* Discard character [IEXTEN]. */
#define VWERASE 14 /* Word-erase character [ICANON]. */
#define VLNEXT 15 /* Literal-next character [IEXTEN]. */
#endif
#define VEOF 16 /* End-of-file character [ICANON]. */
#define VEOL 17 /* End-of-line character [ICANON]. */
/* c_iflag bits */
#define IGNBRK 0000001 /* Ignore break condition. */
#define BRKINT 0000002 /* Signal interrupt on break. */
#define IGNPAR 0000004 /* Ignore characters with parity errors. */
#define PARMRK 0000010 /* Mark parity and framing errors. */
#define INPCK 0000020 /* Enable input parity check. */
#define ISTRIP 0000040 /* Strip 8th bit off characters. */
#define INLCR 0000100 /* Map NL to CR on input. */
#define IGNCR 0000200 /* Ignore CR. */
#define ICRNL 0000400 /* Map CR to NL on input. */
#if defined (__USE_BSD)
#define IUCLC 0001000 /* Map upper case to lower case on input. */
#endif
#define IXON 0002000 /* Enable start/stop output control. */
#if defined (__USE_BSD)
#define IXANY 0004000 /* Any character will restart after stop. */
#endif
#define IXOFF 0010000 /* Enable start/stop input control. */
#if defined (__USE_BSD)
#define IMAXBEL 0020000 /* Ring bell when input queue is full. */
#endif
/* c_oflag bits */
#define OPOST 0000001 /* Perform output processing. */
#if defined (__USE_BSD)
#define OLCUC 0000002 /* Map lower case to upper case on output. */
#define ONLCR 0000004 /* Map NL to CR-NL on output. */
#define OCRNL 0000010
#define ONOCR 0000020
#define ONLRET 0000040
#define OFILL 0000100
#define OFDEL 0000200
#define NLDLY 0000400
#define NL0 0000000
#define NL1 0000400
#define CRDLY 0003000
#define CR0 0000000
#define CR1 0001000
#define CR2 0002000
#define CR3 0003000
#define TABDLY 0014000
#define TAB0 0000000
#define TAB1 0004000
#define TAB2 0010000
#define TAB3 0014000
#define XTABS 0014000
#define BSDLY 0020000
#define BS0 0000000
#define BS1 0020000
#define VTDLY 0040000
#define VT0 0000000
#define VT1 0040000
#define FFDLY 0100000
#define FF0 0000000
#define FF1 0100000
/*
#define PAGEOUT ???
#define WRAP ???
*/
#endif
/* c_cflag bit meaning */
#define CBAUD 0010017
#define B0 0000000 /* hang up */
#define B50 0000001
#define B75 0000002
#define B110 0000003
#define B134 0000004
#define B150 0000005
#define B200 0000006
#define B300 0000007
#define B600 0000010
#define B1200 0000011
#define B1800 0000012
#define B2400 0000013
#define B4800 0000014
#define B9600 0000015
#define B19200 0000016
#define B38400 0000017
#define EXTA B19200
#define EXTB B38400
#define CSIZE 0000060 /* Number of bits per byte (mask). */
#define CS5 0000000 /* 5 bits per byte. */
#define CS6 0000020 /* 6 bits per byte. */
#define CS7 0000040 /* 7 bits per byte. */
#define CS8 0000060 /* 8 bits per byte. */
#define CSTOPB 0000100 /* Two stop bits instead of one. */
#define CREAD 0000200 /* Enable receiver. */
#define PARENB 0000400 /* Parity enable. */
#define PARODD 0001000 /* Odd parity instead of even. */
#define HUPCL 0002000 /* Hang up on last close. */
#define CLOCAL 0004000 /* Ignore modem status lines. */
#if defined (__USE_BSD)
#define CBAUDEX 0010000
#define B57600 0010001
#define B115200 0010002
#define B230400 0010003
#define B460800 0010004
#define CIBAUD 002003600000 /* input baud rate (not used) */
#define CRTSCTS 020000000000 /* flow control */
#endif
/* c_lflag bits */
#define ISIG 0000001 /* Enable signals. */
#define ICANON 0000002 /* Do erase and kill processing. */
#define XCASE 0000004
#define ECHO 0000010 /* Enable echo. */
#define ECHOE 0000020 /* Visual erase for ERASE. */
#define ECHOK 0000040 /* Echo NL after KILL. */
#define ECHONL 0000100 /* Echo NL even if ECHO is off. */
#define NOFLSH 0000200 /* Disable flush after interrupt. */
#define IEXTEN 0000400 /* Enable DISCARD and LNEXT. */
#if defined (__USE_BSD)
#define ECHOCTL 0001000 /* Echo control characters as ^X. */
#define ECHOPRT 0002000 /* Hardcopy visual erase. */
#define ECHOKE 0004000 /* Visual erase for KILL. */
#endif
#define FLUSHO 0020000
#if defined (__USE_BSD)
#define PENDIN 0040000 /* Retype pending input (state). */
#endif
#define TOSTOP 0100000 /* Send SIGTTOU for background output. */
#define ITOSTOP TOSTOP
/* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
#define TIOCSER_TEMT 0x01 /* Transmitter physically empty */
/* tcflow() and TCXONC use these */
#define TCOOFF 0 /* Suspend output. */
#define TCOON 1 /* Restart suspended output. */
#define TCIOFF 2 /* Send a STOP character. */
#define TCION 3 /* Send a START character. */
/* tcflush() and TCFLSH use these */
#define TCIFLUSH 0 /* Discard data received but not yet read. */
#define TCOFLUSH 1 /* Discard data written but not yet sent. */
#define TCIOFLUSH 2 /* Discard all pending data. */
/* tcsetattr uses these */
#define TCSANOW 0x540e /* Same as TCSETS; change immediately. */
#define TCSADRAIN 0x540f /* Same as TCSETSW; change when pending output is written. */
#define TCSAFLUSH 0x5410 /* Same as TCSETSF; flush pending input before changing. */
#define _IOT_termios /* Hurd ioctl type field. */ \
_IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2)
#endif /* bits/termios.h */

View File

@ -0,0 +1,54 @@
/* System-dependent timing definitions. Linux/MIPS version.
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. */
/*
* Never include this file directly; use <time.h> instead.
*/
#ifdef __need_timeval
# undef __need_timeval
# ifndef _STRUCT_TIMEVAL
# define _STRUCT_TIMEVAL 1
/* A time value that is accurate to the nearest
microsecond but also has a range of years. */
struct timeval
{
long tv_sec; /* Seconds. */
long tv_usec; /* Microseconds. */
};
# endif /* struct timeval */
#endif /* need timeval */
#ifndef _BITS_TIME_H
#define _BITS_TIME_H 1
/* ISO/IEC 9899:1990 7.12.1: <time.h>
The macro `CLOCKS_PER_SEC' is the number per second of the value
returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
The value of CLOCKS_PER_SEC is required to be 1 million on all
XSI-conformant systems. */
# define CLOCKS_PER_SEC 1000000
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system. */
# define CLK_TCK 100 /* XXX not correct for all systems. */
#endif /* bits/time.h */

View File

@ -0,0 +1,125 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>, 1996.
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 <sys/asm.h>
#include <asm/unistd.h>
#include <sysdep.h>
#define _ERRNO_H 1
#include <bits/errno.h>
/* int clone(int (*fn)(), void *child_stack, int flags, int nargs, ...) */
#define FRAMESZ 4*SZREG
#if _MIPS_SIM == _MIPS_SIM_ABI32
#define MAX_REG_ARGS 4
#else
#define MAX_REG_ARGS 6
#endif
.text
NESTED(__clone,4*SZREG,sp)
#ifdef __PIC__
.set noreorder
.cpload $25
.set reorder
.cprestore 16
#endif
PTR_SUBIU sp,FRAMESZ
#ifdef PROF
.set noat
move $1,ra
jal _mcount
.set at
#endif
/* Sanity check arguments. */
li v0,EINVAL
beqz a0,error /* no NULL function pointers */
beqz a1,error /* no NULL stack pointers */
bltz a3,error /* no negative argument counts */
/* Allocate space on the new stack and copy args over */
move t0,a3 # save nargs for __thread_start
PTR_SLL t1,a3,PTR_SCALESHIFT
PTR_ADDU t1,a3,sp
1: REG_L t2,-SZREG(t1)
PTR_SUBIU t1,SZREG
REG_S t2,-SZREG(a1)
PTR_SUBIU a3,1
PTR_SUBIU a1,SZREG
bnez a3,1b
/* Do the system call */
move t9,a0 # get fn ptr out of the way
move a0,a2
li v0,__NR_clone
syscall
bnez a3,error
beqz v0,__thread_start
/* Successful return from the parent */
PTR_ADDIU sp,FRAMESZ
ret
/* Something bad happened -- no child created */
error:
PTR_ADDIU sp,FRAMESZ
#ifdef PIC
la t9,__syscall_error
jr t9
#else
j __syscall_error
#endif
END(__clone)
/* Load up the arguments to the function. Put this block of code in
its own function so that we can terminate the stack trace with our
debug info.
At this point we have t0=nargs, t9=fn, sp=&arg[0]. */
NESTED(__thread_start,32,sp)
/* Stackframe has been created on entry of clone() */
/* Calculate address of jump into argument loading code */
li t1,MAX_REG_ARGS
slt t0,t1,t2 /* max MAX_REG_ARGS args in registers */
MOVN (t2,t1,t0)
la v0,arg0
PTR_SLL t1,t0,PTR_SCALESHIFT
PTR_SUBU v0,t1
jr v0
/* Load the integer register arguments */
REG_L a0,SZREG(sp)
arg0:
/* Call the user's function */
jalr t9
/* Call _exit rather than doing it inline for breakpoint purposes */
move a0,v0
jal _exit
END(__thread_start)
weak_alias(__clone, clone)

View File

@ -0,0 +1 @@
#define ENTRY_POINT __start

View File

@ -0,0 +1 @@
#include <sys/fpregdef.h>

View File

@ -0,0 +1,80 @@
/* fxstat using old-style Unix fstat system call.
Copyright (C) 1991, 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. */
#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
#include <kernel_stat.h>
extern int __syscall_fstat (int, struct kernel_stat *);
/* Get information about the file descriptor FD in BUF. */
int
__fxstat (int vers, int fd, struct stat *buf)
{
struct kernel_stat kbuf;
int result;
switch (vers)
{
case _STAT_VER_LINUX_OLD:
/* Nothing to do. The struct is in the form the kernel expects
it to be. */
result = __syscall_fstat (fd, (struct kernel_stat *) buf);
break;
case _STAT_VER_LINUX:
/* Do the system call. */
result = __syscall_fstat (fd, &kbuf);
/* Convert to current kernel version of `struct stat'. */
buf->st_dev = kbuf.st_dev;
buf->st_pad1[0] = 0; buf->st_pad1[1] = 0; buf->st_pad1[2] = 0;
buf->st_ino = kbuf.st_ino;
buf->st_mode = kbuf.st_mode;
buf->st_nlink = kbuf.st_nlink;
buf->st_uid = kbuf.st_uid;
buf->st_gid = kbuf.st_gid;
buf->st_rdev = kbuf.st_rdev;
buf->st_pad2[0] = 0; buf->st_pad2[1] = 0;
buf->st_pad3 = 0;
buf->st_size = kbuf.st_size;
buf->st_blksize = kbuf.st_blksize;
buf->st_blocks = kbuf.st_blocks;
buf->st_atime = kbuf.st_atime; buf->__reserved0 = 0;
buf->st_mtime = kbuf.st_mtime; buf->__reserved1 = 0;
buf->st_ctime = kbuf.st_ctime; buf->__reserved2 = 0;
buf->st_pad4[0] = 0; buf->st_pad4[1] = 0;
buf->st_pad4[2] = 0; buf->st_pad4[3] = 0;
buf->st_pad4[4] = 0; buf->st_pad4[5] = 0;
buf->st_pad4[6] = 0; buf->st_pad4[7] = 0;
break;
default:
__set_errno (EINVAL);
result = -1;
break;
}
return result;
}
weak_alias (__fxstat, _fxstat)

View File

@ -0,0 +1,22 @@
/* This is the sigaction structure from the Linux 2.1.24 kernel. */
#include <sgidefs.h>
#define HAVE_SA_RESTORER
struct kernel_sigaction {
unsigned int sa_flags;
__sighandler_t sa_handler;
unsigned long sa_mask;
unsigned int __pad0[3]; /* reserved, keep size constant */
/* Abi says here follows reserved int[2] */
void (*sa_restorer)(void);
#if (_MIPS_ISA == _MIPS_ISA_MIPS1) || (_MIPS_ISA == _MIPS_ISA_MIPS2)
/*
* For 32 bit code we have to pad struct sigaction to get
* constant size for the ABI
*/
int pad1[1]; /* reserved */
#endif
};

View File

@ -0,0 +1,28 @@
/* Definition of `struct stat' used in the kernel.. */
struct kernel_stat
{
unsigned long int st_dev;
long int __pad1[3]; /* Reserved for network id */
unsigned long int st_ino;
unsigned long int st_mode;
unsigned long int st_nlink;
long int st_uid;
long int st_gid;
unsigned long int st_rdev;
long int __pad2[2];
long int st_size;
long int __pad3;
unsigned int st_atime;
unsigned int __unused1;
unsigned int st_mtime;
unsigned int __unused2;
unsigned int st_ctime;
unsigned int __unused3;
long int st_blksize;
long int st_blocks;
char st_fstype[16]; /* Filesystem type name, unsupported */
long st_pad4[8];
/* Linux specific fields */
unsigned int st_flags;
unsigned int st_gen;
};

View File

@ -0,0 +1,20 @@
#ifndef _SYS_KERNEL_TERMIOS_H
#define _SYS_KERNEL_TERMIOS_H 1
/* The following corresponds to the values from the Linux 2.1.24 kernel. */
/* We need the definition of tcflag_t, cc_t, and speed_t. */
#include <bits/termios.h>
#define __KERNEL_NCCS 23
struct __kernel_termios
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[__KERNEL_NCCS]; /* control characters */
};
#endif /* kernel_termios.h */

View File

@ -0,0 +1,80 @@
/* lxstat using old-style Unix lstat system call.
Copyright (C) 1991, 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. */
#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
#include <kernel_stat.h>
extern int __syscall_lstat (const char *, struct kernel_stat *);
/* Get information about the file NAME in BUF. */
int
__lxstat (int vers, const char *name, struct stat *buf)
{
struct kernel_stat kbuf;
int result;
switch (vers)
{
case _STAT_VER_LINUX_OLD:
/* Nothing to do. The struct is in the form the kernel expects
it to be. */
result = __syscall_lstat (name, (struct kernel_stat *) buf);
break;
case _STAT_VER_LINUX:
/* Do the system call. */
result = __syscall_lstat (name, &kbuf);
/* Convert to current kernel version of `struct stat'. */
buf->st_dev = kbuf.st_dev;
buf->st_pad1[0] = 0; buf->st_pad1[1] = 0; buf->st_pad1[2] = 0;
buf->st_ino = kbuf.st_ino;
buf->st_mode = kbuf.st_mode;
buf->st_nlink = kbuf.st_nlink;
buf->st_uid = kbuf.st_uid;
buf->st_gid = kbuf.st_gid;
buf->st_rdev = kbuf.st_rdev;
buf->st_pad2[0] = 0; buf->st_pad2[1] = 0;
buf->st_pad3 = 0;
buf->st_size = kbuf.st_size;
buf->st_blksize = kbuf.st_blksize;
buf->st_blocks = kbuf.st_blocks;
buf->st_atime = kbuf.st_atime; buf->__reserved0 = 0;
buf->st_mtime = kbuf.st_mtime; buf->__reserved1 = 0;
buf->st_ctime = kbuf.st_ctime; buf->__reserved2 = 0;
buf->st_pad4[0] = 0; buf->st_pad4[1] = 0;
buf->st_pad4[2] = 0; buf->st_pad4[3] = 0;
buf->st_pad4[4] = 0; buf->st_pad4[5] = 0;
buf->st_pad4[6] = 0; buf->st_pad4[7] = 0;
break;
default:
__set_errno (EINVAL);
result = -1;
break;
}
return result;
}
weak_alias (__lxstat, _lxstat)

View File

@ -0,0 +1 @@
#include <sys/regdef.h>

View File

@ -0,0 +1,28 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ralf Baechle <ralf@gnu.ai.mit.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. */
#ifndef _SGIDEFS_H
#define _SGIDEFS_H 1
/*
* The real definitions come from the Linux kernel sources
*/
#include <asm/sgidefs.h>
#endif /* sgidefs.h */

View File

@ -0,0 +1,66 @@
/* Copyright (C) 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_ACCT_H
#define _SYS_ACCT_H 1
#include <features.h>
#define __need_time_t
#include <time.h>
__BEGIN_DECLS
#define ACCT_COMM 16
struct acct
{
char ac_comm[ACCT_COMM]; /* Accounting command name. */
time_t ac_utime; /* Accounting user time. */
time_t ac_stime; /* Accounting system time. */
time_t ac_etime; /* Accounting elapsed time. */
time_t ac_btime; /* Beginning time. */
long ac_uid; /* Accounting user ID. */
long ac_gid; /* Accounting group ID. */
unsigned long int ac_tty; /* Controlling tty. */
/* Please note that the value of the `ac_tty' field, a device number,
is encoded differently in the kernel and for the libc dev_t type. */
char ac_flag; /* Accounting flag. */
long int ac_minflt; /* Accounting minor pagefaults. */
long int ac_majflt; /* Accounting major pagefaults. */
long int ac_exitcode; /* Accounting process exitcode. */
};
enum
{
AFORK = 0001, /* Has executed fork, but no exec. */
ASU = 0002, /* Used super-user privileges. */
ACORE = 0004, /* Dumped core. */
AXSIG = 0010 /* Killed by a signal. */
};
#define AHZ 100
/* Switch process accounting on and off. */
extern int acct __P ((__const char *__filename));
__END_DECLS
#endif /* sys/acct.h */

View File

@ -0,0 +1,28 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ralf Baechle <ralf@gnu.ai.mit.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. */
#ifndef _SYS_ASM_H
#define _SYS_ASM_H
/*
* The real definitions come from the Linux kernel sources
*/
#include <asm/asm.h>
#endif /* sys/asm.h */

View File

@ -0,0 +1,42 @@
/* Copyright (C) 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 _SYS_CACHECTL_H
#define _SYS_CACHECTL_H 1
#include <features.h>
/*
* Get the kernel definition for the op bits.
*/
#include <asm/cachectl.h>
__BEGIN_DECLS
#ifdef __USE_MISC
extern int cachectl __P ((void *addr, __const int nbytes, __const int op));
#endif
extern int __cachectl __P ((void *addr, __const int nbytes, __const int op));
#ifdef __USE_MISC
extern int cacheflush __P ((void *addr, __const int nbytes, __const int op));
#endif
extern int _flush_cache __P ((char *addr, __const int nbytes, __const int op));
__END_DECLS
#endif /* sys/cachectl.h */

View File

@ -0,0 +1,27 @@
/* Copyright (C) 1991, 92, 94, 95, 96, 97 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_FPREGDEF_H
#define _SYS_FPREGDEF_H
/*
* The real definitions come from the Linux kernel sources
*/
#include <asm/fpregdef.h>
#endif /* sys/fpregdef.h */

View File

@ -0,0 +1,109 @@
/* 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_PROCFS_H
#define _SYS_PROCFS_H 1
#include <features.h>
/* This is somehow modelled after the file of the same name on SysVr4
systems. It provides a definition of the core file format for ELF
used on Linux. */
#include <signal.h>
#include <sys/time.h>
#include <sys/types.h>
#include <asm/user.h>
#include <asm/elf.h>
__BEGIN_DECLS
struct elf_siginfo
{
int si_signo; /* Signal number. */
int si_code; /* Extra code. */
int si_errno; /* Errno. */
};
typedef elf_greg_t greg_t;
typedef elf_gregset_t gregset_t;
typedef elf_fpregset_t fpregset_t;
#define NGREG ELF_NGREG
/* Definitions to generate Intel SVR4-like core files. These mostly
have the same names as the SVR4 types with "elf_" tacked on the
front to prevent clashes with linux definitions, and the typedef
forms have been avoided. This is mostly like the SVR4 structure,
but more Linuxy, with things that Linux does not support and which
gdb doesn't really use excluded. Fields present but not used are
marked with "XXX". */
struct elf_prstatus
{
#if 0
long int pr_flags; /* XXX Process flags. */
short int pr_why; /* XXX Reason for process halt. */
short int pr_what; /* XXX More detailed reason. */
#endif
struct elf_siginfo pr_info; /* Info associated with signal. */
short int pr_cursig; /* Current signal. */
unsigned long int pr_sigpend; /* Set of pending signals. */
unsigned long int pr_sighold; /* Set of held signals. */
#if 0
struct sigaltstack pr_altstack; /* Alternate stack info. */
struct sigaction pr_action; /* Signal action for current sig. */
#endif
__pid_t pr_pid;
__pid_t pr_ppid;
__pid_t pr_pgrp;
__pid_t pr_sid;
struct timeval pr_utime; /* User time. */
struct timeval pr_stime; /* System time. */
struct timeval pr_cutime; /* Cumulative user time. */
struct timeval pr_cstime; /* Cumulative system time. */
#if 0
long int pr_instr; /* Current instruction. */
#endif
elf_gregset_t pr_reg; /* GP registers. */
int pr_fpvalid; /* True if math copro being used. */
};
#define ELF_PRARGSZ (80) /* Number of chars for args */
struct elf_prpsinfo
{
char pr_state; /* Numeric process state. */
char pr_sname; /* Char for pr_state. */
char pr_zomb; /* Zombie. */
char pr_nice; /* Nice val. */
unsigned long int pr_flag; /* Flags. */
long pr_uid;
long pr_gid;
int pr_pid, pr_ppid, pr_pgrp, pr_sid;
/* Lots missing */
char pr_fname[16]; /* Filename of executable. */
char pr_psargs[ELF_PRARGSZ]; /* Initial part of arg list. */
};
typedef struct elf_prstatus prstatus_t;
typedef struct elf_prpsinfo prpsinfo_t;
__END_DECLS
#endif /* sys/procfs.h */

View File

@ -0,0 +1,29 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ralf Baechle <ralf@gnu.ai.mit.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. */
#ifndef _REGDEF_H
#define _REGDEF_H 1
/*
* The real definitions come from the Linux kernel sources
*/
#include <asm/regdef.h>
#include <asm/fpregdef.h>
#endif /* regdef.h */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,36 @@
/* Copyright (C) 1991, 92, 94, 95, 96, 97 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_SYSMIPS_H
#define _SYS_SYSMIPS_H 1
#include <features.h>
/*
* Get the kernel definition for sysmips(2)
*/
#include <asm/sysmips.h>
__BEGIN_DECLS
extern int sysmips __P ((__const int cmd, __const int arg1,
__const int arg2, __const int arg3));
__END_DECLS
#endif /* sys/sysmips.h */

View File

@ -0,0 +1,46 @@
# File name Caller Syscall name # args Strong name Weak names
#
# Calls for compatibility with existing MIPS OS implementations and
# compilers.
#
cachectl - cachectl 3 __cachectl cachectl
cacheflush - cacheflush 3 _flush_cache cacheflush
sysmips - sysmips 4 __sysmips sysmips
# override select.S in parent directory:
select - select 5 __select select
sigsuspend - sigsuspend 1 __sigsuspend sigsuspend
#
# Socket functions; Linux/MIPS doesn't use the socketcall(2) wrapper;
# it's provided for compatibility, though.
#
accept - accept 3 __accept accept
bind - bind 3 __bind bind
connect - connect 3 __connect connect
getpeername - getpeername 3 __getpeername getpeername
getsockname - getsockname 3 __getsockname getsockname
getsockopt - getsockopt 5 __getsockopt getsockopt
listen - listen 2 __listen listen
recv - recv 4 __recv recv
recvfrom - recvfrom 6 __recvfrom recvfrom
recvmsg - recvmsg 3 __recvmsg recvmsg
send - send 4 __send send
sendmsg - sendmsg 3 __sendmsg sendmsg
sendto - sendto 6 __sendto sendto
setsockopt - setsockopt 5 __setsockopt setsockopt
shutdown - shutdown 2 __shutdown shutdown
socket - socket 3 __socket socket
socketpair - socketpair 4 __socketpair socketpair
#
# There are defined locally because the caller is also defined in this dir.
#
s_llseek llseek _llseek 5 __sys_llseek
s_sigaction sigaction sigaction 3 __syscall_sigaction
s_ustat ustat ustat 2 __syscall_ustat
sys_mknod xmknod mknod 3 __syscall_mknod
sys_fstat fxstat fstat 2 __syscall_fstat
sys_lstat lxstat lstat 2 __syscall_lstat
sys_stat xstat stat 2 __syscall_stat

View File

@ -0,0 +1,35 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
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. */
#include <sys/ustat.h>
#include <sys/sysmacros.h>
extern int __syscall_ustat (unsigned long dev, struct ustat *ubuf);
int
ustat (dev_t dev, struct ustat *ubuf)
{
unsigned long k_dev;
/* We must convert the value to dev_t type used by the kernel. */
k_dev = ((major (dev) & 0xff) << 8) | (minor (dev) & 0xff);
return __syscall_ustat (k_dev, ubuf);
}

View File

@ -0,0 +1,47 @@
/* xmknod call using old-style Unix mknod system call.
Copyright (C) 1991, 1993, 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. */
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
extern int __syscall_mknod (const char *, unsigned long, unsigned int);
/* Create a device file named PATH, with permission and special bits MODE
and device number DEV (which can be constructed from major and minor
device numbers with the `makedev' macro above). */
int
__xmknod (int vers, const char *path, mode_t mode, dev_t *dev)
{
unsigned long k_dev;
if (vers != _MKNOD_VER)
{
__set_errno (EINVAL);
return -1;
}
/* We must convert the value to dev_t type used by the kernel. */
k_dev = ((major (*dev) & 0xff) << 8) | (minor (*dev) & 0xff);
return __syscall_mknod (path, mode, k_dev);
}
weak_alias (__xmknod, _xmknod)

View File

@ -0,0 +1,80 @@
/* xstat using old-style Unix stat system call.
Copyright (C) 1991, 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. */
#include <errno.h>
#include <stddef.h>
#include <sys/stat.h>
#include <kernel_stat.h>
extern int __syscall_stat (const char *, struct kernel_stat *);
/* Get information about the file NAME in BUF. */
int
__xstat (int vers, const char *name, struct stat *buf)
{
struct kernel_stat kbuf;
int result;
switch (vers)
{
case _STAT_VER_LINUX_OLD:
/* Nothing to do. The struct is in the form the kernel expects
it to be. */
result = __syscall_stat (name, (struct kernel_stat *) buf);
break;
case _STAT_VER_LINUX:
/* Do the system call. */
result = __syscall_stat (name, &kbuf);
/* Convert to current kernel version of `struct stat'. */
buf->st_dev = kbuf.st_dev;
buf->st_pad1[0] = 0; buf->st_pad1[1] = 0; buf->st_pad1[2] = 0;
buf->st_ino = kbuf.st_ino;
buf->st_mode = kbuf.st_mode;
buf->st_nlink = kbuf.st_nlink;
buf->st_uid = kbuf.st_uid;
buf->st_gid = kbuf.st_gid;
buf->st_rdev = kbuf.st_rdev;
buf->st_pad2[0] = 0; buf->st_pad2[1] = 0;
buf->st_pad3 = 0;
buf->st_size = kbuf.st_size;
buf->st_blksize = kbuf.st_blksize;
buf->st_blocks = kbuf.st_blocks;
buf->st_atime = kbuf.st_atime; buf->__reserved0 = 0;
buf->st_mtime = kbuf.st_mtime; buf->__reserved1 = 0;
buf->st_ctime = kbuf.st_ctime; buf->__reserved2 = 0;
buf->st_pad4[0] = 0; buf->st_pad4[1] = 0;
buf->st_pad4[2] = 0; buf->st_pad4[3] = 0;
buf->st_pad4[4] = 0; buf->st_pad4[5] = 0;
buf->st_pad4[6] = 0; buf->st_pad4[7] = 0;
break;
default:
__set_errno (EINVAL);
result = -1;
break;
}
return result;
}
weak_alias (__xstat, _xstat)

View File

@ -67,7 +67,8 @@ sys_readv readv readv 3 __syscall_readv
sys_stat xstat stat 2 __syscall_stat
sys_writev writev writev 3 __syscall_writev
sysinfo EXTRA sysinfo 1 sysinfo
swapon - swapon 2 swapon
swapon - swapon 2 __swapon swapon
swapoff - swapoff 1 __swapoff swapoff
umount EXTRA umount 1 __umount umount
uselib EXTRA uselib 1 uselib
wait4 - wait4 4 __wait4 wait4

View File

@ -32,7 +32,7 @@ routines := offtime asctime clock ctime ctime_r difftime \
tzfile gettimeofday settimeofday adjtime \
getitimer setitimer \
stime dysize timegm ftime \
strptime
strptime getdate
others := ap zdump zic
tests := test_time clocktest test-tz

247
time/getdate.c Normal file
View File

@ -0,0 +1,247 @@
/* Convert a string representation of time to a time value.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Mark Kettenis <kettenis@phys.uva.nl>, 1997.
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. */
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/stat.h>
/* Prototypes for local functions. */
static int first_wday (int year, int mon, int wday);
static int check_mday (int year, int mon, int mday);
/* Set to one of the following values to indicate an error.
1 the DATEMSK environment variable is null or undefined,
2 the template file cannot be opened for reading,
3 failed to get file status information,
4 the template file is not a regular file,
5 an error is encountered while reading the template file,
6 memory allication failed (not enough memory available),
7 there is no line in the template that matches the input,
8 invalid input specification Example: February 31 or a time is
specified that can not be represented in a time_t (representing
the time in seconds since 00:00:00 UTC, January 1, 1970) */
int getdate_err = 0;
/* Returns the first weekday WDAY of month MON in the year YEAR. */
static int
first_wday (int year, int mon, int wday)
{
struct tm tm;
if (wday == INT_MIN)
return 1;
memset (&tm, 0, sizeof (struct tm));
tm.tm_year = year;
tm.tm_mon = mon;
tm.tm_mday = 1;
mktime (&tm);
return (1 + (wday - tm.tm_wday + 7) % 7);
}
/* Returns 1 if MDAY is a valid day of the month in month MON of year
YEAR, and 0 if it is not. */
static int
check_mday (int year, int mon, int mday)
{
switch (mon)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if (mday >= 1 && mday <= 31)
return 1;
break;
case 4:
case 6:
case 9:
case 11:
if (mday >= 1 && mday <= 30)
return 1;
break;
case 2:
if (mday >= 1 && mday < (__isleap (year) ? 29 : 28))
return 1;
break;
}
return 0;
}
int
__getdate_r (const char *string, struct tm *tp)
{
FILE *fp;
char *line;
size_t len;
char *datemsk;
char *result = NULL;
time_t timer;
struct tm tm;
struct stat st;
int mday_ok = 0;
datemsk = getenv ("DATEMSK");
if (datemsk == NULL || *datemsk == '\0')
return 1;
if (stat (datemsk, &st) < 0)
return 3;
if (!S_ISREG (st.st_mode))
return 4;
/* Open the template file. */
fp = fopen (datemsk, "r");
if (fp == NULL)
return 2;
line = NULL;
len = 0;
do
{
ssize_t n;
n = __getline (&line, &len, fp);
if (n < 0)
break;
if (line[n - 1] == '\n')
line[n - 1] = '\0';
/* Do the conversion. */
tp->tm_year = tp->tm_mon = tp->tm_mday = tp->tm_wday = INT_MIN;
tp->tm_hour = tp->tm_sec = tp->tm_min = INT_MIN;
result = strptime (string, line, tp);
if (result && *result == '\0')
break;
}
while (!feof (fp));
/* Free the buffer. */
free (line);
/* Check for errors. */
if (ferror (fp))
{
fclose (fp);
return 5;
}
/* Close template file. */
fclose (fp);
if (result == NULL)
return 7;
/* Get current time. */
time (&timer);
__localtime_r (&timer, &tm);
/* If only the weekday is given, today is assumed if the given day
is equal to the current day and next week if it is less. */
if (tp->tm_wday >= 0 && tp->tm_wday <= 6 && tp->tm_year == INT_MIN
&& tp->tm_mon == INT_MIN && tp->tm_mday == INT_MIN)
{
tp->tm_year = tm.tm_year;
tp->tm_mon = tm.tm_mon;
tp->tm_mday = tm.tm_mday + (tp->tm_wday - tm.tm_wday + 7) % 7;
mday_ok = 1;
}
/* If only the month is given, the current month is assumed if the
given month is equal to the current month and next year if it is
less and no year is given (the first day of month is assumed if
no day is given. */
if (tp->tm_mon >= 0 && tp->tm_mon <= 11 && tp->tm_mday == INT_MIN)
{
if (tp->tm_year == INT_MIN)
tp->tm_year = tm.tm_year + (((tp->tm_mon - tm.tm_mon) < 0) ? 1 : 0);
tp->tm_mday = first_wday (tp->tm_year, tp->tm_mon, tp->tm_wday);
mday_ok = 1;
}
/* If no hour, minute and second are given the current hour, minute
and second are assumed. */
if (tp->tm_hour == INT_MIN && tp->tm_min == INT_MIN && tp->tm_sec == INT_MIN)
{
tp->tm_hour = tm.tm_hour;
tp->tm_min = tm.tm_min;
tp->tm_sec = tm.tm_sec;
}
/* If no date is given, today is assumed if the given hour is
greater than the current hour and tomorrow is assumed if
it is less. */
if (tp->tm_hour >= 0 && tp->tm_hour <= 23
&& tp->tm_year == INT_MIN && tp->tm_mon == INT_MIN
&& tp->tm_mday == INT_MIN && tp->tm_wday == INT_MIN)
{
tp->tm_year = tm.tm_year;
tp->tm_mon = tm.tm_mon;
tp->tm_mday = tm.tm_mday + ((tp->tm_hour - tm.tm_hour) < 0 ? 1 : 0);
mday_ok = 1;
}
/* Fill in the gaps. */
if (tp->tm_year == INT_MIN)
tp->tm_year = tm.tm_year;
if (tp->tm_hour == INT_MIN)
tp->tm_hour = 0;
if (tp->tm_min == INT_MIN)
tp->tm_min = 0;
if (tp->tm_sec == INT_MIN)
tp->tm_sec = 0;
/* Check if the day of month is within range, and if the time can be
represented in a time_t. We make use of the fact that the mktime
call normalizes the struct tm. */
if ((!mday_ok && !check_mday (tp->tm_year, tp->tm_mon, tp->tm_mday))
|| mktime (tp) == (time_t) -1)
return 8;
return 0;
}
#ifdef weak_alias
weak_alias (__getdate_r, getdate_r)
#endif
struct tm *
getdate (const char *string)
{
/* Buffer returned by getdate. */
static struct tm tmbuf;
int errval = __getdate_r (string, &tmbuf);
return errval == 0 ? &tmbuf : NULL;
}

View File

@ -275,6 +275,38 @@ extern int nanosleep __P ((__const struct timespec *__requested_time,
#endif
#ifdef __USE_XOPEN_EXTENDED
/* Set to one of the following values to indicate an error.
1 the DATEMSK environment variable is null or undefined,
2 the template file cannot be opened for reading,
3 failed to get file status information,
4 the template file is not a regular file,
5 an error is encountered while reading the template file,
6 memory allication failed (not enough memory available),
7 there is no line in the template that matches the input,
8 invalid input specification Example: February 31 or a time is
specified that can not be represented in a time_t (representing
the time in seconds since 00:00:00 UTC, January 1, 1970) */
extern int getdate_err;
/* Parse the given string as a date specification and return a value
representing the value. The templates from the file identified by
the environment variable DATEMSK are used. In case of an error
`getdate_err' is set. */
extern struct tm *getdate __P ((__const char *__string));
#endif
#ifdef __USE_GNU
/* Since `getdate' is not reentrant because of the use of `getdate_err'
and the static buffer to return the result in, we provide a thread-safe
variant. The functionality is the same. The result is returned in
the buffer pointed to by RESBUFP and in case of an error the return
value is != 0 with the same values as given above for `getdate_err'. */
extern int __getdate_r __P ((__const char *__string, struct tm *__resbufp));
extern int getdate_r __P ((__const char *__string, struct tm *__resbufp));
#endif
__END_DECLS
#endif /* <time.h> included. */