BSD 2 development
authorKurt A. Shoens <kurt@ucbvax.Berkeley.EDU>
Wed, 9 May 1979 07:30:00 +0000 (23:30 -0800)
committerKurt A. Shoens <kurt@ucbvax.Berkeley.EDU>
Wed, 9 May 1979 07:30:00 +0000 (23:30 -0800)
Work on file src/Mail/edit.c

Synthesized-from: 2bsd

src/Mail/edit.c [new file with mode: 0644]

diff --git a/src/Mail/edit.c b/src/Mail/edit.c
new file mode 100644 (file)
index 0000000..328681b
--- /dev/null
@@ -0,0 +1,179 @@
+/* Copyright (c) 1979 Regents of the University of California */
+#
+
+#include "rcv.h"
+#include <stdio.h>
+#include <sys/stat.h>
+
+/*
+ * Mail -- a mail program
+ *
+ * Perform message editing functions.
+ */
+
+/*
+ * Edit a message list.
+ */
+
+editor(msgvec)
+       int *msgvec;
+{
+       char *edname;
+
+       if ((edname = value("EDITOR")) == NOSTR)
+               edname = EDITOR;
+       return(edit1(msgvec, edname));
+}
+
+/*
+ * Invoke the visual editor on a message list.
+ */
+
+visual(msgvec)
+       int *msgvec;
+{
+       char *edname;
+
+       if ((edname = value("VISUAL")) == NOSTR)
+               edname = VISUAL;
+       return(edit1(msgvec, edname));
+}
+
+/*
+ * Edit a message by writing the message into a funnily-named file
+ * (which should not exist) and forking an editor on it.
+ * We get the editor from the stuff above.
+ */
+
+edit1(msgvec, ed)
+       int *msgvec;
+       char *ed;
+{
+       register char *cp, *cp2;
+       register int c;
+       int *ip, pid, mesg;
+       unsigned int ms;
+       int (*sigint)(), (*sigquit)();
+       FILE *ibuf, *obuf;
+       char edname[15], nbuf[10];
+       struct message *mp;
+       extern char tempEdit[];
+       off_t fsize(), size;
+
+       /*
+        * Set signals; locate editor.
+        */
+
+       sigint = signal(SIGINT, SIG_IGN);
+       sigquit = signal(SIGQUIT, SIG_IGN);
+
+       /*
+        * Deal with each message to be edited . . .
+        */
+
+       for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
+               mesg = *ip;
+               mp = &message[mesg-1];
+               mp->m_flag |= MODIFY;
+
+               /*
+                * Make up a name for the edit file of the
+                * form "Message%d" and make sure it doesn't
+                * already exist.
+                */
+
+               cp = &nbuf[10];
+               *--cp = 0;
+               while (mesg) {
+                       *--cp = mesg % 10 + '0';
+                       mesg /= 10;
+               }
+               cp2 = copy("Message", edname);
+               while (*cp2++ = *cp++)
+                       ;
+               if (!access(edname, 2)) {
+                       printf("%s: file exists\n", edname);
+                       goto out;
+               }
+
+               /*
+                * Copy the message into the edit file.
+                */
+
+               close(creat(edname, 0600));
+               if ((obuf = fopen(edname, "w")) == NULL) {
+                       perror(edname);
+                       goto out;
+               }
+               if (send(mp, obuf) < 0) {
+                       perror(edname);
+                       fclose(obuf);
+                       unlink(edname);
+                       goto out;
+               }
+               fflush(obuf);
+               if (ferror(obuf)) {
+                       unlink(edname);
+                       fclose(obuf);
+                       goto out;
+               }
+               fclose(obuf);
+
+               /*
+                * Fork/execl the editor on the edit file.
+                */
+
+               pid = fork();
+               if (pid == -1) {
+                       perror("fork");
+                       unlink(edname);
+                       goto out;
+               }
+               if (pid == 0) {
+                       if (sigint != SIG_IGN)
+                               signal(SIGINT, SIG_DFL);
+                       if (sigquit != SIG_IGN)
+                               signal(SIGQUIT, SIG_DFL);
+                       execl(ed, ed, edname, 0);
+                       perror(ed);
+                       exit(1);
+               }
+               while (wait(&mesg) != pid)
+                       ;
+
+               /*
+                * Now copy the message to the end of the
+                * temp file.
+                */
+
+               if ((ibuf = fopen(edname, "r")) == NULL) {
+                       perror(edname);
+                       unlink(edname);
+                       goto out;
+               }
+               unlink(edname);
+               fseek(otf, (long) 0, 2);
+               size = fsize(otf);
+               mp->m_block = blockof(size);
+               mp->m_offset = offsetof(size);
+               ms = 0;
+               while ((c = getc(ibuf)) != EOF) {
+                       putc(c, otf);
+                       if (ferror(otf))
+                               break;
+                       ms++;
+               }
+               mp->m_size = ms;
+               if (ferror(otf))
+                       perror("/tmp");
+               fclose(ibuf);
+       }
+
+       /*
+        * Restore signals and return.
+        */
+
+out:
+       signal(SIGINT, sigint);
+       signal(SIGQUIT, sigquit);
+}