/* Common rewrite tail function to convert RFC822 tokens back into ** a text string. */ void rw_rewrite_print(struct rw_info *info) { char *p=rfc822_gettok(info->ptr); if (!p) clog_msg_errno(); ( (struct rw_info_rewrite *)info->udata)->buf=p; }
static void found_module(struct rw_info *rwi, struct rw_transport *t, const struct rfc822token *host, const struct rfc822token *addr) { struct getdelinfo_struct *p=(struct getdelinfo_struct *)rwi->udata; if (!t->udata) return; p->drvinfop=(drvinfo *)t->udata; char *s=rfc822_gettok(host); if (!s) clog_msg_errno(); p->host=s; free(s); s=rfc822_gettok(addr); if (!s) clog_msg_errno(); p->addr=s; free(s); }
static void do_rw_rewrite_chksyn_print(struct rw_info *info, struct rfc822token *t) { if (rw_syntaxchk(t)) { static const char errmsg[]="Syntax error: "; char *addr=rfc822_gettok(info->ptr); char *buf; if (!addr) clog_msg_errno(); buf=courier_malloc(strlen(addr)+sizeof(errmsg)); strcat(strcpy(buf, errmsg), addr); free(addr); (*info->err_func)(553, buf, info); free(buf); } else rw_rewrite_print(info); }
static void doenva(void (*writefunc)(const char *, size_t), char *s) { struct rfc822t *t; struct rfc822a *a; int i; char *q, *r; if (!s) { (*writefunc)("NIL", 3); return; } t=rfc822t_alloc_new(s, 0, 0); if (!t) { perror("malloc"); exit(0); } a=rfc822a_alloc(t); if (!a) { perror("malloc"); exit(1); } if (a->naddrs == 0) { rfc822a_free(a); rfc822t_free(t); free(s); (*writefunc)("NIL", 3); return; } (*writefunc)("(", 1); for (i=0; i<a->naddrs; i++) { (*writefunc)("(", 1); q=rfc822_display_name_tobuf(a, i, NULL); if (!q) { perror("malloc"); exit(1); } if (a->addrs[i].tokens == 0) { if (strcmp(q, ";") == 0) { (*writefunc)("NIL NIL NIL NIL)", 16); free(q); continue; } r=strrchr(q, ':'); if (r && r[1] == 0) *r=0; (*writefunc)("NIL NIL \"", 9); msgappends(writefunc, q, strlen(q)); (*writefunc)("\" NIL)", 6); free(q); continue; } if (a->addrs[i].name == 0) *q=0; /* rfc822_display_name_tobuf() defaults to addr, ignore. */ doenvs(writefunc, q); (*writefunc)(" NIL \"", 6); /* TODO @domain list */ q=rfc822_gettok(a->addrs[i].tokens); if (!q) { perror("malloc"); exit(1); } r=strrchr(q, '@'); if (r) *r++=0; msgappends(writefunc, q, strlen(q)); (*writefunc)("\" \"", 3); if (r) msgappends(writefunc, r, strlen(r)); (*writefunc)("\")", 2); free(q); } (*writefunc)(")", 1); rfc822a_free(a); rfc822t_free(t); free(s); }
static char *rewrite_from(const char *oldfrom, const char *newuser, const char *newhost, const char *newname) { struct rfc822t *rfct; struct rfc822a *rfca; struct rfc822t *usert, *hostt, *namet; struct rfc822token attoken, **tp; char *p; const char *q; char *gecosname=0; if (!oldfrom) { char *p=courier_malloc( (newuser ? strlen(newuser):0)+ (newhost ? strlen(newhost):0)+4); strcpy(p, "<"); if (newuser) strcat(p, newuser); if (newuser && newhost) strcat(strcat(p, "@"), newhost); strcat(p, ">"); if (newname) { char *q, *r; namet=tokenize_name(newname); q=rfc822_gettok(namet->tokens); rfc822t_free(namet); r=courier_malloc(strlen(p)+strlen(q)+2); strcat(strcat(strcpy(r, q), " "), p); free(p); p=r; free(q); } return (p); } if ((rfct=rfc822t_alloc_new(oldfrom, NULL, NULL)) == 0 || (rfca=rfc822a_alloc(rfct)) == 0) { clog_msg_errno(); return(0); } if ((q=env("MAILNAME")) || (q=env("NAME"))) newname=q; if (!newname && rfca->naddrs == 0) newname=gecosname=get_gecos(); if ((rfca->naddrs == 0 || rfca->addrs[0].tokens == 0) && newuser == 0) { struct passwd *pw=mypwd(); if (pw) newuser=pw->pw_name; } namet=newname ? tokenize_name(newname):0; usert=newuser ? rw_rewrite_tokenize(newuser):0; hostt=newhost ? rw_rewrite_tokenize(newhost):0; if (rfca->naddrs == 0 || rfca->addrs[0].tokens == 0) { struct rfc822addr a; struct rfc822a fakea; if (hostt) { struct rfc822token *t; attoken.token='@'; attoken.next=hostt->tokens; attoken.ptr=0; attoken.len=0; for (t=usert->tokens; t->next; t=t->next) ; t->next=&attoken; } fakea.naddrs=1; fakea.addrs= &a; if (!namet) namet=tokenize_name(""); if (!usert) usert=rw_rewrite_tokenize(""); a.name=namet->tokens; a.tokens=usert->tokens; p=rfc822_getaddrs(&fakea); } else { struct rfc822token *t, *u; rfca->naddrs=1; if (usert) { for (t=rfca->addrs[0].tokens; t; t=t->next) if (t->token == '@') break; for (u=usert->tokens; u->next; u=u->next) ; u->next=t; rfca->addrs[0].tokens=usert->tokens;; } if (hostt && rfca->addrs[0].tokens) { for (tp= &rfca->addrs[0].tokens; *tp; tp= &(*tp)->next) if ( (*tp)->token == '@') break; *tp=&attoken; attoken.token='@'; attoken.next=hostt->tokens; attoken.ptr=0; attoken.len=0; } if (namet) rfca->addrs[0].name=namet->tokens; p=rfc822_getaddrs(rfca); } if (!p) clog_msg_errno(); if (usert) rfc822t_free(usert); if (hostt) rfc822t_free(hostt); if (namet) rfc822t_free(namet); rfc822t_free(rfct); rfc822a_free(rfca); if (gecosname) free(gecosname); return (p); }