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