removed deprecated files. sendmail functionality exists in mts/smtp/
authorShantonu Sen <ssen@mit.edu>
Tue, 9 Jan 2001 06:45:26 +0000 (06:45 +0000)
committerShantonu Sen <ssen@mit.edu>
Tue, 9 Jan 2001 06:45:26 +0000 (06:45 +0000)
mts/mmdf/Makefile.in [deleted file]
mts/mmdf/hosts.c [deleted file]
mts/sendmail/Makefile.in [deleted file]
mts/sendmail/hosts.c [deleted file]
mts/sendmail/sendmail.c [deleted file]

diff --git a/mts/mmdf/Makefile.in b/mts/mmdf/Makefile.in
deleted file mode 100644 (file)
index eb720d8..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# Makefile for mts/mmdf subdirectory
-#
-# $Id$
-#
-
-SHELL = /bin/sh
-
-srcdir = @srcdir@
-VPATH  = @srcdir@
-
-prefix      = @prefix@
-exec_prefix = @exec_prefix@
-bindir      = @bindir@
-libdir      = @libdir@
-etcdir      = @sysconfdir@
-
-LINT       = @LINT@
-LINTFLAGS   = @LINTFLAGS@
-
-.SUFFIXES:
-
-# source files
-SRC = hosts.c
-
-# auxiliary files
-AUX = Makefile.in
-
-# all files in this directory included in the distribution
-DIST = $(SRC) $(AUX)
-
-# ========= DEPENDENCIES FOR BUILDING ==========
-
-all:
-
-install:
-
-uninstall:
-
-# ========== DEPENDENCIES FOR CLEANUP ==========
-
-mostlyclean:
-       rm -f *~
-
-clean: mostlyclean
-
-distclean: clean
-       rm -f Makefile
-
-realclean: distclean
-
-superclean: realclean
-
-# ========== DEPENDENCIES FOR LINT =================
-
-lint: 
-       $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS)
-
-# ========== DEPENDENCIES FOR MAINTENANCE ==========
-
-subdir = mts/mmdf
-
-Makefile: Makefile.in ../../config.status
-       cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-distdir = ../../`cat ../../distname`/$(subdir)
-nmhdist: $(DIST)
-       @echo "Copying distribution files in $(subdir)"
-       @for file in $(DIST); do \
-         cp -p $(srcdir)/$$file $(distdir); \
-       done
-
diff --git a/mts/mmdf/hosts.c b/mts/mmdf/hosts.c
deleted file mode 100644 (file)
index a6d3139..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-
-/*
- * hosts.c -- use MMDF to get hostname information
- *
- * $Id$
- */
-
-#include "../../h/strings.h"
-#include "util.h"
-#include "mmdf.h"
-#include "ch.h"
-
-#ifdef MMDFII
-# include "dm.h"
-#endif /* MMDFII */
-
-#include <mts/generic/mts.h>
-
-/* 
- * We really should be careful with the number of fd's that this routine
- * opens:  the ch_seq ch_table.c module likes to keep 6 (yes, SIX) fds around
- * to speed-up host lookups in the channel table.  Unfortunately, after all
- * of them get opened, six are always open (ch_table may close one to open
- * another).  The bottom line is that if repl calls post, then we get 12
- * (yes, TWELVE) fds open, with only six usable.
- *
- * send will close all fds >= 3 prior to invoking post.  It would be nice
- * if one could control ch_seq's use of fds for table lookups, but such is
- * life.
- *
- */
-
-#ifndef        MMDFII
-char *
-OfficialName (char *name)
-{
-    register Chan *ch;
-    static char buffer[BUFSIZ];
-
-    return ((ch = ch_h2chan (name, buffer)) == (Chan *) (-1) ? NULL
-           : ch == (Chan *) NULL ? LocalName ()
-           : buffer);
-}
-#else  /* MMDFII */
-
-extern char *invo_name;
-
-extern short ch_yloc;            /* ok to intercept local names */
-
-static int inited = 0;
-
-char *
-OfficialName (char *name)
-{
-    Dmn_route route;
-    static char buffer[BUFSIZ];
-
-    if (!inited) {
-       mmdf_init (invo_name);
-       inited = 1;
-    }
-    switch (dm_v2route (name, buffer, &route)) {
-       case NOTOK: 
-       case OK: 
-           return ((ch_yloc && lexequ (name, LocalName ())) ? LocalName ()
-                   : NULL);
-
-       default: 
-           return buffer;
-    }
-}
-#endif /* MMDFII */
diff --git a/mts/sendmail/Makefile.in b/mts/sendmail/Makefile.in
deleted file mode 100644 (file)
index b025b3b..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#
-# Makefile for mts/sendmail subdirectory
-#
-# $Id$
-#
-
-SHELL = /bin/sh
-
-top_srcdir = @top_srcdir@
-srcdir     = @srcdir@
-VPATH      = @srcdir@
-
-prefix      = @prefix@
-exec_prefix = @exec_prefix@
-bindir      = @bindir@
-libdir      = @libdir@
-etcdir      = @sysconfdir@
-
-CC       = @CC@
-CFLAGS   = @CFLAGS@
-DEFS     = @DEFS@
-INCLUDES = -I../.. -I$(srcdir) -I$(top_srcdir)
-
-LORDER  = @LORDER@
-TSORT   = @TSORT@
-RANLIB  = @RANLIB@
-LIBTOOL = @LIBTOOL@
-GNU_LIBTOOL = @GNU_LIBTOOL@
-LINT   = @LINT@
-LINTFLAGS = @LINTFLAGS@
-
-COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS)
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
-       $(COMPILE) $<
-
-# source
-SRCS = hosts.c sendmail.c
-
-# object files in libsend.a
-OBJS = hosts.o sendmail.o
-
-# auxiliary files
-AUX = Makefile.in
-
-# all files in this directory included in the distribution
-DIST = $(SRCS) $(AUX)
-
-# ========= DEPENDENCIES FOR BUILDING AND INSTALLING ==========
-
-all: libsend.a
-
-libsend.a: $(OBJS)
-       rm -f $@
-       if test x$(LIBTOOL) != x -a x$(GNU_LIBTOOL) = x ; then \
-         $(LIBTOOL) -static -c $(OBJS) -o $@  ; \
-       else \
-         ar cr $@ `$(LORDER) $(OBJS) | $(TSORT)`  ; \
-         $(RANLIB) $@  ; \
-       fi 
-
-install:
-
-uninstall:
-
-# ========== DEPENDENCIES FOR CLEANUP ==========
-
-mostlyclean:
-       rm -f *.o *~
-
-clean: mostlyclean
-       rm -f libsend.a
-
-distclean: clean
-       rm -f Makefile
-
-realclean: distclean
-
-superclean: realclean
-
-# ========== DEPENDENCIES FOR LINT =================
-
-lint: 
-       $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS)
-
-# ========== DEPENDENCIES FOR MAINTENANCE ==========
-
-subdir = mts/sendmail
-
-Makefile: Makefile.in ../../config.status
-       cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-distdir = ../../`cat ../../distname`/$(subdir)
-nmhdist: $(DIST)
-       @echo "Copying distribution files in $(subdir)"
-       @for file in $(DIST); do \
-         cp -p $(srcdir)/$$file $(distdir); \
-       done
-
diff --git a/mts/sendmail/hosts.c b/mts/sendmail/hosts.c
deleted file mode 100644 (file)
index 40697ce..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-
-/*
- * hosts.c -- find out the official name of a host
- *
- * $Id$
- */
-
-/*
- * 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/mh.h>
-#include <mts/generic/mts.h>
-#include <netdb.h>
-
-static struct host {
-    char *h_name;
-    char **h_aliases;
-    struct host *h_next;
-} hosts;
-
-
-/*
- * static prototypes
- */
-static int init_hs(void);
-
-
-char *
-OfficialName (char *name)
-{
-    char *p, *q, site[BUFSIZ];
-    struct hostent *hp;
-
-    static char buffer[BUFSIZ];
-    char **r;
-    struct host *h;
-
-    for (p = name, q = site; *p && (q - site < sizeof(site) - 1); p++, q++)
-       *q = isupper (*p) ? tolower (*p) : *p;
-    *q = '\0';
-    q = site;
-
-    if (!strcasecmp (LocalName(), site))
-       return LocalName();
-
-#ifdef HAVE_SETHOSTENT
-    sethostent (1);
-#endif
-
-    if ((hp = gethostbyname (q))) {
-       strncpy (buffer, hp->h_name, sizeof(buffer));
-       return buffer;
-    }
-    if (hosts.h_name || init_hs ()) {
-       for (h = hosts.h_next; h; h = h->h_next)
-           if (!strcasecmp (h->h_name, q)) {
-               return h->h_name;
-           } else {
-               for (r = h->h_aliases; *r; r++)
-                   if (!strcasecmp (*r, q))
-                       return h->h_name;
-           }
-    }
-
-    strncpy (buffer, site, sizeof(buffer));
-    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 (void)
-{
-    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 = strchr(buffer, '#')))
-           *cp = 0;
-       if ((cp = strchr(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 = strchr(dp = cp, ' '))) {
-           *cp = 0;
-           for (cp++; *cp; cp++) {
-               while (isspace (*cp))
-                   cp++;
-               if (*cp == 0)
-                   break;
-               if ((cp = strchr(*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 ((size_t) (q - aliases + 1), sizeof(*q));
-       for (q = aliases; *q; q++)
-           *r++ = getcpy (*q);
-       *r = 0;
-    }
-
-    fclose (fp);
-    return 1;
-}
diff --git a/mts/sendmail/sendmail.c b/mts/sendmail/sendmail.c
deleted file mode 100644 (file)
index 00fe825..0000000
+++ /dev/null
@@ -1,828 +0,0 @@
-
-/*
- * sendmail.c -- nmh sendmail interface
- *
- * $Id$
- */
-
-#include <h/mh.h>
-#include <mts/smtp/smtp.h>
-#include <mts/generic/mts.h>
-#include <signal.h>
-#include "h/signals.h"  /* for SIGNAL() */
-#ifdef MPOP
-#include <errno.h>
-#endif
-
-/*
- * This module implements an interface to SendMail very similar
- * to the MMDF mm_(3) routines.  The sm_() routines herein talk
- * SMTP to a sendmail process, mapping SMTP reply codes into
- * RP_-style codes.
- */
-
-/*
- * On older 4.2BSD machines without the POSIX function `sigaction',
- * the alarm handing stuff for time-outs will NOT work due to the way
- * syscalls get restarted.  This is not really crucial, since SendMail
- * is generally well-behaved in this area.
- */
-
-#ifdef SENDMAILBUG
-/*
- * It appears that some versions of Sendmail will return Code 451
- * when they don't really want to indicate a failure.
- * "Code 451 almost always means sendmail has deferred; we don't
- * really want bomb out at this point since sendmail will rectify
- * things later."  So, if you define SENDMAILBUG, Code 451 is
- * considered the same as Code 250.  Yuck!
- */
-#endif
-
-#define        TRUE    1
-#define        FALSE   0
-
-#define        NBITS ((sizeof (int)) * 8)
-
-/*
- * these codes must all be different!
- */
-#define        SM_OPEN  90      /* Changed from 30 in case of nameserver flakiness */
-#define        SM_HELO  20
-#define        SM_RSET  15
-#define        SM_MAIL  40
-#define        SM_RCPT 120
-#define        SM_DATA  20
-#define        SM_TEXT 150
-#define        SM_DOT  180
-#define        SM_QUIT  30
-#define        SM_CLOS  10
-
-static int sm_addrs = 0;
-static int sm_alarmed = 0;
-static int sm_child = NOTOK;
-static int sm_debug = 0;
-static int sm_nl = TRUE;
-static int sm_verbose = 0;
-
-static FILE *sm_rfp = NULL;
-static FILE *sm_wfp = NULL;
-
-#ifdef MPOP
-static int sm_ispool = 0;
-static char sm_tmpfil[BUFSIZ];
-#endif /* MPOP */
-
-static char *sm_noreply = "No reply text given";
-static char *sm_moreply = "; ";
-
-struct smtp sm_reply;          /* global... */
-
-static int doingEHLO;
-
-#define        MAXEHLO 20
-char *EHLOkeys[MAXEHLO + 1];
-
-/*
- * static prototypes
- */
-static int sm_ierror (char *fmt, ...);
-static int smtalk (int time, char *fmt, ...);
-static int sm_wrecord (char *, int);
-static int sm_wstream (char *, int);
-static int sm_werror (void);
-static int smhear (void);
-static int sm_rrecord (char *, int *);
-static int sm_rerror (void);
-static RETSIGTYPE alrmser (int);
-
-
-int
-sm_init (char *client, char *server, int watch, int verbose,
-         int debug, int onex, int queued, int sasl, char *saslmech, char *user)
-{
-    int i, result, vecp;
-    int pdi[2], pdo[2];
-    char *vec[15];
-
-    if (watch)
-       verbose = TRUE;
-
-    sm_verbose = verbose;
-    sm_debug = debug;
-    if (sm_rfp != NULL && sm_wfp != NULL)
-       return RP_OK;
-
-    if (client == NULL || *client == '\0') {
-       if (clientname)
-           client = clientname;
-       else
-           client = LocalName();       /* no clientname -> LocalName */
-    }
-
-#ifdef ZMAILER
-    if (client == NULL || *client == '\0')
-       client = "localhost";
-#endif
-
-    if (pipe (pdi) == NOTOK)
-       return sm_ierror ("no pipes");
-    if (pipe (pdo) == NOTOK) {
-       close (pdi[0]);
-       close (pdi[1]);
-       return sm_ierror ("no pipes");
-    }
-
-    for (i = 0; (sm_child = fork ()) == NOTOK && i < 5; i++)
-       sleep (5);
-
-    switch (sm_child) {
-       case NOTOK: 
-           close (pdo[0]);
-           close (pdo[1]);
-           close (pdi[0]);
-           close (pdi[1]);
-           return sm_ierror ("unable to fork");
-
-       case OK: 
-           if (pdo[0] != fileno (stdin))
-               dup2 (pdo[0], fileno (stdin));
-           if (pdi[1] != fileno (stdout))
-               dup2 (pdi[1], fileno (stdout));
-           if (pdi[1] != fileno (stderr))
-               dup2 (pdi[1], fileno (stderr));
-           for (i = fileno (stderr) + 1; i < NBITS; i++)
-               close (i);
-
-           vecp = 0;
-           vec[vecp++] = r1bindex (sendmail, '/');
-           vec[vecp++] = "-bs";
-#ifndef ZMAILER
-           vec[vecp++] = watch ? "-odi" : queued ? "-odq" : "-odb";
-           vec[vecp++] = "-oem";
-           vec[vecp++] = "-om";
-# ifndef RAND
-           if (verbose)
-               vec[vecp++] = "-ov";
-# endif /* not RAND */
-#endif /* not ZMAILER */
-           vec[vecp++] = NULL;
-
-           setgid (getegid ());
-           setuid (geteuid ());
-           execvp (sendmail, vec);
-           fprintf (stderr, "unable to exec ");
-           perror (sendmail);
-           _exit (-1);         /* NOTREACHED */
-
-       default: 
-           SIGNAL (SIGALRM, alrmser);
-           SIGNAL (SIGPIPE, SIG_IGN);
-
-           close (pdi[1]);
-           close (pdo[0]);
-           if ((sm_rfp = fdopen (pdi[0], "r")) == NULL
-                   || (sm_wfp = fdopen (pdo[1], "w")) == NULL) {
-               close (pdi[0]);
-               close (pdo[1]);
-               sm_rfp = sm_wfp = NULL;
-               return sm_ierror ("unable to fdopen");
-           }
-           sm_alarmed = 0;
-           alarm (SM_OPEN);
-           result = smhear ();
-           alarm (0);
-           switch (result) {
-               case 220: 
-                   break;
-
-               default: 
-                   sm_end (NOTOK);
-                   return RP_RPLY;
-           }
-
-           if (client && *client) {
-               doingEHLO = 1;
-               result = smtalk (SM_HELO, "EHLO %s", client);
-               doingEHLO = 0;
-
-               if (500 <= result && result <= 599)
-                   result = smtalk (SM_HELO, "HELO %s", client);
-
-               switch (result) {
-                   case 250:
-                       break;
-
-                   default:
-                       sm_end (NOTOK);
-                       return RP_RPLY;
-               }
-           }
-
-#ifndef ZMAILER
-           if (onex)
-               smtalk (SM_HELO, "ONEX");
-#endif
-           if (watch)
-               smtalk (SM_HELO, "VERB on");
-
-           return RP_OK;
-    }
-}
-
-
-int
-sm_winit (int mode, char *from)
-{
-#ifdef MPOP
-    if (sm_ispool && !sm_wfp) {
-       strlen (strcpy (sm_reply.text, "unable to create new spool file"));
-       sm_reply.code = NOTOK;
-       return RP_BHST;
-    }
-#endif /* MPOP */
-
-    switch (smtalk (SM_MAIL, "%s FROM:<%s>",
-               mode == S_SEND ? "SEND" : mode == S_SOML ? "SOML"
-               : mode == S_SAML ? "SAML" : "MAIL", from)) {
-       case 250: 
-           sm_addrs = 0;
-           return RP_OK;
-
-       case 500: 
-       case 501: 
-       case 552: 
-           return RP_PARM;
-
-       default: 
-           return RP_RPLY;
-    }
-}
-
-
-int
-sm_wadr (char *mbox, char *host, char *path)
-{
-    switch (smtalk (SM_RCPT, host && *host ? "RCPT TO:<%s%s@%s>"
-                                          : "RCPT TO:<%s%s>",
-                            path ? path : "", mbox, host)) {
-       case 250: 
-       case 251: 
-           sm_addrs++;
-           return RP_OK;
-
-       case 451: 
-#ifdef SENDMAILBUG
-           sm_addrs++;
-           return RP_OK;
-#endif /* SENDMAILBUG */
-       case 421: 
-       case 450: 
-       case 452: 
-           return RP_NO;
-
-       case 500: 
-       case 501: 
-           return RP_PARM;
-
-       case 550: 
-       case 551: 
-       case 552: 
-       case 553: 
-           return RP_USER;
-
-       default: 
-           return RP_RPLY;
-    }
-}
-
-
-int
-sm_waend (void)
-{
-    switch (smtalk (SM_DATA, "DATA")) {
-       case 354: 
-           sm_nl = TRUE;
-           return RP_OK;
-
-       case 451: 
-#ifdef SENDMAILBUG
-           sm_nl = TRUE;
-           return RP_OK;
-#endif /* SENDMAILBUG */
-       case 421: 
-           return RP_NO;
-
-       case 500: 
-       case 501: 
-       case 503: 
-       case 554: 
-           return RP_NDEL;
-
-       default: 
-           return RP_RPLY;
-    }
-}
-
-
-int
-sm_wtxt (char *buffer, int len)
-{
-    int result;
-
-    sm_alarmed = 0;
-    alarm (SM_TEXT);
-    result = sm_wstream (buffer, len);
-    alarm (0);
-
-    return (result == NOTOK ? RP_BHST : RP_OK);
-}
-
-
-int
-sm_wtend (void)
-{
-    if (sm_wstream ((char *) NULL, 0) == NOTOK)
-       return RP_BHST;
-
-    switch (smtalk (SM_DOT + 3 * sm_addrs, ".")) {
-       case 250: 
-       case 251: 
-           return RP_OK;
-
-       case 451: 
-#ifdef SENDMAILBUG
-           return RP_OK;
-#endif /* SENDMAILBUG */
-       case 452: 
-       default: 
-           return RP_NO;
-
-       case 552: 
-       case 554: 
-           return RP_NDEL;
-    }
-}
-
-
-int
-sm_end (int type)
-{
-    int status;
-    struct smtp sm_note;
-
-    switch (sm_child) {
-       case NOTOK: 
-       case OK: 
-           return RP_OK;
-
-       default: 
-           break;
-    }
-
-    if (sm_rfp == NULL && sm_wfp == NULL)
-       return RP_OK;
-
-    switch (type) {
-       case OK: 
-           smtalk (SM_QUIT, "QUIT");
-           break;
-
-       case NOTOK: 
-           sm_note.code = sm_reply.code;
-           strncpy (sm_note.text, sm_reply.text, sm_note.length = sm_reply.length);/* fall */
-       case DONE: 
-           if (smtalk (SM_RSET, "RSET") == 250 && type == DONE)
-               return RP_OK;
-           kill (sm_child, SIGKILL);
-           discard (sm_rfp);
-           discard (sm_wfp);
-           if (type == NOTOK) {
-               sm_reply.code = sm_note.code;
-               strncpy (sm_reply.text, sm_note.text, sm_reply.length = sm_note.length);
-           }
-           break;
-    }
-    if (sm_rfp != NULL) {
-       alarm (SM_CLOS);
-       fclose (sm_rfp);
-       alarm (0);
-    }
-    if (sm_wfp != NULL) {
-       alarm (SM_CLOS);
-       fclose (sm_wfp);
-       alarm (0);
-    }
-
-    status = pidwait (sm_child, OK);
-
-    sm_child = NOTOK;
-    sm_rfp = sm_wfp = NULL;
-
-    return (status ? RP_BHST : RP_OK);
-}
-
-
-static int
-sm_ierror (char *fmt, ...)
-{
-    va_list ap;
-
-    va_start(ap, fmt);
-    vsnprintf (sm_reply.text, sizeof(sm_reply.text), fmt, ap);
-    va_end(ap);
-
-    sm_reply.length = strlen (sm_reply.text);
-    sm_reply.code = NOTOK;
-
-    return RP_BHST;
-}
-
-
-static int
-smtalk (int time, char *fmt, ...)
-{
-    int result;
-    char buffer[BUFSIZ];
-    va_list ap;
-
-    va_start(ap, fmt);
-    vsnprintf (buffer, sizeof(buffer), fmt, ap);
-    va_end(ap);
-
-    if (sm_debug) {
-       printf ("=> %s\n", buffer);
-       fflush (stdout);
-    }
-
-#ifdef MPOP
-    if (sm_ispool) {
-       char file[BUFSIZ];
-
-       if (strcmp (buffer, ".") == 0)
-           time = SM_DOT;
-       fprintf (sm_wfp, "%s\r\n", buffer);
-       switch (time) {
-           case SM_DOT:
-               fflush (sm_wfp);
-               if (ferror (sm_wfp))
-                   return sm_werror ();
-               snprintf (file, sizeof(file), "%s%c.bulk", sm_tmpfil,
-                               (char) (sm_ispool + 'a' - 1));
-               if (rename (sm_tmpfil, file) == NOTOK) {
-                   int len;
-                   char *bp;
-
-                   snprintf (sm_reply.text, sizeof(sm_reply.text),
-                       "error renaming %s to %s: ", sm_tmpfil, file);
-                   bp = sm_reply.text;
-                   len = strlen (bp);
-                   bp += len;
-                   if ((s = strerror (errno)))
-                       strncpy (bp, s, sizeof(sm_reply.text) - len);
-                   else
-                       snprintf (bp, sizeof(sm_reply.text) - len,
-                               "unknown error %d", errno);
-                   sm_reply.length = strlen (sm_reply.text);
-                   sm_reply.code = NOTOK;
-                   return RP_BHST;
-               }
-               fclose (sm_wfp);
-               if (sm_wfp = fopen (sm_tmpfil, "w"))
-                   chmod (sm_tmpfil, 0600);
-               sm_ispool++;
-               /* and fall... */
-
-           case SM_MAIL:
-           case SM_RCPT:
-               result = 250;
-               break;
-
-           case SM_RSET:
-               fflush (sm_wfp);
-               ftruncate (fileno (sm_wfp), 0L);
-               fseek (sm_wfp, 0L, SEEK_SET);
-               result = 250;
-               break;
-
-           case SM_DATA:
-               result = 354;
-               break;
-
-           case SM_QUIT:
-               unlink (sm_tmpfil);
-               sm_ispool = 0;
-               result = 221;
-               break;
-
-           default:
-               result = 500;
-               break;
-       }
-       if (sm_debug) {
-           printf ("<= %d\n", result);
-           fflush (stdout);
-       }
-
-       sm_reply.text[sm_reply.length = 0] = NULL;
-       return (sm_reply.code = result);
-    }
-#endif /* MPOP */
-
-    sm_alarmed = 0;
-    alarm ((unsigned) time);
-    if ((result = sm_wrecord (buffer, strlen (buffer))) != NOTOK)
-       result = smhear ();
-    alarm (0);
-
-    return result;
-}
-
-
-static int
-sm_wrecord (char *buffer, int len)
-{
-    if (sm_wfp == NULL)
-       return sm_werror ();
-
-    fwrite (buffer, sizeof *buffer, len, sm_wfp);
-    fputs ("\r\n", sm_wfp);
-    fflush (sm_wfp);
-
-    return (ferror (sm_wfp) ? sm_werror () : OK);
-}
-
-
-static int
-sm_wstream (char *buffer, int len)
-{
-    char *bp;
-    static char lc = 0;
-
-    if (sm_wfp == NULL)
-       return sm_werror ();
-
-    if (buffer == NULL && len == 0) {
-       if (lc != '\n')
-           fputs ("\r\n", sm_wfp);
-       lc = 0;
-       return (ferror (sm_wfp) ? sm_werror () : OK);
-    }
-
-    for (bp = buffer; len > 0; bp++, len--) {
-       switch (*bp) {
-           case '\n': 
-               sm_nl = TRUE;
-               fputc ('\r', sm_wfp);
-               break;
-
-           case '.': 
-               if (sm_nl)
-                   fputc ('.', sm_wfp);/* FALL THROUGH */
-           default: 
-               sm_nl = FALSE;
-       }
-       fputc (*bp, sm_wfp);
-       if (ferror (sm_wfp))
-           return sm_werror ();
-    }
-
-    if (bp > buffer)
-       lc = *--bp;
-    return (ferror (sm_wfp) ? sm_werror () : OK);
-}
-
-
-#ifdef _AIX
-/*
- * AIX by default will inline the strlen and strcpy commands by redefining
- * them as __strlen and __strcpy respectively.  This causes compile problems
- * with the #ifdef MPOP in the middle.  Should the #ifdef MPOP be removed,
- * remove these #undefs.
- */
-# undef strlen
-# undef strcpy
-#endif /* _AIX */
-
-static int
-sm_werror (void)
-{
-    sm_reply.length =
-       strlen (strcpy (sm_reply.text, sm_wfp == NULL ? "no pipe opened"
-           : sm_alarmed ? "write to pipe timed out"
-           : "error writing to pipe"));
-
-    return (sm_reply.code = NOTOK);
-}
-
-
-static int
-smhear (void)
-{
-    int i, code, cont, bc, rc, more;
-    char *bp, *rp;
-    char **ehlo, buffer[BUFSIZ];
-
-    if (doingEHLO) {
-       static int at_least_once = 0;
-
-       if (at_least_once) {
-           for (ehlo = EHLOkeys; *ehlo; ehlo++)
-               free (*ehlo);
-       } else {
-           at_least_once = 1;
-       }
-
-       *(ehlo = EHLOkeys) = NULL;
-    }
-
-again:
-
-    sm_reply.text[sm_reply.length = 0] = 0;
-
-    rp = sm_reply.text;
-    rc = sizeof(sm_reply.text) - 1;
-
-    for (more = FALSE; sm_rrecord (bp = buffer, &bc) != NOTOK;) {
-       if (sm_debug) {
-           printf ("<= %s\n", buffer);
-           fflush (stdout);
-       }
-
-       if (doingEHLO
-               && strncmp (buffer, "250", sizeof("250") - 1) == 0
-               && (buffer[3] == '-' || doingEHLO == 2)
-               && buffer[4]) {
-           if (doingEHLO == 2) {
-               if ((*ehlo = malloc ((size_t) (strlen (buffer + 4) + 1)))) {
-                   strcpy (*ehlo++, buffer + 4);
-                   *ehlo = NULL;
-                   if (ehlo >= EHLOkeys + MAXEHLO)
-                       doingEHLO = 0;
-               }
-               else
-                   doingEHLO = 0;
-           }
-           else
-               doingEHLO = 2;
-       }
-
-       for (; bc > 0 && (!isascii (*bp) || !isdigit (*bp)); bp++, bc--)
-           continue;
-
-       cont = FALSE;
-       code = atoi (bp);
-       bp += 3, bc -= 3;
-       for (; bc > 0 && isspace (*bp); bp++, bc--)
-           continue;
-       if (bc > 0 && *bp == '-') {
-           cont = TRUE;
-           bp++, bc--;
-           for (; bc > 0 && isspace (*bp); bp++, bc--)
-               continue;
-       }
-
-       if (more) {
-           if (code != sm_reply.code || cont)
-               continue;
-           more = FALSE;
-       } else {
-           sm_reply.code = code;
-           more = cont;
-           if (bc <= 0) {
-               strncpy (buffer, sm_noreply, sizeof(buffer));
-               bp = buffer;
-               bc = strlen (sm_noreply);
-           }
-       }
-       if ((i = min (bc, rc)) > 0) {
-           strncpy (rp, bp, i);
-           rp += i;
-           rc -= i;
-           if (more && rc > strlen (sm_moreply) + 1) {
-               strncpy (sm_reply.text + rc, sm_moreply, sizeof(sm_reply.text) - rc);
-               rc += strlen (sm_moreply);
-           }
-       }
-       if (more)
-           continue;
-       if (sm_reply.code < 100) {
-           if (sm_verbose) {
-               printf ("%s\n", sm_reply.text);
-               fflush (stdout);
-           }
-           goto again;
-       }
-
-       sm_reply.length = rp - sm_reply.text;
-
-       return sm_reply.code;
-    }
-
-    return NOTOK;
-}
-
-
-static int
-sm_rrecord (char *buffer, int *len)
-{
-    if (sm_rfp == NULL)
-       return sm_rerror ();
-
-    buffer[*len = 0] = 0;
-
-    fgets (buffer, BUFSIZ, sm_rfp);
-    *len = strlen (buffer);
-    if (ferror (sm_rfp) || feof (sm_rfp))
-       return sm_rerror ();
-    if (buffer[*len - 1] != '\n')
-       while (getc (sm_rfp) != '\n' && !ferror (sm_rfp) && !feof (sm_rfp))
-           continue;
-    else
-       if (buffer[*len - 2] == '\r')
-           *len -= 1;
-    buffer[*len - 1] = 0;
-
-    return OK;
-}
-
-
-static int
-sm_rerror (void)
-{
-    sm_reply.length =
-       strlen (strcpy (sm_reply.text, sm_rfp == NULL ? "no pipe opened"
-           : sm_alarmed ? "read from pipe timed out"
-           : feof (sm_rfp) ? "premature end-of-file on pipe"
-           : "error reading from pipe"));
-
-    return (sm_reply.code = NOTOK);
-}
-
-
-static RETSIGTYPE
-alrmser (int i)
-{
-#ifndef        RELIABLE_SIGNALS
-    SIGNAL (SIGALRM, alrmser);
-#endif
-
-    sm_alarmed++;
-    if (sm_debug) {
-       printf ("timed out...\n");
-       fflush (stdout);
-    }
-}
-
-
-char *
-rp_string (int code)
-{
-    char  *text;
-    static char buffer[BUFSIZ];
-
-    switch (sm_reply.code != NOTOK ? code : NOTOK) {
-       case RP_AOK:
-           text = "AOK";
-           break;
-
-       case RP_MOK:
-           text = "MOK";
-           break;
-
-       case RP_OK: 
-           text = "OK";
-           break;
-
-       case RP_RPLY: 
-           text = "RPLY";
-           break;
-
-       case RP_BHST: 
-       default: 
-           text = "BHST";
-           snprintf (buffer, sizeof(buffer), "[%s] %s", text, sm_reply.text);
-           return buffer;
-
-       case RP_PARM: 
-           text = "PARM";
-           break;
-
-       case RP_NO: 
-           text = "NO";
-           break;
-
-       case RP_USER: 
-           text = "USER";
-           break;
-
-       case RP_NDEL: 
-           text = "NDEL";
-           break;
-    }
-
-    snprintf (buffer, sizeof(buffer), "[%s] %3d %s",
-               text, sm_reply.code, sm_reply.text);
-    return buffer;
-}
-