]> code.delx.au - gnu-emacs/blobdiff - lib-src/movemail.c
Doc fix.
[gnu-emacs] / lib-src / movemail.c
index 32e4039d519a0af8851a4d58e92c19131e42a588..6a1585fae4a8df94514d9f36489d11e2276b47d3 100644 (file)
@@ -1,22 +1,34 @@
 /* movemail foo bar -- move file foo to file bar,
    locking file foo the way /bin/mail respects.
-   Copyright (C) 1986 Free Software Foundation, Inc.
+   Copyright (C) 1986, 1992 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
+GNU Emacs is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 1, or (at your option)
+any later version.
+
 GNU Emacs is distributed in the hope that it will be useful,
-but without any warranty.  No author or distributor
-accepts responsibility to anyone for the consequences of using it
-or for whether it serves any particular purpose or works at all,
-unless he says so in writing.
-
-Everyone is granted permission to copy, modify and redistribute
-GNU Emacs, but only under the conditions described in the
-document "GNU Emacs copying permission notice".   An exact copy
-of the document is supposed to have been given to you along with
-GNU Emacs so that you can know how you may redistribute it all.
-It should be in a file named COPYING.  Among other things, the
-copyright notice and this notice must be preserved on all copies.  */
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Emacs; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Important notice: defining MAIL_USE_FLOCK *will cause loss of mail*
+   if you do it on a system that does not normally use flock as its way of
+   interlocking access to inbox files.  The setting of MAIL_USE_FLOCK
+   *must agree* with the system's own conventions.
+   It is not a choice that is up to you.
+
+   So, if your system uses lock files rather than flock, then the only way
+   you can get proper operation is to enable movemail to write lockfiles there.
+   This means you must either give that directory access modes
+   that permit everyone to write lockfiles in it, or you must make movemail
+   a setuid or setgid program.  */
 
 /*
  * Modified January, 1986 by Michael R. Gretzinger (Project Athena)
@@ -29,7 +41,7 @@ copyright notice and this notice must be preserved on all copies.  */
  * 
  * New module: popmail.c
  * Modified routines:
- *     main - added code within #ifdef MAIL_USE_POP; added setuid(getuid())
+ *     main - added code within #ifdef MAIL_USE_POP; added setuid (getuid ())
  *             after POP code. 
  * New routines in movemail.c:
  *     get_errmsg - return pointer to system error message
@@ -46,20 +58,35 @@ copyright notice and this notice must be preserved on all copies.  */
 #ifdef USG
 #include <fcntl.h>
 #include <unistd.h>
+#ifndef F_OK
+#define F_OK 0
+#define X_OK 1
+#define W_OK 2
+#define R_OK 4
+#endif
 #endif /* USG */
 
 #ifdef XENIX
 #include <sys/locking.h>
 #endif
 
+#ifdef MAIL_USE_MMDF
+extern int lk_open (), lk_close ();
+#endif
+
 /* Cancel substitutions made by config.h for Emacs.  */
 #undef open
 #undef read
 #undef write
 #undef close
 
+char *malloc ();
+char *strcpy ();
 char *concat ();
+char *xmalloc ();
+#ifndef errno
 extern int errno;
+#endif
 
 /* Nonzero means this is name of a lock file to delete on fatal error.  */
 char *delete_lockname;
@@ -70,7 +97,6 @@ main (argc, argv)
 {
   char *inname, *outname;
   int indesc, outdesc;
-  char buf[1024];
   int nread;
 
 #ifndef MAIL_USE_FLOCK
@@ -78,7 +104,7 @@ main (argc, argv)
   long now;
   int tem;
   char *lockname, *p;
-  char tempname[40];
+  char *tempname;
   int desc;
 #endif /* not MAIL_USE_FLOCK */
 
@@ -90,9 +116,11 @@ main (argc, argv)
   inname = argv[1];
   outname = argv[2];
 
-  /* Check access to input and output file.  */
-  if (access (inname, R_OK | W_OK) != 0)
-    pfatal_with_name (inname);
+#ifdef MAIL_USE_MMDF
+  mmdf_init (argv[0]);
+#endif
+
+  /* Check access to output file.  */
   if (access (outname, F_OK) == 0 && access (outname, W_OK) != 0)
     pfatal_with_name (outname);
 
@@ -121,21 +149,47 @@ main (argc, argv)
       exit (status);
     }
 
