static int smtpd_proxy_rec_fprintf(VSTREAM *stream, int rec_type, const char *fmt,...) { const char *myname = "smtpd_proxy_rec_fprintf"; va_list ap; int err = 0; /* * Errors first. */ if (vstream_ferror(stream) || vstream_feof(stream) || (err = vstream_setjmp(stream)) != 0) { (void) smtpd_proxy_rdwr_error(VSTREAM_TO_SMTPD_STATE(stream), err); return (REC_TYPE_ERROR); } /* * Send one content record. Errors and results must be as with * rec_fprintf(). */ va_start(ap, fmt); if (rec_type == REC_TYPE_NORM) smtp_vprintf(stream, fmt, ap); else msg_panic("%s: need REC_TYPE_NORM", myname); va_end(ap); return (rec_type); }
void smtp_printf(VSTREAM *stream, const char *fmt,...) { va_list ap; va_start(ap, fmt); smtp_vprintf(stream, fmt, ap); va_end(ap); }
static void command(VSTREAM *stream, char *fmt,...) { VSTRING *buf; va_list ap; /* * Optionally, log the command before actually sending, so we can see * what the program is trying to do. */ if (msg_verbose) { buf = vstring_alloc(100); va_start(ap, fmt); vstring_vsprintf(buf, fmt, ap); va_end(ap); msg_info("%s", vstring_str(buf)); vstring_free(buf); } va_start(ap, fmt); smtp_vprintf(stream, fmt, ap); va_end(ap); smtp_flush(stream); }