about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/generic/Makefile6
-rw-r--r--sysdeps/generic/_strerror.c10
-rw-r--r--sysdeps/generic/paths.h71
-rw-r--r--sysdeps/posix/getaddrinfo.c487
-rw-r--r--sysdeps/stub/getaddrinfo.c38
-rw-r--r--sysdeps/stub/lockfile.c24
-rw-r--r--sysdeps/unix/sysv/linux/Makefile5
-rw-r--r--sysdeps/unix/sysv/linux/alpha/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sigaction.h51
-rw-r--r--sysdeps/unix/sysv/linux/alpha/signum.h69
-rw-r--r--sysdeps/unix/sysv/linux/alpha/statbuf.h49
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c1
-rw-r--r--sysdeps/unix/sysv/linux/paths.h71
-rw-r--r--sysdeps/unix/sysv/linux/siglist.c19
-rw-r--r--sysdeps/unix/sysv/linux/siglist.h47
15 files changed, 910 insertions, 40 deletions
diff --git a/sysdeps/generic/Makefile b/sysdeps/generic/Makefile
index f160dc8892..5e0f03abcc 100644
--- a/sysdeps/generic/Makefile
+++ b/sysdeps/generic/Makefile
@@ -32,8 +32,8 @@ common-generated := $(common-generated) bytesex.h det_endian
 endif
 
 ifeq ($(subdir),stdio-common)
-
-ifeq	"$(filter $(objpfx)siglist.c,$(before-compile))" ""
+ifneq ($(inhibit-siglist),yes)
+ifeq	"$(filter %siglist.c,$(before-compile))" ""
 before-compile := $(before-compile) $(objpfx)siglist.c
 $(objpfx)siglist.c: $(objpfx)make_siglist
 	@rm -f $@
@@ -49,5 +49,5 @@ $(objpfx)make_siglist: $(sysdep_dir)/generic/make_siglist.c
 
 generated := $(generated) make_siglist siglist.c
 endif
-
+endif
 endif
diff --git a/sysdeps/generic/_strerror.c b/sysdeps/generic/_strerror.c
index 8067f3fd06..45fc8cab59 100644
--- a/sysdeps/generic/_strerror.c
+++ b/sysdeps/generic/_strerror.c
@@ -16,6 +16,7 @@ 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 <libintl.h>
 #include <stdio.h>
 #include <string.h>
 #include "../stdio-common/_itoa.h"
@@ -25,6 +26,9 @@ Cambridge, MA 02139, USA.  */
 #define _sys_nerr sys_nerr
 #endif
 
