Use ``mail.local -H'' to do dot locking so we can have mode 755 mail
authormillert <millert@openbsd.org>
Sat, 29 Mar 1997 03:01:43 +0000 (03:01 +0000)
committermillert <millert@openbsd.org>
Sat, 29 Mar 1997 03:01:43 +0000 (03:01 +0000)
spool, change an occurrence of tempnam() to mkstemp(), change some
longs and shorts to ints.  Mail is now usable again.

usr.bin/mail/Makefile
usr.bin/mail/cmd1.c
usr.bin/mail/cmd3.c
usr.bin/mail/def.h
usr.bin/mail/extern.h
usr.bin/mail/fio.c
usr.bin/mail/pathnames.h
usr.bin/mail/popen.c
usr.bin/mail/quit.c
usr.bin/mail/temp.c

index 765ebad..b8c0bd5 100644 (file)
@@ -1,8 +1,8 @@
-#      $OpenBSD: Makefile,v 1.4 1996/12/08 14:32:29 downsj Exp $
+#      $OpenBSD: Makefile,v 1.5 1997/03/29 03:01:43 millert Exp $
 #      $NetBSD: Makefile,v 1.8 1996/06/08 19:48:09 christos Exp $
 
 PROG=  mail
-SRCS=  version.c aux.c cmd1.c cmd2.c cmd3.c cmdtab.c collect.c dotlock.c \
+SRCS=  version.c aux.c cmd1.c cmd2.c cmd3.c cmdtab.c collect.c \
        edit.c fio.c getname.c head.c v7.local.c lex.c list.c main.c names.c \
        popen.c quit.c send.c strings.c temp.c tty.c vars.c
 SFILES=        mail.help mail.tildehelp
index 3ec58dd..03821c6 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cmd1.c,v 1.3 1996/06/11 12:53:32 deraadt Exp $        */
+/*     $OpenBSD: cmd1.c,v 1.4 1997/03/29 03:01:44 millert Exp $        */
 /*     $NetBSD: cmd1.c,v 1.5 1996/06/08 19:48:11 christos Exp $        */
 
 /*-
@@ -38,7 +38,7 @@
 #if 0
 static char sccsid[] = "@(#)cmd1.c     8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: cmd1.c,v 1.3 1996/06/11 12:53:32 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: cmd1.c,v 1.4 1997/03/29 03:01:44 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -204,7 +204,7 @@ printhead(mesg)
        if (mp->m_flag & MBOX)
                dispc = 'M';
        parse(headline, &hl, pbuf);
-       sprintf(wcount, "%3d/%-5ld", mp->m_lines, mp->m_size);
+       sprintf(wcount, "%3d/%-5d", mp->m_lines, mp->m_size);
        subjlen = screenwidth - 50 - strlen(wcount);
        name = value("show-rcpt") != NOSTR ?
                skin(hfield("to", mp)) : nameof(mp, 0);
index ce3ec6b..2b2a4dc 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cmd3.c,v 1.2 1996/06/11 12:53:34 deraadt Exp $        */
+/*     $OpenBSD: cmd3.c,v 1.3 1997/03/29 03:01:44 millert Exp $        */
 /*     $NetBSD: cmd3.c,v 1.5 1996/06/08 19:48:14 christos Exp $        */
 
 /*
@@ -38,7 +38,7 @@
 #if 0
 static char sccsid[] = "@(#)cmd3.c     8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: cmd3.c,v 1.2 1996/06/11 12:53:34 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: cmd3.c,v 1.3 1997/03/29 03:01:44 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -348,7 +348,7 @@ messize(v)
        for (ip = msgvec; *ip != NULL; ip++) {
                mesg = *ip;
                mp = &message[mesg-1];
-               printf("%d: %d/%ld\n", mesg, mp->m_lines, mp->m_size);
+               printf("%d: %d/%d\n", mesg, mp->m_lines, mp->m_size);
        }
        return(0);
 }
index 01bb3cc..88132e5 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: def.h,v 1.3 1997/02/03 00:25:18 deraadt Exp $ */
+/*     $OpenBSD: def.h,v 1.4 1997/03/29 03:01:45 millert Exp $ */
 /*     $NetBSD: def.h,v 1.8 1996/06/08 19:48:18 christos Exp $ */
 /*
  * Copyright (c) 1980, 1993
 
 struct message {
        short   m_flag;                 /* flags, see below */
