plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

cat_mail.c (1190B)


      1 #include "common.h"
      2 #include "send.h"
      3 
      4 
      5 /* dispose of local addresses */
      6 int
      7 cat_mail(dest *dp, message *mp)
      8 {
      9 	Biobuf *fp;
     10 	char *rcvr, *cp;
     11 	Mlock *l;
     12 	String *tmp, *s;
     13 	int i, n;
     14 
     15 	s = unescapespecial(s_clone(dp->repl1));
     16 	if (nflg) {
     17 		if(!xflg)
     18 			print("cat >> %s\n", s_to_c(s));
     19 		else
     20 			print("%s\n", s_to_c(dp->addr));
     21 		s_free(s);
     22 		return 0;
     23 	}
     24 	for(i = 0;; i++){
     25 		l = syslock(s_to_c(s));
     26 		if(l == 0)
     27 			return refuse(dp, mp, "can't lock mail file", 0, 0);
     28 
     29 		fp = sysopen(s_to_c(s), "al", MBOXMODE);
     30 		if(fp)
     31 			break;
     32 		tmp = s_append(0, s_to_c(s));
     33 		s_append(tmp, ".tmp");
     34 		fp = sysopen(s_to_c(tmp), "al", MBOXMODE);
     35 		if(fp){
     36 			syslog(0, "mail", "error: used %s", s_to_c(tmp));
     37 			s_free(tmp);
     38 			break;
     39 		}
     40 		s_free(tmp);
     41 		sysunlock(l);
     42 		if(i >= 5)
     43 			return refuse(dp, mp, "mail file cannot be opened", 0, 0);
     44 		sleep(1000);
     45 	}
     46 	s_free(s);
     47 	n = m_print(mp, fp, (char *)0, 1);
     48 	if (Bprint(fp, "\n") < 0 || Bflush(fp) < 0 || n < 0){
     49 		sysclose(fp);
     50 		sysunlock(l);
     51 		return refuse(dp, mp, "error writing mail file", 0, 0);
     52 	}
     53 	sysclose(fp);
     54 	sysunlock(l);
     55 	rcvr = s_to_c(dp->addr);
     56 	if(cp = strrchr(rcvr, '!'))
     57 		rcvr = cp+1;
     58 	logdelivery(dp, rcvr, mp);
     59 	return 0;
     60 }