+/* Set if startup process finished.  */
+extern int _dl_starting_up;
+
 /* Return a string describing the errno code in ERRNUM.  */
 char *
 _strerror_internal (int errnum,
@@ -33,7 +37,8 @@ _strerror_internal (int errnum,
 {
   if (errnum < 0 || errnum >= _sys_nerr)
     {
-      const char *unk = _("Unknown error ");
+      static const char unk_orig[] = N_("Unknown error ");
+      const char *unk = _dl_starting_up ? unk_orig : _(unk_orig);
       const size_t unklen = strlen (unk);
       char *p = buf + buflen;
       *--p = '\0';
@@ -41,5 +46,6 @@ _strerror_internal (int errnum,
       return memcpy (p - unklen, unk, unklen);
     }
 
-  return (char *) _(_sys_errlist[errnum]);
+  return (char *) (_dl_starting_up ? _sys_errlist[errnum]
+		   : _(_sys_errlist[errnum]));
 }
diff --git a/sysdeps/generic/paths.h b/sysdeps/generic/paths.h
new file mode 100644
index 0000000000..760ae7cfe0
--- /dev/null
+++ b/sysdeps/generic/paths.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)paths.h	8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _PATHS_H_
+#define	_PATHS_H_
+
+/* Default search path. */
+#define	_PATH_DEFPATH	"/usr/bin:/bin"
+/* All standard utilities path. */
+#define	_PATH_STDPATH \
+	"/usr/bin:/bin:/usr/sbin:/sbin:/usr/contrib/bin:/usr/old/bin"
+
+#define	_PATH_BSHELL	"/bin/sh"
+#define	_PATH_CONSOLE	"/dev/console"
+#define	_PATH_CSHELL	"/bin/csh"
+#define	_PATH_DEVDB	"/var/run/dev.db"
+#define	_PATH_DEVNULL	"/dev/null"
+#define	_PATH_DRUM	"/dev/drum"
+#define	_PATH_KMEM	"/dev/kmem"
+#define	_PATH_MAILDIR	"/var/mail"
+#define	_PATH_MAN	"/usr/man"
+#define	_PATH_MEM	"/dev/mem"
+#define	_PATH_MNTTAB    "/etc/fstab"
+#define	_PATH_MOUNTED   "/var/run/mtab"
+#define	_PATH_NOLOGIN	"/etc/nologin"
+#define	_PATH_SENDMAIL	"/usr/sbin/sendmail"
+#define	_PATH_SHELLS	"/etc/shells"
+#define	_PATH_TTY	"/dev/tty"
+#define	_PATH_UNIX	"/vmunix"
+#define	_PATH_VI	"/usr/bin/vi"
+
+/* Provide trailing slash, since mostly used for building pathnames. */
+#define	_PATH_DEV	"/dev/"
+#define	_PATH_TMP	"/tmp/"
+#define	_PATH_VARDB	"/var/db/"
+#define	_PATH_VARRUN	"/var/run/"
+#define	_PATH_VARTMP	"/var/tmp/"
+
+#endif /* !_PATHS_H_ */
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
new file mode 100644
index 0000000000..823335d761
--- /dev/null
+++ b/sysdeps/posix/getaddrinfo.c
@@ -0,0 +1,487 @@
+/* The Inner Net License, Version 2.00
+
+  The author(s) grant permission for redistribution and use in source and
+binary forms, with or without modification, of the software and documentation
+provided that the following conditions are met:
+
+0. If you receive a version of the software that is specifically labelled
+   as not being for redistribution (check the version message and/or README),
+   you are not permitted to redistribute that version of the software in any
+   way or form.
+1. All terms of the all other applicable copyrights and licenses must be
+   followed.
+2. Redistributions of source code must retain the authors' copyright
+   notice(s), this list of conditions, and the following disclaimer.
+3. Redistributions in binary form must reproduce the authors' copyright
+   notice(s), this list of conditions, and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+4. All advertising materials mentioning features or use of this software
+   must display the following acknowledgement with the name(s) of the
+   authors as specified in the copyright notice(s) substituted where
+   indicated:
+
+	This product includes software developed by <name(s)>, The Inner
+	Net, and other contributors.
+
+5. Neither the name(s) of the author(s) nor the names of its contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY ITS AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+  If these license terms cause you a real problem, contact the author.  */
+
+/* This software is Copyright 1996 by Craig Metz, All Rights Reserved.  */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include <netinet/in.h>
+#ifdef INET6
+#include <netinet6/in6.h>
+#endif /* INET6 */
+#include <netdb.h>
+
+
+#define GAIH_OKIFUNSPEC 0x0100
+#define GAIH_EAI        ~(GAIH_OKIFUNSPEC)
+
+#ifdef HOSTTABLE
+struct hostent *_hostname2addr_hosts(const char *name, int);
+struct hostent *_addr2hostname_hosts(const char *name, int, int);
+#endif /* HOSTTABLE */
+
+static struct addrinfo nullreq =
+{ 0, PF_UNSPEC, 0, 0, 0, NULL, NULL, NULL };
+
+struct gaih_service {
+  char *name;
+  unsigned long num;
+};
+
+struct gaih_servtuple {
+  struct gaih_servtuple *next;
+  int socktype;
+  int protocol;
+  int port;
+};
+
+static struct gaih_servtuple nullserv = {
+  NULL, 0, 0, 0
+};
+
+struct gaih_addrtuple {
+  struct gaih_addrtuple *next;
+  int family;
+  char addr[16];
+};
+
+static struct gaih_addrtuple nulladdr;
+
+struct gaih_typeproto {
+  int socktype;
+  int protocol;
+  char *name;
+};
+
+static struct gaih_typeproto gaih_inet_typeproto[] = {
+  { 0, 0, NULL },
+  { SOCK_STREAM, IPPROTO_TCP, "tcp" },
+  { SOCK_DGRAM, IPPROTO_UDP, "udp" },
+  { 0, 0, NULL }
+};
+
+static int gaih_inet_serv(char *servicename, struct gaih_typeproto *tp, struct gaih_servtuple **st)
+{
+  struct servent *s;
+
+  if (!(s = getservbyname(servicename, tp->name)))
+    return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
+
+  if (!(*st = malloc(sizeof(struct gaih_servtuple))))
+    return -EAI_MEMORY;
+
+  (*st)->next = NULL;
+  (*st)->socktype = tp->socktype;
+  (*st)->protocol = tp->protocol;
+  (*st)->port = s->s_port;
+
+  return 0;
+}
+
+static int gaih_inet(const char *name, const struct gaih_service *service,
+		     const struct addrinfo *req, struct addrinfo **pai)
+{
+  struct hostent *h = NULL;
+  struct gaih_typeproto *tp = gaih_inet_typeproto;
+  struct gaih_servtuple *st = &nullserv;
+  struct gaih_addrtuple *at = &nulladdr;
+  int i;
+
+  if (req->ai_protocol || req->ai_socktype) {
+    for (tp++; tp->name &&
+	  ((req->ai_socktype != tp->socktype) || !req->ai_socktype) &&
+	  ((req->ai_protocol != tp->protocol) || !req->ai_protocol); tp++);
+    if (!tp->name)
+      if (req->ai_socktype)
+	return (GAIH_OKIFUNSPEC | -EAI_SOCKTYPE);
+      else
+	return (GAIH_OKIFUNSPEC | -EAI_SERVICE);
+  }
+
+  if (service) {
+    if (service->name) {
+      if (tp->name) {
+	if (i = gaih_inet_serv(service->name, tp, &st))
+	  return i;
+      } else {
+	struct gaih_servtuple **pst = &st;
+	for (tp++; tp->name; tp++) {
+	  if (i = gaih_inet_serv(service->name, tp, pst)) {
+	    if (i & GAIH_OKIFUNSPEC)
+	      continue;
+	    goto ret;
+	  }
+	  pst = &((*pst)->next);
+	}
+	if (st == &nullserv) {
+	  i = (GAIH_OKIFUNSPEC | -EAI_SERVICE);
+	  goto ret;
+	}
+      }
+    } else {
+      if (!(st = malloc(sizeof(struct gaih_servtuple))))
+	return -EAI_MEMORY;
+
+      st->next = NULL;
+      st->socktype = tp->socktype;
+      st->protocol = tp->protocol;
+      st->port = htons(service->num);
+    }
+  }
+
+  if (name) {
+    if (!(at = malloc(sizeof(struct gaih_addrtuple)))) {
+      i = -EAI_MEMORY;
+      goto ret;
+    }
+
+    at->family = 0;
+    at->next = NULL;
+
+    if (!at->family || !req->ai_family || (req->ai_family == AF_INET))
+      if (inet_pton(AF_INET, name, at->addr) > 0)
+	at->family = AF_INET;
+
+#ifdef INET6
+    if (!at->family && (!req->ai_family || (req->ai_family == AF_INET6)))
+      if (inet_pton(AF_INET6, name, at->addr) > 0)
+	at->family = AF_INET6;
+#endif /* INET6 */
+
+#ifdef HOSTTABLE
+    if (!at->family) {
+      struct hostent *h;
+      struct gaih_addrtuple **pat = &at;
+
+#ifdef INET6
+      if (!req->ai_family || (req->ai_family == AF_INET6))
+	if (h = _hostname2addr_hosts(name, AF_INET6)) {
+	  for (i = 0; h->h_addr_list[i]; i++) {
+	    if (!*pat) {
+	      if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) {
+		i = -EAI_MEMORY;
+		goto ret;
+	      }
+	    }
+	    (*pat)->next = NULL;
+	    (*pat)->family = AF_INET6;
+	    memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in6_addr));
+	    pat = &((*pat)->next);
+	  }
+	}
+#endif /* INET6 */
+
+      if (!req->ai_family || (req->ai_family == AF_INET))
+	if (h = _hostname2addr_hosts(name, AF_INET)) {
+	  for (i = 0; h->h_addr_list[i]; i++) {
+	    if (!*pat) {
+	      if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) {
+		i = -EAI_MEMORY;
+		goto ret;
+	      }
+	    }
+	    (*pat)->next = NULL;
+	    (*pat)->family = AF_INET;
+	    memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in_addr));
+	    pat = &((*pat)->next);
+	  }
+	}
+    }
+#endif /* HOSTTABLE */
+
+#ifdef RESOLVER
+    if (!at->family) {
+      struct hostent *h;
+      struct gaih_addrtuple **pat = &at;
+
+#ifdef INET6
+      if (!req->ai_family || (req->ai_family == AF_INET6))
+	if (h = gethostbyname2(name, AF_INET6)) {
+	  for (i = 0; h->h_addr_list[i]; i++) {
+	    if (!*pat) {
+	      if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) {
+		i = -EAI_MEMORY;
+		goto ret;
+	      }
+	    }
+	    (*pat)->next = NULL;
+	    (*pat)->family = AF_INET6;
+	    memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in6_addr));
+	    pat = &((*pat)->next);
+	  }
+	}
+#endif /* INET6 */
+
+      if (!req->ai_family || (req->ai_family == AF_INET))
+	if (h = gethostbyname2(name, AF_INET)) {
+	  for (i = 0; h->h_addr_list[i]; i++) {
+	    if (!*pat) {
+	      if (!(*pat = malloc(sizeof(struct gaih_addrtuple)))) {
+		i = -EAI_MEMORY;
+		goto ret;
+	      }
+	    }
+	    (*pat)->next = NULL;
+	    (*pat)->family = AF_INET;
+	    memcpy((*pat)->addr, h->h_addr_list[i], sizeof(struct in_addr));
+	    pat = &((*pat)->next);
+	  }
+	}
+    }
+#endif /* RESOLVER */
+
+    if (!at->family)
+      return (GAIH_OKIFUNSPEC | -EAI_NONAME);
+  } else {
+    memset(&nulladdr, 0, sizeof(nulladdr));
+#ifdef INET6
+    if (!req->ai_family || (req->ai_family == AF_INET6))
+      nulladdr.family = AF_INET6;
+    else
+#endif /* INET6 */
+    nulladdr.family = AF_INET;
+  }
+
+  {
+    const char *c = NULL;
+    struct gaih_servtuple *st2;
+    struct gaih_addrtuple *at2 = at;
+    int j;
+
+    while(at2) {
+      if (req->ai_flags & AI_CANONNAME) {
+        struct hostent *h = NULL;
+
+#ifdef RESOLVER
+	h = gethostbyaddr(at2->addr,
+#ifdef INET6
+	    (at2->family == AF_INET6) ? sizeof(struct in6_addr) :
+#endif /* INET6 */
+	    sizeof(struct in_addr), at2->family);
+#endif /* RESOLVER */
+#ifdef HOSTTABLE
+	if (!h)
+	  h = _addr2hostname_hosts(at2->addr,
+#ifdef INET6
+	    (at2->family == AF_INET6) ? sizeof(struct in6_addr) :
+#endif /* INET6 */
+	    sizeof(struct in_addr), at2->family);
+#endif /* HOSTTABLE */
+
+	if (!h) {
+	  c = inet_ntop(at2->family, at2->addr, NULL, 0);
+	} else
+          c = h->h_name;
+
+	if (!c) {
+	  i = (GAIH_OKIFUNSPEC | -EAI_NONAME);
+	  goto ret;
+	}
+
+	j = strlen(c) + 1;
+      } else
+	j = 0;
+
+#ifdef INET6
+      if (at2->family == AF_INET6)
+	i = sizeof(struct sockaddr_in6);
+      else
+#endif /* INET6 */
+	i = sizeof(struct sockaddr_in);
+
+      st2 = st;
+      while(st2) {
+	if (!(*pai = malloc(sizeof(struct addrinfo) + i + j))) {
+	  i = -EAI_MEMORY;
+	  goto ret;
+	}
+	(*pai)->ai_flags = req->ai_flags;
+	(*pai)->ai_family = at2->family;
+	(*pai)->ai_socktype = st2->socktype;
+	(*pai)->ai_protocol = st2->protocol;
+	(*pai)->ai_addrlen = i;
+	(*pai)->ai_addr = (void *)(*pai) + sizeof(struct addrinfo);
+#if SALEN
+	((struct sockaddr_in *)(*pai)->ai_addr)->sin_len = i;
+#endif /* SALEN */
+	((struct sockaddr_in *)(*pai)->ai_addr)->sin_family = at2->family;
+	((struct sockaddr_in *)(*pai)->ai_addr)->sin_port = st2->port;
+
+#ifdef INET6
+	if (at2->family == AF_INET6) {
+	  ((struct sockaddr_in6 *)(*pai)->ai_addr)->sin6_flowinfo = 0;
+	  memcpy(&((struct sockaddr_in6 *)(*pai)->ai_addr)->sin6_addr, at2->addr, sizeof(struct in6_addr));
+	} else
+#endif /* INET6 */
+	{
+	  memcpy(&((struct sockaddr_in *)(*pai)->ai_addr)->sin_addr, at2->addr, sizeof(struct in_addr));
+	  memset(((struct sockaddr_in *)(*pai)->ai_addr)->sin_zero, 0, sizeof(((struct sockaddr_in *)(*pai)->ai_addr)->sin_zero));
+	}
+
+	if (c) {
+	  (*pai)->ai_canonname = (void *)(*pai) + sizeof(struct addrinfo) + i;
+	  strcpy((*pai)->ai_canonname, c);
+	} else
+	  (*pai)->ai_canonname = NULL;
+	(*pai)->ai_next = NULL;
+
+	pai = &((*pai)->ai_next);
+
+	st2 = st2->next;
+      }
+      at2 = at2->next;
+    }
+  }
+
+  i = 0;
+
+ret:
+  if (st != &nullserv) {
+    struct gaih_servtuple *st2 = st;
+    while(st) {
+      st2 = st->next;
+      free(st);
+      st = st2;
+    }
+  }
+  if (at != &nulladdr) {
+    struct gaih_addrtuple *at2 = at;
+    while(at) {
+      at2 = at->next;
+      free(at);
+      at = at2;
+    }
+  }
+  return i;
+}
+
+struct gaih {
+  int family;
+  int (*gaih)(const char *name, const struct gaih_service *service,
+	      const struct addrinfo *req, struct addrinfo **pai);
+};
+
+static struct gaih gaih[] = {
+#ifdef INET6
+  { PF_INET6, gaih_inet },
+#endif /* INET6 */
+  { PF_INET, gaih_inet },
+  { PF_UNSPEC, NULL }
+};
+
+int getaddrinfo(const char *name, const char *service,
+		const struct addrinfo *req, struct addrinfo **pai)
+{
+  int i, j = 0;
+  struct addrinfo *p = NULL, **end = &p;
+  struct gaih *g = gaih, *pg = NULL;
+  struct gaih_service gaih_service, *pservice;
+
+  if (!name && !service)
+    return EAI_NONAME;
+
+  if (!req)
+    req = &nullreq;
+
+  if (req->ai_flags & ~3)
+    return EAI_BADFLAGS;
+
+  if ((req->ai_flags & AI_CANONNAME) && !name)
+    return EAI_BADFLAGS;
+
+  if (service && *service) {
+    char *c;
+    gaih_service.num = strtoul(gaih_service.name = (void *)service, &c, 10);
+    if (!*c) {
+      if (!req->ai_socktype)
+	return EAI_SERVICE;
+      gaih_service.name = NULL;
+    }
+    pservice = &gaih_service;
+  } else
+    pservice = NULL;
+
+  while(g->gaih) {
+    if ((req->ai_family == g->family) || !req->ai_family) {
+      j++;
+      if (!((pg && (pg->gaih == g->gaih)))) {
+	pg = g;
+	if (i = g->gaih(name, pservice, req, end)) {
+	  if (!req->ai_family && (i & GAIH_OKIFUNSPEC))
+	    continue;
+	  goto gaih_err;
+	}
+	while(*end) end = &((*end)->ai_next);
+      }
+    }
+    g++;
+  }
+
+  if (!j)
+    return EAI_FAMILY;
+
+  if (p) {
+    *pai = p;
+    return 0;
+  }
+
+gaih_err:
+  if (p)
+    freeaddrinfo(p);
+
+  if (i)
+    return -(i & GAIH_EAI);
+
+  return EAI_NONAME;
+}
+
+void freeaddrinfo(struct addrinfo *ai)
+{
+  struct addrinfo *p;
+
+  while(ai) {
+    p = ai;
+    ai = ai->ai_next;
+    free((void *)p);
+  }
+}
diff --git a/sysdeps/stub/getaddrinfo.c b/sysdeps/stub/getaddrinfo.c
new file mode 100644
index 0000000000..5b8bb0ea94
--- /dev/null
+++ b/sysdeps/stub/getaddrinfo.c
@@ -0,0 +1,38 @@
+/* Stub version of getaddrinfo function.
+   Copyright (C) 1996 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include <errno.h>
+#include <netdb.h>
+
+int
+getaddrinfo (const char *name, const char *service, const struct addrinfo *req,
+	     struct addrinfo **pai)
+{
+  __set_errno (ENOSYS);
+  return EAI_SYSTEM;
+}
+stub_warning (getaddrinfo)
+
+
+void
+freeaddrinfo (struct addrinfo *ai)
+{
+  /* Nothing.  */
+}
+stub_warning (freeaddrinfo)
diff --git a/sysdeps/stub/lockfile.c b/sysdeps/stub/lockfile.c
index 61d03a7c72..112a7ad0b1 100644
--- a/sysdeps/stub/lockfile.c
+++ b/sysdeps/stub/lockfile.c
@@ -21,34 +21,40 @@ typedef FILE;
 
 
 void