-       short   m_block;                /* block number of this message */
-       short   m_offset;               /* offset in block of message */
-       long    m_size;                 /* Bytes in the message */
-       long    m_lines;                /* Lines in the message */
+       int     m_block;                /* block number of this message */
+       int     m_offset;               /* offset in block of message */
+       int     m_size;                 /* Bytes in the message */
+       int     m_lines;                /* Lines in the message */
 };
 
 /*
index 28ed945..e40ca2c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: extern.h,v 1.3 1996/06/11 12:53:39 deraadt Exp $      */
+/*     $OpenBSD: extern.h,v 1.4 1997/03/29 03:01:45 millert Exp $      */
 /*     $NetBSD: extern.h,v 1.4 1996/06/08 19:48:21 christos Exp $      */
 
 /*-
@@ -236,6 +236,8 @@ int  shell __P((void *));
 void    sigchild __P((int));
 void    sort __P((char **));
 int     source __P((void *));
+int     spool_lock __P((void));
+int     spool_unlock __P((void));
 void    spreserve __P((void));
 void    sreset __P((void));
 int     start_command __P((char *, sigset_t *, int, int, char *, char *, char *));
index 80e0bdb..ca95714 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: fio.c,v 1.3 1997/01/17 07:12:46 millert Exp $ */
+/*     $OpenBSD: fio.c,v 1.4 1997/03/29 03:01:46 millert Exp $ */
 /*     $NetBSD: fio.c,v 1.5 1996/06/08 19:48:22 christos Exp $ */
 
 /*
@@ -38,7 +38,7 @@
 #if 0
 static char sccsid[] = "@(#)fio.c      8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: fio.c,v 1.3 1997/01/17 07:12:46 millert Exp $";
+static char rcsid[] = "$OpenBSD: fio.c,v 1.4 1997/03/29 03:01:46 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -74,7 +74,7 @@ setptr(ibuf)
        char linebuf[LINESIZE];
 
        /* Get temporary file. */
