char *rfc822_getaddr(const struct rfc822a *rfc, int n) { return rfc822_display_addr_tobuf(rfc, n, NULL); }
static void dodel(const char *username, const char *userhome, FILE *c, char *ctl, const char *extension, const char *sender, const char *receipient, const char *defaultext, const char *quota, const char *defaultmail, int recursion_level) { char *ufromline; char *dtline; char *rpline; time_t t; const char *curtime; time(&t); curtime=ctime(&t); if ((ufromline=malloc(strlen(curtime)+strlen(sender)+30))==0|| (dtline=malloc(strlen(receipient)+ sizeof("Delivered-To: "))) == 0 || (rpline=malloc(strlen(sender) + sizeof("Return-Path: <>"))) == 0) { perror("malloc"); exit(EX_TEMPFAIL); } if ( (!ctl || !*ctl) && recursion_level == 0) { const char *p= *defaultmail ? defaultmail:config_defaultdelivery(); if ((ctl=malloc(strlen(p)+1)) == 0) { perror("malloc"); exit(EX_TEMPFAIL); } strcpy(ctl, p); } sprintf(ufromline, "From %s %s", sender, curtime); { char *p; if ((p=strchr(ufromline, '\n')) != 0) *p=0; } strcat(strcpy(dtline, "Delivered-To: "), receipient); strcat(strcat(strcpy(rpline, "Return-Path: <"), sender), ">"); while (*ctl) { if (*ctl == '#' || *ctl == '\n') { while (*ctl) if (*ctl++ == '\n') break; continue; } /* ** The fd hack is needed for BSD, whose C lib doesn't like ** mixing stdio and unistd seek calls. */ if (*ctl == '.' || *ctl == '/') { const char *filename=ctl; int fd_hack=dup(fileno(stdin)); FILE *fp_hack; if (fd_hack < 0 || lseek(fd_hack, 0L, SEEK_SET) < 0 || (fp_hack=fdopen(fd_hack, "r")) == NULL) { perror("dup"); exit(EX_TEMPFAIL); } while (*ctl) { if (*ctl == '/' && (ctl[1] == '\n' || ctl[1] == 0)) *ctl=0; /* Strip trailing / */ if (*ctl == '\n') { *ctl++='\0'; break; } ++ctl; } if (savemessage(extension, sender, receipient, fp_hack, filename, ufromline, dtline, rpline, quota)) exit(EX_TEMPFAIL); fclose(fp_hack); close(fd_hack); continue; } if (*ctl == '|') { const char *command=++ctl; int rc; int fd_hack=dup(fileno(stdin)); FILE *fp_hack; if (fd_hack < 0 || lseek(fd_hack, 0L, SEEK_SET) < 0 || (fp_hack=fdopen(fd_hack, "r")) == NULL) { perror("dup"); exit(EX_TEMPFAIL); } ctl=skip_eol(ctl, 0); while (*command == ' ' || *command == '\t') ++command; rc=docommand(extension, sender, receipient, defaultext, fp_hack, username, userhome, command, dtline, rpline, ufromline, quota, defaultmail, recursion_level); if (rc) exit(rc); fclose(fp_hack); close(fd_hack); continue; } /* Forwarding instructions, parse RFC822 addresses */ if (*ctl == '&' || *ctl == '!') ++ctl; /* Legacy */ { const char *addresses=ctl; struct rfc822t *tokens; struct rfc822a *addrlist; int n; ctl=skip_eol(ctl, 1); if ((tokens=rfc822t_alloc_new(addresses, NULL, NULL)) == 0 || (addrlist=rfc822a_alloc(tokens)) == 0) { perror("malloc"); exit(EX_TEMPFAIL); } for (n=0; n<addrlist->naddrs; ++n) { char *p; if (addrlist->addrs[n].tokens == NULL) continue; p=rfc822_display_addr_tobuf(addrlist, n, NULL); if (!p) { perror(addresses); exit(EX_TEMPFAIL); } printf("%s\n", p); free(p); } rfc822a_free(addrlist); rfc822t_free(tokens); fflush(stdout); } } free(rpline); free(dtline); free(ufromline); }