-__flockfile (FILE *stream)
+__internal_flockfile (FILE *stream)
 {
   /* Do nothing.  Using this version does not do any locking.  */
 }
 #ifdef USE_IN_LIBIO
-strong_alias (__flockfile, _IO_flockfile)
+weak_alias (__internal_flockfile, _IO_flockfile)
+#else
+weak_alias (__internal_flockfile, __flockfile)
 #endif
-weak_alias (__flockfile, flockfile);
+weak_alias (__internal_flockfile, flockfile);
 
 
 void
-__funlockfile (FILE *stream)
+__internal_funlockfile (FILE *stream)
 {
   /* Do nothing.  Using this version does not do any locking.  */
 }
 #ifdef USE_IN_LIBIO
-strong_alias (__funlockfile, _IO_funlockfile)
+weak_alias (__internal_funlockfile, _IO_funlockfile)
+#else
+weak_alias (__internal_funlockfile, __internal_funlockfile)
 #endif
-weak_alias (__funlockfile, funlockfile);
+weak_alias (__internal_funlockfile, funlockfile);
 
 
 int
-__ftrylockfile (FILE *stream)
+__internal_ftrylockfile (FILE *stream)
 {
   /* Do nothing.  Using this version does not do any locking.  */
   return 1;
 }
 #ifdef USE_IN_LIBIO