-       (void)sprintf(linebuf, "%s/mail.XXXXXX", tmpdir);
+       (void)sprintf(linebuf, "%s/mail.XXXXXXXXXX", tmpdir);
        if ((c = mkstemp(linebuf)) == -1 ||
            (mestmp = Fdopen(c, "r+")) == NULL) {
                (void)fprintf(stderr, "mail: can't open %s\n", linebuf);
index 5b62b79..68dd05b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: pathnames.h,v 1.2 1996/06/11 12:53:46 deraadt Exp $   */
+/*     $OpenBSD: pathnames.h,v 1.3 1997/03/29 03:01:46 millert Exp $   */
 /*     $NetBSD: pathnames.h,v 1.4 1996/06/08 19:48:34 christos Exp $   */
 
 /*
@@ -44,3 +44,4 @@
 #define        _PATH_TILDE     "/usr/share/misc/mail.tildehelp"
 #define        _PATH_MASTER_RC "/etc/mail.rc"
 #define        _PATH_MORE      "/usr/bin/more"
+#define        _PATH_MAIL_LOCAL "/usr/libexec/mail.local"
index 7cdd016..9690989 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: popen.c,v 1.3 1996/06/26 21:22:34 dm Exp $    */
+/*     $OpenBSD: popen.c,v 1.4 1997/03/29 03:01:47 millert Exp $       */
 /*     $NetBSD: popen.c,v 1.4 1996/06/08 19:48:35 christos Exp $       */
 
 /*
@@ -38,7 +38,7 @@
 #if 0
 static char sccsid[] = "@(#)popen.c    8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: popen.c,v 1.3 1996/06/26 21:22:34 dm Exp $";
+static char rcsid[] = "$OpenBSD: popen.c,v 1.4 1997/03/29 03:01:47 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -69,6 +69,7 @@ static struct child *child;
 static struct child *findchild __P((int));
 static void delchild __P((struct child *));
 static int file_pid __P((FILE *));
+static int handle_spool_locks __P((int));
 
 FILE *
 Fopen(file, mode)
@@ -398,3 +399,59 @@ free_child(pid)
                cp->free = 1;
        sigprocmask(SIG_SETMASK, &oset, NULL);
 }
+
+/*
+ * Lock(1)/unlock(0) mail spool using mail.local's -H flag.
+ * Returns 1 for success, 0 for failure, -1 for bad usage.
+ */
+static int
+handle_spool_locks(action)
+       int action;
+{
+       char *cmd;
+       static FILE *lockfp = NULL;
+       static int lock_pid;
+
+       if (action == 0) {
+               /* Clear the lock */
+               if (lockfp == NULL) {
+                       fprintf(stderr,
+                           "handle_spool_locks: no spool lock to remove.\n");
+                       return (-1);
+               }
+               (void)kill(lock_pid, SIGTERM);
+               Pclose(lockfp);
+               lockfp = NULL;
+       } else if (action == 1) {
+               /* Create the lock */
+               if ((cmd = (char *) malloc(sizeof(_PATH_MAIL_LOCAL) + 3)) == NULL)
+                       panic("Out of memory");
+               sprintf(cmd, "%s -H", _PATH_MAIL_LOCAL);
+               if ((lockfp = Popen(cmd, "r")) == NULL || getc(lockfp) != '1') {
+                       lockfp = NULL;
+                       free(cmd);
+                       return (0);
+               }
+
+               lock_pid = fp_head->pid;        /* new entries added at head */
+               free(cmd);
+       } else {
+               fprintf(stderr, "handle_spool_locks: unknown action %d\n",
+                   action);
+               return (-1);
+       }
+
+       return (1);
+}
+
+int
+spool_lock()
+{
+       return(handle_spool_locks(1));
+}
+
+int
+spool_unlock()
+{
+       return(handle_spool_locks(0));
+}
index bf63671..104101c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: quit.c,v 1.2 1996/06/11 12:53:48 deraadt Exp $        */
+/*     $OpenBSD: quit.c,v 1.3 1997/03/29 03:01:47 millert Exp $        */
 /*     $NetBSD: quit.c,v 1.5 1996/06/08 19:48:37 christos Exp $        */
 
 /*
@@ -38,7 +38,7 @@
 #if 0
 static char sccsid[] = "@(#)quit.c     8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: quit.c,v 1.2 1996/06/11 12:53:48 deraadt Exp $";
+static char rcsid[] = "$OpenBSD: quit.c,v 1.3 1997/03/29 03:01:47 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -113,13 +113,14 @@ quit()
        if (fbuf == NULL)
                goto newmail;
        if (flock(fileno(fbuf), LOCK_EX) == -1) {
-nolock:
                perror("Unable to lock mailbox");
                Fclose(fbuf);
                return;
        }
-       if (dot_lock(mailname, 1, stdout, ".") == -1)
-               goto nolock;
+       if (!spool_lock()) {
+               Fclose(fbuf);
+               return;                 /* mail.local printed error for us */
+       }
        rbuf = NULL;
        if (fstat(fileno(fbuf), &minfo) >= 0 && minfo.st_size > mailsize) {
                printf("New mail has arrived.\n");
@@ -192,14 +193,14 @@ nolock:
                printf("Held %d message%s in %s\n",
                        p, p == 1 ? "" : "s", mailname);
                Fclose(fbuf);
-               dot_unlock(mailname);
+               spool_unlock();
                return;
        }
        if (c == 0) {
                if (p != 0) {
                        writeback(rbuf);
                        Fclose(fbuf);
-                       dot_unlock(mailname);
+                       spool_unlock();
                        return;
                }
                goto cream;
@@ -218,7 +219,7 @@ nolock:
                if ((obuf = Fopen(tempQuit, "w")) == NULL) {
                        perror(tempQuit);
                        Fclose(fbuf);
-                       dot_unlock(mailname);
+                       spool_unlock();
                        return;
                }
                if ((ibuf = Fopen(tempQuit, "r")) == NULL) {
@@ -226,7 +227,7 @@ nolock:
                        rm(tempQuit);
                        Fclose(obuf);
                        Fclose(fbuf);
-                       dot_unlock(mailname);
+                       spool_unlock();
                        return;
                }
                rm(tempQuit);
@@ -240,7 +241,7 @@ nolock:
                        Fclose(ibuf);
                        Fclose(obuf);
                        Fclose(fbuf);
-                       dot_unlock(mailname);
+                       spool_unlock();
                        return;
                }
                Fclose(obuf);
@@ -249,7 +250,7 @@ nolock:
                        perror(mbox);
                        Fclose(ibuf);
                        Fclose(fbuf);
