2 Proprietary Rand Corporation
, 1981.
3 Further distribution of
this software
4 subject to the terms of the Rand
9 #include "/rnd/borden/h/iobuf.h"
10 #include "/rnd/borden/h/signals.h"
26 "edit [<editor>]", 0, /* 1 */
27 "quit [delete]", 0, /* 2 */
28 "send [verbose]", 0, /* 3 */
32 int *vec
[MAXARGS
], fout
, anot
;
37 int inplace
; /* preserve links in anno */
39 struct swit switches
[] {
40 "annotate", 0, /* 0 */
41 "noannotate", 0, /* 1 */
44 "editor editor", 0, /* 4 */
46 "noinplace", 0, /* 6 */
54 char *folder
, *nfolder
, *msg
;
55 register char *cp
, *ap
;
57 char *arguments
[50], **argp
;
63 msg
= anot
= folder
= 0;
69 if((cp
= m_find(ap
)) != -1) {
70 ap
= brkstring(cp
= getcpy(cp
), " ", "\n");
71 ap
= copyip(ap
, arguments
);
78 switch(smatch(++cp
, switches
)) {
79 case -2:ambigsw(cp
, switches
); /* ambiguous */
82 case -1:printf("resp: -%s unknown\n", cp
);
84 case 0: anot
= 1; continue; /* -annotate */
85 case 1: anot
= 0; continue; /* -noannotate */
86 case 2: ccme
= 1; continue; /* -ccme */
87 case 3: ccme
= 0; continue; /* -noccme */
88 case 4: if(!(ed
= *argp
++)) { /* -editor */
89 printf("resp: Missing argument for %s switch\n", argp
[-2]);
93 case 5: inplace
= 1; continue; /* -inplace */
94 case 6: inplace
= 0; continue; /* -noinplace */
96 case 7: help("resp [+folder] [msg] [switches]",
102 printf("Only one folder at a time.\n");
107 printf("Only one message per response.\n");
115 folder
= m_getfolder();
116 maildir
= getcpy(m_maildir(folder
));
117 if(chdir(maildir
) < 0) {
118 printf("Can't chdir to: "); flush();
122 if(!(mp
= m_gmsg(folder
))) {
123 printf("Can't read folder!?\n");
126 if(mp
->hghmsg
== 0) {
127 printf("No messages in \"%s\".\n", folder
);
132 if(mp
->numsel
== 0) {
133 printf("resp: shark's fin soup\n"); /* never get here */
137 printf("Only one message at a time.\n");
140 m_replace(pfolder
, folder
);
141 if(mp
->lowsel
!= mp
->curmsg
)
142 m_setcur(mp
->lowsel
);
143 repl(getcpy(m_name(mp
->lowsel
)));
155 char name
[NAMESZ
], field
[512], *replto
, *from
, *cc
, *sub
, *date
, *to
;
157 int state
, out
, status
, intr
;
159 char **argp
, *address
;
161 if(fopen(msg
, &in
) < 0) {
162 printf("Can't open \"%s\"\n", msg
);
165 drft
= m_maildir(draft
);
166 if((out
= open(drft
, 0)) >= 0) {
167 cp
= concat("\"", drft
, "\" exists; delete? ", 0);
168 while((i
= gans(cp
, anyl
)) == 2)
175 if((out
= creat(drft
, m_gmprot())) < 0) {
176 printf("Can't create \"%s\".\n", drft
);
181 replto
= msgid
= to
= from
= cc
= sub
= date
= 0;
185 switch(state
= m_getfld(state
, name
, field
, sizeof field
, &in
)) {
190 if(uleq(name
, "from"))
191 from
= niceadd(field
, from
);
193 cc
= niceadd(field
, cc
);
194 if(uleq(name
, "subject"))
195 sub
= niceadd(field
, sub
);
196 if(uleq(name
, "date"))
197 date
= niceadd(field
, date
);
199 to
= niceadd(field
, to
);
200 if(uleq(name
, "message-id"))
201 msgid
= niceadd(field
, msgid
);
202 if(uleq(name
, "reply-to"))
203 replto
= niceadd(field
, replto
);
204 /* if(uleq(name, "sender"))
205 sender = niceadd(field, sender); */
216 printf("getfld returned %d\n", state
);
224 /* if(!(address = addr(sender)))
225 if(!(address = addr(from)))
226 address = addr(replto);
228 address
= (replto
? addr(replto
) : addr(from
));
231 if(!(from
|| replto
|| to
)) {
232 printf("No one to respond to!!!\n");
240 type(out
, "To: "); /* To: */
241 if(cp
= (replto
? replto
: from
))
247 to
= fix(to
, address
);
253 cc
= fix(cc
, address
);
256 if(sub
) { /* Subject: Re: */
257 type(out
, "Subject: ");
258 if(*sub
== ' ') sub
++;
259 if((sub
[0] != 'R' && sub
[0] != 'r') ||
260 (sub
[1] != 'E' && sub
[1] != 'e') ||
264 } /* In-response-to: */
265 type(out
, "In-response-to: Message from ");
268 date
[length(date
)-1] = '.';
269 if(*date
== ' ') date
++;
276 if(*msgid
== ' ') msgid
++;
283 type(out
, "\n----------\n");
286 if(m_edit(&ed
, drft
, NOUSE
, msg
) < 0)
289 printf("!! Test Version of SEND Being Run !!\n");
290 printf(" Send verbose !\n\n");
294 if(!(argp
= getans("\nWhat now? ", aleqs
))) {
298 switch(smatch(*argp
, aleqs
)) {
299 case 0: showfile(drft
); /* list */
301 case 1: if(*++argp
) /* edit */
303 if(m_edit(&ed
, drft
, NOUSE
, msg
) == -1)
306 case 2: if(*++argp
&& *argp
[0] == 'd') /* quit */
307 if(unlink(drft
) == -1) {
308 printf("Can't unlink %s ", drft
);
312 case 3: if(*++argp
) cp
= *argp
; else cp
= ""; /* send */
314 if(!mp
->msgflags
&READONLY
) { /* annotate first */
316 while((pid
= fork()) == -1) sleep(5);
318 while(wpid
=wait()!= -1 && wpid
!= pid
);
319 if(stat(drft
, field
) == -1)
320 annotate(msg
, "Responded", "");
325 if(!m_send(cp
, drft
))
327 default:printf("resp: illegal option\n"); /*##*/