BSD 3 development
[unix-history] / .ref-BSD-2 / src / Mail / edit.c
CommitLineData
5abdcf6d
KS
1/* Copyright (c) 1979 Regents of the University of California */
2#
3
4#include "rcv.h"
5#include <stdio.h>
6#include <sys/stat.h>
7
8/*
9 * Mail -- a mail program
10 *
11 * Perform message editing functions.
12 */
13
14/*
15 * Edit a message list.
16 */
17
18editor(msgvec)
19 int *msgvec;
20{
21 char *edname;
22
23 if ((edname = value("EDITOR")) == NOSTR)
24 edname = EDITOR;
25 return(edit1(msgvec, edname));
26}
27
28/*
29 * Invoke the visual editor on a message list.
30 */
31
32visual(msgvec)
33 int *msgvec;
34{
35 char *edname;
36
37 if ((edname = value("VISUAL")) == NOSTR)
38 edname = VISUAL;
39 return(edit1(msgvec, edname));
40}
41
42/*
43 * Edit a message by writing the message into a funnily-named file
44 * (which should not exist) and forking an editor on it.
45 * We get the editor from the stuff above.
46 */
47
48edit1(msgvec, ed)
49 int *msgvec;
50 char *ed;
51{
52 register char *cp, *cp2;
53 register int c;
54 int *ip, pid, mesg;
55 unsigned int ms;
56 int (*sigint)(), (*sigquit)();
57 FILE *ibuf, *obuf;
58 char edname[15], nbuf[10];
59 struct message *mp;
60 extern char tempEdit[];
61 off_t fsize(), size;
62
63 /*
64 * Set signals; locate editor.
65 */
66
67 sigint = signal(SIGINT, SIG_IGN);
68 sigquit = signal(SIGQUIT, SIG_IGN);
69
70 /*
71 * Deal with each message to be edited . . .
72 */
73
74 for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) {
75 mesg = *ip;
76 mp = &message[mesg-1];
77 mp->m_flag |= MODIFY;
78
79 /*
80 * Make up a name for the edit file of the
81 * form "Message%d" and make sure it doesn't
82 * already exist.
83 */
84
85 cp = &nbuf[10];
86 *--cp = 0;
87 while (mesg) {
88 *--cp = mesg % 10 + '0';
89 mesg /= 10;
90 }
91 cp2 = copy("Message", edname);
92 while (*cp2++ = *cp++)
93 ;
94 if (!access(edname, 2)) {
95 printf("%s: file exists\n", edname);
96 goto out;
97 }
98
99 /*
100 * Copy the message into the edit file.
101 */
102
103 close(creat(edname, 0600));
104 if ((obuf = fopen(edname, "w")) == NULL) {
105 perror(edname);
106 goto out;
107 }
108 if (send(mp, obuf) < 0) {
109 perror(edname);
110 fclose(obuf);
111 unlink(edname);
112 goto out;
113 }
114 fflush(obuf);
115 if (ferror(obuf)) {
116 unlink(edname);
117 fclose(obuf);
118 goto out;
119 }
120 fclose(obuf);
121
122 /*
123 * Fork/execl the editor on the edit file.
124 */
125
126 pid = fork();
127 if (pid == -1) {
128 perror("fork");
129 unlink(edname);
130 goto out;
131 }
132 if (pid == 0) {
133 if (sigint != SIG_IGN)
134 signal(SIGINT, SIG_DFL);
135 if (sigquit != SIG_IGN)
136 signal(SIGQUIT, SIG_DFL);
137 execl(ed, ed, edname, 0);
138 perror(ed);
139 exit(1);
140 }
141 while (wait(&mesg) != pid)
142 ;
143
144 /*
145 * Now copy the message to the end of the
146 * temp file.
147 */
148
149 if ((ibuf = fopen(edname, "r")) == NULL) {
150 perror(edname);
151 unlink(edname);
152 goto out;
153 }
154 unlink(edname);
155 fseek(otf, (long) 0, 2);
156 size = fsize(otf);
157 mp->m_block = blockof(size);
158 mp->m_offset = offsetof(size);
159 ms = 0;
160 while ((c = getc(ibuf)) != EOF) {
161 putc(c, otf);
162 if (ferror(otf))
163 break;
164 ms++;
165 }
166 mp->m_size = ms;
167 if (ferror(otf))
168 perror("/tmp");
169 fclose(ibuf);
170 }
171
172 /*
173 * Restore signals and return.
174 */
175
176out:
177 signal(SIGINT, sigint);
178 signal(SIGQUIT, sigquit);
179}