-strong_alias (__ftrylockfile, _IO_ftrylockfile)
+weak_alias (__internal_ftrylockfile, __ftrylockfile)
+#else
+weak_alias (__internal_ftrylockfile, _IO_ftrylockfile)
 #endif
-weak_alias (__ftrylockfile, ftrylockfile);
+weak_alias (__internal_ftrylockfile, ftrylockfile);
diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
index 0f563f082a..0e87d09142 100644
--- a/sysdeps/unix/sysv/linux/Makefile
+++ b/sysdeps/unix/sysv/linux/Makefile
@@ -43,5 +43,10 @@ ifeq ($(subdir), termios)
 sysdep_headers += termio.h
 endif
 
+ifeq ($(subdir), stdio-common)
+# Just disable the auto generation in sysdeps/generic
+inhibit-siglist := yes
+endif
+
 # Don't compile the ctype glue code, since there is no old non-GNU C library.
 inhibit-glue = yes
diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
index fa433e9d8b..3908b5703c 100644
--- a/sysdeps/unix/sysv/linux/alpha/Makefile
+++ b/sysdeps/unix/sysv/linux/alpha/Makefile
@@ -1,5 +1,5 @@
 ifeq ($(subdir), misc)
-sysdep_headers += alpha/ptrace.h alpha/regdef.h sys/io.h
+sysdep_headers += alpha/ptrace.h alpha/regdef.h
 
 sysdep_routines += ieee_get_fp_control ieee_set_fp_control \
 		   sethae ioperm osf_sigprocmask fstatfs statfs llseek
