]> diplodocus.org Git - nmh/blob - docs/historical/mh-nov-1983/subs/m_edit.c
Update XOAUTH2 documentation.
[nmh] / docs / historical / mh-nov-1983 / subs / m_edit.c
1 #include "mh.h"
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <signal.h>
5 #include <stdio.h>
6 #include "strings.h"
7
8 struct msgs *mp;
9
10 char *rindex();
11
12 m_edit(ed, file, use, altmsg)
13 char **ed, *file, *altmsg;
14 int use;
15 {
16 /* Exec editor. Normal exit returns 0.
17 * To abort, returns -1. To try again, returns -2
18 */
19
20 static char *edsave;
21 static int reedit;
22 struct stat stbuf;
23 int retstat;
24 register char *cp;
25 int pid, wpid;
26 int intr;
27 union { int statint;
28 struct {char lobyte, hibyte;} statby;
29 } status;
30
31 if(!reedit) { /* set initial editor */
32 if(!*ed && (*ed = m_find("editor")) == NULL)
33 *ed = sysed;
34 } else
35 if(!*ed) { /* no explicit editor */
36 *ed = edsave;
37 cp = rindex(*ed, '/');
38 if(cp == 0)
39 cp = *ed;
40 cp = concat(cp, "-next", 0);
41 if((cp = m_find(cp)) != NULL)
42 *ed = cp;
43 }
44 intr = (int) signal(SIGINT, SIG_IGN);
45 if((pid = fork()) == 0) {
46 if(altmsg) {
47 unlink("@");
48 link(altmsg, "@"); /* An easy handle on cur msg */
49 }
50 m_update();
51 fflush(stdout);
52 signal(SIGINT, (int (*)()) intr);
53 execlp(*ed, *ed, file, 0);
54 fprintf(stderr, "Can't exec the editor: ");
55 perror(*ed); done(-1);
56 } else if(pid == -1) {
57 fprintf(stderr, "No forks!\n");
58 retstat = -1;
59 goto leave;
60 } else
61 while((wpid = wait(&status)) != -1 && wpid != pid) ;
62 signal(SIGINT, (int (*)()) intr);
63 if(status.statint) {
64 if((status.statby.hibyte == -1) || /* Can't exec editor */
65 (reedit && !status.statby.lobyte)) { /*2nd edit.Aborted by user*/
66 retstat = -2;
67 goto leave;
68 }
69 fprintf(stderr, "[%s aborted--%s ", invo_name(), file);
70 if(!use && status.statby.hibyte) { /* edit aborted by user */
71 unlink(file);
72 fprintf(stderr, "deleted]\n");
73 } else /* 'use' or system abort */
74 fprintf(stderr, "preserved]\n");
75 retstat = -2;
76 goto leave;
77 }
78 reedit++;
79 retstat = 0;
80 if(altmsg && !mp->msgflags&READONLY) {
81 stat("@", &stbuf);
82 if(stbuf.st_nlink == 1) /*@'s been edited by Ned*/
83 if(unlink(altmsg) == -1 || link("@", altmsg) == -1){
84 fprintf(stderr, "Can't update %s from @ file!\n",altmsg);
85 retstat = 0;
86 goto leave;
87 }
88 }
89 leave:
90 edsave = getcpy(*ed);
91 *ed = 0;
92 unlink("@"); /* Remove this extra link */
93 return(retstat);
94 }