Adds sunrpc (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 4 Jun 2015 04:46:31 +0000 (00:46 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 4 Jun 2015 14:45:20 +0000 (10:45 -0400)
Some applications (e.g. lmbench) seem to want sunrpc.  It wasn't too hard to
add it back in.  Most of sunrpc should work (we'll see!) but the authentication
stuff relies on NSS.  I've stubbed out a couple of those functions.

Note that netname.c needed to be changed in the sunrpc directory, and a sysdep
was insufficient.  Check out my notes in Documentation/glibc.txt for more info.

Also, we needed to --enable-obsolete-rpc to get any rpc/ headers, other than
netdb.h.  That's a recent change (2012).

Rebuild glibc.

Documentation/glibc.txt
tools/compilers/gcc-glibc/Makefile
tools/compilers/gcc-glibc/glibc-2.19-akaros/sunrpc/netname.c [new file with mode: 0644]
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/Subdirs
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/publickey.c [new file with mode: 0644]

index 963cb34..c4ffee1 100644 (file)
@@ -83,6 +83,15 @@ Putting it in the -ros/sys/ folder did it (though ultimately I didn't want the
 change).  The point is, sysdeps doesn't mirror and override the main tree for
 all files - it is behind some others in the search/include path.
 
+Another situation requiring a change outside of the sysdeps directory was
+sunrpc/netname.c.  I wanted to change the functions (stub out the ones that
+used NSS).  Adding the sysdep worked, but it turns out that *both* the sysdep
+netname.c and the original sunrpc/netname.c were being compiled.  The root
+cause seems to be compat-netname.os.  There are make rules in sunrpc to
+generate some compatibility routines.  Grep for rpc-compat-routines.os.  The
+rule seems to ignore sysdeps and just use the normal C file - in this case
+netname.c.
+
 Subdirs
 --------------------------
 As a note, these 'subdirectories' are the "primary folders" (i.e. addons),
index 6e1c5b4..0cb8930 100644 (file)
@@ -460,6 +460,9 @@ $(BINARY_PREFIX)glibc-stage1-builddir: glibc-$(GLIBC_VERSION)
                --with-elf \
                --enable-hacker-mode \
                --enable-static-nss \
+               --enable-obsolete-rpc \
+               --disable-build-nscd \
+               --disable-nscd \
                $(GLIBC_CONFIGURE_FLAGS);
        touch $@
 
@@ -509,6 +512,9 @@ $(BINARY_PREFIX)glibc-stage2-builddir: glibc-$(GLIBC_VERSION)
                --with-elf \
                --enable-hacker-mode \
                --enable-static-nss \
+               --enable-obsolete-rpc \
+               --disable-build-nscd \
+               --disable-nscd \
                $(GLIBC_CONFIGURE_FLAGS);
        touch $@
 
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sunrpc/netname.c b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sunrpc/netname.c
new file mode 100644 (file)
index 0000000..594a9c6
--- /dev/null
@@ -0,0 +1,179 @@
+/* Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* AKAROS_PORT: removed references to nss; stubbed the funcs that used it. */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <rpc/rpc.h>
+
+#define        OPSYS_LEN 4
+#define        MAXIPRINT (11)          /* max length of printed integer */
+static const char OPSYS[] = "unix";
+
+int
+user2netname (char netname[MAXNETNAMELEN + 1], const uid_t uid,
+             const char *domain)
+{
+  char dfltdom[MAXNETNAMELEN + 1];
+  size_t i;
+
+  if (domain == NULL)
+    {
+      if (getdomainname (dfltdom, sizeof (dfltdom)) < 0)
+       return 0;
+    }
+  else
+    {
+      strncpy (dfltdom, domain, MAXNETNAMELEN);
+      dfltdom[MAXNETNAMELEN] = '\0';
+    }
+
+  if ((strlen (dfltdom) + OPSYS_LEN + 3 + MAXIPRINT) > (size_t) MAXNETNAMELEN)
+    return 0;
+
+  sprintf (netname, "%s.%d@%s", OPSYS, uid, dfltdom);
+  i = strlen (netname);
+  if (netname[i - 1] == '.')
+    netname[i - 1] = '\0';
+  return 1;
+}
+libc_hidden_nolink_sunrpc (user2netname, GLIBC_2_1)
+
+int
+host2netname (char netname[MAXNETNAMELEN + 1], const char *host,
+             const char *domain)
+{
+  char *p;
+  char hostname[MAXHOSTNAMELEN + 1];
+  char domainname[MAXHOSTNAMELEN + 1];
+  char *dot_in_host;
+  size_t i;
+
+  netname[0] = '\0';           /* make null first (no need for memset) */
+
+  if (host == NULL)
+    __gethostname (hostname, MAXHOSTNAMELEN);
+  else
+    {
+      strncpy (hostname, host, MAXHOSTNAMELEN);
+      hostname[MAXHOSTNAMELEN] = '\0';
+    }
+
+  dot_in_host = strchr (hostname, '.');
+  if (domain == NULL)
+    {
+      p = dot_in_host;
+      if (p)
+       {
+         ++p;
+         strncpy (domainname, p, MAXHOSTNAMELEN);
+         domainname[MAXHOSTNAMELEN] = '\0';
+       }
+      else
+       {
+         domainname[0] = 0;
+         getdomainname (domainname, MAXHOSTNAMELEN);
+       }
+    }
+  else
+    {
+      strncpy (domainname, domain, MAXHOSTNAMELEN);
+      domainname[MAXHOSTNAMELEN] = '\0';
+    }
+
+  i = strlen (domainname);
+  if (i == 0)
+    /* No domainname */
+    return 0;
+  if (domainname[i - 1] == '.')
+    domainname[i - 1] = 0;
+
+  if (dot_in_host)             /* strip off rest of name */
+    *dot_in_host = '\0';
+
+  if ((strlen (domainname) + strlen (hostname) + OPSYS_LEN + 3)
+      > MAXNETNAMELEN)
+    return 0;
+
+  sprintf (netname, "%s.%s@%s", OPSYS, hostname, domainname);
+  return 1;
+}
+#ifdef EXPORT_RPC_SYMBOLS
+libc_hidden_def (host2netname)
+#else
+libc_hidden_nolink_sunrpc (host2netname, GLIBC_2_1)
+#endif
+
+int
+getnetname (char name[MAXNETNAMELEN + 1])
+{
+  uid_t uid;
+  int dummy;
+
+  uid = __geteuid ();
+  if (uid == 0)
+    dummy = host2netname (name, NULL, NULL);
+  else
+    dummy = user2netname (name, uid, NULL);
+  return (dummy);
+}
+libc_hidden_nolink_sunrpc (getnetname, GLIBC_2_1)
+
+/* Type of the lookup function for netname2user.  */
+typedef int (*netname2user_function) (const char netname[MAXNETNAMELEN + 1],
+                                     uid_t *, gid_t *, int *, gid_t *);
+int
+netname2user (const char netname[MAXNETNAMELEN + 1], uid_t * uidp, gid_t * gidp,
+             int *gidlenp, gid_t * gidlist)
+{
+  return FALSE;
+}
+#ifdef EXPORT_RPC_SYMBOLS
+libc_hidden_def (netname2user)
+#else
+libc_hidden_nolink_sunrpc (netname2user, GLIBC_2_1)
+#endif
+stub_warning(netname2user)
+
+int
+netname2host (const char netname[MAXNETNAMELEN + 1], char *hostname,
+             const int hostlen)
+{
+  char *p1, *p2;
+
+  p1 = strchr (netname, '.');
+  if (p1 == NULL)
+    return 0;
+  p1++;
+
+  p2 = strchr (p1, '@');
+  if (p2 == NULL)
+    return 0;
+  *p2 = '\0';
+
+  if (hostlen > MAXNETNAMELEN)
+    return 0;
+
+  strncpy (hostname, p1, hostlen);
+  hostname[hostlen] = '\0';
+
+  return 1;
+}
+libc_hidden_nolink_sunrpc (netname2host, GLIBC_2_1)
diff --git a/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/publickey.c b/tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/publickey.c
new file mode 100644 (file)
index 0000000..150c3ac
--- /dev/null
@@ -0,0 +1,49 @@
+/* Get public or secret key from key server.
+   Copyright (C) 1996-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* AKAROS_PORT: removed references to nss; just stubbed the funcs */
+
+#include <errno.h>
+#include <rpc/netdb.h>
+#include <rpc/auth_des.h>
+
+
+/* Type of the lookup function for the public key.  */
+typedef int (*public_function) (const char *, char *, int *);
+
+/* Type of the lookup function for the secret key.  */
+typedef int (*secret_function) (const char *, char *, const char *, int *);
+
+
+int
+getpublickey (const char *name, char *key)
+{
+  return FALSE;
+}
+libc_hidden_nolink_sunrpc (getpublickey, GLIBC_2_0)
+stub_warning(getpublickey)
+
+
+int
+getsecretkey (const char *name, char *key, const char *passwd)
+{
+  return FALSE;
+}
+libc_hidden_nolink_sunrpc (getsecretkey, GLIBC_2_0)
+stub_warning(getsecretkey)