-  setuid (getuid());
+  setuid (getuid ());
 #endif /* MAIL_USE_POP */
 
+  /* Check access to input file.  */
+  if (access (inname, R_OK | W_OK) != 0)
+    pfatal_with_name (inname);
+
+#ifndef MAIL_USE_MMDF
 #ifndef MAIL_USE_FLOCK
   /* Use a lock file named /usr/spool/mail/$USER.lock:
      If it exists, the mail file is locked.  */
+  /* Note: this locking mechanism is *required* by the mailer
+     (on systems which use it) to prevent loss of mail.
+
+     On systems that use a lock file, extracting the mail without locking
+     WILL occasionally cause loss of mail due to timing errors!
+
+     So, if creation of the lock file fails
+     due to access permission on /usr/spool/mail,
+     you simply MUST change the permission
+     and/or make movemail a setgid program
+     so it can create lock files properly.
+
+     You might also wish to verify that your system is one
+     which uses lock files for this purpose.  Some systems use other methods.
+
+     If your system uses the `flock' system call for mail locking,
+     define MAIL_USE_FLOCK in config.h or the s-*.h file
+     and recompile movemail.  If the s- file for your system
+     should define MAIL_USE_FLOCK but does not, send a bug report
+     to bug-gnu-emacs@prep.ai.mit.edu so we can fix it.  */
+
   lockname = concat (inname, ".lock", "");
-  strcpy (tempname, inname);
+  tempname = strcpy (xmalloc (strlen (inname)+1), inname);
   p = tempname + strlen (tempname);
   while (p != tempname && p[-1] != '/')
     p--;
   *p = 0;
   strcpy (p, "EXXXXXX");
   mktemp (tempname);
-  (void) unlink (tempname);
+  unlink (tempname);
 
   while (1)
     {
@@ -143,11 +197,11 @@ main (argc, argv)
       /* Give up if cannot do that.  */
       desc = open (tempname, O_WRONLY | O_CREAT, 0666);
       if (desc < 0)
-        pfatal_with_name (concat ("temporary file \"", tempname, "\""));
+        pfatal_with_name ("lock file--see source file etc/movemail.c");
       close (desc);
 
       tem = link (tempname, lockname);
-      (void) unlink (tempname);
+      unlink (tempname);
       if (tem >= 0)
        break;
       sleep (1);
@@ -157,7 +211,7 @@ main (argc, argv)
        {
          now = time (0);
          if (st.st_ctime < now - 60)
-           (void) unlink (lockname);
+           unlink (lockname);
        }
     }
 
@@ -169,10 +223,14 @@ main (argc, argv)
 #else /* if not MAIL_USE_FLOCK */
   indesc = open (inname, O_RDONLY);
 #endif /* not MAIL_USE_FLOCK */
+#else /* MAIL_USE_MMDF */
+  indesc = lk_open (inname, O_RDONLY, 0, 0, 10);
+#endif /* MAIL_USE_MMDF */
+
   if (indesc < 0)
     pfatal_with_name (inname);
 
-#if defined(BSD) || defined(XENIX)
+#if defined (BSD) || defined (XENIX)
   /* In case movemail is setuid to root, make sure the user can
      read the output file.  */
   /* This is desirable for all systems
@@ -190,49 +248,59 @@ main (argc, argv)
 #endif
 #endif /* MAIL_USE_FLOCK */
 
-  while (1)
-    {
-      nread = read (indesc, buf, sizeof buf);
-      if (nread != write (outdesc, buf, nread))
-       {
-         int saved_errno = errno;
-         (void) unlink (outname);
-         errno = saved_errno;
-         pfatal_with_name (outname);
-       }
-      if (nread < sizeof buf)
-       break;
-    }
+  {
+    char buf[1024];
+
+    while (1)
+      {
+       nread = read (indesc, buf, sizeof buf);
+       if (nread != write (outdesc, buf, nread))
+         {
+           int saved_errno = errno;
+           unlink (outname);
+           errno = saved_errno;
+           pfatal_with_name (outname);
+         }
+       if (nread < sizeof buf)
+         break;
+      }
+  }
 
 #ifdef BSD