diff --git a/sysdeps/unix/sysv/linux/alpha/sigaction.h b/sysdeps/unix/sysv/linux/alpha/sigaction.h
new file mode 100644
index 0000000000..57ce5e6ded
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/sigaction.h
@@ -0,0 +1,51 @@
+/* The proper definitions for Linux/Alpha sigaction.
+Copyright (C) 1996 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Structure describing the action to be taken when a signal arrives.  */
+struct sigaction
+  {
+    /* Signal handler.  */
+    __sighandler_t sa_handler;
+
+    /* Additional set of signals to be blocked.  */
+    __sigset_t sa_mask;
+
+    /* Special flags.  */
+    unsigned int sa_flags;
+  };
+
+/* Bits in `sa_flags'.  */
+#define	SA_NOCLDSTOP 0x00000004	/* Don't send SIGCHLD when children stop.  */
+#ifdef __USE_MISC
+#define SA_STACK     0x00000001	/* Use signal stack by using `sa_restorer'.  */
+#define SA_RESTART   0x00000002	/* Don't restart syscall on signal return.  */
+#define SA_INTERRUPT 0x20000000	/* Historical no-op.  */
+#define SA_NOMASK    0x00000008	/* Don't automatically block the signal when
+				   its handler is being executed.  */
+#define SA_ONESHOT   0x00000010	/* Reset to SIG_DFL on entry to handler.  */
+
+/* Some aliases for the SA_ constants.  */
+#define SA_NODEFER	SA_NOMASK
+#define SA_RESETHAND	SA_ONESHOT
+#endif
+
+/* Values for the HOW argument to `sigprocmask'.  */
+#define	SIG_BLOCK	1	/* Block signals.  */
+#define	SIG_UNBLOCK	2	/* Unblock signals.  */
+#define	SIG_SETMASK	3	/* Set the set of blocked signals.  */
diff --git a/sysdeps/unix/sysv/linux/alpha/signum.h b/sysdeps/unix/sysv/linux/alpha/signum.h
new file mode 100644
index 0000000000..be6132d42f
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/signum.h
@@ -0,0 +1,69 @@
+/* Signal number definitions.  Linux/Alpha version.
+Copyright (C) 1996 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.  */
+
+/*
+ * Linux/AXP has different signal numbers that Linux/i386: I'm trying
+ * to make it OSF/1 binary compatible, at least for normal binaries.
+ */
+#define SIGHUP		 1
+#define SIGINT		 2
+#define SIGQUIT		 3
+#define SIGILL		 4
+#define SIGTRAP		 5
+#define SIGABRT		 6
+#define SIGEMT		 7
+#define SIGFPE		 8
+#define SIGKILL		 9
+#define SIGBUS		10
+#define SIGSEGV		11
+#define SIGSYS		12
+#define SIGPIPE		13
+#define SIGALRM		14
+#define SIGTERM		15
+#define SIGURG		16
+#define SIGSTOP		17
+#define SIGTSTP		18
+#define SIGCONT		19
+#define SIGCHLD		20
+#define SIGTTIN		21
+#define SIGTTOU		22
+#define SIGIO		23
+#define SIGXCPU		24
+#define SIGXFSZ		25
+#define SIGVTALRM	26
+#define SIGPROF		27
+#define SIGWINCH	28
+#define SIGINFO		29
+#define SIGUSR1		30
+#define SIGUSR2		31
+
+#define SIGPOLL	SIGIO
+#define SIGPWR	SIGINFO
+#define SIGIOT	SIGABRT
+
+#define	_NSIG		32	/* Biggest signal number + 1.  */
+
+#endif	/* <signal.h> included.  */
diff --git a/sysdeps/unix/sysv/linux/alpha/statbuf.h b/sysdeps/unix/sysv/linux/alpha/statbuf.h
index e0e7a8ae37..5b59155d10 100644
--- a/sysdeps/unix/sysv/linux/alpha/statbuf.h
+++ b/sysdeps/unix/sysv/linux/alpha/statbuf.h
@@ -1,5 +1,5 @@
-/* Copyright (C) 1993 Free Software Foundation, Inc.
-   Contributed by Brendan Kehoe (brendan@zen.org).
+/* Copyright (C) 1996 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
@@ -19,32 +19,30 @@ Cambridge, MA 02139, USA.  */
 #ifndef	_STATBUF_H
 #define	_STATBUF_H
 
