Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

#include "common.h"
#include "send.h"


/* dispose of local addresses */
int
cat_mail(dest *dp, message *mp)
{
        Biobuf *fp;
        char *rcvr, *cp;
        Mlock *l;
        String *tmp, *s;
        int i, n;

        s = unescapespecial(s_clone(dp->repl1));
        if (nflg) {
                if(!xflg)
                        print("cat >> %s\n", s_to_c(s));
                else
                        print("%s\n", s_to_c(dp->addr));
                s_free(s);
                return 0;
        }
        for(i = 0;; i++){
                l = syslock(s_to_c(s));
                if(l == 0)
                        return refuse(dp, mp, "can't lock mail file", 0, 0);

                fp = sysopen(s_to_c(s), "al", MBOXMODE);
                if(fp)
                        break;
                tmp = s_append(0, s_to_c(s));
                s_append(tmp, ".tmp");
                fp = sysopen(s_to_c(tmp), "al", MBOXMODE);
                if(fp){
                        syslog(0, "mail", "error: used %s", s_to_c(tmp));
                        s_free(tmp);
                        break;
                }
                s_free(tmp);
                sysunlock(l);
                if(i >= 5)
                        return refuse(dp, mp, "mail file cannot be opened", 0, 0);
                sleep(1000);
        }
        s_free(s);
        n = m_print(mp, fp, (char *)0, 1);
        if (Bprint(fp, "\n") < 0 || Bflush(fp) < 0 || n < 0){
                sysclose(fp);
                sysunlock(l);
                return refuse(dp, mp, "error writing mail file", 0, 0);
        }
        sysclose(fp);
        sysunlock(l);
        rcvr = s_to_c(dp->addr);
        if(cp = strrchr(rcvr, '!'))
                rcvr = cp+1;
        logdelivery(dp, rcvr, mp);
        return 0;
}