-  fsync (outdesc);
+  if (fsync (outdesc) < 0)
+    pfatal_and_delete (outname);
 #endif
 
   /* Check to make sure no errors before we zap the inbox.  */
   if (close (outdesc) != 0)
-    {
-      int saved_errno = errno;
-      (void) unlink (outname);
-      errno = saved_errno;
-      pfatal_with_name (outname);
-  }
+    pfatal_and_delete (outname);
 
 #ifdef MAIL_USE_FLOCK
-#if defined(STRIDE) || defined(XENIX)
+#if defined (STRIDE) || defined (XENIX)
   /* Stride, xenix have file locking, but no ftruncate.  This mess will do. */
-  (void) close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666));
+  close (open (inname, O_CREAT | O_TRUNC | O_RDWR, 0666));
 #else
-  (void) ftruncate (indesc, 0L);
+  ftruncate (indesc, 0L);
 #endif /* STRIDE or XENIX */
 #endif /* MAIL_USE_FLOCK */
+
+#ifdef MAIL_USE_MMDF
+  lk_close (indesc, 0, 0, 0);
+#else
   close (indesc);
+#endif
 
 #ifndef MAIL_USE_FLOCK
   /* Delete the input file; if we can't, at least get rid of its contents.  */
-  if (unlink (inname) < 0)
-    if (errno != ENOENT)
-      creat (inname, 0666);
-  (void) unlink (lockname);
+#ifdef MAIL_UNLINK_SPOOL
+  /* This is generally bad to do, because it destroys the permissions
+     that were set on the file.  Better to just empty the file.  */
+  if (unlink (inname) < 0 && errno != ENOENT)
+#endif /* MAIL_UNLINK_SPOOL */
+    creat (inname, 0600);
+#ifndef MAIL_USE_MMDF
+  unlink (lockname);
+#endif /* not MAIL_USE_MMDF */
 #endif /* not MAIL_USE_FLOCK */
   exit (0);
 }
@@ -250,11 +318,11 @@ fatal (s1, s2)
 
 /* Print error message.  `s1' is printf control string, `s2' is arg for it. */
 
-error (s1, s2)
-     char *s1, *s2;
+error (s1, s2, s3)
+     char *s1, *s2, *s3;
 {
   printf ("movemail: ");
-  printf (s1, s2);
+  printf (s1, s2, s3);
   printf ("\n");
 }
 
@@ -272,6 +340,22 @@ pfatal_with_name (name)
   fatal (s, name);
 }
 
+pfatal_and_delete (name)
+     char *name;
+{
+  extern int errno, sys_nerr;
+  extern char *sys_errlist[];
+  char *s;
+
+  if (errno < sys_nerr)
+    s = concat ("", sys_errlist[errno], " for %s");
+  else
+    s = "cannot open %s";
+
+  unlink (name);
+  fatal (s, name);
+}
+
 /* Return a newly-allocated string whose contents concatenate those of s1, s2, s3.  */
 
 char *
@@ -291,11 +375,11 @@ concat (s1, s2, s3)
 
 /* Like malloc but get fatal error if memory is exhausted.  */
 
-int
+char *
 xmalloc (size)
