aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux')
-rw-r--r--sysdeps/unix/sysv/linux/Implies7
-rw-r--r--sysdeps/unix/sysv/linux/Makefile21
-rw-r--r--sysdeps/unix/sysv/linux/Subdirs1
-rw-r--r--sysdeps/unix/sysv/linux/accept.S2
-rw-r--r--sysdeps/unix/sysv/linux/adjtime.c69
-rw-r--r--sysdeps/unix/sysv/linux/adjtimex.S22
-rw-r--r--sysdeps/unix/sysv/linux/bind.S2
-rw-r--r--sysdeps/unix/sysv/linux/connect.S2
-rw-r--r--sysdeps/unix/sysv/linux/direct.h43
-rw-r--r--sysdeps/unix/sysv/linux/dl-machine.h214
-rw-r--r--sysdeps/unix/sysv/linux/errnos.h1
-rw-r--r--sysdeps/unix/sysv/linux/fork.S24
-rw-r--r--sysdeps/unix/sysv/linux/gethostid.c96
-rw-r--r--sysdeps/unix/sysv/linux/gethostname.c53
-rw-r--r--sysdeps/unix/sysv/linux/getpeername.S2
-rw-r--r--sysdeps/unix/sysv/linux/getpgid.S22
-rw-r--r--sysdeps/unix/sysv/linux/getpgrp.S22
-rw-r--r--sysdeps/unix/sysv/linux/getsockname.S2
-rw-r--r--sysdeps/unix/sysv/linux/getsockopt.S2
-rw-r--r--sysdeps/unix/sysv/linux/gtty.S22
-rw-r--r--sysdeps/unix/sysv/linux/i386/Dist1
-rw-r--r--sysdeps/unix/sysv/linux/i386/Makefile7
-rw-r--r--sysdeps/unix/sysv/linux/i386/brk.S60
-rw-r--r--sysdeps/unix/sysv/linux/i386/fcntlbits.h26
-rw-r--r--sysdeps/unix/sysv/linux/i386/fpu_control.c20
-rw-r--r--sysdeps/unix/sysv/linux/i386/fpu_control.h100
-rw-r--r--sysdeps/unix/sysv/linux/i386/fstat.S4
-rw-r--r--sysdeps/unix/sysv/linux/i386/fxstat.S4
-rw-r--r--sysdeps/unix/sysv/linux/i386/ieee_fpu.c22
-rw-r--r--sysdeps/unix/sysv/linux/i386/init-first.S84
-rw-r--r--sysdeps/unix/sysv/linux/i386/ipc.S22
-rw-r--r--sysdeps/unix/sysv/linux/i386/lstat.S4
-rw-r--r--sysdeps/unix/sysv/linux/i386/lxstat.S4
-rw-r--r--sysdeps/unix/sysv/linux/i386/mknod.S39
-rw-r--r--sysdeps/unix/sysv/linux/i386/mmap.S45
-rw-r--r--sysdeps/unix/sysv/linux/i386/sbrk.S82
-rw-r--r--sysdeps/unix/sysv/linux/i386/setfpucw.c43
-rw-r--r--sysdeps/unix/sysv/linux/i386/signum.h66
-rw-r--r--sysdeps/unix/sysv/linux/i386/socket.S60
-rw-r--r--sysdeps/unix/sysv/linux/i386/stat.S38
-rw-r--r--sysdeps/unix/sysv/linux/i386/syscall.S31
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.S40
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.h135
-rw-r--r--sysdeps/unix/sysv/linux/i386/xmknod.S49
-rw-r--r--sysdeps/unix/sysv/linux/i386/xstat.S51
-rw-r--r--sysdeps/unix/sysv/linux/listen.S2
-rw-r--r--sysdeps/unix/sysv/linux/local_lim.h31
-rw-r--r--sysdeps/unix/sysv/linux/madvise.c1
-rw-r--r--sysdeps/unix/sysv/linux/msgctl.c32
-rw-r--r--sysdeps/unix/sysv/linux/msgget.c32
-rw-r--r--sysdeps/unix/sysv/linux/msgrcv.c38
-rw-r--r--sysdeps/unix/sysv/linux/msgsnd.c30
-rw-r--r--sysdeps/unix/sysv/linux/pipe.S24
-rw-r--r--sysdeps/unix/sysv/linux/poll.c1
-rw-r--r--sysdeps/unix/sysv/linux/readv.c1
-rw-r--r--sysdeps/unix/sysv/linux/recv.S2
-rw-r--r--sysdeps/unix/sysv/linux/recvfrom.S2
-rw-r--r--sysdeps/unix/sysv/linux/recvmsg.S2
-rw-r--r--sysdeps/unix/sysv/linux/semctl.c33
-rw-r--r--sysdeps/unix/sysv/linux/semget.c33
-rw-r--r--sysdeps/unix/sysv/linux/semop.c31
-rw-r--r--sysdeps/unix/sysv/linux/send.S2
-rw-r--r--sysdeps/unix/sysv/linux/sendmsg.S2
-rw-r--r--sysdeps/unix/sysv/linux/sendto.S2
-rw-r--r--sysdeps/unix/sysv/linux/setegid.c1
-rw-r--r--sysdeps/unix/sysv/linux/seteuid.c36
-rw-r--r--sysdeps/unix/sysv/linux/sethostid.c2
-rw-r--r--sysdeps/unix/sysv/linux/setpgid.S22
-rw-r--r--sysdeps/unix/sysv/linux/setpgrp.c25
-rw-r--r--sysdeps/unix/sysv/linux/setsid.S1
-rw-r--r--sysdeps/unix/sysv/linux/setsockopt.S2
-rw-r--r--sysdeps/unix/sysv/linux/settimeofday.S24
-rw-r--r--sysdeps/unix/sysv/linux/shmat.c37
-rw-r--r--sysdeps/unix/sysv/linux/shmctl.c31
-rw-r--r--sysdeps/unix/sysv/linux/shmdt.c30
-rw-r--r--sysdeps/unix/sysv/linux/shmget.c33
-rw-r--r--sysdeps/unix/sysv/linux/shutdown.S2
-rw-r--r--sysdeps/unix/sysv/linux/sigaction.S24
-rw-r--r--sysdeps/unix/sysv/linux/signal.S8
-rw-r--r--sysdeps/unix/sysv/linux/sigpending.S1
-rw-r--r--sysdeps/unix/sysv/linux/sigset.h1
-rw-r--r--sysdeps/unix/sysv/linux/sockaddrcom.h37
-rw-r--r--sysdeps/unix/sysv/linux/socketpair.S2
-rw-r--r--sysdeps/unix/sysv/linux/speed.c103
-rw-r--r--sysdeps/unix/sysv/linux/statbuf.h72
-rw-r--r--sysdeps/unix/sysv/linux/stty.S22
-rw-r--r--sysdeps/unix/sysv/linux/sys/ipc_buf.h84
-rw-r--r--sysdeps/unix/sysv/linux/sys/mman.h112
-rw-r--r--sysdeps/unix/sysv/linux/sys/msq_buf.h54
-rw-r--r--sysdeps/unix/sysv/linux/sys/sem_buf.h65
-rw-r--r--sysdeps/unix/sysv/linux/sys/shm_buf.h56
-rw-r--r--sysdeps/unix/sysv/linux/sys/socketcall.h46
-rw-r--r--sysdeps/unix/sysv/linux/sys/timex.h30
-rw-r--r--sysdeps/unix/sysv/linux/syscall.h59
-rw-r--r--sysdeps/unix/sysv/linux/sysconf.c1
-rw-r--r--sysdeps/unix/sysv/linux/tcdrain.c31
-rw-r--r--sysdeps/unix/sysv/linux/tcflow.c1
-rw-r--r--sysdeps/unix/sysv/linux/tcflush.c1
-rw-r--r--sysdeps/unix/sysv/linux/tcgetattr.c31
-rw-r--r--sysdeps/unix/sysv/linux/tcsetattr.c1
-rw-r--r--sysdeps/unix/sysv/linux/termbits.h209
-rw-r--r--sysdeps/unix/sysv/linux/ualarm.c1
-rw-r--r--sysdeps/unix/sysv/linux/ulimit.c73
-rw-r--r--sysdeps/unix/sysv/linux/usleep.c1
-rw-r--r--sysdeps/unix/sysv/linux/utsnamelen.h24
-rw-r--r--sysdeps/unix/sysv/linux/vfork.c1
-rw-r--r--sysdeps/unix/sysv/linux/wait.c1
-rw-r--r--sysdeps/unix/sysv/linux/wait4.S1
-rw-r--r--sysdeps/unix/sysv/linux/waitpid.c32
-rw-r--r--sysdeps/unix/sysv/linux/writev.c1
110 files changed, 3399 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/Implies b/sysdeps/unix/sysv/linux/Implies
new file mode 100644
index 0000000000..141aab485c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/Implies
@@ -0,0 +1,7 @@
+# Linux has not yet (as of 1.3.18) the canonical set of <sys/mman.h>
+# system calls. msync() and madvice() are missing, so their stubs
+# are found here. I think later version will have them ones.
+unix/mman
+
+# Linux has network support in the kernel.
+unix/inet
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
new file mode 100644
index 0000000000..702ad047a3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -0,0 +1,21 @@
+ifeq ($(subdir), io)
+sysdep_routines := $(sysdep_routines) fxstat lxstat xstat
+endif
+
+ifeq ($(subdir), misc)
+sysdep_routines := $(sysdep_routines) xmknod
+endif
+
+#ifeq ($(subdir), posix)
+#sysdep_routines := $(sysdep_routines) setpgrp
+#endif
+
+ifeq ($(subdir), time)
+sysdep_routines := $(sysdep_routines) adjtimex
+endif
+
+ifeq ($(subdir), sysvipc)
+sysdep_routines := $(sysdep_routines) ipc
+endif
+
+headers := $(headers) sys/socketcall.h sys/timex.h
diff --git a/sysdeps/unix/sysv/linux/Subdirs b/sysdeps/unix/sysv/linux/Subdirs
new file mode 100644
index 0000000000..ea1a9e9d3a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/Subdirs
@@ -0,0 +1 @@
+sysvipc
diff --git a/sysdeps/unix/sysv/linux/accept.S b/sysdeps/unix/sysv/linux/accept.S
new file mode 100644
index 0000000000..5936a0185b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/accept.S
@@ -0,0 +1,2 @@
+#define socket accept
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/adjtime.c b/sysdeps/unix/sysv/linux/adjtime.c
new file mode 100644
index 0000000000..3673cd9164
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/adjtime.c
@@ -0,0 +1,69 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+
+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 <limits.h>
+#include <sys/time.h>
+#include <sys/timex.h>
+
+#define MAX_SEC (LONG_MAX / 1000000L - 2)
+#define MIN_SEC (LONG_MIN / 1000000L + 2)
+
+int
+__adjtime (itv, otv)
+ const struct timeval *itv;
+ struct timeval *otv;
+{
+ struct timex tntx;
+
+ if (itv)
+ {
+ struct timeval tmp;
+
+ /* We will do some check here. */
+ tmp.tv_sec = itv->tv_sec + itv->tv_usec / 1000000L;
+ tmp.tv_usec = itv->tv_usec % 1000000L;
+ if (tmp.tv_sec > MAX_SEC || tmp.tv_sec < MIN_SEC)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+ tntx.offset = tmp.tv_usec + tmp.tv_sec * 1000000L;
+ tntx.mode = ADJ_OFFSET_SINGLESHOT;
+ }
+ else
+ tntx.mode = 0;
+
+ if (__adjtimex (&tntx) < 0) return -1;
+
+ if (otv)
+ {
+ if (tntx.offset < 0)
+ {
+ otv->tv_usec = -(-tntx.offset % 1000000);
+ otv->tv_sec = -(-tntx.offset / 1000000);
+ }
+ else
+ {
+ otv->tv_usec = tntx.offset % 1000000;
+ otv->tv_sec = tntx.offset / 1000000;
+ }
+ }
+ return 0;
+}
+
+weak_alias (__adjtime, adjtime)
diff --git a/sysdeps/unix/sysv/linux/adjtimex.S b/sysdeps/unix/sysv/linux/adjtimex.S
new file mode 100644
index 0000000000..de680acffb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/adjtimex.S
@@ -0,0 +1,22 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL__ (adjtimex, 1)
+ ret
diff --git a/sysdeps/unix/sysv/linux/bind.S b/sysdeps/unix/sysv/linux/bind.S
new file mode 100644
index 0000000000..fc82b65a2f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/bind.S
@@ -0,0 +1,2 @@
+#define socket bind
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/connect.S b/sysdeps/unix/sysv/linux/connect.S
new file mode 100644
index 0000000000..3433043d8c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/connect.S
@@ -0,0 +1,2 @@
+#define socket connect
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/direct.h b/sysdeps/unix/sysv/linux/direct.h
new file mode 100644
index 0000000000..ef88147d81
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/direct.h
@@ -0,0 +1,43 @@
+/* Copyright (C) 1992, 1993 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#ifndef _BSDDIR_H
+#define _BSDDIR_H 1
+
+#include <limits.h>
+
+/* This is what system V calls a "struct dirent". */
+
+struct direct
+ {
+ unsigned long int d_fileno;
+ long int d_off;
+ unsigned short int d_reclen;
+ char d_name[NAME_MAX + 1];
+ };
+
+#include <stddef.h>
+
+/* We calculate the length of the name by taking the length of the whole
+ `struct direct' record, subtracting the size of everything before the
+ name, and subtracting one for the terminating null. */
+
+#define D_NAMLEN(d) \
+ ((d)->d_reclen - offsetof (struct direct, d_name) - 1)
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/dl-machine.h b/sysdeps/unix/sysv/linux/dl-machine.h
new file mode 100644
index 0000000000..2ed6c670e5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/dl-machine.h
@@ -0,0 +1,214 @@
+/* Machine-dependent ELF dynamic relocation inline functions.
+ i386/Linux version.
+Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#define ELF_MACHINE_NAME "i386"
+
+#include <assert.h>
+#include <string.h>
+#include <link.h>
+#include <syscall.h>
+#include <sys/mman.h>
+
+/* Return nonzero iff E_MACHINE is compatible with the running host. */
+static inline int
+elf_machine_matches_host (Elf32_Half e_machine)
+{
+ switch (e_machine)
+ {
+ case EM_386:
+ case EM_486:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+
+/* Return the run-time address of the _GLOBAL_OFFSET_TABLE_.
+ Must be inlined in a function which uses global data. */
+static inline Elf32_Addr *
+elf_machine_got (void)
+{
+ register Elf32_Addr *got asm ("%ebx");
+ return got;
+}
+
+
+/* Return the run-time load address of the shared object. */
+static inline Elf32_Addr
+elf_machine_load_address (void)
+{
+ Elf32_Addr addr;
+ asm (" call here\n"
+ "here: popl %0\n"
+ " subl $here, %0"
+ : "=r" (addr));
+ return addr;
+}
+/* The `subl' insn above will contain an R_386_32 relocation entry
+ intended to insert the run-time address of the label `here'.
+ This will be the first relocation in the text of the dynamic linker;
+ we skip it to avoid trying to modify read-only text in this early stage. */
+#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) \
+ ++(const Elf32_Rel *) (dynamic_info)[DT_REL]->d_un.d_ptr; \
+ (dynamic_info)[DT_RELSZ]->d_un.d_val -= sizeof (Elf32_Rel)
+
+/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
+ MAP is the object containing the reloc. */
+
+static inline void
+elf_machine_rel (struct link_map *map,
+ const Elf32_Rel *reloc,
+ Elf32_Addr sym_loadaddr, const Elf32_Sym *sym)
+{
+ Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
+ const Elf32_Addr sym_value = sym_loadaddr + sym->st_value;
+
+ switch (ELF32_R_TYPE (reloc->r_info))
+ {
+ case R_386_COPY:
+ memcpy (reloc_addr, (void *) sym_value, sym->st_size);
+ break;
+ case R_386_GLOB_DAT:
+ case R_386_JMP_SLOT:
+ *reloc_addr = sym_value;
+ break;
+ case R_386_32:
+ if (map->l_type == lt_interpreter)
+ {
+ /* Undo the relocation done here during bootstrapping. Now we will
+ relocate it anew, possibly using a binding found in the user
+ program or a loaded library rather than the dynamic linker's
+ built-in definitions used while loading those libraries. */
+ const Elf32_Sym *const dlsymtab
+ = (void *) (map->l_addr + map->l_info[DT_SYMTAB]->d_un.d_ptr);
+ *reloc_addr -= (map->l_addr +
+ dlsymtab[ELF32_R_SYM (reloc->r_info)].st_value);
+ }
+ *reloc_addr += sym_value;
+ break;
+ case R_386_RELATIVE:
+ if (map->l_type != lt_interpreter) /* Already done in dynamic linker. */
+ *reloc_addr += map->l_addr;
+ break;
+ case R_386_PC32:
+ *reloc_addr = sym_value - (Elf32_Addr) reloc_addr;
+ break;
+ default:
+ assert (! "unexpected dynamic reloc type");
+ break;
+ }
+}
+
+static inline void
+elf_machine_lazy_rel (struct link_map *map, const Elf32_Rel *reloc)
+{
+ Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
+ switch (ELF32_R_TYPE (reloc->r_info))
+ {
+ case R_386_JMP_SLOT:
+ *reloc_addr += map->l_addr;
+ break;
+ default:
+ assert (! "unexpected PLT reloc type");
+ break;
+ }
+}
+
+/* The i386 never uses Elf32_Rela relocations. */
+#define ELF_MACHINE_NO_RELA 1
+
+
+/* Set up the loaded object described by L so its unrelocated PLT
+ entries will jump to the on-demand fixup code in dl-runtime.c. */
+
+static inline void
+elf_machine_runtime_setup (struct link_map *l)
+{
+ Elf32_Addr *got;
+ extern void _dl_runtime_resolve (Elf32_Word);
+
+ /* The GOT entries for functions in the PLT have not yet been filled
+ in. Their initial contents will arrange when called to push an
+ offset into the .rel.plt section, push _GLOBAL_OFFSET_TABLE_[1],
+ and then jump to _GLOBAL_OFFSET_TABLE[2]. */
+ got = (Elf32_Addr *) (l->l_addr + l->l_info[DT_PLTGOT]->d_un.d_ptr);
+ got[1] = (Elf32_Addr) l; /* Identify this shared object. */
+ /* This function will get called to fix up the GOT entry indicated by
+ the offset on the stack, and then jump to the resolved address. */
+ got[2] = (Elf32_Addr) &_dl_runtime_resolve;
+}
+
+
+/* Mask identifying addresses reserved for the user program,
+ where the dynamic linker should not map anything. */
+#define ELF_MACHINE_USER_ADDRESS_MASK 0xf8000000UL
+
+
+
+/* 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. */
+
+#define RTLD_START asm ("\
+.text\n\
+.globl _start\n\
+.globl _dl_start_user\n\
+_start:\n\
+ call _dl_start\n\
+_dl_start_user:\n\
+ # Save the user entry point address in %edi.\n\
+ movl %eax, %edi\n\
+ # Point %ebx at the GOT.
+ call 0f\n\
+0: popl %ebx\n\
+ addl $_GLOBAL_OFFSET_TABLE_+[.-0b], %ebx\n\
+ # See if we were run as a command with the executable file\n\
+ # name as an extra leading argument.\n\
+ movl rtld_command@GOT(%ebx), %eax\n\
+ movl (%eax),%eax\n\
+ testl %eax,%eax\n\
+ jz 0f\n\
+ # Pop the original argument count, decrement it, and replace\n\
+ # the original first argument pointer with the new count.\n\
+ popl %eax\n\
+ decl %eax\n\
+ movl %eax,(%esp)\n\
+ # Call _dl_init_next to return the address of an initializer\n\
+ # function to run.\n\
+0: call _dl_init_next@PLT\n\
+ # Check for zero return, when out of initializers.\n\
+ testl %eax,%eax\n\
+ jz 1f\n\
+ # Call the shared object initializer function.\n\
+ # NOTE: We depend only on the registers (%ebx and %edi)\n\
+ # and the return address pushed by this call;\n\
+ # the initializer is called with the stack just\n\
+ # as it appears on entry, and it is free to move\n\
+ # the stack around, as long as it winds up jumping to\n\
+ # the return address on the top of the stack.\n\
+ call *%eax\n\
+ # Loop to call _dl_init_next for the next initializer.\n\
+ jmp 0b\n\
+1: # Pass our finalizer function to the user in %edx, as per ELF ABI.\n\
+ movl _dl_fini@GOT(%ebx), %edx\n\
+ # Jump to the user's entry point.\n\
+ jmp *%edi\n\
+");
diff --git a/sysdeps/unix/sysv/linux/errnos.h b/sysdeps/unix/sysv/linux/errnos.h
new file mode 100644
index 0000000000..be1e4d3feb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/errnos.h
@@ -0,0 +1 @@
+#include <linux/errno.h>
diff --git a/sysdeps/unix/sysv/linux/fork.S b/sysdeps/unix/sysv/linux/fork.S
new file mode 100644
index 0000000000..a49a4bcebd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/fork.S
@@ -0,0 +1,24 @@
+/* Copyright (C) 1991, 1992, 1994, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL__ (fork, 0)
+ ret
+
+weak_alias (__fork, fork)
diff --git a/sysdeps/unix/sysv/linux/gethostid.c b/sysdeps/unix/sysv/linux/gethostid.c
new file mode 100644
index 0000000000..94f4a1ece7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/gethostid.c
@@ -0,0 +1,96 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+
+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 <fcntl.h>
+#include <unistd.h>
+
+#define HOSTIDFILE "/var/adm/hostid"
+
+#ifdef SET_PROCEDURE
+int
+sethostid (id)
+ long int id;
+{
+ int fd;
+ ssize_t written;
+
+ /* Test for appropriate rights to set host ID. */
+ if (geteuid () || getuid ())
+ {
+ errno = EPERM;
+ return -1;
+ }
+
+ /* Open file for writing. Everybody is allowed to read this file. */
+ fd = __open (HOSTIDFILE, O_CREAT|O_WRONLY, 0644);
+ if (fd < 0)
+ return -1;
+
+ written = __write (fd, &id, sizeof (id));
+
+ __close (fd);
+
+ return written != sizeof (id) ? -1 : 0;
+}
+
+#else
+# include <sys/param.h>
+# include <resolv/netdb.h>
+# include <netinet/in.h>
+
+long int
+gethostid ()
+{
+ char hostname[MAXHOSTNAMELEN + 1];
+ struct hostent *hp;
+ unsigned long id;
+ struct in_addr in;
+ int fd;
+
+ /* First try to get the ID from a former invocation of sethostid. */
+ fd = __open (HOSTIDFILE, O_RDONLY);
+ if (fd >= 0)
+ {
+ ssize_t n = __read (fd, &id, sizeof (id));
+
+ __close (fd);
+
+ if (n == sizeof (id))
+ return id;
+ }
+
+ /* Getting from the file was not succesful. An intelligent guess for
+ a unique number of a host is its IP address. Return this. */
+ if (gethostname (hostname, MAXHOSTNAMELEN) < 0 || hostname[0] == '\0')
+ /* This also fails. Return and arbitrary value. */
+ return 0;
+
+ /* To get the IP address we need to knoe the host name. */
+ hp = gethostbyname (hostname);
+ if (hp == NULL)
+ return 0;
+
+ in.s_addr = 0;
+ memcpy (&in, hp->h_addr,
+ sizeof (in) < hp->h_length ? sizeof (in) : hp->h_length);
+
+ /* For the return value to be not exactly the IP address we do some
+ bit fiddling. */
+ return in.s_addr << 16 | in.s_addr >> 16;
+}
+#endif
diff --git a/sysdeps/unix/sysv/linux/gethostname.c b/sysdeps/unix/sysv/linux/gethostname.c
new file mode 100644
index 0000000000..4b7720d414
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/gethostname.c
@@ -0,0 +1,53 @@
+/* Copyright (C) 1992, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/utsname.h>
+
+/* Put the name of the current host in no more than LEN bytes of NAME.
+ The result is null-terminated if LEN is large enough for the full
+ name and the terminator. */
+int
+__gethostname (name, len)
+ char *name;
+ size_t len;
+{
+ struct utsname buf;
+
+ if (name == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (uname (&buf))
+ return -1;
+
+ if (strlen (buf.nodename) + 1 > len)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ strcpy (name, buf.nodename);
+ return 0;
+}
+
+weak_alias (__gethostname, gethostname)
diff --git a/sysdeps/unix/sysv/linux/getpeername.S b/sysdeps/unix/sysv/linux/getpeername.S
new file mode 100644
index 0000000000..8429fcdf76
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/getpeername.S
@@ -0,0 +1,2 @@
+#define socket getpeername
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/getpgid.S b/sysdeps/unix/sysv/linux/getpgid.S
new file mode 100644
index 0000000000..3151296b3c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/getpgid.S
@@ -0,0 +1,22 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL (getpgid, 1)
+ ret
diff --git a/sysdeps/unix/sysv/linux/getpgrp.S b/sysdeps/unix/sysv/linux/getpgrp.S
new file mode 100644
index 0000000000..75e8d342cc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/getpgrp.S
@@ -0,0 +1,22 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL (getpgrp, 0)
+ ret
diff --git a/sysdeps/unix/sysv/linux/getsockname.S b/sysdeps/unix/sysv/linux/getsockname.S
new file mode 100644
index 0000000000..6782707f88
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/getsockname.S
@@ -0,0 +1,2 @@
+#define socket getsockname
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/getsockopt.S b/sysdeps/unix/sysv/linux/getsockopt.S
new file mode 100644
index 0000000000..6ce92a6330
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/getsockopt.S
@@ -0,0 +1,2 @@
+#define socket getsockopt
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/gtty.S b/sysdeps/unix/sysv/linux/gtty.S
new file mode 100644
index 0000000000..1cff6b251c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/gtty.S
@@ -0,0 +1,22 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL (gtty, 2)
+ ret
diff --git a/sysdeps/unix/sysv/linux/i386/Dist b/sysdeps/unix/sysv/linux/i386/Dist
new file mode 100644
index 0000000000..91365adfc4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/Dist
@@ -0,0 +1 @@
+fxstat.S lxstat.S xmknod.S xstat.S
diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile
new file mode 100644
index 0000000000..76d295e048
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/Makefile
@@ -0,0 +1,7 @@
+ifeq ($(subdir), misc)
+sysdep_routines := $(sysdep_routines) fpu_control setfpucw
+
+extra-libs := $(extra-libs) libieee
+libieee-routines := ieee_fpu
+libieee-inhibit-o := .so .po
+endif
diff --git a/sysdeps/unix/sysv/linux/i386/brk.S b/sysdeps/unix/sysv/linux/i386/brk.S
new file mode 100644
index 0000000000..ef2f55db97
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/brk.S
@@ -0,0 +1,60 @@
+/* Copyright (C) 1991, 1992, 1993, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+.data
+.globl C_SYMBOL_NAME(__curbrk)
+C_LABEL(__curbrk)
+#ifdef PIC
+ .long 0
+#else
+# ifdef HAVE_GNU_LD
+ .long C_SYMBOL_NAME(_end)
+# else
+ .long C_SYMBOL_NAME(end)
+# endif
+#endif
+
+.text
+.globl C_SYMBOL_NAME(syscall_error)
+
+ENTRY (__brk)
+ movl %ebx, %edx
+ movl $SYS_ify(brk), %eax
+ movl 4(%esp), %ebx
+ int $0x80
+ movl %edx, %ebx
+
+ cmpl 4(%esp), %eax
+ jne JUMPTARGET(syscall_error)
+
+#ifdef PIC
+ /* Standard PIC nonsense to store into `__curbrk' through the GOT. */
+ call here
+here: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
+ movl C_SYMBOL_NAME(__curbrk@GOT)(%ecx), %ecx
+ movl %eax, (%ecx)
+#else
+ movl %eax, C_SYMBOL_NAME(__curbrk)
+#endif
+ xorl %eax, %eax
+ ret
+
+weak_alias (__brk, brk)
diff --git a/sysdeps/unix/sysv/linux/i386/fcntlbits.h b/sysdeps/unix/sysv/linux/i386/fcntlbits.h
new file mode 100644
index 0000000000..8d92ac02b0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fcntlbits.h
@@ -0,0 +1,26 @@
+/* O_*, F_*, FD_* bit values for Linux.
+Copyright (C) 1995 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 _FCNTLBITS_H
+#define _FCNTLBITS_H 1
+
+#include <sys/types.h>
+#include <linux/fcntl.h>
+
+#endif /* fcntlbits.h */
diff --git a/sysdeps/unix/sysv/linux/i386/fpu_control.c b/sysdeps/unix/sysv/linux/i386/fpu_control.c
new file mode 100644
index 0000000000..79933b90eb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fpu_control.c
@@ -0,0 +1,20 @@
+/* Default control word for ix86 FPU.
+Copyright (C) 1995 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. */
+
+unsigned short ___fpu_control = 0;
diff --git a/sysdeps/unix/sysv/linux/i386/fpu_control.h b/sysdeps/unix/sysv/linux/i386/fpu_control.h
new file mode 100644
index 0000000000..28f3eeba7b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fpu_control.h
@@ -0,0 +1,100 @@
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Olaf Flebbe.
+
+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 _FPU_CONTROL_H
+#define _FPU_CONTROL_H
+
+/* Here is the dirty part. Settup up your 387 through the control word
+ * (cw) register.
+ *
+ * 15-13 12 11-10 9-8 7-6 5 4 3 2 1 0
+ * | reserved | IC | RC | PC | reserved | PM | UM | OM | ZM | DM | IM
+ *
+ * IM: Invalid operation mask
+ * DM: Denormalized operand mask
+ * ZM: Zero-divide mask
+ * OM: Overflow mask
+ * UM: Underflow mask
+ * PM: Precision (inexact result) mask
+ *
+ * Mask bit is 1 means no interrupt.
+ *
+ * PC: Precision control
+ * 11 - round to extended precision
+ * 10 - round to double precision
+ * 00 - round to single precision
+ *
+ * RC: Rounding control
+ * 00 - rounding to nearest
+ * 01 - rounding down (toward - infinity)
+ * 10 - rounding up (toward + infinity)
+ * 11 - rounding toward zero
+ *
+ * IC: Infinity control
+ * That is for 8087 and 80287 only.
+ *
+ * The hardware default is 0x037f. I choose 0x1372.
+ */
+
+#include <features.h>
+
+/* masking of interrupts */
+#define _FPU_MASK_IM 0x01
+#define _FPU_MASK_DM 0x02
+#define _FPU_MASK_ZM 0x04
+#define _FPU_MASK_OM 0x08
+#define _FPU_MASK_UM 0x10
+#define _FPU_MASK_PM 0x20
+
+/* precision control */
+#define _FPU_EXTENDED 0x300 /* RECOMMENDED */
+#define _FPU_DOUBLE 0x200
+#define _FPU_SINGLE 0x0 /* DO NOT USE */
+
+/* rounding control */
+#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */
+#define _FPU_RC_DOWN 0x400
+#define _FPU_RC_UP 0x800
+#define _FPU_RC_ZERO 0xC00
+
+#define _FPU_RESERVED 0xF0C0 /* Reserved bits in cw */
+
+
+/* Now two recommended cw */
+
+/* Linux default:
+ - extended precision
+ - rounding to nearest
+ - exceptions on overflow, zero divide and NaN */
+#define _FPU_DEFAULT 0x1372
+
+/* IEEE: same as above, but exceptions */
+#define _FPU_IEEE 0x137f
+
+/* private namespace. It should only be used in init-first.o. */
+extern unsigned short __fpu_control;
+
+__BEGIN_DECLS
+
+/* called in init-first.o. It can be used to manipulate 387 control word. */
+extern void __setfpucw __P ((unsigned short));
+
+__END_DECLS
+
+#endif /* fpu_control.h */
diff --git a/sysdeps/unix/sysv/linux/i386/fstat.S b/sysdeps/unix/sysv/linux/i386/fstat.S
new file mode 100644
index 0000000000..434ad4ad64
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fstat.S
@@ -0,0 +1,4 @@
+#define __stat __fstat
+#define stat fstat
+#define __xstat __fxstat
+#include "stat.S"
diff --git a/sysdeps/unix/sysv/linux/i386/fxstat.S b/sysdeps/unix/sysv/linux/i386/fxstat.S
new file mode 100644
index 0000000000..c4db088abe
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/fxstat.S
@@ -0,0 +1,4 @@
+#define __xstat __fxstat
+#define _xstat _fxstat
+#define stat fstat
+#include "xstat.S"
diff --git a/sysdeps/unix/sysv/linux/i386/ieee_fpu.c b/sysdeps/unix/sysv/linux/i386/ieee_fpu.c
new file mode 100644
index 0000000000..4a0bf31e7c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/ieee_fpu.c
@@ -0,0 +1,22 @@
+/* Default control word for ix86 FPU.
+Copyright (C) 1995 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 <fpu_control.h>
+
+unsigned short ___fpu_control = _FPU_IEEE;
diff --git a/sysdeps/unix/sysv/linux/i386/init-first.S b/sysdeps/unix/sysv/linux/i386/init-first.S
new file mode 100644
index 0000000000..3c0c185fb7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/init-first.S
@@ -0,0 +1,84 @@
+/* Initialization code run first thing by the ELF startup code.
+ For i386/Linux.
+Copyright (C) 1995 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 <sysdep.h>
+
+ .text
+
+ /* Called from start.S. Not: there is no value in %ebx. */
+
+ENTRY (__libc_init_first)
+
+ /* Make sure we are not using iBSC2 personality. */
+ movl $SYS_ify (personality), %eax
+ xorl %ebx, %ebx
+ int $0x80
+
+#ifdef PIC
+ /* Set control work of FPU. */
+ call .L0
+.L0: popl %ebx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-.L0], %ebx
+ movzwl C_SYMBOL_NAME(___fpu_control@GOT)(%ebx), %eax
+#else
+ movzwl ___fpu_control, %eax
+#endif
+ pushl %eax
+ call JUMPTARGET(__setfpucw)
+ addl $4, %esp
+
+ /* That is all for now. */
+ ret
+
+
+ /* This is only a dummy function for the list below. */
+ .type _dummy_exit, @function
+C_LABEL(_dummy_exit)
+ ret
+
+
+ .section .init,"ax",@progbits
+ movl 16(%ebp), %edx /* envp */
+ movl 12(%ebp), %ecx /* argv */
+ movl 8(%ebp), %eax /* argc */
+ pushl %edx
+ pushl %ecx
+ pushl %eax
+
+ call JUMPTARGET(__libc_init)
+
+ addl $12, %esp
+
+
+ /* Make sure __libc_subinit section is always present. */
+ .section __libc_subinit, "a", @progbits
+ .align 4
+ .type __elf_set___libc_subinit_element__dummy_exit__, @object
+ .size __elf_set___libc_subinit_element__dummy_exit__, 4
+__elf_set___libc_subinit_element__dummy_exit__:
+ .long _dummy_exit
+
+ /* Make sure __libc_atexit section is always present. */
+ .section __libc_atexit, "a", @progbits
+ .align 4
+ .type __elf_set___libc_atexit_element__dummy_exit__, @object
+ .size __elf_set___libc_atexit_element__dummy_exit__, 4
+__elf_set___libc_atexit_element__dummy_exit__:
+ .long _dummy_exit
diff --git a/sysdeps/unix/sysv/linux/i386/ipc.S b/sysdeps/unix/sysv/linux/i386/ipc.S
new file mode 100644
index 0000000000..bb523a20dc
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/ipc.S
@@ -0,0 +1,22 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL__ (ipc, 5)
+ ret
diff --git a/sysdeps/unix/sysv/linux/i386/lstat.S b/sysdeps/unix/sysv/linux/i386/lstat.S
new file mode 100644
index 0000000000..9135c6bfe1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/lstat.S
@@ -0,0 +1,4 @@
+#define __stat __lstat
+#define stat lstat
+#define __xstat __lxstat
+#include "stat.S"
diff --git a/sysdeps/unix/sysv/linux/i386/lxstat.S b/sysdeps/unix/sysv/linux/i386/lxstat.S
new file mode 100644
index 0000000000..fee635be78
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/lxstat.S
@@ -0,0 +1,4 @@
+#define __xstat __lxstat
+#define _xstat _lxstat
+#define stat lstat
+#include "xstat.S"
diff --git a/sysdeps/unix/sysv/linux/i386/mknod.S b/sysdeps/unix/sysv/linux/i386/mknod.S
new file mode 100644
index 0000000000..7faf89d74b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/mknod.S
@@ -0,0 +1,39 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+/* In Linux the `mknod' call is actually done by a emulation of the
+ `xmknod' system call, which takes an additional first argument
+ giving a version number for the interface. This macro gives the
+ Linux version number that corresponds to the modern interface. */
+#define _MKNOD_VER 1
+
+ENTRY (__mknod)
+ movl 12(%esp), %edx
+ movl 8(%esp), %ecx
+ movl 4(%esp), %eax
+ pushl %edx
+ pushl %ecx
+ pushl %eax
+ pushl $_MKNOD_VER /* Push extra first arg to syscall. */
+ call JUMPTARGET(__xmknod)
+ addl $16, %esp /* Correct version parameter offset. */
+ ret
+
+weak_alias (__mknod, mknod)
diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
new file mode 100644
index 0000000000..96ea870846
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/mmap.S
@@ -0,0 +1,45 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+.globl syscall_error
+
+ENTRY (__mmap)
+
+ /* Save registers. */
+ movl %ebx, %edx
+
+ movl $SYS_ify(mmap), %eax /* System call number in %eax. */
+
+ lea 4(%esp), %ebx /* Address of args is 1st arg. */
+
+ /* Do the system call trap. */
+ int $0x80
+
+ /* Restore registers. */
+ movl %edx, %ebx
+
+ /* %eax is < 0 if there was an error. */
+ testl %eax, %eax
+ jl JUMPTARGET(syscall_error)
+
+ /* Successful; return the syscall's value. */
+ ret
+
+weak_alias (__mmap, mmap)
diff --git a/sysdeps/unix/sysv/linux/i386/sbrk.S b/sysdeps/unix/sysv/linux/i386/sbrk.S
new file mode 100644
index 0000000000..7a0e940cfe
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/sbrk.S
@@ -0,0 +1,82 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+.data
+.globl C_SYMBOL_NAME(__curbrk)
+
+.text
+.globl C_SYMBOL_NAME(syscall_error)
+
+ENTRY (__sbrk)
+
+ movl %ebx, %edx
+
+#ifdef PIC
+ /* Standard PIC nonsense to access `__curbrk' through the GOT. */
+ call .L0
+.L0: popl %ecx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-.L0], %ecx
+
+ movl C_SYMBOL_NAME(__curbrk@GOT)(%ecx), %ecx
+ movl (%ecx), %ebx
+ movl %ebx, %eax
+ testl %ebx, %ebx
+ jne .L1
+
+ /* We have to initialize `__curbrk' first. */
+ movl $SYS_ify(brk), %eax
+ int $0x80
+
+ movl %eax, (%ecx)
+ movl %eax, %ebx
+ .align 16, 0x90
+
+.L1:
+#else
+ movl C_SYMBOL_NAME(__curbrk), %ebx
+ movl %ebx, %eax
+#endif
+
+ addl 4(%esp), %ebx
+ cmpl %ebx, %eax
+ je .L2
+
+ movl $SYS_ify(brk), %eax
+ int $0x80
+
+ cmpl %eax, %ebx
+ jne .L3
+
+#ifdef PIC
+ xchgl %eax, (%ecx)
+#else
+ xchgl %eax, C_SYMBOL_NAME(__curbrk)
+#endif
+
+.L2:
+ movl %edx, %ebx
+ ret
+
+ .align 16
+.L3:
+ movl %edx, %ebx
+ jmp JUMPTARGET(syscall_error)
+
+weak_alias (__sbrk, sbrk)
diff --git a/sysdeps/unix/sysv/linux/i386/setfpucw.c b/sysdeps/unix/sysv/linux/i386/setfpucw.c
new file mode 100644
index 0000000000..329573df6a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/setfpucw.c
@@ -0,0 +1,43 @@
+/* Copyright (C) 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+Contributed by Olaf Flebbe.
+
+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 <fpu_control.h>
+
+void
+__setfpucw (fpu_control)
+ unsigned short fpu_control;
+{
+ volatile unsigned short cw;
+
+ /* If user supplied _fpu_control, use it ! */
+ if (!fpu_control)
+ {
+ /* use linux defaults */
+ fpu_control = _FPU_DEFAULT;
+ }
+ /* Get Control Word */
+ __asm__ volatile ("fnstcw %0" : "=m" (cw) : );
+
+ /* mask in */
+ cw &= _FPU_RESERVED;
+ cw = cw | (fpu_control & ~_FPU_RESERVED);
+
+ /* set cw */
+ __asm__ volatile ("fldcw %0" :: "m" (cw));
+}
diff --git a/sysdeps/unix/sysv/linux/i386/signum.h b/sysdeps/unix/sysv/linux/i386/signum.h
new file mode 100644
index 0000000000..8e4f270204
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/signum.h
@@ -0,0 +1,66 @@
+/* Signal number definitions. Linux version.
+Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#ifdef _SIGNAL_H
+
+/* Fake signal functions. */
+#define SIG_ERR ((__sighandler_t) -1) /* Error return. */
+#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
+#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */
+
+
+/* Signals. */
+#define SIGHUP 1 /* Hangup (POSIX). */
+#define SIGINT 2 /* Interrupt (ANSI). */
+#define SIGQUIT 3 /* Quit (POSIX). */
+#define SIGILL 4 /* Illegal instruction (ANSI). */
+#define SIGTRAP 5 /* Trace trap (POSIX). */
+#define SIGABRT SIGIOT /* Abort (ANSI). */
+#define SIGIOT 6 /* IOT trap (4.2 BSD). */
+#define SIGBUS 7 /* BUS error (4.2 BSD). */
+#define SIGFPE 8 /* Floating-point exception (ANSI). */
+#define SIGKILL 9 /* Kill, unblockable (POSIX). */
+#define SIGUSR1 10 /* User-defined signal 1 (POSIX). */
+#define SIGSEGV 11 /* Segmentation violation (ANSI). */
+#define SIGUSR2 12 /* User-defined signal 2 (POSIX). */
+#define SIGPIPE 13 /* Broken pipe (POSIX). */
+#define SIGALRM 14 /* Alarm clock (POSIX). */
+#define SIGTERM 15 /* Termination (ANSI). */
+#define SIGSTKFLT 16 /* ??? */
+#define SIGCLD SIGCHLD /* Same as SIGCHLD (System V). */
+#define SIGCHLD 17 /* Child status has changed (POSIX). */
+#define SIGCONT 18 /* Continue (POSIX). */
+#define SIGSTOP 19 /* Stop, unblockable (POSIX). */
+#define SIGTSTP 20 /* Keyboard stop (POSIX). */
+#define SIGTTIN 21 /* Background read from tty (POSIX). */
+#define SIGTTOU 22 /* Background write to tty (POSIX). */
+#define SIGURG 23 /* Urgent condition on socket (4.2 BSD). */
+#define SIGXCPU 24 /* CPU limit exceeded (4.2 BSD). */
+#define SIGXFSZ 25 /* File size limit exceeded (4.2 BSD). */
+#define SIGVTALRM 26 /* Virtual alarm clock (4.2 BSD). */
+#define SIGPROF 27 /* Profiling alarm clock (4.2 BSD). */
+#define SIGWINCH 28 /* Window size change (4.3 BSD, Sun). */
+#define SIGPOLL SIGIO /* Pollable event occured (System V). */
+#define SIGIO 29 /* I/O now possible (4.2 BSD). */
+#define SIGPWR 30 /* Power failure restart (System V). */
+#define SIGUNUSED 31
+
+#endif /* <signal.h> included. */
+
+#define _NSIG 32 /* Biggest signal number + 1. */
diff --git a/sysdeps/unix/sysv/linux/i386/socket.S b/sysdeps/unix/sysv/linux/i386/socket.S
new file mode 100644
index 0000000000..3d3a67213b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/socket.S
@@ -0,0 +1,60 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+#include <sys/socketcall.h>
+
+#define P(a, b) P2(a, b)
+#define P2(a, b) a##b
+
+.globl syscall_error
+
+/* The socket-oriented system calls are handled unusally in Linux.
+ They are all gated through the single `socketcall' system call number.
+ `socketcall' takes two arguments: the first is the subcode, specifying
+ which socket function is being called; and the second is a pointer to
+ the arguments to the specific function.
+
+ The .S files for the other calls just #define socket and #include this. */
+
+.globl P(__,socket)
+ENTRY (P(__,socket))
+
+ /* Save registers. */
+ movl %ebx, %edx
+
+ movl $SYS_ify(socketcall), %eax /* System call number in %eax. */
+
+ /* Use ## so `socket' is a separate token that might be #define'd. */
+ movl $P(SOCKOP_,socket), %ebx /* Subcode is first arg to syscall. */
+ lea 8(%esp), %ecx /* Address of args is 2nd arg. */
+
+ /* Do the system call trap. */
+ int $0x80
+
+ /* Restore registers. */
+ movl %edx, %ebx
+
+ /* %eax is < 0 if there was an error. */
+ testl %eax, %eax
+ jl JUMPTARGET(syscall_error)
+
+ /* Successful; return the syscall's value. */
+ ret
+
+weak_alias (P(__,socket), socket)
diff --git a/sysdeps/unix/sysv/linux/i386/stat.S b/sysdeps/unix/sysv/linux/i386/stat.S
new file mode 100644
index 0000000000..73204bf254
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/stat.S
@@ -0,0 +1,38 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+/* In Linux the `stat' call is actually done by emulating a `xstat' system
+ call, which takes an additional first argument giving a version number
+ for `struct stat'. Likewise for `fstat' and `lstat' there are `fxstat'
+ and `lxstat' emulations. This macro gives the Linux version number that
+ corresponds to the definition of `struct stat' in <statbuf.h>. */
+#define _STAT_VER 1
+
+ENTRY (__stat)
+ movl 8(%esp), %eax
+ movl 4(%esp), %ecx
+ pushl %eax
+ pushl %ecx
+ pushl $_STAT_VER /* Push extra first arg to syscall. */
+ call JUMPTARGET(__xstat)/* Jump to xstat implementation. */
+ addl $12, %esp
+ ret
+
+weak_alias (__stat, stat)
diff --git a/sysdeps/unix/sysv/linux/i386/syscall.S b/sysdeps/unix/sysv/linux/i386/syscall.S
new file mode 100644
index 0000000000..6e6aa5d3c8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/syscall.S
@@ -0,0 +1,31 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+.globl syscall_error
+ENTRY (syscall)
+ popl %ecx /* Pop return address into %ecx. */
+ popl %eax /* Pop syscall number into %eax. */
+ pushl %ecx /* Push back return address. */
+ DO_CALL (5) /* Frob the args and do the system call. */
+ movl (%esp), %ecx
+ pushl %ecx
+ testl %eax, %eax /* Check %eax for error. */
+ jl JUMPTARGET(syscall_error) /* Jump to error handler if negative. */
+ ret /* Return to caller. */
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.S b/sysdeps/unix/sysv/linux/i386/sysdep.S
new file mode 100644
index 0000000000..b873c958bb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.S
@@ -0,0 +1,40 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* The syscall stubs jump here when they detect an error.
+ The code for Linux is almost identical to the canonical Unix/i386
+ code, except that the error number in %eax is negated. */
+
+.globl __syscall_error
+__syscall_error:
+ negl %eax
+
+#define __syscall_error __syscall_error_1
+#include <sysdeps/unix/i386/sysdep.S>
+
+/* Because the Linux version is in fact i386/ELF and the start.? file
+ for this system (sysdeps/i386/elf/start.S) is also used by The Hurd
+ and therefore this files must not contain the definition of the
+ `errno' variable (I don't know why, ask Roland), we have to define
+ it somewhere else.
+
+ ...and this please is here. */
+ .data
+ .globl errno
+errno:
+ .long 0
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
new file mode 100644
index 0000000000..7fe4d414e3
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -0,0 +1,135 @@
+/* Copyright (C) 1992, 1993, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* In the Linux/ELF world, C symbols are asm symbols. */
+#define NO_UNDERSCORES
+
+/* There is some commonality. */
+#include <sysdeps/unix/i386/sysdep.h>
+
+/* For Linux we can use the system call table in the header file
+ /usr/include/asm/unistd.h
+ of the kernel. But these symbols do not follow the SYS_* syntax
+ so we have to redefine the `SYS_ify' macro here. */
+#undef SYS_ify
+#ifdef __STDC__
+# define SYS_ify(syscall_name) __NR_##syscall_name
+#else
+# define SYS_ify(syscall_name) __NR_/**/syscall_name
+#endif
+
+
+#ifdef ASSEMBLER
+
+/* Linux uses a negative return value to indicate syscall errors, unlike
+ most Unices, which use the condition codes' carry flag. */
+#undef PSEUDO
+#define PSEUDO(name, syscall_name, args) \
+ .text; \
+ .globl syscall_error; \
+ ENTRY (name) \
+ movl $SYS_ify (syscall_name), %eax; \
+ DO_CALL (args); \
+ testl %eax, %eax; \
+ jl JUMPTARGET (syscall_error)
+
+/* We define our own ENTRY macro because the alignment should be 16 for ELF. */
+#undef ENTRY
+#define ENTRY(name) \
+ ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (name); \
+ ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME (name), @function) \
+ .align 16; \
+ C_LABEL (name)
+
+/* Linux takes system call arguments in registers:
+
+ syscall number %eax call-clobbered
+ arg 1 %ebx call-saved
+ arg 2 %ecx call-clobbered
+ arg 3 %edx call-clobbered
+ arg 4 %esi call-saved
+ arg 5 %edi call-saved
+
+ The stack layout upon entering the function is:
+
+ 20(%esp) Arg# 5
+ 16(%esp) Arg# 4
+ 12(%esp) Arg# 3
+ 8(%esp) Arg# 2
+ 4(%esp) Arg# 1
+ (%esp) Return address
+
+ (Of course a function with say 3 arguments does not have entries for
+ arguments 4 and 5.)
+
+ The following code tries hard to be optimal. A general assuption
+ (which is true accoriding to the data books I have) is that
+
+ 2 * xchg is more expensive than pushl + movl + popl
+
+ Beside this a neat trick is used. The calling conventions for Linux
+ tell that among the registers used for parameters %ecx and %edx need
+ not be saved. Beside this we may clobber this registers even when
+ they are not used for parameter passing.
+
+ As a result one can see below that we save the content of the %ebx
+ register in the %edx register when we have less than 3 arguments
+ (2 * movl is less expensive than pushl + popl).
+
+ Second unlike for the other registers we don't save the content of
+ %ecx and %edx when we have than 1 and 2 registers resp. */
+
+#undef DO_CALL
+#define DO_CALL(args) \
+ DOARGS_##args \
+ int $0x80; \
+ UNDOARGS_##args
+
+#define DOARGS_0 /* No arguments to frob. */
+#define UNDOARGS_0 /* No arguments to unfrob. */
+#define _DOARGS_0(n) /* No arguments to frob. */
+#define _UNDOARGS_0 /* No arguments to unfrob. */
+
+#define DOARGS_1 movl %ebx, %edx; movl 4(%esp), %ebx; DOARGS_0
+#define UNDOARGS_1 UNDOARGS_0; movl %edx, %ebx
+#define _DOARGS_1(n) pushl %ebx; movl n+4(%esp), %ebx; _DOARGS_0 (n)
+#define _UNDOARGS_1 _UNDOARGS_0; popl %ebx
+
+#define DOARGS_2 movl 8(%esp), %ecx; DOARGS_1
+#define UNDOARGS_2 UNDOARGS_1
+#define _DOARGS_2(n) movl n(%esp), %ecx; _DOARGS_1 (n-4)
+#define _UNDOARGS_2 _UNDOARGS_1
+
+#define DOARGS_3 _DOARGS_3 (12)
+#define UNDOARGS_3 _UNDOARGS_3
+#define _DOARGS_3(n) movl n(%esp), %edx; _DOARGS_2 (n-4)
+#define _UNDOARGS_3 _UNDOARGS_2
+
+#define DOARGS_4 _DOARGS_4 (16)
+#define UNDOARGS_4 _UNDOARGS_4
+#define _DOARGS_4(n) pushl %esi; movl n+4(%esp), %esi; _DOARGS_3 (n)
+#define _UNDOARGS_4 _UNDOARGS_3; popl %esi
+
+#define DOARGS_5 _DOARGS_5 (20)
+#define UNDOARGS_5 _UNDOARGS_5
+#define _DOARGS_5(n) pushl %edi; movl n+4(%esp), %edi; _DOARGS_4 (n)
+#define _UNDOARGS_5 _UNDOARGS_4; popl %edi
+
+
+#endif /* ASSEMBLER */
diff --git a/sysdeps/unix/sysv/linux/i386/xmknod.S b/sysdeps/unix/sysv/linux/i386/xmknod.S
new file mode 100644
index 0000000000..fde3165d01
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/xmknod.S
@@ -0,0 +1,49 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+#include <errnos.h>
+
+.globl syscall_error
+ENTRY (__xmknod)
+ popl %ecx /* Pop return address into %eax. */
+ popl %edx /* Pop version number into %edx. */
+ pushl %ecx /* Push back the return address. */
+
+ movl $SYS_ify(mknod), %eax
+ /* Load syscall number for prev_stat in %eax. */
+ cmpl $1, %edx /* Version 1 xstat call? */
+ je .L1 /* Yes, do syscall. */
+
+ movl $-EINVAL, %eax /* Load error code into %eax. */
+ jmp .L2
+
+.L1: DO_CALL (3) /* Do the syscall. */
+
+ movl (%esp), %ecx
+ testl %eax, %eax /* Check for error. */
+ jl .L2
+
+ jmp *%ecx /* Return success. */
+
+.L2: pushl %ecx
+ jmp JUMPTARGET(syscall_error)
+ /* Yes, then branch to error handling. */
+
+/* For compatibility with Linux libc. */
+weak_alias (__xmknod, _xmknod)
diff --git a/sysdeps/unix/sysv/linux/i386/xstat.S b/sysdeps/unix/sysv/linux/i386/xstat.S
new file mode 100644
index 0000000000..34822beda6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/i386/xstat.S
@@ -0,0 +1,51 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+#include <errnos.h>
+
+#define SYS_expand(name) SYS_ify(name)
+
+.globl syscall_error
+ENTRY (__xstat)
+ popl %ecx /* Pop return address into %eax. */
+ popl %edx /* Pop version number into %edx. */
+ pushl %ecx /* Push back the return address. */
+
+ movl $SYS_expand(stat), %eax
+ /* Load syscall number for prev_stat in %eax. */
+ cmpl $1, %edx /* Version 1 xstat call? */
+ je .L1 /* Yes, do syscall. */
+
+ movl $-EINVAL, %eax /* Load error code into %eax. */
+ jmp .L2
+
+.L1: DO_CALL (2) /* Do the syscall. */
+
+ movl (%esp), %ecx
+ testl %eax, %eax /* Check for error. */
+ jl .L2
+
+ jmp *%ecx /* Return success. */
+
+.L2: pushl %ecx
+ jmp JUMPTARGET(syscall_error)
+ /* Yes, then branch to error handling. */
+
+/* For compatibility with Linux libc. */
+weak_alias (__xstat, _xstat)
diff --git a/sysdeps/unix/sysv/linux/listen.S b/sysdeps/unix/sysv/linux/listen.S
new file mode 100644
index 0000000000..d2cbec60a0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/listen.S
@@ -0,0 +1,2 @@
+#define socket listen
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/local_lim.h b/sysdeps/unix/sysv/linux/local_lim.h
new file mode 100644
index 0000000000..bfc65bd6fd
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/local_lim.h
@@ -0,0 +1,31 @@
+/* Minimum guaranteed maximum values for system limits. Hurd version.
+
+Copyright (C) 1993, 1994 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* Linux has a fixed limit of supplementary groups allocated with a
+ process. This value is determined by the size of the `groups'
+ member of the `task_struct' structure in <linux/sched.h>. */
+
+#define NGROUPS_MAX 32
+
+
+/* Maximum size of file names. Not all file system types support
+ this size but it is only a maximum value. */
+
+#define NAME_MAX 255
diff --git a/sysdeps/unix/sysv/linux/madvise.c b/sysdeps/unix/sysv/linux/madvise.c
new file mode 100644
index 0000000000..72b7d76543
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/madvise.c
@@ -0,0 +1 @@
+#include <sysdeps/stub/madvise.c>
diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c
new file mode 100644
index 0000000000..cd64d15cbe
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/msgctl.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/msg.h>
+
+/* Allows to control internal state and destruction of message queue
+ objects. */
+
+int
+msgctl (msqid, cmd, buf)
+ int msqid;
+ int cmd;
+ struct msqid_ds *buf;
+{
+ return __ipc (IPCOP_msgctl, msqid, cmd, 0, buf);
+}
diff --git a/sysdeps/unix/sysv/linux/msgget.c b/sysdeps/unix/sysv/linux/msgget.c
new file mode 100644
index 0000000000..b1c29d6780
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/msgget.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/msg.h>
+#include <stdlib.h> /* for definition of NULL */
+
+/* Return descriptor for message queue associated with KEY. The MSGFLG
+ parameter describes how to proceed with clashing of key values. */
+
+int
+msgget (key, msgflg)
+ key_t key;
+ int msgflg;
+{
+ return __ipc (IPCOP_msgget, key, msgflg, 0, NULL);
+}
diff --git a/sysdeps/unix/sysv/linux/msgrcv.c b/sysdeps/unix/sysv/linux/msgrcv.c
new file mode 100644
index 0000000000..21c6b75cac
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/msgrcv.c
@@ -0,0 +1,38 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/msg.h>
+
+int
+msgrcv (msqid, msgp, msgsz, msgtyp, msgflg)
+ int msqid;
+ void *msgp;
+ size_t msgsz;
+ long msgtyp;
+ int msgflg;
+{
+ /* The problem here is that Linux' calling convention only allows up to
+ fives parameters to a system call. */
+ struct ipc_kludge tmp;
+
+ tmp.msgp = msgp;
+ tmp.msgtyp = msgtyp;
+
+ return __ipc (IPCOP_msgrcv, msqid, msgsz, msgflg, &tmp);
+}
diff --git a/sysdeps/unix/sysv/linux/msgsnd.c b/sysdeps/unix/sysv/linux/msgsnd.c
new file mode 100644
index 0000000000..6d2d3ef26b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/msgsnd.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/msg.h>
+
+int
+msgsnd (msqid, msgp, msgsz, msgflg)
+ int msqid;
+ void *msgp;
+ size_t msgsz;
+ int msgflg;
+{
+ return __ipc (IPCOP_msgsnd, msqid, msgsz, msgflg, msgp);
+}
diff --git a/sysdeps/unix/sysv/linux/pipe.S b/sysdeps/unix/sysv/linux/pipe.S
new file mode 100644
index 0000000000..cd050b36e8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/pipe.S
@@ -0,0 +1,24 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL__ (pipe, 1)
+ ret
+
+weak_alias (__pipe, pipe)
diff --git a/sysdeps/unix/sysv/linux/poll.c b/sysdeps/unix/sysv/linux/poll.c
new file mode 100644
index 0000000000..ff43a76a63
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/poll.c
@@ -0,0 +1 @@
+#include <sysdeps/stub/poll.c>
diff --git a/sysdeps/unix/sysv/linux/readv.c b/sysdeps/unix/sysv/linux/readv.c
new file mode 100644
index 0000000000..baa976da6d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/readv.c
@@ -0,0 +1 @@
+#include <sysdeps/posix/readv.c>
diff --git a/sysdeps/unix/sysv/linux/recv.S b/sysdeps/unix/sysv/linux/recv.S
new file mode 100644
index 0000000000..f1081cc431
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/recv.S
@@ -0,0 +1,2 @@
+#define socket recv
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/recvfrom.S b/sysdeps/unix/sysv/linux/recvfrom.S
new file mode 100644
index 0000000000..febaa9ef55
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/recvfrom.S
@@ -0,0 +1,2 @@
+#define socket recvfrom
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/recvmsg.S b/sysdeps/unix/sysv/linux/recvmsg.S
new file mode 100644
index 0000000000..ffadd30195
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/recvmsg.S
@@ -0,0 +1,2 @@
+#define socket recvmsg
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c
new file mode 100644
index 0000000000..dd0e7b9484
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/semctl.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/sem.h>
+
+/* Return identifier for array of NSEMS semaphores associated with
+ KEY. */
+
+int
+semctl (semid, semnum, cmd, arg)
+ int semid;
+ int semnum;
+ int cmd;
+ union semun arg;
+{
+ return __ipc (IPCOP_semctl, semid, semnum, cmd, &arg);
+}
diff --git a/sysdeps/unix/sysv/linux/semget.c b/sysdeps/unix/sysv/linux/semget.c
new file mode 100644
index 0000000000..6320e4720e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/semget.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/sem.h>
+#include <stdlib.h> /* for definition of NULL */
+
+/* Return identifier for array of NSEMS semaphores associated with
+ KEY. */
+
+int
+semget (key, nsems, semflg)
+ key_t key;
+ int nsems;
+ int semflg;
+{
+ return __ipc (IPCOP_semget, key, nsems, semflg, NULL);
+}
diff --git a/sysdeps/unix/sysv/linux/semop.c b/sysdeps/unix/sysv/linux/semop.c
new file mode 100644
index 0000000000..57f074e90e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/semop.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/sem.h>
+
+/* Perform user-defined atomical operation of array of semaphores. */
+
+int
+semop (semid, sops, nsops)
+ int semid;
+ struct sembuf *sops;
+ unsigned int nsops;
+{
+ return __ipc (IPCOP_semop, semid, (int) nsops, 0, sops);
+}
diff --git a/sysdeps/unix/sysv/linux/send.S b/sysdeps/unix/sysv/linux/send.S
new file mode 100644
index 0000000000..52293c6524
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/send.S
@@ -0,0 +1,2 @@
+#define socket send
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/sendmsg.S b/sysdeps/unix/sysv/linux/sendmsg.S
new file mode 100644
index 0000000000..65f2c3eb98
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sendmsg.S
@@ -0,0 +1,2 @@
+#define socket sendmsg
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/sendto.S b/sysdeps/unix/sysv/linux/sendto.S
new file mode 100644
index 0000000000..aa637ce9c9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sendto.S
@@ -0,0 +1,2 @@
+#define socket sendto
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/setegid.c b/sysdeps/unix/sysv/linux/setegid.c
new file mode 100644
index 0000000000..1b29a6ffb2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/setegid.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/setegid.c>
diff --git a/sysdeps/unix/sysv/linux/seteuid.c b/sysdeps/unix/sysv/linux/seteuid.c
new file mode 100644
index 0000000000..850f3c5656
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/seteuid.c
@@ -0,0 +1,36 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <errno.h>
+#include <unistd.h>
+#include <sys/types.h>
+
+int
+__seteuid (uid)
+ uid_t uid;
+{
+ if (uid == (uid_t) ~0)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ return __setreuid (-1, uid);
+}
+
+weak_alias (__seteuid, seteuid)
diff --git a/sysdeps/unix/sysv/linux/sethostid.c b/sysdeps/unix/sysv/linux/sethostid.c
new file mode 100644
index 0000000000..eb71b74a1d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sethostid.c
@@ -0,0 +1,2 @@
+#define SET_PROCEDURE 1
+#include "gethostid.c"
diff --git a/sysdeps/unix/sysv/linux/setpgid.S b/sysdeps/unix/sysv/linux/setpgid.S
new file mode 100644
index 0000000000..ba8140fb53
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/setpgid.S
@@ -0,0 +1,22 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL (setpgid, 2)
+ ret
diff --git a/sysdeps/unix/sysv/linux/setpgrp.c b/sysdeps/unix/sysv/linux/setpgrp.c
new file mode 100644
index 0000000000..4497e07018
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/setpgrp.c
@@ -0,0 +1,25 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <unistd.h>
+
+int
+setpgrp ()
+{
+ return setpgid (0, 0);
+}
diff --git a/sysdeps/unix/sysv/linux/setsid.S b/sysdeps/unix/sysv/linux/setsid.S
new file mode 100644
index 0000000000..4930c56dcf
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/setsid.S
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/bsd4.4/setsid.S>
diff --git a/sysdeps/unix/sysv/linux/setsockopt.S b/sysdeps/unix/sysv/linux/setsockopt.S
new file mode 100644
index 0000000000..33d57179ca
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/setsockopt.S
@@ -0,0 +1,2 @@
+#define socket setsockopt
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/settimeofday.S b/sysdeps/unix/sysv/linux/settimeofday.S
new file mode 100644
index 0000000000..4f86a26ac4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/settimeofday.S
@@ -0,0 +1,24 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL__ (settimeofday, 2)
+ ret
+
+weak_alias (__settimeofday, settimeofday)
diff --git a/sysdeps/unix/sysv/linux/shmat.c b/sysdeps/unix/sysv/linux/shmat.c
new file mode 100644
index 0000000000..1efef29215
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/shmat.c
@@ -0,0 +1,37 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/sem.h>
+
+/* Attach the shared memory segment associated with SHMID to the data
+ segment of the calling process. SHMADDR and SHMFLG determine how
+ and where the segment is attached. */
+
+char *
+shmat (shmid, shmaddr, shmflg)
+ int shmid;
+ char *shmaddr;
+ int shmflg;
+{
+ int retval;
+ unsigned long raddr;
+
+ retval = __ipc (IPCOP_shmat, shmid, shmflg, (int) &raddr, shmaddr);
+ return retval < 0 ? (char *) retval : (char *) raddr;
+}
diff --git a/sysdeps/unix/sysv/linux/shmctl.c b/sysdeps/unix/sysv/linux/shmctl.c
new file mode 100644
index 0000000000..81192a8996
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/shmctl.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/shm.h>
+
+/* Provide operations to control over shared memory segments. */
+
+int
+shmctl (shmid, cmd, buf)
+ int shmid;
+ int cmd;
+ struct shmid_ds *buf;
+{
+ return __ipc (IPCOP_shmctl, shmid, cmd, 0, buf);
+}
diff --git a/sysdeps/unix/sysv/linux/shmdt.c b/sysdeps/unix/sysv/linux/shmdt.c
new file mode 100644
index 0000000000..1e5bbe13b1
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/shmdt.c
@@ -0,0 +1,30 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/shm.h>
+
+/* Detach shared memory segment starting at address specified by SHMADDR
+ from the caller's data segment. */
+
+int
+shmdt (shmaddr)
+ char *shmaddr;
+{
+ return __ipc (IPCOP_shmdt, 0, 0, 0, shmaddr);
+}
diff --git a/sysdeps/unix/sysv/linux/shmget.c b/sysdeps/unix/sysv/linux/shmget.c
new file mode 100644
index 0000000000..f0b2b6531d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/shmget.c
@@ -0,0 +1,33 @@
+/* Copyright (C) 1995 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. */
+
+#include <sys/shm.h>
+#include <stdlib.h> /* for definition of NULL */
+
+/* Return an identifier for an shared memory segment of at least size SIZE
+ which is associated with KEY. */
+
+int
+shmget (key, size, shmflg)
+ key_t key;
+ int size;
+ int shmflg;
+{
+ return __ipc (IPCOP_shmget, key, size, shmflg, NULL);
+}
diff --git a/sysdeps/unix/sysv/linux/shutdown.S b/sysdeps/unix/sysv/linux/shutdown.S
new file mode 100644
index 0000000000..6cc95d50f9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/shutdown.S
@@ -0,0 +1,2 @@
+#define socket shutdown
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/sigaction.S b/sysdeps/unix/sysv/linux/sigaction.S
new file mode 100644
index 0000000000..0618d6ea95
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigaction.S
@@ -0,0 +1,24 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL__ (sigaction, 3)
+ ret
+
+weak_alias (__sigaction, sigaction)
diff --git a/sysdeps/unix/sysv/linux/signal.S b/sysdeps/unix/sysv/linux/signal.S
new file mode 100644
index 0000000000..68582a68f7
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/signal.S
@@ -0,0 +1,8 @@
+#include <sysdeps/unix/sysv/signal.S>
+
+/* Used in siginterrupt() */
+
+ .data
+ .globl _sigintr
+_sigintr:
+ .long 0
diff --git a/sysdeps/unix/sysv/linux/sigpending.S b/sysdeps/unix/sysv/linux/sigpending.S
new file mode 100644
index 0000000000..574ea3a282
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigpending.S
@@ -0,0 +1 @@
+#include <sysdeps/unix/sysv/sco3.2.4/sigpending.S>
diff --git a/sysdeps/unix/sysv/linux/sigset.h b/sysdeps/unix/sysv/linux/sigset.h
new file mode 100644
index 0000000000..e9bbb9652a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sigset.h
@@ -0,0 +1 @@
+#include <sysdeps/generic/sigset.h>
diff --git a/sysdeps/unix/sysv/linux/sockaddrcom.h b/sysdeps/unix/sysv/linux/sockaddrcom.h
new file mode 100644
index 0000000000..768d05be35
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sockaddrcom.h
@@ -0,0 +1,37 @@
+/* Definition of `struct sockaddr_*' common members. Generic/4.2 BSD version.
+Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#ifndef _SOCKADDRCOM_H
+#define _SOCKADDRCOM_H 1
+
+/* This prevents including the file <linux/socket.h>. */
+#define _LINUX_SOCKET_H
+#define _LINUX_TYPES_H
+
+/* This macro is used to declare the initial common members
+ of the data types used for socket addresses, `struct sockaddr',
+ `struct sockaddr_in', `struct sockaddr_un', etc. */
+
+#define __SOCKADDR_COMMON(sa_prefix) \
+ unsigned short int sa_prefix##family
+
+#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
+
+
+#endif /* sockaddrcom.h */
diff --git a/sysdeps/unix/sysv/linux/socketpair.S b/sysdeps/unix/sysv/linux/socketpair.S
new file mode 100644
index 0000000000..da71c57dea
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/socketpair.S
@@ -0,0 +1,2 @@
+#define socket socketpair
+#include <socket.S>
diff --git a/sysdeps/unix/sysv/linux/speed.c b/sysdeps/unix/sysv/linux/speed.c
new file mode 100644
index 0000000000..84811deba6
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/speed.c
@@ -0,0 +1,103 @@
+/* `struct termios' speed frobnication functions. Linux version.
+Copyright (C) 1991, 1992, 1993, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <stddef.h>
+#include <errno.h>
+#include <termios.h>
+
+static const speed_t speeds[] =
+ {
+ 0,
+ 50,
+ 75,
+ 110,
+ 134,
+ 150,
+ 200,
+ 300,
+ 600,
+ 1200,
+ 1800,
+ 2400,
+ 4800,
+ 9600,
+ 19200,
+ 38400,
+ 38400, /* Mention this twice here is a trick. */
+ 57600,
+ 115200,
+ 230400,
+ };
+
+
+/* Return the output baud rate stored in *TERMIOS_P. */
+speed_t
+cfgetospeed (termios_p)
+ const struct termios *termios_p;
+{
+ speed_t retval = termios_p->c_cflag & (CBAUD | CBAUDEX);
+
+ if (retval & CBAUDEX)
+ {
+ retval &= ~CBAUDEX;
+ retval |= CBAUD + 1;
+ }
+
+ return retval;
+}
+
+/* Return the input baud rate stored in *TERMIOS_P.
+ For Linux there is no difference between input and output speed. */
+strong_alias (cfgetospeed, cfgetispeed);
+
+/* Set the output baud rate stored in *TERMIOS_P to SPEED. */
+int
+cfsetospeed (termios_p, speed)
+ struct termios *termios_p;
+ speed_t speed;
+{
+ register unsigned int i;
+
+ if (termios_p == NULL)
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* This allows either B1200 or 1200 to work. XXX
+ Do we really want to try to support this, given that
+ fetching the speed must return one or the other? */
+
+ for (i = 0; i < sizeof (speeds) / sizeof (speeds[0]); ++i)
+ if (i == speed || speeds[i] == speed)
+ {
+ termios_p->c_cflag &= ~(CBAUD | CBAUDEX);
+ termios_p->c_cflag |= (i & CBAUD);
+ if (i & ~CBAUD)
+ termios_p->c_cflag |= CBAUDEX;
+ return 0;
+ }
+
+ errno = EINVAL;
+ return -1;
+}
+
+/* Set the input baud rate stored in *TERMIOS_P to SPEED.
+ For Linux there is no difference between input and output speed. */
+strong_alias (cfsetospeed, cfsetispeed);
diff --git a/sysdeps/unix/sysv/linux/statbuf.h b/sysdeps/unix/sysv/linux/statbuf.h
new file mode 100644
index 0000000000..ad81704ae5
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/statbuf.h
@@ -0,0 +1,72 @@
+/* Copyright (C) 1992, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#ifndef _STATBUF_H
+#define _STATBUF_H
+
+struct stat
+ {
+ short int st_dev; /* Device. */
+ unsigned short __pad1;
+ unsigned long int st_ino; /* File serial number. */
+ unsigned short int st_mode; /* File mode. */
+ unsigned short int st_nlink; /* Link count. */
+ unsigned short int st_uid; /* User ID of the file's owner. */
+ unsigned short int st_gid; /* Group ID of the file's group.*/
+ unsigned short int st_rdev; /* Device number, if device. */
+ unsigned short int __pad2;
+ long int st_size; /* Size of file, in bytes. */
+ unsigned long int st_blksize; /* Optimal block size for I/O. */
+#define _STATBUF_ST_BLKSIZE /* Tell code we have this member. */
+
+ unsigned long int st_blocks; /* Number of 512-byte blocks allocated. */
+ long int st_atime; /* Time of last access. */
+ unsigned long int __unused1;
+ long int st_mtime; /* Time of last modification. */
+ unsigned long int __unused2;
+ long int st_ctime; /* Time of last status change. */
+ unsigned long int __unused3;
+ unsigned long int __unused4;
+ unsigned long int __unused5;
+ };
+
+/* 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 /* statbuf.h */
diff --git a/sysdeps/unix/sysv/linux/stty.S b/sysdeps/unix/sysv/linux/stty.S
new file mode 100644
index 0000000000..6c04c2af38
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/stty.S
@@ -0,0 +1,22 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+
+SYSCALL (stty, 2)
+ ret
diff --git a/sysdeps/unix/sysv/linux/sys/ipc_buf.h b/sysdeps/unix/sysv/linux/sys/ipc_buf.h
new file mode 100644
index 0000000000..767fc9ade9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/ipc_buf.h
@@ -0,0 +1,84 @@
+/* Copyright (C) 1995 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
+
+#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 */
+ __uid_t uid; /* owner's user ID */
+ __gid_t gid; /* owner's group ID */
+ __uid_t cuid; /* creator's user ID */
+ __gid_t cgid; /* creator's group ID */
+ __mode_t 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 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 /* sys/ipc_buf.h */
diff --git a/sysdeps/unix/sysv/linux/sys/mman.h b/sysdeps/unix/sysv/linux/sys/mman.h
new file mode 100644
index 0000000000..b05738d8e4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/mman.h
@@ -0,0 +1,112 @@
+/* Definitions for BSD-style memory management. Linux version.
+Copyright (C) 1994, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* These are the bits used by 4.4 BSD and its derivatives. On systems
+ (such as GNU) where these facilities are not system services but can be
+ emulated in the C library, these are the definitions we emulate. */
+
+#ifndef _SYS_MMAN_H
+
+#define _SYS_MMAN_H 1
+#include <features.h>
+
+#include <gnu/types.h>
+#define __need_size_t
+#include <stddef.h>
+
+
+/* Protections are chosen from these bits, OR'd together. The
+ implementation does not necessarily support PROT_EXEC or PROT_WRITE
+ without PROT_READ. The only guarantees are that no writing will be
+ allowed without PROT_WRITE and no access will be allowed for PROT_NONE. */
+
+#define PROT_NONE 0x00 /* No access. */
+#define PROT_READ 0x01 /* Pages can be read. */
+#define PROT_WRITE 0x02 /* Pages can be written. */
+#define PROT_EXEC 0x04 /* Pages can be executed. */
+
+
+/* Flags contain mapping type, sharing type and options. */
+
+/* Mapping type (must choose one and only one of these). */
+#define MAP_FILE 0x0000 /* Mapped from a file or device. */
+#define MAP_ANON 0x0020 /* Allocated from anonymous virtual memory. */
+#define MAP_TYPE 0x000f /* Mask for type field. */
+
+/* Sharing types (must choose one and only one of these). */
+#define MAP_COPY MAP_PRIVATE /* Virtual copy of region at mapping time. */
+#define MAP_SHARED 0x0001 /* Share changes. */
+#define MAP_PRIVATE 0x0002 /* Changes private; copy pages on write. */
+
+/* Other flags. */
+#define MAP_FIXED 0x0010 /* Map address must be exactly as requested. */
+#define MAP_NOEXTEND 0x0000 /* For MAP_FILE, don't change file size.
+ Not available on Linux??? */
+#define MAP_HASSEMPHORE 0x0000 /* Region may contain semaphores.
+ Not available on Linux??? */
+#define MAP_INHERIT 0x0000 /* Region is retained after exec.
+ Not available on Linux??? */
+
+/* Advice to `madvise'. */
+#define MADV_NORMAL 0 /* No further special treatment. */
+#define MADV_RANDOM 1 /* Expect random page references. */
+#define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+#define MADV_WILLNEED 3 /* Will need these pages. */
+#define MADV_DONTNEED 4 /* Don't need these pages. */
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+/* Map addresses starting near ADDR and extending for LEN bytes. from
+ OFFSET into the file FD describes according to PROT and FLAGS. If ADDR
+ is nonzero, it is the desired mapping address. If the MAP_FIXED bit is
+ set in FLAGS, the mapping will be at ADDR exactly (which must be
+ page-aligned); otherwise the system chooses a convenient nearby address.
+ The return value is the actual mapping address chosen or (caddr_t) -1
+ for errors (in which case `errno' is set). A successful `mmap' call
+ deallocates any previous mapping for the affected region. */
+
+__caddr_t __mmap __P ((__caddr_t __addr, size_t __len,
+ int __prot, int __flags, int __fd, __off_t __offset));
+__caddr_t mmap __P ((__caddr_t __addr, size_t __len,
+ int __prot, int __flags, int __fd, __off_t __offset));
+
+/* Deallocate any mapping for the region starting at ADDR and extending LEN
+ bytes. Returns 0 if successful, -1 for errors (and sets errno). */
+int __munmap __P ((__caddr_t __addr, size_t __len));
+int munmap __P ((__caddr_t __addr, size_t __len));
+
+/* Change the memory protection of the region starting at ADDR and
+ extending LEN bytes to PROT. Returns 0 if successful, -1 for errors
+ (and sets errno). */
+int mprotect __P ((__caddr_t __addr, size_t __len, int __prot));
+
+/* Synchronize the region starting at ADDR and extending LEN bytes with the
+ file it maps. Filesystem operations on a file being mapped are
+ unpredictable before this is done. */
+int msync __P ((__caddr_t __addr, size_t __len));
+
+/* Advise the system about particular usage patterns the program follows
+ for the region starting at ADDR and extending LEN bytes. */
+int madvise __P ((__caddr_t __addr, size_t __len, int __advice));
+
+__END_DECLS
+
+
+#endif /* sys/mman.h */
diff --git a/sysdeps/unix/sysv/linux/sys/msq_buf.h b/sysdeps/unix/sysv/linux/sys/msq_buf.h
new file mode 100644
index 0000000000..92a52d515d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/msq_buf.h
@@ -0,0 +1,54 @@
+/* Copyright (C) 1995 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_MSQ_BUF_H
+#define _SYS_MSQ_BUF_H
+
+#include <features.h>
+#include <sys/types.h>
+
+/* Define options for message queue functions. */
+#define MSG_NOERROR 010000 /* no error if message is too big */
+#define MSG_EXCEPT 020000 /* recv any msg except of specified type */
+
+
+__BEGIN_DECLS
+
+/* Structure of record for one message inside the kernel.
+ The type `struct __msg' is opaque. */
+struct msqid_ds
+{
+ struct ipc_perm msg_perm; /* structure describing operation permission */
+ struct msg *__msg_first; /* pointer to first message on queue */
+ struct msg *__msg_last; /* pointer to last message on queue */
+ __time_t msg_stime; /* time of last msgsnd command */
+ __time_t msg_rtime; /* time of last msgrcv command */
+ __time_t msg_ctime; /* time of last change */
+ struct wait_queue *__wwait; /* ??? */
+ struct wait_queue *__rwait; /* ??? */
+ unsigned short int __msg_cbytes;/* current number of bytes on queue */
+ unsigned short int msg_qnum; /* number of messages currently on queue */
+ unsigned short int msg_qbytes;/* max number of bytes allowed on queue */
+ __pid_t msg_lspid; /* pid of last msgsnd() */
+ __pid_t msg_lrpid; /* pid of last msgrcv() */
+};
+
+__END_DECLS
+
+#endif /* sys/msq_buf.h */
diff --git a/sysdeps/unix/sysv/linux/sys/sem_buf.h b/sysdeps/unix/sysv/linux/sys/sem_buf.h
new file mode 100644
index 0000000000..d93002ad6e
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/sem_buf.h
@@ -0,0 +1,65 @@
+/* Copyright (C) 1995 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_SEM_BUF_H
+#define _SYS_SEM_BUF_H
+
+#include <features.h>
+#include <sys/types.h>
+
+/* Flags for `semop'. */
+#define SEM_UNDO 0x1000 /* undo the operation on exit */
+
+/* Commands for `semctl'. */
+#define GETPID 11 /* get sempid */
+#define GETVAL 12 /* get semval */
+#define GETALL 13 /* get all semval's */
+#define GETNCNT 14 /* get semncnt */
+#define GETZCNT 15 /* get semzcnt */
+#define SETVAL 16 /* set semval */
+#define SETALL 17 /* set all semval's */
+
+
+__BEGIN_DECLS
+
+/* Data structure describing a set of semaphores. */
+struct semid_ds
+{
+ struct ipc_perm sem_perm; /* operation permisson struct */
+ __time_t sem_otime; /* last semop() time */
+ __time_t sem_ctime; /* last time changed by semctl() */
+ struct sem *__sembase; /* ptr to first semaphore in array */
+ struct sem_queue *__sem_pending; /* pending operations */
+ struct sem_queue *__sem_pending_last; /* last pending operation */
+ struct sem_undo *__undo; /* ondo requests on this array */
+ unsigned short int sem_nsems; /* number of semaphores in set */
+};
+
+/* Union used for argument for `semctl'. */
+union semun
+{
+ int val; /* value for SETVAL */
+ struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
+ unsigned short int *array; /* array for GETALL & SETALL */
+ struct seminfo *__buf; /* buffer for IPC_INFO */
+};
+
+__END_DECLS
+
+#endif /* sys/sem_buf.h */
diff --git a/sysdeps/unix/sysv/linux/sys/shm_buf.h b/sysdeps/unix/sysv/linux/sys/shm_buf.h
new file mode 100644
index 0000000000..fa1e8235d8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/shm_buf.h
@@ -0,0 +1,56 @@
+/* Copyright (C) 1995 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
+
+#include <features.h>
+#include <sys/types.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 sem_perm; /* operation permisson struct */
+ int shm_segsz; /* size of segment in bytes */
+ __time_t sem_atime; /* time of last shmat() */
+ __time_t sem_dtime; /* time of last shmdt() */
+ __time_t sem_ctime; /* time of last change by shmctl() */
+ __pid_t shm_cpid; /* pid of creator */
+ __pid_t 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 */
+};
+
+__END_DECLS
+
+#endif /* sys/shm_buf.h */
diff --git a/sysdeps/unix/sysv/linux/sys/socketcall.h b/sysdeps/unix/sysv/linux/sys/socketcall.h
new file mode 100644
index 0000000000..4bfd71264c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/socketcall.h
@@ -0,0 +1,46 @@
+/* ID for functions called via socketcall system call.
+ Copyright (C) 1995 Free Software Foundation, Inc.
+
+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_SOCKETCALL_H
+#define _SYS_SOCKETCALL_H
+
+/* Define unique numbers for the operations permitted on socket. Linux
+ uses a single system call for all these functions. The relevant code
+ file is /usr/include/linux/net.h.
+ We cannot use a enum here because the values are used in assembler
+ code. */
+
+#define SOCKOP_socket 1
+#define SOCKOP_bind 2
+#define SOCKOP_connect 3
+#define SOCKOP_listen 4
+#define SOCKOP_accept 5
+#define SOCKOP_getsockname 6
+#define SOCKOP_getpeername 7
+#define SOCKOP_socketpair 8
+#define SOCKOP_send 9
+#define SOCKOP_recv 10
+#define SOCKOP_sendto 11
+#define SOCKOP_recvfrom 12
+#define SOCKOP_shutdown 13
+#define SOCKOP_setsockopt 14
+#define SOCKOP_getsockopt 15
+#define SOCKOP_sendmsg 16
+#define SOCKOP_recvmsg 17
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sys/timex.h b/sysdeps/unix/sysv/linux/sys/timex.h
new file mode 100644
index 0000000000..fad47cd607
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sys/timex.h
@@ -0,0 +1,30 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+
+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_TIMEX_H
+#define _SYS_TIMEX_H
+
+#include <features.h>
+#include <linux/timex.h>
+
+__BEGIN_DECLS
+
+extern int __adjtimex __P ((struct timex *__ntx));
+
+__END_DECLS
+
+#endif /* sys/timex.h */
diff --git a/sysdeps/unix/sysv/linux/syscall.h b/sysdeps/unix/sysv/linux/syscall.h
new file mode 100644
index 0000000000..fe6cfcf84c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/syscall.h
@@ -0,0 +1,59 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#ifndef _SYSCALL_H
+#define _SYSCALL_H
+
+/* This file should list the numbers of the system the system knows.
+ But instead of duplicating this we use the information available
+ from the kernel sources. */
+#include <asm/unistd.h>
+
+/* Among the system calls defined there are
+ _dup2
+ _mkdir
+ _rmdir
+ _readlink
+ _symlink
+ _rename
+ _swapon
+ _access
+ _select
+ _getgroups
+ _setgroups
+ _getitimer
+ _setitimer
+ _setdomainname
+ _getrlimit
+ _setrlimit
+ _getrusage
+ _getpriority
+ _setpriority
+ _truncate
+ _ftruncate
+ _setpgid
+ _fchmod
+ _fchdir
+ _fchown
+ _setregid
+ _setreuid
+ _vhangup
+ (This is a hack for the autoconf mechanism. Don't change a single
+ character, esp white spaces, unless you know what you are doing!) */
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/sysconf.c b/sysdeps/unix/sysv/linux/sysconf.c
new file mode 100644
index 0000000000..e366d04a8b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/sysconf.c
@@ -0,0 +1 @@
+#include <sysdeps/posix/sysconf.c>
diff --git a/sysdeps/unix/sysv/linux/tcdrain.c b/sysdeps/unix/sysv/linux/tcdrain.c
new file mode 100644
index 0000000000..67c7573cf9
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tcdrain.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <termios.h>
+#include <sys/ioctl.h>
+
+/* Wait for pending output to be written on FD. */
+int
+__tcdrain (fd)
+ int fd;
+{
+ /* With an argument of 1, TCSBRK for output to be drain. */
+ return __ioctl (fd, TCSBRK, 1);
+}
+
+weak_alias (__tcdrain, tcdrain)
diff --git a/sysdeps/unix/sysv/linux/tcflow.c b/sysdeps/unix/sysv/linux/tcflow.c
new file mode 100644
index 0000000000..5be68e2ea2
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tcflow.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/sun/sunos4/tcflow.c>
diff --git a/sysdeps/unix/sysv/linux/tcflush.c b/sysdeps/unix/sysv/linux/tcflush.c
new file mode 100644
index 0000000000..78e09b2f75
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tcflush.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/sun/sunos4/tcflush.c>
diff --git a/sysdeps/unix/sysv/linux/tcgetattr.c b/sysdeps/unix/sysv/linux/tcgetattr.c
new file mode 100644
index 0000000000..3f12348478
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tcgetattr.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1992, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <termios.h>
+#include <sys/ioctl.h>
+
+/* Put the state of FD into *TERMIOS_P. */
+int
+__tcgetattr (fd, termios_p)
+ int fd;
+ struct termios *termios_p;
+{
+ return __ioctl (fd, TCGETS, termios_p);
+}
+
+weak_alias (__tcgetattr, tcgetattr)
diff --git a/sysdeps/unix/sysv/linux/tcsetattr.c b/sysdeps/unix/sysv/linux/tcsetattr.c
new file mode 100644
index 0000000000..ef5009d1c8
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/tcsetattr.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/sun/sunos4/tcsetattr.c>
diff --git a/sysdeps/unix/sysv/linux/termbits.h b/sysdeps/unix/sysv/linux/termbits.h
new file mode 100644
index 0000000000..8a71334ba0
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/termbits.h
@@ -0,0 +1,209 @@
+/* termios type and macro definitions. Linux version.
+Copyright (C) 1993, 1994, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+/* Type of terminal control flag masks. */
+typedef unsigned int tcflag_t;
+
+/* Type of control characters. */
+typedef unsigned char cc_t;
+
+/* Type of baud rate specifiers. */
+typedef unsigned int speed_t;
+
+/* Terminal control structure. */
+struct termios
+{
+ /* Input modes. */
+ tcflag_t c_iflag;
+#define IGNBRK 0x0001 /* Ignore break condition. */
+#define BRKINT 0x0002 /* Signal interrupt on break. */
+#define IGNPAR 0x0004 /* Ignore characters with parity errors. */
+#define PARMRK 0x0008 /* Mark parity and framing errors. */
+#define INPCK 0x0010 /* Enable input parity check. */
+#define ISTRIP 0x0020 /* Strip 8th bit off characters. */
+#define INLCR 0x0040 /* Map NL to CR on input. */
+#define IGNCR 0x0080 /* Ignore CR. */
+#define ICRNL 0x0100 /* Map CR to NL on input. */
+#ifdef __USE_BSD
+#define IUCLC 0x0200 /* Map upper case to lower case on input. */
+#endif
+#define IXON 0x0400 /* Enable start/stop output control. */
+#define IXOFF 0x1000 /* Enable start/stop input control. */
+#ifdef __USE_BSD
+#define IXANY 0x0800 /* Any character will restart after stop. */
+#define IMAXBEL 0x2000 /* Ring bell when input queue is full. */
+#endif
+
+ /* Output modes. */
+ tcflag_t c_oflag;
+#define OPOST 0x0001 /* Perform output processing. */
+#ifdef __USE_BSD
+#define OLCUC 0x00000002 /* Map lower case to upper case on output. */
+#define ONLCR 0x00000004 /* Map NL to CR-NL on output. */
+#define OCRNL 0x00000008
+#define ONOCR 0x00000010
+#define ONLRET 0x00000020
+#define OFILL 0x00000040
+#define OFDEL 0x00000080
+#define NLDLY 0x00000100
+#define NL0 0
+#define NL1 0x00000100
+#define CRDLY 0x00000600
+#define CR0 0
+#define CR1 0x00000200
+#define CR2 0x00000400
+#define CR3 0x00000600
+#define TABDLY 0x00001800
+#define TAB0 0
+#define TAB1 0x00000800
+#define TAB2 0x00001000
+#define XTABS 0x00001800
+#define TAB3 XTABS
+#define BSDLY 0x00002000
+#define BS0 0
+#define BS1 0x00002000
+#define VTDLY 0x00004000
+#define VT0 0
+#define VT1 0x00004000
+#define FFDLY 0x00008000
+#define FF0 0
+#define FF1 0x00008000
+#define PAGEOUT 0x00010000
+#define WRAP 0x00020000
+#endif
+
+ /* Control modes. */
+ tcflag_t c_cflag;
+#define CSIZE (CS5|CS6|CS7|CS8) /* Number of bits per byte (mask). */
+#define CS5 0 /* 5 bits per byte. */
+#define CS6 0x00000010 /* 6 bits per byte. */
+#define CS7 0x00000020 /* 7 bits per byte. */
+#define CS8 0x00000030 /* 8 bits per byte. */
+#define CSTOPB 0x00000040 /* Two stop bits instead of one. */
+#define CREAD 0x00000080 /* Enable receiver. */
+#define PARENB 0x00000100 /* Parity enable. */
+#define PARODD 0x00000200 /* Odd parity instead of even. */
+#define HUPCL 0x00000400 /* Hang up on last close. */
+#define CLOCAL 0x00000800 /* Ignore modem status lines. */
+#ifdef __USE_BSD
+#define CRTSCTS 0x08000000
+#define CBAUD 0x0000000f /* Mask for speed from c_cflag. */
+#define CBAUDEX 0x00010000 /* Mask for extended speed from c_cflag. */
+#endif
+
+ /* Input and output baud rates. These are encoded in c_cflag. */
+#define B0 0x000000000
+#define B50 0x000000001
+#define B75 0x000000002
+#define B110 0x000000003
+#define B134 0x000000004
+#define B150 0x000000005
+#define B200 0x000000006
+#define B300 0x000000007
+#define B600 0x000000008
+#define B1200 0x000000009
+#define B1800 0x00000000a
+#define B2400 0x00000000b
+#define B4800 0x00000000c
+#define B9600 0x00000000d
+#define B19200 0x00000000e
+#define B38400 0x00000000f
+#ifdef __USE_BSD
+#define EXTA 0x00000000e
+#define EXTB 0x00000000f
+#endif
+#define B57600 0x000010001
+#define B115200 0x000010002
+#define B230400 0x000010003
+
+ /* Local modes. */
+ tcflag_t c_lflag;
+#ifdef __USE_BSD
+#define ECHOKE 0x00000800 /* Visual erase for KILL. */
+#endif
+#define ECHOE 0x00000010 /* Visual erase for ERASE. */
+#define ECHOK 0x00000020 /* Echo NL after KILL. */
+#define ECHO 0x00000008 /* Enable echo. */
+#define ECHONL 0x00000040 /* Echo NL even if ECHO is off. */
+#ifdef __USE_BSD
+#define ECHOPRT 0x00000400 /* Hardcopy visual erase. */
+#define ECHOCTL 0x00000200 /* Echo control characters as ^X. */
+#endif
+#define ISIG 0x00000001 /* Enable signals. */
+#define ICANON 0x00000002 /* Do erase and kill processing. */
+#define IEXTEN 0x00008000 /* Enable DISCARD and LNEXT. */
+#define TOSTOP 0x00000100 /* Send SIGTTOU for background output. */
+#ifdef __USE_BSD
+#define PENDIN 0x00004000 /* Retype pending input (state). */
+#endif
+#define NOFLSH 0x00000080 /* Disable flush after interrupt. */
+
+ cc_t c_line; /* Line discipline (?) */
+
+ /* Control characters. */
+#define VEOF 4 /* End-of-file character [ICANON]. */
+#define VEOL 5 /* End-of-line character [ICANON]. */
+#ifdef __USE_BSD
+#define VEOL2 6 /* Second EOL character [ICANON]. */
+#define VSWTCH 7 /* ??? */
+#endif
+#define VERASE 2 /* Erase character [ICANON]. */
+#ifdef __USE_BSD
+#define VWERASE 14 /* Word-erase character [ICANON]. */
+#endif
+#define VKILL 3 /* Kill-line character [ICANON]. */
+#ifdef __USE_BSD
+#define VREPRINT 12 /* Reprint-line character [ICANON]. */
+#endif
+#define VINTR 0 /* Interrupt character [ISIG]. */
+#define VQUIT 1 /* Quit character [ISIG]. */
+#define VSUSP 10 /* Suspend character [ISIG]. */
+#ifdef __USE_BSD
+#define VDSUSP 11 /* Delayed suspend character [ISIG]. */
+#endif
+#define VSTART 8 /* Start (X-ON) character [IXON, IXOFF]. */
+#define VSTOP 9 /* Stop (X-OFF) character [IXON, IXOFF]. */
+#ifdef __USE_BSD
+#define VLNEXT 15 /* Literal-next character [IEXTEN]. */
+#define VDISCARD 13 /* Discard character [IEXTEN]. */
+#endif
+#define VMIN VEOF /* Minimum number of bytes read at once [!ICANON]. */
+#define VTIME VEOL /* Time-out value (tenths of a second) [!ICANON]. */
+#define NCCS 19
+ cc_t c_cc[NCCS];
+};
+
+#define _IOT_termios /* Hurd ioctl type field. */ \
+ _IOT (_IOTS (cflag_t), 4, _IOTS (cc_t), NCCS, _IOTS (speed_t), 2)
+
+/* Values for the OPTIONAL_ACTIONS argument to `tcsetattr'. */
+#define TCSANOW 0 /* Change immediately. */
+#define TCSADRAIN 1 /* Change when pending output is written. */
+#define TCSAFLUSH 2 /* Flush pending input before changing. */
+
+/* Values for the QUEUE_SELECTOR argument to `tcflush'. */
+#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. */
+
+/* Values for the ACTION argument to `tcflow'. */
+#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. */
diff --git a/sysdeps/unix/sysv/linux/ualarm.c b/sysdeps/unix/sysv/linux/ualarm.c
new file mode 100644
index 0000000000..5522f58892
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ualarm.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/ualarm.c>
diff --git a/sysdeps/unix/sysv/linux/ulimit.c b/sysdeps/unix/sysv/linux/ulimit.c
new file mode 100644
index 0000000000..2b1193085a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ulimit.c
@@ -0,0 +1,73 @@
+/* Copyright (C) 1991, 1992, 1994, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <sysdep.h>
+#include <sys/resource.h>
+#include <unistd.h>
+#include <errno.h>
+
+/* Function depends on CMD:
+ 1 = Return the limit on the size of a file, in units of 512 bytes.
+ 2 = Set the limit on the size of a file to NEWLIMIT. Only the
+ super-user can increase the limit.
+ 3 = illegal due to shared libraries; normally is
+ (Return the maximum possible address of the data segment.)
+ 4 = Return the maximum number of files that the calling process
+ can open.
+ Returns -1 on errors. */
+long int
+__ulimit (cmd, newlimit)
+ int cmd;
+ long int newlimit;
+{
+ int status;
+
+ switch (cmd)
+ {
+ case 1:
+ {
+ /* Get limit on file size. */
+ struct rlimit fsize;
+
+ status = getrlimit(RLIMIT_FSIZE, &fsize);
+ if (status < 0)
+ return -1;
+
+ /* Convert from bytes to 512 byte units. */
+ return fsize.rlim_cur / 512;
+ }
+ case 2:
+ /* Set limit on file size. */
+ {
+ struct rlimit fsize;
+ fsize.rlim_cur = newlimit * 512;
+ fsize.rlim_max = newlimit * 512;
+
+ return setrlimit(RLIMIT_FSIZE, &fsize);
+ }
+ case 4:
+ return sysconf(_SC_OPEN_MAX);
+
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+weak_alias (__ulimit, ulimit);
diff --git a/sysdeps/unix/sysv/linux/usleep.c b/sysdeps/unix/sysv/linux/usleep.c
new file mode 100644
index 0000000000..d08c6b6594
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/usleep.c
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/usleep.c>
diff --git a/sysdeps/unix/sysv/linux/utsnamelen.h b/sysdeps/unix/sysv/linux/utsnamelen.h
new file mode 100644
index 0000000000..c16c3852fb
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/utsnamelen.h
@@ -0,0 +1,24 @@
+/* Copyright (C) 1995 Free Software Foundation, Inc.
+
+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. */
+
+/* Length of the entries in `struct utsname' is 65. */
+#define _UTSNAME_LENGTH 65
+
+/* Linux provides as additional information in the `struct utsname'
+ the name of the current domain. Define _UTSNAME_DOMAIN_LENGTH
+ to a value != 0 to activate this entry. */
+#define _UTSNAME_DOMAIN_LENGTH _UTSNAME_LENGTH
diff --git a/sysdeps/unix/sysv/linux/vfork.c b/sysdeps/unix/sysv/linux/vfork.c
new file mode 100644
index 0000000000..9b4dd5f121
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/vfork.c
@@ -0,0 +1 @@
+#include <sysdeps/generic/vfork.c>
diff --git a/sysdeps/unix/sysv/linux/wait.c b/sysdeps/unix/sysv/linux/wait.c
new file mode 100644
index 0000000000..63cf60c64a
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/wait.c
@@ -0,0 +1 @@
+#include <sysdeps/posix/wait.c>
diff --git a/sysdeps/unix/sysv/linux/wait4.S b/sysdeps/unix/sysv/linux/wait4.S
new file mode 100644
index 0000000000..e4c322341d
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/wait4.S
@@ -0,0 +1 @@
+#include <sysdeps/unix/bsd/bsd4.4/wait4.S>
diff --git a/sysdeps/unix/sysv/linux/waitpid.c b/sysdeps/unix/sysv/linux/waitpid.c
new file mode 100644
index 0000000000..d4ee06bf1b
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/waitpid.c
@@ -0,0 +1,32 @@
+/* Copyright (C) 1991, 1992, 1995 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., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <sysdep.h>
+#include <stdlib.h>
+#include <sys/wait.h>
+
+__pid_t
+__waitpid (pid, stat_loc, options)
+ __pid_t pid;
+ int *stat_loc;
+ int options;
+{
+ return __wait4 (pid, stat_loc, options, NULL);
+}
+
+weak_alias (__waitpid, waitpid)
diff --git a/sysdeps/unix/sysv/linux/writev.c b/sysdeps/unix/sysv/linux/writev.c
new file mode 100644
index 0000000000..0dc6a76014
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/writev.c
@@ -0,0 +1 @@
+#include <sysdeps/posix/writev.c>