]> diplodocus.org Git - nmh/blob - docs/historical/2.9BSD/cmds/send.c
Added start_test/finish_test to a bunch of tests.
[nmh] / docs / historical / 2.9BSD / cmds / send.c
1 #ifndef lint
2 static char sccsid[] = "@(#)send.c 4.2 2/23/83";
3 #endif
4
5 #include "mh.h"
6 #include <stdio.h>
7 #include <sys/types.h>
8 #include <sys/stat.h>
9 #include <strings.h>
10 #include <signal.h>
11
12 char *anoyes[]; /* Std no/yes gans array */
13
14 char *vec[20];
15 int vecp;
16
17 struct swit switches[] = {
18 "debug", -1, /* 0 */
19 "draft", 0, /* 1 */
20 "format", 0, /* 2 */
21 "noformat", 0, /* 3 */
22 "msgid", 0, /* 4 */
23 "nomsgid", 0, /* 5 */
24 "verbose", 0, /* 6 */
25 "noverbose", 0, /* 7 */
26 "help", 4, /* 8 */
27 0, 0
28 };
29
30 int debug;
31
32 main(argc, argv)
33 char *argv[];
34 {
35 register char *drft, *cp;
36 register int i;
37 int status, pid;
38 struct stat stbuf;
39 char **ap;
40 char *arguments[50], **argp;
41
42 #ifdef NEWS
43 m_news();
44 #endif
45 drft = 0;
46 vec[vecp++] = "mh_deliver";
47 cp = r1bindex(argv[0], '/');
48 if((cp = m_find(cp)) != NULL) {
49 ap = brkstring(cp = getcpy(cp), " ", "\n");
50 ap = copyip(ap, arguments);
51 } else
52 ap = arguments;
53 copyip(argv+1, ap);
54 argp = arguments;
55 while(cp = *argp++) {
56 if(*cp == '-')
57 switch(smatch(++cp, switches)) {
58 case -2:ambigsw(cp, switches); /* ambiguous */
59 goto leave;
60 /* unknown */
61 case -1:fprintf(stderr, "send: -%s unknown\n", cp);
62 goto leave;
63 /* -draft */
64 case 1: vec[vecp++] = drft = m_maildir(draft);
65 continue;
66 case 0: debug++;
67 case 2: case 3: case 4:
68 case 5: case 6: case 7:
69 vec[vecp++] = --cp;
70 continue;
71 case 8: help("send [file] [switches]",
72 switches);
73 goto leave;
74 }
75 if(drft) {
76 fprintf(stderr, "Send: Only one message at a time.\n");
77 done(1);
78 }
79 vec[vecp++] = drft = cp;
80 }
81 if(!drft) {
82 drft = m_maildir(draft);
83 if(stat(drft, &stbuf) == -1) {
84 fprintf(stderr, "Draft file: %s doesn't exist.\n", drft);
85 done(1);
86 }
87 cp = concat("Use \"", drft, "\"? ", 0);
88 if(!gans(cp, anoyes))
89 done(0);
90 vec[vecp++] = drft;
91 } else {
92 if(stat(drft, &stbuf) == -1) {
93 fprintf(stderr, "Draft file: %s doesn't exist.\n", drft);
94 done(1);
95 }
96 }
97 m_update();
98 vec[vecp] = 0;
99
100 while((pid = fork()) == -1) {
101 fprintf("Waiting for a fork\n");
102 sleep(2);
103 }
104 if(pid == 0) {
105 execv(mh_deliver, vec);
106 perror(mh_deliver);
107 done(1);
108 }
109 signal(SIGINT, SIG_IGN);
110 signal(SIGQUIT, SIG_IGN);
111 while((i = wait(&status)) != -1 && i != pid) ;
112 if(status == 0 && !debug)
113 backup(drft);
114
115 leave: ;
116 /*** m_update(); ***/
117 }
118
119
120 backup(file)
121 char *file;
122 {
123 char buf[128];
124 register char *cp;
125 extern char *rindex();
126
127 buf[0] = 0;
128 if(cp = rindex(file, '/'))
129 sprintf(buf, "%.*s", (++cp)-file, file);
130 else
131 cp = file;
132 #ifdef UCB
133 strcat(buf, "#");
134 #else
135 strcat(buf, ",");
136 #endif
137 strcat(buf, cp);
138 unlink(buf);
139 if(link(file, buf) < 0 || unlink(file) < 0) {
140 fprintf(stderr, "Send: Backup rename failure ");
141 perror(buf);
142 done(1);
143 }
144 }