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