-#include <gnu/types.h>
+/* The Alpha has no additional syscall versions.  */
 
-/* Structure describing file characteristics.  */
-struct stat
-  {
-    int st_dev;			/* Device.  */
-    unsigned int st_ino;	/* File serial number.		*/
-    unsigned int st_mode;	/* File mode.  */
-    unsigned int st_nlink;	/* Link count.  */
-    unsigned int st_uid;	/* User ID of the file's owner.	*/
-    unsigned int st_gid;	/* Group ID of the file's group.*/
-    int st_rdev;		/* Device number, if device.  */
-
-    long st_size;		/* Size of file, in bytes.  */
+/* Versions of the `struct stat' data structure.  */
+#define _STAT_VER		0
 
-    int st_atime;		/* Time of last access.  */
-    int st_atime_usec;
-    int st_mtime;		/* Time of last modification.  */
-    int st_mtime_usec;
-    int st_ctime;		/* Time of last status change.  */
-    int st_ctime_usec;
+/* Versions of the `xmknod' interface.  */
+#define _MKNOD_VER_LINUX	0
 
-    unsigned int st_blksize;	/* Optimal block size for I/O.  */
-#define	_STATBUF_ST_BLKSIZE	/* Tell code we have this member.  */
-
-    int st_blocks;		/* Number of 512-byte blocks allocated.  */
+struct stat
+  {
+    unsigned int st_dev;		/* Device.  */
+    unsigned int st_ino;		/* File serial number.	*/
+    unsigned int st_mode;		/* File mode.  */
+    unsigned int st_nlink;		/* Link count.  */
+    unsigned int st_uid;		/* User ID of the file's owner.	*/
+    unsigned int st_gid;		/* Group ID of the file's group.*/
+    unsigned int st_rdev;		/* Device number, if device.  */
+    long int st_size;			/* Size of file, in bytes.  */
+    unsigned long int st_atime;		/* Time of last access.  */
+    unsigned long int st_mtime;		/* Time of last modification.  */
+    unsigned long int st_ctime;		/* Time of last status change.  */
+    unsigned int st_blksize;		/* Optimal block size for I/O.  */
+#define	_STATBUF_ST_BLKSIZE		/* Tell code we have this member.  */
+    int st_blocks;			/* Nr. of 512-byte blocks allocated.  */
     unsigned int st_flags;
     unsigned int st_gen;
   };
@@ -60,6 +58,7 @@ struct stat
 #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.  */
 
diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c
index 349da98e90..d37ca8c80f 100644
--- a/sysdeps/unix/sysv/linux/getsysstats.c
+++ b/sysdeps/unix/sysv/linux/getsysstats.c
@@ -20,6 +20,7 @@ Boston, MA 02111-1307, USA.  */
 
 #include <errno.h>
 #include <mntent.h>
+#include <paths.h>
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
diff --git a/sysdeps/unix/sysv/linux/paths.h b/sysdeps/unix/sysv/linux/paths.h
new file mode 100644
index 0000000000..80b6362701
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/paths.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)paths.h	8.1 (Berkeley) 6/2/93
+ */
+
+#ifndef _PATHS_H_
+#define	_PATHS_H_
+
+/* Default search path. */
+#define	_PATH_DEFPATH	"/usr/bin:/bin"
+/* All standard utilities path. */
+#define	_PATH_STDPATH \
+	"/usr/bin:/bin:/usr/sbin:/sbin"
+
+#define	_PATH_BSHELL	"/bin/sh"
+#define	_PATH_CONSOLE	"/dev/console"
+#define	_PATH_CSHELL	"/bin/csh"
+#define	_PATH_DEVDB	"/var/run/dev.db"
+#define	_PATH_DEVNULL	"/dev/null"
+#define	_PATH_DRUM	"/dev/drum"
+#define	_PATH_KMEM	"/dev/kmem"
+#define	_PATH_MAILDIR	"/var/spool/mail"
+#define	_PATH_MAN	"/usr/man"
+#define	_PATH_MEM	"/dev/mem"
+#define	_PATH_MNTTAB	"/etc/fstab"
+#define	_PATH_MOUNTED	"/etc/mtab"
+#define	_PATH_NOLOGIN	"/etc/nologin"
+#define	_PATH_SENDMAIL	"/usr/sbin/sendmail"
+#define	_PATH_SHELLS	"/etc/shells"
+#define	_PATH_TTY	"/dev/tty"
+#define	_PATH_UNIX	"/vmlinux"
+#define	_PATH_VI	"/usr/bin/vi"
+
+/* Provide trailing slash, since mostly used for building pathnames. */
+#define	_PATH_DEV	"/dev/"
+#define	_PATH_TMP	"/tmp/"
+#define	_PATH_VARDB	"/var/db/"
+#define	_PATH_VARRUN	"/var/run/"
+#define	_PATH_VARTMP	"/var/tmp/"
+
+#endif /* !_PATHS_H_ */
diff --git a/sysdeps/unix/sysv/linux/siglist.c b/sysdeps/unix/sysv/linux/siglist.c
new file mode 100644
index 0000000000..c054e81999
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/siglist.c
@@ -0,0 +1,19 @@
+#include <stddef.h>
+#include <signal.h>
+
+const char * const _sys_siglist[NSIG] =
+{
+#define init_sig(sig, abbrev, desc)   [sig] desc,
+#include "siglist.h"
+#undef init_sig
+};
+
+const char * const _sys_sigabbrev[NSIG] =
+{
+#define init_sig(sig, abbrev, desc)   [sig] abbrev,
+#include "siglist.h"
+#undef init_sig
+};
+
+weak_alias(_sys_siglist, sys_siglist)
+weak_alias(_sys_sigabbrev, sys_sigabbrev)
diff --git a/sysdeps/unix/sysv/linux/siglist.h b/sysdeps/unix/sysv/linux/siglist.h
new file mode 100644
index 0000000000..44aa4d9027
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/siglist.h
@@ -0,0 +1,47 @@
+/* This file is included multiple times.  */
+
+/* Standard signals  */
+  init_sig (SIGHUP, "HUP", "Hangup")
+  init_sig (SIGINT, "INT", "Interrupt")
+  init_sig (SIGQUIT, "QUIT", "Quit")
+  init_sig (SIGILL, "ILL", "Illegal Instruction")
+  init_sig (SIGTRAP, "TRAP", "Trace/breakpoint trap")
+  init_sig (SIGABRT, "ABRT", "Aborted")
+  init_sig (SIGFPE, "FPE", "Floating point exception")
+  init_sig (SIGKILL, "KILL", "Killed")
+  init_sig (SIGBUS, "BUS", "Bus error")
+  init_sig (SIGSEGV, "SEGV", "Segmentation fault")
+  init_sig (SIGPIPE, "PIPE", "Broken pipe")
+  init_sig (SIGALRM, "ALRM", "Alarm clock")
+  init_sig (SIGTERM, "TERM", "Terminated")
+  init_sig (SIGURG, "URG", "Urgent I/O condition")
+  init_sig (SIGSTOP, "STOP", "Stopped (signal)")
+  init_sig (SIGTSTP, "TSTP", "Stopped")
+  init_sig (SIGCONT, "CONT", "Continued")
+  init_sig (SIGCHLD, "CHLD", "Child exited")
+  init_sig (SIGTTIN, "TTIN", "Stopped (tty input)")
+  init_sig (SIGTTOU, "TTOU", "Stopped (tty output)")
+  init_sig (SIGIO, "IO", "I/O possible")
+  init_sig (SIGXCPU, "XCPU", "CPU time limit exceeded")
+  init_sig (SIGXFSZ, "XFSZ", "File size limit exceeded")
+  init_sig (SIGVTALRM, "VTALRM", "Virtual timer expired")
+  init_sig (SIGPROF, "PROF", "Profiling timer expired")
+  init_sig (SIGWINCH, "WINCH", "Window changed")
+  init_sig (SIGUSR1, "USR1", "User defined signal 1")
+  init_sig (SIGUSR2, "USR2", "User defined signal 2")
+
+/* Variations  */
+#ifdef SIGEMT
+  init_sig (SIGEMT, "EMT", "EMT trap")
+#endif
+#ifdef SIGSYS
+  init_sig (SIGSYS, "SYS", "Bad system call")
+#endif
+#ifdef SIGSTKFLT
+  init_sig (SIGSTKFLT, "STKFLT", "Stack fault")
+#endif
+#ifdef SIGINFO
+  init_sig (SIGINFO, "INFO", "Information request")
+#elif defined(SIGPWR)
+  init_sig (SIGPWR, "PWR", "Power failure")
+#endif