Initial revision
authorroland <roland>
Sat, 20 Apr 1991 20:50:08 +0000 (20:50 +0000)
committerroland <roland>
Sat, 20 Apr 1991 20:50:08 +0000 (20:50 +0000)
inet/inet_addr.c [new file with mode: 0644]
inet/inet_lnaof.c [new file with mode: 0644]
inet/inet_netof.c [new file with mode: 0644]
inet/rcmd.c [new file with mode: 0644]
resolv/herror.c [new file with mode: 0644]

diff --git a/inet/inet_addr.c b/inet/inet_addr.c
new file mode 100644 (file)
index 0000000..fc7ac1b
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 1983, 1990 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)inet_addr.c        5.10 (Berkeley) 2/24/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <ctype.h>
+
+/*
+ * Ascii internet address interpretation routine.
+ * The value returned is in network order.
+ */
+u_long
+inet_addr(cp)
+       register const char *cp;
+{
+       struct in_addr val;
+
+       if (inet_aton(cp, &val))
+               return (val.s_addr);
+       return (INADDR_NONE);
+}
+
+/* 
+ * Check whether "cp" is a valid ascii representation
+ * of an Internet address and convert to a binary address.
+ * Returns 1 if the address is valid, 0 if not.
+ * This replaces inet_addr, the return value from which
+ * cannot distinguish between failure and a local broadcast address.
+ */
+
+inet_aton(cp, addr)
+       register char *cp;
+       struct in_addr *addr;
+{
+       register u_long val, base, n;
+       register char c;
+       u_long parts[4], *pp = parts;
+
+       for (;;) {
+               /*
+                * Collect number up to ``.''.
+                * Values are specified as for C:
+                * 0x=hex, 0=octal, other=decimal.
+                */
+               val = 0; base = 10;
+               if (*cp == '0') {
+                       if (*++cp == 'x' || *cp == 'X')
+                               base = 16, cp++;
+                       else
+                               base = 8;
+               }
+               while ((c = *cp) != '\0') {
+                       if (isascii(c) && isdigit(c)) {
+                               val = (val * base) + (c - '0');
+                               cp++;
+                               continue;
+                       }
+                       if (base == 16 && isascii(c) && isxdigit(c)) {
+                               val = (val << 4) + 
+                                       (c + 10 - (islower(c) ? 'a' : 'A'));
+                               cp++;
+                               continue;
+                       }
+                       break;
+               }
+               if (*cp == '.') {
+                       /*
+                        * Internet format:
+                        *      a.b.c.d
+                        *      a.b.c   (with c treated as 16-bits)
+                        *      a.b     (with b treated as 24 bits)
+                        */
+                       if (pp >= parts + 3 || val > 0xff)
+                               return (0);
+                       *pp++ = val, cp++;
+               } else
+                       break;
+       }
+       /*
+        * Check for trailing characters.
+        */
+       if (*cp && (!isascii(*cp) || !isspace(*cp)))
+               return (0);
+       /*
+        * Concoct the address according to
+        * the number of parts specified.
+        */
+       n = pp - parts + 1;
+       switch (n) {
+
+       case 1:                         /* a -- 32 bits */
+               break;
+
+       case 2:                         /* a.b -- 8.24 bits */
+               if (val > 0xffffff)
+                       return (0);
+               val |= parts[0] << 24;
+               break;
+
+       case 3:                         /* a.b.c -- 8.8.16 bits */
+               if (val > 0xffff)
+                       return (0);
+               val |= (parts[0] << 24) | (parts[1] << 16);
+               break;
+
+       case 4:                         /* a.b.c.d -- 8.8.8.8 bits */
+               if (val > 0xff)
+                       return (0);
+               val |= (parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8);
+               break;
+       }
+       if (addr)
+               addr->s_addr = htonl(val);
+       return (1);
+}
diff --git a/inet/inet_lnaof.c b/inet/inet_lnaof.c
new file mode 100644 (file)
index 0000000..55fa489
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1983 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)inet_lnaof.c       5.7 (Berkeley) 2/24/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Return the local network address portion of an
+ * internet address; handles class a/b/c network
+ * number formats.
+ */
+u_long
+inet_lnaof(in)
+       struct in_addr in;
+{
+       register u_long i = ntohl(in.s_addr);
+
+       if (IN_CLASSA(i))
+               return ((i)&IN_CLASSA_HOST);
+       else if (IN_CLASSB(i))
+               return ((i)&IN_CLASSB_HOST);
+       else
+               return ((i)&IN_CLASSC_HOST);
+}
diff --git a/inet/inet_netof.c b/inet/inet_netof.c
new file mode 100644 (file)
index 0000000..86c64b9
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1983 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)inet_netof.c       5.7 (Berkeley) 2/24/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+/*
+ * Return the network number from an internet
+ * address; handles class a/b/c network #'s.
+ */
+u_long
+inet_netof(in)
+       struct in_addr in;
+{
+       register u_long i = ntohl(in.s_addr);
+
+       if (IN_CLASSA(i))
+               return (((i)&IN_CLASSA_NET) >> IN_CLASSA_NSHIFT);
+       else if (IN_CLASSB(i))
+               return (((i)&IN_CLASSB_NET) >> IN_CLASSB_NSHIFT);
+       else
+               return (((i)&IN_CLASSC_NET) >> IN_CLASSC_NSHIFT);
+}
diff --git a/inet/rcmd.c b/inet/rcmd.c
new file mode 100644 (file)
index 0000000..d0cd180
--- /dev/null
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 1983 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)rcmd.c     5.24 (Berkeley) 2/24/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/param.h>
+#include <sys/socket.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <pwd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <string.h>
+
+rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
+       char **ahost;
+       u_short rport;
+       const char *locuser, *remuser, *cmd;
+       int *fd2p;
+{
+       int s, timo = 1, pid;
+       long oldmask;
+       struct sockaddr_in sin, sin2, from;
+       char c;
+       int lport = IPPORT_RESERVED - 1;
+       struct hostent *hp;
+       fd_set reads;
+
+       pid = getpid();
+       hp = gethostbyname(*ahost);
+       if (hp == 0) {
+               herror(*ahost);
+               return (-1);
+       }
+       *ahost = hp->h_name;
+       oldmask = sigblock(sigmask(SIGURG));
+       for (;;) {
+               s = rresvport(&lport);
+               if (s < 0) {
+                       if (errno == EAGAIN)
+                               fprintf(stderr, "socket: All ports in use\n");
+                       else
+                               perror("rcmd: socket");
+                       sigsetmask(oldmask);
+                       return (-1);
+               }
+               fcntl(s, F_SETOWN, pid);
+               sin.sin_family = hp->h_addrtype;
+               bcopy(hp->h_addr_list[0], (caddr_t)&sin.sin_addr, hp->h_length);
+               sin.sin_port = rport;
+               if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) >= 0)
+                       break;
+               (void) close(s);
+               if (errno == EADDRINUSE) {
+                       lport--;
+                       continue;
+               }
+               if (errno == ECONNREFUSED && timo <= 16) {
+                       sleep(timo);
+                       timo *= 2;
+                       continue;
+               }
+               if (hp->h_addr_list[1] != NULL) {
+                       int oerrno = errno;
+
+                       fprintf(stderr,
+                           "connect to address %s: ", inet_ntoa(sin.sin_addr));
+                       errno = oerrno;
+                       perror(0);
+                       hp->h_addr_list++;
+                       bcopy(hp->h_addr_list[0], (caddr_t)&sin.sin_addr,
+                           hp->h_length);
+                       fprintf(stderr, "Trying %s...\n",
+                               inet_ntoa(sin.sin_addr));
+                       continue;
+               }
+               perror(hp->h_name);
+               sigsetmask(oldmask);
+               return (-1);
+       }
+       lport--;
+       if (fd2p == 0) {
+               write(s, "", 1);
+               lport = 0;
+       } else {
+               char num[8];
+               int s2 = rresvport(&lport), s3;
+               int len = sizeof (from);
+
+               if (s2 < 0)
+                       goto bad;
+               listen(s2, 1);
+               (void) sprintf(num, "%d", lport);
+               if (write(s, num, strlen(num)+1) != strlen(num)+1) {
+                       perror("write: setting up stderr");
+                       (void) close(s2);
+                       goto bad;
+               }
+               FD_ZERO(&reads);
+               FD_SET(s, &reads);
+               FD_SET(s2, &reads);
+               errno = 0;
+               if (select(32, &reads, 0, 0, 0) < 1 ||
+                   !FD_ISSET(s2, &reads)) {
+                       if (errno != 0)
+                               perror("select: setting up stderr");
+                       else
+                           fprintf(stderr,
+                               "select: protocol failure in circuit setup.\n");
+                       (void) close(s2);
+                       goto bad;
+               }
+               s3 = accept(s2, (struct sockaddr *)&from, &len);
+               (void) close(s2);
+               if (s3 < 0) {
+                       perror("accept");
+                       lport = 0;
+                       goto bad;
+               }
+               *fd2p = s3;
+               from.sin_port = ntohs((u_short)from.sin_port);
+               if (from.sin_family != AF_INET ||
+                   from.sin_port >= IPPORT_RESERVED ||
+                   from.sin_port < IPPORT_RESERVED / 2) {
+                       fprintf(stderr,
+                           "socket: protocol failure in circuit setup.\n");
+                       goto bad2;
+               }
+       }
+       (void) write(s, locuser, strlen(locuser)+1);
+       (void) write(s, remuser, strlen(remuser)+1);
+       (void) write(s, cmd, strlen(cmd)+1);
+       if (read(s, &c, 1) != 1) {
+               perror(*ahost);
+               goto bad2;
+       }
+       if (c != 0) {
+               while (read(s, &c, 1) == 1) {
+                       (void) write(2, &c, 1);
+                       if (c == '\n')
+                               break;
+               }
+               goto bad2;
+       }
+       sigsetmask(oldmask);
+       return (s);
+bad2:
+       if (lport)
+               (void) close(*fd2p);
+bad:
+       (void) close(s);
+       sigsetmask(oldmask);
+       return (-1);
+}
+
+rresvport(alport)
+       int *alport;
+{
+       struct sockaddr_in sin;
+       int s;
+
+       sin.sin_family = AF_INET;
+       sin.sin_addr.s_addr = INADDR_ANY;
+       s = socket(AF_INET, SOCK_STREAM, 0);
+       if (s < 0)
+               return (-1);
+       for (;;) {
+               sin.sin_port = htons((u_short)*alport);
+               if (bind(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0)
+                       return (s);
+               if (errno != EADDRINUSE) {
+                       (void) close(s);
+                       return (-1);
+               }
+               (*alport)--;
+               if (*alport == IPPORT_RESERVED/2) {
+                       (void) close(s);
+                       errno = EAGAIN;         /* close */
+                       return (-1);
+               }
+       }
+}
+
+int    _check_rhosts_file = 1;
+
+ruserok(rhost, superuser, ruser, luser)
+       const char *rhost, *ruser, *luser;
+       int superuser;
+{
+       FILE *hostf;
+       char fhost[MAXHOSTNAMELEN];
+       int first = 1;
+       register char *sp, *p;
+       int baselen = -1;
+
+       sp = (char *)rhost;
+       p = fhost;
+       while (*sp) {
+               if (*sp == '.') {
+                       if (baselen == -1)
+                               baselen = sp - rhost;
+                       *p++ = *sp++;
+               } else {
+                       *p++ = isupper(*sp) ? tolower(*sp++) : *sp++;
+               }
+       }
+       *p = '\0';
+       hostf = superuser ? (FILE *)0 : fopen(_PATH_HEQUIV, "r");
+again:
+       if (hostf) {
+               if (!_validuser(hostf, fhost, luser, ruser, baselen)) {
+                       (void) fclose(hostf);
+                       return(0);
+               }
+               (void) fclose(hostf);
+       }
+       if (first == 1 && (_check_rhosts_file || superuser)) {
+               struct stat sbuf;
+               struct passwd *pwd;
+               char pbuf[MAXPATHLEN];
+
+               first = 0;
+               if ((pwd = getpwnam(luser)) == NULL)
+                       return(-1);
+               (void)strcpy(pbuf, pwd->pw_dir);
+               (void)strcat(pbuf, "/.rhosts");
+               if ((hostf = fopen(pbuf, "r")) == NULL)
+                       return(-1);
+               /*
+                * if owned by someone other than user or root or if
+                * writeable by anyone but the owner, quit
+                */
+               if (fstat(fileno(hostf), &sbuf) ||
+                   sbuf.st_uid && sbuf.st_uid != pwd->pw_uid ||
+                   sbuf.st_mode&022) {
+                       fclose(hostf);
+                       return(-1);
+               }
+               goto again;
+       }
+       return (-1);
+}
+
+/* don't make static, used by lpd(8) */
+_validuser(hostf, rhost, luser, ruser, baselen)
+       char *rhost, *luser, *ruser;
+       FILE *hostf;
+       int baselen;
+{
+       register char *p;
+       char *user, ahost[MAXHOSTNAMELEN];
+       static int _checkhost();
+
+       while (fgets(ahost, sizeof (ahost), hostf)) {
+               p = ahost;
+               while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0') {
+                       *p = isupper(*p) ? tolower(*p) : *p;
+                       p++;
+               }
+               if (*p == ' ' || *p == '\t') {
+                       *p++ = '\0';
+                       while (*p == ' ' || *p == '\t')
+                               p++;
+                       user = p;
+                       while (*p != '\n' && *p != ' ' && *p != '\t' && *p != '\0')
+                               p++;
+               } else
+                       user = p;
+               *p = '\0';
+               if (_checkhost(rhost, ahost, baselen) &&
+                   !strcmp(ruser, *user ? user : luser)) {
+                       return (0);
+               }
+       }
+       return (-1);
+}
+
+static
+_checkhost(rhost, lhost, len)
+       char *rhost, *lhost;
+       int len;
+{
+       static char ldomain[MAXHOSTNAMELEN + 1];
+       static char *domainp = NULL;
+       static int nodomain = 0;
+       register char *cp;
+
+       if (len == -1)
+               return(!strcmp(rhost, lhost));
+       if (strncmp(rhost, lhost, len))
+               return(0);
+       if (!strcmp(rhost, lhost))
+               return(1);
+       if (*(lhost + len) != '\0')
+               return(0);
+       if (nodomain)
+               return(0);
+       if (!domainp) {
+               if (gethostname(ldomain, sizeof(ldomain)) == -1) {
+                       nodomain = 1;
+                       return(0);
+               }
+               ldomain[MAXHOSTNAMELEN] = NULL;
+               if ((domainp = index(ldomain, '.')) == (char *)NULL) {
+                       nodomain = 1;
+                       return(0);
+               }
+               for (cp = ++domainp; *cp; ++cp)
+                       if (isupper(*cp))
+                               *cp = tolower(*cp);
+       }
+       return(!strcmp(domainp, rhost + len +1));
+}
diff --git a/resolv/herror.c b/resolv/herror.c
new file mode 100644 (file)
index 0000000..f896925
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1987 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.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)herror.c   6.6 (Berkeley) 2/24/91";
+#endif /* LIBC_SCCS and not lint */
+
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <netdb.h>
+#include <unistd.h>
+#include <string.h>
+
+char   *h_errlist[] = {
+       "Error 0",
+       "Unknown host",                         /* 1 HOST_NOT_FOUND */
+       "Host name lookup failure",             /* 2 TRY_AGAIN */
+       "Unknown server error",                 /* 3 NO_RECOVERY */
+       "No address associated with name",      /* 4 NO_ADDRESS */
+};
+int    h_nerr = { sizeof(h_errlist)/sizeof(h_errlist[0]) };
+
+extern int     h_errno;
+
+/*
+ * herror --
+ *     print the error indicated by the h_errno value.
+ */
+void
+herror(s)
+       const char *s;
+{
+       struct iovec iov[4];
+       register struct iovec *v = iov;
+
+       if (s && *s) {
+               v->iov_base = (char *)s;
+               v->iov_len = strlen(s);
+               v++;
+               v->iov_base = ": ";
+               v->iov_len = 2;
+               v++;
+       }
+       v->iov_base = (u_int)h_errno < h_nerr ?
+           h_errlist[h_errno] : "Unknown error";
+       v->iov_len = strlen(v->iov_base);
+       v++;
+       v->iov_base = "\n";
+       v->iov_len = 1;
+       writev(STDERR_FILENO, iov, (v - iov) + 1);
+}