diff mts/sendmail/hosts.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children 441a2190cfae
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mts/sendmail/hosts.c	Mon Apr 18 23:46:02 2005 +0900
@@ -0,0 +1,158 @@
+/* hosts.c - find out the official name of a host */
+#ifndef	lint
+static char ident[] = "@(#)$Id$";
+#endif	/* lint */
+
+/* LINTLIBRARY */
+
+/* In the SendMail world, we really don't know what the valid hosts are.
+   We could poke around in the sendmail.cf file, but that still isn't a
+   guarantee.  As a result, we'll say that everything is a valid host, and
+   let SendMail worry about it. */
+
+
+#include "../h/strings.h"
+#include <stdio.h>
+#include "../zotnet/mts.h"
+#include <ctype.h>
+#if	defined(BSD42) || defined(SOCKETS)
+#include <netdb.h>
+#endif	/* BSD42 or SOCKETS */
+
+
+#define	NOTOK	(-1)
+
+
+static struct host {
+    char   *h_name;
+    char  **h_aliases;
+    struct host   *h_next;
+}                   hosts;
+
+char   *getcpy ();
+
+static int	init_hs();
+
+/*  */
+
+struct hostent *mh_gethostbyname();
+
+char   *OfficialName (name)
+register char   *name;
+{
+    register char  *p;
+    char   *q,
+            site[BUFSIZ];
+#if	defined(BSD42) || defined(SOCKETS)
+    register struct hostent *hp;
+#endif	/* BSD42 or SOCKETS */
+    static char buffer[BUFSIZ];
+    register char **r;
+    register struct host   *h;
+
+    for (p = name, q = site; *p; p++, q++)
+	*q = isupper (*p) ? tolower (*p) : *p;
+    *q = 0;
+    q = site;
+
+    if (uleq (LocalName (), site))
+	return LocalName ();
+
+#ifdef	BSD41A
+    if (rhost (&q) != NOTOK) {
+	(void) strcpy (buffer, q);
+	free (q);
+	return buffer;
+    }
+#endif	/* BSD41A */
+#if	defined(BSD42) || defined(SOCKETS)
+#ifndef	BIND
+    sethostent (1);
+#endif
+    if (hp = mh_gethostbyname (q)) {
+	(void) strcpy (buffer, hp -> h_name);
+	return buffer;
+    }
+#endif	/* BSD42 or SOCKETS */
+
+    if (hosts.h_name || init_hs ())
+	for (h = hosts.h_next; h; h = h -> h_next)
+	    if (uleq (h -> h_name, q))
+		return h -> h_name;
+	    else
+		for (r = h -> h_aliases; *r; r++)
+		    if (uleq (*r, q))
+			return h -> h_name;
+
+    (void) strcpy (buffer, site);
+    return buffer;
+}
+
+/*  */
+
+/* Use hostable as an exception file for those hosts that aren't on the
+   Internet (listed in /etc/hosts).  These are usually PhoneNet and UUCP
+   sites. */
+
+
+#define	NALIASES	50
+
+static int  init_hs () {
+    register char  *cp,
+                   *dp,
+                  **q,
+                  **r;
+    char    buffer[BUFSIZ],
+           *aliases[NALIASES];
+    register struct host   *h;
+    register FILE  *fp;
+
+    if ((fp = fopen (hostable, "r")) == NULL)
+	return 0;
+
+    h = &hosts;
+    while (fgets (buffer, sizeof buffer, fp) != NULL) {
+	if (cp = index (buffer, '#'))
+	    *cp = 0;
+	if (cp = index (buffer, '\n'))
+	    *cp = 0;
+	for (cp = buffer; *cp; cp++)
+	    if (isspace (*cp))
+		*cp = ' ';
+	for (cp = buffer; isspace (*cp); cp++)
+	    continue;
+	if (*cp == 0)
+	    continue;
+
+	q = aliases;
+	if (cp = index (dp = cp, ' ')) {
+	    *cp = 0;
+	    for (cp++; *cp; cp++) {
+		while (isspace (*cp))
+		    cp++;
+		if (*cp == 0)
+		    break;
+		if (cp = index (*q++ = cp, ' '))
+		    *cp = 0;
+		else
+		    break;
+		if (q >= aliases + NALIASES)
+		    break;
+	    }
+	}
+
+	*q = 0;
+
+	h -> h_next = (struct host *) calloc (1, sizeof *h);
+	h = h -> h_next;
+	h -> h_name = getcpy (dp);
+	r = h -> h_aliases =
+		(char **) calloc ((unsigned) (q - aliases + 1), sizeof *q);
+	for (q = aliases; *q; q++)
+	    *r++ = getcpy (*q);
+	*r = 0;
+    }
+
+    (void) fclose (fp);
+    return 1;
+}