-     int size;
+     unsigned size;
 {
-  int result = malloc (size);
+  char *result = malloc (size);
   if (!result)
     fatal ("virtual memory exhausted", 0);
   return result;
@@ -309,6 +393,7 @@ xmalloc (size)
 #include <netinet/in.h>
 #include <netdb.h>
 #include <stdio.h>
+#include <pwd.h>
 
 #ifdef USG
 #include <fcntl.h>
@@ -330,313 +415,348 @@ char Errmsg[80];
 
 static int debug = 0;
 
-popmail(user, outfile)
-char *user;
-char *outfile;
+char *get_errmsg ();
+char *getenv ();
+int mbx_write ();
+
+popmail (user, outfile)
+     char *user;
+     char *outfile;
 {
-    char *host;
-    int nmsgs, nbytes;
-    char response[128];
-    register int i;
-    int mbfi;
-    FILE *mbf;
-    char *getenv();
-    int mbx_write();
-    char *get_errmsg();
-
-    host = getenv("MAILHOST");
-    if (host == NULL) {
-       fatal("no MAILHOST defined");
+  char *host;
+  int nmsgs, nbytes;
+  char response[128];
+  register int i;
+  int mbfi;
+  FILE *mbf;
+  struct passwd *pw = (struct passwd *) getpwuid (getuid ());
+  if (pw == NULL)
+    fatal ("cannot determine user name");
+
+  host = getenv ("MAILHOST");
+  if (host == NULL)
+    {
+      fatal ("no MAILHOST defined");
     }
 
-    if (pop_init(host) == NOTOK) {
-       error(Errmsg);
-       return(1);
+  if (pop_init (host) == NOTOK)
+    {
+      fatal (Errmsg);
     }
 
-    if (getline(response, sizeof response, sfi) != OK) {
-       error(response);
-       return(1);
+  if (getline (response, sizeof response, sfi) != OK)
+    {
+      fatal (response);
     }
 
-    if (pop_command("USER %s", user) == NOTOK || 
-       pop_command("RPOP %s", user) == NOTOK) {
-       error(Errmsg);
-       pop_command("QUIT");
-       return(1);
+  if (pop_command ("USER %s", user) == NOTOK
+      || pop_command ("RPOP %s", pw->pw_name) == NOTOK)
+    {
+      pop_command ("QUIT");
+      fatal (Errmsg);
     }
 
-    if (pop_stat(&nmsgs, &nbytes) == NOTOK) {
-       error(Errmsg);
-       pop_command("QUIT");
-       return(1);
+  if (pop_stat (&nmsgs, &nbytes) == NOTOK)
+    {
+      pop_command ("QUIT");
+      fatal (Errmsg);
     }
 
-    if (!nmsgs)
-      {
-       pop_command("QUIT");
-       return(0);
-      }
+  if (!nmsgs)
+    {
+      pop_command ("QUIT");
+      return 0;
+    }
 
-    mbfi = open (outfile, O_WRONLY | O_CREAT | O_EXCL, 0666);
-    if (mbfi < 0)
-      {
-       pop_command("QUIT");
-       error("Error in open: %s, %s", get_errmsg(), outfile);
-       return(1);
-      }
-    fchown(mbfi, getuid(), -1);
+  mbfi = open (outfile, O_WRONLY | O_CREAT | O_EXCL, 0666);
+  if (mbfi < 0)
+    {
+      pop_command ("QUIT");
+      pfatal_and_delete (outfile);
+    }
+  fchown (mbfi, getuid (), -1);
 
-    if ((mbf = fdopen(mbfi, "w")) == NULL)
-      {
-       pop_command("QUIT");
-       error("Error in fdopen: %s", get_errmsg());
-       close(mbfi);
-       unlink(outfile);
-       return(1);
-      }
+  if ((mbf = fdopen (mbfi, "w")) == NULL)
+    {
+      pop_command ("QUIT");
+      pfatal_and_delete (outfile);
+    }
 
-    for (i = 1; i <= nmsgs; i++) {
-       mbx_delimit_begin(mbf);
-       if (pop_retr(i, mbx_write, mbf) != OK) {
-           error(Errmsg);
-           pop_command("QUIT");
-           close(mbfi);
-           return(1);
+  for (i = 1; i <= nmsgs; i++)
+    {
+      mbx_delimit_begin (mbf);
+      if (pop_retr (i, mbx_write, mbf) != OK)
+       {
+         pop_command ("QUIT");
+         close (mbfi);
+         unlink (outfile);
+         fatal (Errmsg);
        }
-       mbx_delimit_end(mbf);
-       fflush(mbf);
+      mbx_delimit_end (mbf);
+      fflush (mbf);
     }
 
-    for (i = 1; i <= nmsgs; i++) {
-       if (pop_command("DELE %d", i) == NOTOK) {
-           error(Errmsg);
-           pop_command("QUIT");
-           close(mbfi);
-           return(1);
+  if (fsync (mbfi) < 0)
+    {
+      pop_command ("QUIT");
+      pfatal_and_delete (outfile);
+    }
+
+  if (close (mbfi) == -1)
+    {
+      pop_command ("QUIT");
+      pfatal_and_delete (outfile);
+    }
+
+  for (i = 1; i <= nmsgs; i++)
+    {
+      if (pop_command ("DELE %d", i) == NOTOK)
+       {
+         /* Better to ignore this failure.  */
        }
     }
 
-    pop_command("QUIT");
-    close(mbfi);
-    return(0);
+  pop_command ("QUIT");
+  return (0);
 }
 
-pop_init(host)
-char *host;
+pop_init (host)
+     char *host;
 {
-    register struct hostent *hp;
-    register struct servent *sp;
-    int lport = IPPORT_RESERVED - 1;
-    struct sockaddr_in sin;
-    register int s;
-    char *get_errmsg();
-
-    hp = gethostbyname(host);
-    if (hp == NULL) {
-       sprintf(Errmsg, "MAILHOST unknown: %s", host);
-       return(NOTOK);
+  register struct hostent *hp;
+  register struct servent *sp;
+  int lport = IPPORT_RESERVED - 1;
+  struct sockaddr_in sin;
+  register int s;
+
+  hp = gethostbyname (host);
+  if (hp == NULL)
+    {
+      sprintf (Errmsg, "MAILHOST unknown: %s", host);
+      return NOTOK;
     }
 
-    sp = getservbyname("pop", "tcp");
-    if (sp == 0) {
-       strcpy(Errmsg, "tcp/pop: unknown service");
-       return(NOTOK);
+  sp = getservbyname ("pop", "tcp");
+  if (sp == 0)
+    {
+      strcpy (Errmsg, "tcp/pop: unknown service");
+      return NOTOK;
     }
 
-    sin.sin_family = hp->h_addrtype;
-    bcopy(hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
-    sin.sin_port = sp->s_port;
-    s = rresvport(&lport);
-    if (s < 0) {
-       sprintf(Errmsg, "error creating socket: %s", get_errmsg());
-       return(NOTOK);
+  sin.sin_family = hp->h_addrtype;
+  bcopy (hp->h_addr, (char *)&sin.sin_addr, hp->h_length);
+  sin.sin_port = sp->s_port;
+  s = rresvport (&lport);
+  if (s < 0)
+    {
+      sprintf (Errmsg, "error creating socket: %s", get_errmsg ());
+      return NOTOK;
     }
 
-    if (connect(s, (char *)&sin, sizeof sin) < 0) {
-       sprintf(Errmsg, "error during connect: %s", get_errmsg());
-       close(s);
-       return(NOTOK);
+  if (connect (s, (char *)&sin, sizeof sin) < 0)
+    {
+      sprintf (Errmsg, "error during connect: %s", get_errmsg ());
+      close (s);
+      return NOTOK;
     }
 
-    sfi = fdopen(s, "r");
-    sfo = fdopen(s, "w");
-    if (sfi == NULL || sfo == NULL) {
-       sprintf(Errmsg, "error in fdopen: %s", get_errmsg());
-       close(s);
-       return(NOTOK);
+  sfi = fdopen (s, "r");
+  sfo = fdopen (s, "w");
+  if (sfi == NULL || sfo == NULL)
+    {
+      sprintf (Errmsg, "error in fdopen: %s", get_errmsg ());
+      close (s);
+      return NOTOK;
     }
 
-    return(OK);
+  return OK;
 }
 
-pop_command(fmt, a, b, c, d)
-char *fmt;
+pop_command (fmt, a, b, c, d)
+     char *fmt;
 {
-    char buf[128];
-    char errmsg[64];
+  char buf[128];
+  char errmsg[64];
 
-    sprintf(buf, fmt, a, b, c, d);
+  sprintf (buf, fmt, a, b, c, d);
 
-    if (debug) fprintf(stderr, "---> %s\n", buf);
-    if (putline(buf, Errmsg, sfo) == NOTOK) return(NOTOK);
+  if (debug) fprintf (stderr, "---> %s\n", buf);
+  if (putline (buf, Errmsg, sfo) == NOTOK) return NOTOK;
 
-    if (getline(buf, sizeof buf, sfi) != OK) {
-       strcpy(Errmsg, buf);
-       return(NOTOK);
+  if (getline (buf, sizeof buf, sfi) != OK)
+    {
+      strcpy (Errmsg, buf);
+      return NOTOK;
     }
 
-    if (debug) fprintf(stderr, "<--- %s\n", buf);
-    if (*buf != '+') {
-       strcpy(Errmsg, buf);
-       return(NOTOK);
-    } else {
-       return(OK);
+  if (debug)
+    fprintf (stderr, "<--- %s\n", buf);
+  if (*buf != '+')
+    {
+      strcpy (Errmsg, buf);
+      return NOTOK;
+    }
+  else
+    {
+      return OK;
     }
 }
 
     
-pop_stat(nmsgs, nbytes)
-int *nmsgs, *nbytes;
+pop_stat (nmsgs, nbytes)
+     int *nmsgs, *nbytes;
 {
-    char buf[128];
+  char buf[128];
 
-    if (debug) fprintf(stderr, "---> STAT\n");
-    if (putline("STAT", Errmsg, sfo) == NOTOK) return(NOTOK);
+  if (debug)
+    fprintf (stderr, "---> STAT\n");
+  if (putline ("STAT", Errmsg, sfo) == NOTOK)
+    return NOTOK;
 
-    if (getline(buf, sizeof buf, sfi) != OK) {
-       strcpy(Errmsg, buf);
-       return(NOTOK);
+  if (getline (buf, sizeof buf, sfi) != OK)
+    {
+      strcpy (Errmsg, buf);
+      return NOTOK;
     }
 
-    if (debug) fprintf(stderr, "<--- %s\n", buf);
-    if (*buf != '+') {
-       strcpy(Errmsg, buf);
-       return(NOTOK);
-    } else {
-       sscanf(buf, "+OK %d %d", nmsgs, nbytes);
-       return(OK);
+  if (debug) fprintf (stderr, "<--- %s\n", buf);
+  if (*buf != '+')
+    {
+      strcpy (Errmsg, buf);
+      return NOTOK;
+    }
+  else
+    {
+      sscanf (buf, "+OK %d %d", nmsgs, nbytes);
+      return OK;
     }
 }
 
-pop_retr(msgno, action, arg)
-int (*action)();
+pop_retr (msgno, action, arg)
+     int (*action)();
 {
-    char buf[128];
+  char buf[128];
 
-    sprintf(buf, "RETR %d", msgno);
-    if (debug) fprintf(stderr, "%s\n", buf);
-    if (putline(buf, Errmsg, sfo) == NOTOK) return(NOTOK);
+  sprintf (buf, "RETR %d", msgno);
+  if (debug) fprintf (stderr, "%s\n", buf);
+  if (putline (buf, Errmsg, sfo) == NOTOK) return NOTOK;
 
-    if (getline(buf, sizeof buf, sfi) != OK) {
-       strcpy(Errmsg, buf);
-       return(NOTOK);
+  if (getline (buf, sizeof buf, sfi) != OK)
+    {
+      strcpy (Errmsg, buf);
+      return NOTOK;
     }
 
-    while (1) {
-       switch (multiline(buf, sizeof buf, sfi)) {
+  while (1)
+    {
+      switch (multiline (buf, sizeof buf, sfi))
+       {
        case OK:
-           (*action)(buf, arg);
-           break;
+         (*action)(buf, arg);
+         break;
        case DONE:
-           return (OK);
+         return OK;
        case NOTOK:
-           strcpy(Errmsg, buf);
-           return (NOTOK);
+         strcpy (Errmsg, buf);
+         return NOTOK;
        }
     }
 }
 
-getline(buf, n, f)
-char *buf;
-register int n;
-FILE *f;
+getline (buf, n, f)
+     char *buf;
+     register int n;
+     FILE *f;
 {
-    register char *p;
-    int c;
+  register char *p;
+  int c;
 
-    p = buf;
-    while (--n > 0 && (c = fgetc(f)) != EOF)
-      if ((*p++ = c) == '\n') break;
+  p = buf;
+  while (--n > 0 && (c = fgetc (f)) != EOF)
+    if ((*p++ = c) == '\n') break;
 
-    if (ferror(f)) {
-       strcpy(buf, "error on connection");
-       return (NOTOK);
+  if (ferror (f))
+    {
+      strcpy (buf, "error on connection");
+      return NOTOK;
     }
 
-    if (c == EOF && p == buf) {
-       strcpy(buf, "connection closed by foreign host");
-       return (DONE);
+  if (c == EOF && p == buf)
+    {
+      strcpy (buf, "connection closed by foreign host");
+      return DONE;
     }
 
-    *p = NULL;
-    if (*--p == '\n') *p = NULL;
-    if (*--p == '\r') *p = NULL;
-    return(OK);
+  *p = NULL;
+  if (*--p == '\n') *p = NULL;
+  if (*--p == '\r') *p = NULL;
+  return OK;
 }
 
-multiline(buf, n, f)
-char *buf;
-register int n;
-FILE *f;
+multiline (buf, n, f)
+     char *buf;
+     register int n;
+     FILE *f;
 {
-    if (getline(buf, n, f) != OK) return (NOTOK);
-    if (*buf == '.') {
-       if (*(buf+1) == NULL) {
-           return (DONE);
-       } else {
-           strcpy(buf, buf+1);
-       }
+  if (getline (buf, n, f) != OK)
+    return NOTOK;
+  if (*buf == '.')
+    {
+      if (*(buf+1) == NULL)
+       return DONE;
+      else
+       strcpy (buf, buf+1);
     }
-    return(OK);
+  return OK;
 }
 
 char *
-get_errmsg()
+get_errmsg ()
 {
-    extern int errno, sys_nerr;
-    extern char *sys_errlist[];
-    char *s;
-
-    if (errno < sys_nerr)
-      s = sys_errlist[errno];
-    else
-      s = "unknown error";
-    return(s);
+  extern int errno, sys_nerr;
+  extern char *sys_errlist[];
+  char *s;
+
+  if (errno < sys_nerr)
+    s = sys_errlist[errno];
+  else
+    s = "unknown error";
+  return (s);
 }
 
-putline(buf, err, f)
-char *buf;
-char *err;
-FILE *f;
+putline (buf, err, f)
+     char *buf;
+     char *err;
+     FILE *f;
 {
-    fprintf(f, "%s\r\n", buf);
-    fflush(f);
-    if (ferror(f)) {
-       strcpy(err, "lost connection");
-       return(NOTOK);
+  fprintf (f, "%s\r\n", buf);
+  fflush (f);
+  if (ferror (f))
+    {
+      strcpy (err, "lost connection");
+      return NOTOK;
     }
-    return(OK);
+  return OK;
 }
 
-mbx_write(line, mbf)
-char *line;
-FILE *mbf;
+mbx_write (line, mbf)
+     char *line;
+     FILE *mbf;
 {
-    fputs(line, mbf);
-    fputc(0x0a, mbf);
+  fputs (line, mbf);
+  fputc (0x0a, mbf);
 }
 
-mbx_delimit_begin(mbf)
-FILE *mbf;
+mbx_delimit_begin (mbf)
+     FILE *mbf;
 {
-    fputs("\f\n0,unseen,,\n", mbf);
+  fputs ("\f\n0, unseen,,\n", mbf);
 }
 
-mbx_delimit_end(mbf)
-FILE *mbf;
+mbx_delimit_end (mbf)
+     FILE *mbf;
 {
-    putc('\037', mbf);
+  putc ('\037', mbf);
 }
 
 #endif /* MAIL_USE_POP */