diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-03-12 17:15:03 +0100 |
commit | 963cfc9a6f6e721f52aa949e6d1af0c3e8dc2ecc (patch) | |
tree | 749b74875dbc49bcf6ed0776648b8f0ef9417407 /sys/src/cmd/upas/ml/ml.c | |
parent | 8177d20fb2709ba9290dfd41308b8e5bee4e00f8 (diff) |
merging erik quanstros nupas
Diffstat (limited to 'sys/src/cmd/upas/ml/ml.c')
-rw-r--r-- | sys/src/cmd/upas/ml/ml.c | 187 |
1 files changed, 98 insertions, 89 deletions
diff --git a/sys/src/cmd/upas/ml/ml.c b/sys/src/cmd/upas/ml/ml.c index 213475434..4d35da28d 100644 --- a/sys/src/cmd/upas/ml/ml.c +++ b/sys/src/cmd/upas/ml/ml.c @@ -1,16 +1,89 @@ #include "common.h" #include "dat.h" -Biobuf in; +Biobuf in; +Addr *al; +int na; +String *from; +String *sender; + +char* +trim(char *s) +{ + while(*s == ' ' || *s == '\t') + s++; + return s; +} -Addr *al; -int na; -String *from; -String *sender; +/* add the listname to the subject */ +void +printsubject(int fd, Field *f, char *listname) +{ + char *s, *e, *ln; + Node *p; -void printmsg(int fd, String *msg, char *replyto, char *listname); -void appendtoarchive(char* listname, String *firstline, String *msg); -void printsubject(int fd, Field *f, char *listname); + if(f == nil || f->node == nil){ + fprint(fd, "Subject: [%s]\n", listname); + return; + } + s = e = f->node->end + 1; + for(p = f->node; p; p = p->next) + e = p->end; + *e = 0; + ln = smprint("[%s]", listname); + if(ln != nil && strstr(s, ln) == nil) + fprint(fd, "Subject: %s %s\n", ln, trim(s)); + else + fprint(fd, "Subject: %s\n", trim(s)); + free(ln); + *e = '\n'; +} + +/* send message filtering Reply-to out of messages */ +void +printmsg(int fd, String *msg, char *replyto, char *listname) +{ + Field *f, *subject; + Node *p; + char *cp, *ocp; + + subject = nil; + cp = s_to_c(msg); + for(f = firstfield; f; f = f->next){ + ocp = cp; + for(p = f->node; p; p = p->next) + cp = p->end+1; + switch(f->node->c){ + case SUBJECT: + subject = f; + case REPLY_TO: + case PRECEDENCE: + continue; + } + write(fd, ocp, cp-ocp); + } + printsubject(fd, subject, listname); + fprint(fd, "Reply-To: %s\nPrecedence: bulk\n", replyto); + write(fd, cp, s_len(msg) - (cp - s_to_c(msg))); +} + +/* if the mailbox exists, cat the mail to the end of it */ +void +appendtoarchive(char* listname, String *firstline, String *msg) +{ + char *f; + Biobuf *b; + + f = foldername(nil, listname, "mbox"); + if(access(f, 0) < 0) + return; + if((b = openfolder(f, time(0))) == nil) + return; + Bwrite(b, s_to_c(firstline), s_len(firstline)); + Bwrite(b, s_to_c(msg), s_len(msg)); + Bwrite(b, "\n", 1); + closefolder(b); +} void usage(void) @@ -22,16 +95,21 @@ usage(void) void main(int argc, char **argv) { - String *msg; - String *firstline; - char *listname, *alfile; + char *listname, *alfile, *replytoname; + int fd, private; + String *msg, *firstline; Waitmsg *w; - int fd; - char *replytoname = nil; + private = 0; + replytoname = nil; ARGBEGIN{ + default: + usage(); + case 'p': + private = 1; + break; case 'r': - replytoname = ARGF(); + replytoname = EARGF(usage()); break; }ARGEND; @@ -56,8 +134,10 @@ main(int argc, char **argv) if(s_read_line(&in, firstline) == nil) sysfatal("reading input: %r"); - /* read up to the first 128k of the message. more is ridiculous. - Not if word documents are distributed. Upped it to 2MB (pb) */ + /* + * read up to the first 128k of the message. more is ridiculous. + * Not if word documents are distributed. Upped it to 2MB (pb) + */ if(s_read(&in, msg, 2*1024*1024) <= 0) sysfatal("reading input: %r"); @@ -73,7 +153,8 @@ main(int argc, char **argv) sysfatal("message must contain From: or Sender:"); if(strcmp(listname, s_to_c(from)) == 0) sysfatal("can't remail messages from myself"); - addaddr(s_to_c(from)); + if(addaddr(s_to_c(from)) != 0 && private) + sysfatal("not a list member"); /* start the mailer up and return a pipe to it */ fd = startmailer(listname); @@ -93,75 +174,3 @@ main(int argc, char **argv) appendtoarchive(listname, firstline, msg); exits(0); } - -/* send message filtering Reply-to out of messages */ -void -printmsg(int fd, String *msg, char *replyto, char *listname) -{ - Field *f, *subject; - Node *p; - char *cp, *ocp; - - subject = nil; - cp = s_to_c(msg); - for(f = firstfield; f; f = f->next){ - ocp = cp; - for(p = f->node; p; p = p->next) - cp = p->end+1; - if(f->node->c == REPLY_TO) - continue; - if(f->node->c == PRECEDENCE) - continue; - if(f->node->c == SUBJECT){ - subject = f; - continue; - } - write(fd, ocp, cp-ocp); - } - printsubject(fd, subject, listname); - fprint(fd, "Reply-To: %s\nPrecedence: bulk\n", replyto); - write(fd, cp, s_len(msg) - (cp - s_to_c(msg))); -} - -/* if the mailbox exists, cat the mail to the end of it */ -void -appendtoarchive(char* listname, String *firstline, String *msg) -{ - String *mbox; - int fd; - - mbox = s_new(); - mboxpath("mbox", listname, mbox, 0); - if(access(s_to_c(mbox), 0) < 0) - return; - fd = open(s_to_c(mbox), OWRITE); - if(fd < 0) - return; - s_append(msg, "\n"); - write(fd, s_to_c(firstline), s_len(firstline)); - write(fd, s_to_c(msg), s_len(msg)); -} - -/* add the listname to the subject */ -void -printsubject(int fd, Field *f, char *listname) -{ - char *s, *e; - Node *p; - char *ln; - - if(f == nil || f->node == nil){ - fprint(fd, "Subject: [%s]\n", listname); - return; - } - s = e = f->node->end + 1; - for(p = f->node; p; p = p->next) - e = p->end; - *e = 0; - ln = smprint("[%s]", listname); - if(ln != nil && strstr(s, ln) == nil) - fprint(fd, "Subject: %s%s\n", ln, s); - else - fprint(fd, "Subject:%s\n", s); - free(ln); -} |