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/stat.h"
12 /*#define DEBUG 1 /* Comment out normally */
14 /* Include a -msgid switch to .mh_profile to cause a
15 * Message-Id component to be added to outgoing mail.
18 char *anoyes
[]; /* Std no/yes gans array */
19 struct swit switches
[] {
22 "noformat", 0, /* 2 */
26 "noverbose", 0, /* 6 */
30 struct iobuf in
, pin
, pout
, fout
, fccout
;
31 int format
1; /* re-formatting is the default */
33 char *logn
, *parptr
, *nmsg
, fccfile
[256];
39 register char *cp
, *msg
;
41 char *to
, *cc
, *bcc
, *dist_to
, *dist_cc
, *dist_bcc
;
42 char *tolist
, *cclist
, *adrlist
, *sender
, *fcc
, *dist_fcc
;
43 char name
[NAMESZ
], field
[512];
44 int specfld
, dist
, fcconly
;
45 int from
, loc
, net
, verbose
, msgid
;
48 char *arguments
[50], **argp
;
50 fout
.b_fildes
= dup(1);
51 msgid
= from
= loc
= net
= to
= cc
= bcc
= dist
= fcc
= dist_fcc
=
52 dist_to
= dist_cc
= dist_bcc
= fcconly
= debug
=
56 copyip(argv
+1, arguments
);
60 switch(smatch(++cp
, switches
)) {
61 case -2:ambigsw(cp
, switches
); /* ambiguous */
64 case -1:printf("sndmsg: -%s unknown\n", cp
);
66 case 0: verbose
++; debug
++; continue; /* -debug */
67 case 1: format
= 1; continue; /* -format */
68 case 2: format
= 0; continue; /* -noformat */
69 case 3: msgid
= 1; continue; /* -msgid */
70 case 4: msgid
= 0; continue; /* -nomsgid */
71 case 5: loc
= 1; net
= 1; continue; /* -verbose */
72 case 6: loc
= 0; net
= 0; continue; /* -noverbose */
73 case 7: help("sndmsg [file] [switches]",
78 printf("Only one message at a time!\n");
84 printf("No Message specified.\n");
87 if(fopen(msg
, &in
) < 0) {
88 printf("Can't open \"%s\" for reading.\n", msg
);
95 switch(state
= m_getfld(state
, name
, field
, sizeof field
, &in
)) {
100 if(!dist
&& uleq(name
, "to"))
102 else if(!dist
&& uleq(name
, "cc"))
104 else if(!dist
&& uleq(name
, "bcc"))
105 bcc
= add(field
, bcc
);
106 else if(!dist
&& uleq(name
, "fcc"))
107 fcc
= add(field
, fcc
);
108 else if(uleq(name
, "distribute-to"))
109 { dist
++; /* use presence of field as flag */
110 dist_to
= add(field
, dist_to
);
112 else if(uleq(name
, "distribute-cc"))
113 dist_cc
= add(field
, dist_cc
);
114 else if(uleq(name
, "distribute-bcc"))
115 dist_bcc
= add(field
, dist_bcc
);
116 else if(uleq(name
, "distribute-fcc"))
117 dist_fcc
= add(field
, dist_fcc
);
118 else if(uleq(name
, "from"))
130 printf("getfld returned %d\n", state
);
143 printf("Message %s has no addresses!!\n", msg
);
147 pin
.b_fildes
= dup(2);
161 adrlist
= parptr
; parptr
= 0;
163 printf("Address List:\n%s", adrlist
);
168 if(parse(to
, 'r', dist
? "Distribute-To: " : "To: "))
170 tolist
= parptr
; parptr
= 0;
172 if(parse(cc
, 'r', dist
? "Distribute-cc: " : "cc: "))
174 cclist
= parptr
; parptr
= 0;
177 if (tolist
) printf(tolist
);
178 if (cclist
) printf(cclist
);
184 for(cp
= fcc
; *cp
&& *cp
!= '\n'; cp
++) ;
187 printf("fcc: \"%s\"\n", fcc
); flush();
188 if((fccout
.b_fildes
= filemsg(fcc
)) == -1)
191 copy("\n", copy((logn
= getlogn(getruid())), field
));
192 if(parse(field
, 'r', dist
? "Distributed-By: " :
193 (from
? "Sender: ":"From: ")))
195 sender
= parptr
; parptr
= 0;
196 seek(in
.b_fildes
, 0, 0);
198 pout
.b_fildes
= 1; /* Send msg to std output for debugging */
200 pout
.b_fildes
= 0; /* Flush send output if only an fcc */
209 puts(adrlist
, &pout
);
211 puts2(sender
, &pout
);
212 puts2(dist
? "Distribution-Date: " : "Date: ", &pout
);
215 puts2(dist
? "Distribution-ID: " : "Message-ID: ", &pout
);
216 puts2(gmid(), &pout
);
218 seek(in
.b_fildes
, 0, 0);
219 in
.b_nleft
= in
.b_nextp
= 0;
224 switch(state
= m_getfld(state
, name
, field
, sizeof field
, &in
)) {
230 if(format
&& uleq(name
,dist
? "distribute-to":"to")) {
237 } else if (format
&& uleq(name
,dist
?"distribute-cc":"cc")) {
244 } else if (uleq(name
,dist
? "distribute-bcc" : "bcc") ||
245 uleq(name
,dist
? "distributed-by" : "sender") ||
246 uleq(name
,dist
? "distribution-date" : "date") ||
247 uleq(name
,dist
? "distribution-id" : "message-id") ||
248 uleq(name
,dist
? "distribution-fcc" : "fcc")) {
249 specfld
++; /* Ignore these if present */
255 while(state
== FLDPLUS
) { /* read rest of field */
256 state
=m_getfld(state
, name
, field
, sizeof field
, &in
);
257 if (specfld
) continue;
258 /* puts2(name, &pout);
259 puts2(":", &pout); */
272 while(state
== BODY
) {
273 state
=m_getfld(state
, name
, field
, sizeof field
, &in
);
279 printf("Error from getfld=%d\n", state
);
285 if(fccout
.b_fildes
) {
287 close(fccout
.b_fildes
);
289 if(!debug
&& !fcconly
) {
291 if((state
= read(2, &field
, sizeof field
)) != 1 || field
[0]) {
292 printf("Error from adrparse.\n");
297 printf("Filed: %s:%s\n", fcc
, nmsg
);
300 printf("Message %s sent.\n", msg
);
303 cp
= copy(msg
, field
);
304 /* for(cp = field; *cp++; ) ; */
308 while(--cp
>= field
&& *cp
!= '/');
309 *++cp
= ','; /* New backup convention */
311 if(link(msg
, field
) == -1 || unlink(msg
) == -1)
312 printf("Can't rename %s to %s\n", msg
, field
);
318 printf("[Message NOT Delivered!]\n");
327 parse(ptr
, type
, fldname
)
341 while((i
= getl(&pin
, line
, (sizeof line
) - 1)) > 0) {
346 parptr
= add("\n",parptr
);
350 else if(line
[0] == '?') {
351 printf("Adrparse: %s", line
);
357 { parptr
= add("\n",parptr
);
361 { parptr
= add(fldname
,parptr
);
362 l
=+ length(fldname
);
365 { parptr
= add(", ",parptr
);
368 parptr
= add(line
+1, parptr
);
372 parptr
= add(line
, parptr
);
374 printf("Error from adrparse.\n");
380 static char bufmid
[128];
382 register char *cp
, *c2
;
387 cp
= copy(locv(0, getruid()), cp
);
390 cp
= copy(locv(now
), cp
);
391 cp
= copy("@Rand-Unix>\n", cp
);
399 static char bufmid
[128];
401 register char *cp
, *c2
;
404 cp
= copy("<[Rand-Unix]", cp
);
421 register char *t
, *p
;
424 extern char *tzname
[];
467 cp
= buf
; cnt
= size
;
469 while((c
= getc(iob
)) >= 0) {
472 if(c
== 0 || c
== '\n' || cnt
== 0)
481 register char *f1
, *f2
, *f3
;
484 printf("compress:\n%s-----\n", parptr
);
486 for(f1
= parptr
; *f1
; ) {
487 for(f2
= f1
; *f2
++ != '\n'; ) ;
490 for(f3
= f2
; *f3
++ != '\n'; ) ;
493 while(*f2
++ != '\n') ;
495 while(*f1
++ != '\n') ;
502 register char *c1
, *c2
;
505 while(*c1
!= '\n' && *c2
!= '\n')
506 if((*c1
++|040) != (*c2
++|040))
508 return((*c1
|040) == (*c2
|040));
520 fp
= m_maildir(folder
);
521 if(stat(fp
, &stbuf
) < 0) {
522 nmsg
= concat("Create folder \"",
524 if(!gans(nmsg
, anoyes
))
527 printf("Can't create folder.\n");
532 perror(concat("Can't chdir to ", fp
, 0));
535 if(!(mp
= m_gmsg())) {
536 printf("Can't read folder %s\n", folder
);
539 nmsg
= m_name(mp
->hghmsg
+ 1);
540 copy(nmsg
, copy("/", copy(m_maildir(fp
), fccfile
)));
541 if((i
= creat(fccfile
, m_gmprot())) == -1)
542 printf("Can't create %s\n", fccfile
);