-                       dot_unlock(mailname);
+                       spool_unlock();
                        return;
                }
        }
@@ -257,7 +258,7 @@ nolock:
                if ((obuf = Fopen(mbox, "a")) == NULL) {
                        perror(mbox);
                        Fclose(fbuf);
-                       dot_unlock(mailname);
+                       spool_unlock();
                        return;
                }
                fchmod(fileno(obuf), 0600);
@@ -269,7 +270,7 @@ nolock:
                                Fclose(ibuf);
                                Fclose(obuf);
                                Fclose(fbuf);
-                               dot_unlock(mailname);
+                               spool_unlock();
                                return;
                        }
 
@@ -296,7 +297,7 @@ nolock:
                perror(mbox);
                Fclose(obuf);
                Fclose(fbuf);
-               dot_unlock(mailname);
+               spool_unlock();
                return;
        }
        Fclose(obuf);
@@ -313,7 +314,7 @@ nolock:
        if (p != 0) {
                writeback(rbuf);
                Fclose(fbuf);
-               dot_unlock(mailname);
+               spool_unlock();
                return;
        }
 
@@ -334,19 +335,19 @@ cream:
                Fclose(abuf);
                alter(mailname);
                Fclose(fbuf);
-               dot_unlock(mailname);
+               spool_unlock();
                return;
        }
        demail();
        Fclose(fbuf);
-       dot_unlock(mailname);
+       spool_unlock();
        return;
 
 newmail:
        printf("Thou hast new mail.\n");
        if (fbuf != NULL) {
                Fclose(fbuf);
-               dot_unlock(mailname);
+               spool_unlock();
        }
 }
 
@@ -418,7 +419,7 @@ edstop()
        register struct message *mp;
        FILE *obuf, *ibuf, *readstat = NULL;
        struct stat statb;
-       char *tempname;
+       char tempname[MAXPATHLEN];
 
        if (readonly)
                return;
@@ -447,9 +448,12 @@ edstop()
                goto done;
        ibuf = NULL;
        if (stat(mailname, &statb) >= 0 && statb.st_size > mailsize) {
-               tempname = tempnam(tmpdir, "mbox");
+               int fd;
 
-               if ((obuf = Fopen(tempname, "w")) == NULL) {
+               snprintf(tempname, sizeof(tempname), "%s/%s", tmpdir,
+                   "mboxXXXXXXXXXX");
+               if ((fd = mkstemp(tempname)) == -1 ||
+                   (obuf = Fdopen(fd, "w")) == NULL) {
                        perror(tempname);
                        relsesigs();
                        reset(0);
@@ -473,7 +477,6 @@ edstop()
                        reset(0);
                }
                rm(tempname);
-               free(tempname);
        }
        printf("\"%s\" ", mailname);
        fflush(stdout);
index 108e5bc..312768a 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: temp.c,v 1.4 1996/10/28 00:42:21 millert Exp $        */
+/*     $OpenBSD: temp.c,v 1.5 1997/03/29 03:01:47 millert Exp $        */
 /*     $NetBSD: temp.c,v 1.5 1996/06/08 19:48:42 christos Exp $        */
 
 /*
@@ -38,7 +38,7 @@
 #if 0
 static char sccsid[] = "@(#)temp.c     8.1 (Berkeley) 6/6/93";
 #else
-static char rcsid[] = "$OpenBSD: temp.c,v 1.4 1996/10/28 00:42:21 millert Exp $";
+static char rcsid[] = "$OpenBSD: temp.c,v 1.5 1997/03/29 03:01:47 millert Exp $";
 #endif
 #endif /* not lint */
 
@@ -64,8 +64,16 @@ tinit()
 {
        register char *cp;
 
-       if ((tmpdir = getenv("TMPDIR")) == NULL) {
+       if ((tmpdir = getenv("TMPDIR")) == NULL || *tmpdir == '\0')
                tmpdir = _PATH_TMP;
+       if ((tmpdir = strdup(tmpdir)) == NULL)
+               panic("Out of memory");
+
+       /* Strip trailing '/' if necesary */
+       cp = tmpdir + strlen(tmpdir) - 1;
+       while (cp > tmpdir && *cp == '/') {
+               *cp = '\0';
+               cp--;
        }
 
        tempMail  = tempnam(tmpdir, "Rs");