diff options
Diffstat (limited to 'sink.c')
-rw-r--r-- | sink.c | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -24,6 +24,11 @@ #if defined(HAVE_UNISTD_H) #include <unistd.h> #endif +#if defined(HAVE_STDARG_H) +#include <stdarg.h> +#else +#include <varargs.h> +#endif #include "fetchmail.h" #include "socket.h" @@ -684,4 +689,61 @@ int close_sink(struct query *ctl, flag forward) return(TRUE); } +int open_warning_by_mail(struct query *ctl) +/* set up output sink for a mailed warning to calling user */ +{ + int good, bad; + + /* + * We give a null address list as arg 3 because we actually *want* + * this message to go to run.postmaster. The zero length arg 4 means + * we won't pass a SIZE option to ESMTP; the message length would + * be more trouble than it's worth to compute. + */ + return(open_sink(ctl, "FETCHMAIL-DAEMON", NULL, 0, &good, &bad)); +} + +#if defined(HAVE_STDARG_H) +void stuff_warning_line(struct query *ctl, const char *fmt, ... ) +#else +void stuff_warning_line(struct query *ctl, fmt, va_alist) +struct query *ctl; +const char *fmt; /* printf-style format */ +va_dcl +#endif +/* format and ship a warning message line by mail */ +{ + char buf[POPBUFSIZE]; + va_list ap; + + /* + * stuffline() requires its input to be writeable (for CR stripping), + * so we needed to copy the message to a writeable buffer anyway in + * case it was a string constant. We make a virtue of that necessity + * here by supporting stdargs/varargs. + */ +#if defined(HAVE_STDARG_H) + va_start(ap, fmt) ; +#else + va_start(ap); +#endif +#ifdef HAVE_VSNPRINTF + vsnprintf(buf, sizeof(buf), fmt, ap); +#else + vsprintf(buf, fmt, ap); +#endif + va_end(ap); + + strcat(buf, "\r\n"); + + stuffline(ctl, buf); +} + +void close_warning_by_mail(struct query *ctl) +/* sign and send mailed warnings */ +{ + stuff_warning_line(ctl, "--\r\n\t\t\t\tThe Fetchmail Daemon\r\n"); + close_sink(ctl, TRUE); +} + /* sink.c ends here */ |