changed to version 2.1
[unix-history] / usr / src / usr.bin / mail / fio.c
index 96f2734..3a92c27 100644 (file)
@@ -10,7 +10,7 @@
  * File I/O.
  */
 
  * File I/O.
  */
 
-static char *SccsId = "@(#)fio.c       1.8 %G%";
+static char *SccsId = "@(#)fio.c       1.11 %G%";
 
 /*
  * Set up the input pointers while copying the mail file into
 
 /*
  * Set up the input pointers while copying the mail file into
@@ -286,17 +286,20 @@ remove(name)
 
 /*
  * Terminate an editing session by attempting to write out the user's
 
 /*
  * Terminate an editing session by attempting to write out the user's
- * file from the temporary.
+ * file from the temporary.  Save any new stuff appended to the file.
  */
  */
-
 edstop()
 {
        register int gotcha, c;
        register struct message *mp;
 edstop()
 {
        register int gotcha, c;
        register struct message *mp;
-       FILE *obuf;
+       FILE *obuf, *ibuf;
+       struct stat statb;
+       char tempname[30];
+       int (*sigs[3])();
 
        if (readonly)
                return;
 
        if (readonly)
                return;
+       holdsigs();
        for (mp = &message[0], gotcha = 0; mp < &message[msgCount]; mp++) {
                if (mp->m_flag & MNEW) {
                        mp->m_flag &= ~MNEW;
        for (mp = &message[0], gotcha = 0; mp < &message[msgCount]; mp++) {
                if (mp->m_flag & MNEW) {
                        mp->m_flag &= ~MNEW;
@@ -308,11 +311,40 @@ edstop()
                }
        }
        if (!gotcha)
                }
        }
        if (!gotcha)
-               return;
+               goto done;
+       ibuf = NULL;
+       if (stat(editfile, &statb) >= 0 && statb.st_size > mailsize) {
+               strcpy(tempname, "/tmp/mboxXXXXXX");
+               mktemp(tempname);
+               if ((obuf = fopen(tempname, "w")) == NULL) {
+                       perror(tempname);
+                       relsesigs();
+                       reset(0);
+               }
+               if ((ibuf = fopen(editfile, "r")) == NULL) {
+                       perror(editfile);
+                       fclose(obuf);
+                       remove(tempname);
+                       relsesigs();
+                       reset(0);
+               }
+               while ((c = getc(ibuf)) != EOF)
+                       putc(c, obuf);
+               fclose(ibuf);
+               fclose(obuf);
+               if ((ibuf = fopen(tempname, "r")) == NULL) {
+                       perror(tempname);
+                       remove(tempname);
+                       relsesigs();
+                       reset(0);
+               }
+               remove(tempname);
+       }
        printf("\"%s\" ", editfile);
        flush();
        if ((obuf = fopen(editfile, "w")) == NULL) {
                perror(editfile);
        printf("\"%s\" ", editfile);
        flush();
        if ((obuf = fopen(editfile, "w")) == NULL) {
                perror(editfile);
+               relsesigs();
                reset(0);
        }
        c = 0;
                reset(0);
        }
        c = 0;
@@ -322,21 +354,55 @@ edstop()
                c++;
                if (send(mp, obuf) < 0) {
                        perror(editfile);
                c++;
                if (send(mp, obuf) < 0) {
                        perror(editfile);
+                       relsesigs();
                        reset(0);
                }
        }
                        reset(0);
                }
        }
+       gotcha = (c == 0 && ibuf == NULL);
+       if (ibuf != NULL) {
+               while ((c = getc(ibuf)) != EOF)
+                       putc(c, obuf);
+               fclose(ibuf);
+       }
        fflush(obuf);
        if (ferror(obuf)) {
                perror(editfile);
        fflush(obuf);
        if (ferror(obuf)) {
                perror(editfile);
+               relsesigs();
                reset(0);
        }
                reset(0);
        }
-       if (c == 0) {
+       fclose(obuf);
+       if (gotcha) {
                remove(editfile);
                printf("removed\n");
        }
        else
                printf("complete\n");
        flush();
                remove(editfile);
                printf("removed\n");
        }
        else
                printf("complete\n");
        flush();
+
+done:
+       relsesigs();
+}
+
+/*
+ * Hold signals SIGHUP - SIGQUIT.
+ */
+holdsigs()
+{
+       register int i;
+
+       for (i = SIGHUP; i <= SIGQUIT; i++)
+               sighold(i);
+}
+
+/*
+ * Release signals SIGHUP - SIGQUIT
+ */
+relsesigs()
+{
+       register int i;
+
+       for (i = SIGHUP; i <= SIGQUIT; i++)
+               sigrelse(i);
 }
 
 /*
 }
 
 /*
@@ -423,10 +489,8 @@ expand(name)
 
        if (!anyof(name, "~{[*?$`'\"\\"))
                return(name);
 
        if (!anyof(name, "~{[*?$`'\"\\"))
                return(name);
-       /* sigint = signal(SIGINT, SIG_IGN); */
        if (pipe(pivec) < 0) {
                perror("pipe");
        if (pipe(pivec) < 0) {
                perror("pipe");
-               /* signal(SIGINT, sigint) */
                return(name);
        }
        sprintf(cmdbuf, "echo %s", name);
                return(name);
        }
        sprintf(cmdbuf, "echo %s", name);
@@ -478,11 +542,9 @@ expand(name)
                fprintf(stderr, "\"%s\": Ambiguous\n", name);
                goto err;
        }
                fprintf(stderr, "\"%s\": Ambiguous\n", name);
                goto err;
        }
-       /* signal(SIGINT, sigint) */
        return(savestr(xname));
 
 err:
        return(savestr(xname));
 
 err:
-       /* signal(SIGINT, sigint); */
        return(NOSTR);
 }
 
        return(NOSTR);
 }