X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/5c8b15d4703e145128f51494ffc496dafd5fe718..8e5bcb24340597d842ff02eadd73bd9f775ea80a:/uip/popsbr.c?ds=inline diff --git a/uip/popsbr.c b/uip/popsbr.c index 8d54e021..d79c8b3d 100644 --- a/uip/popsbr.c +++ b/uip/popsbr.c @@ -12,6 +12,7 @@ #include #include +#include "sbr/base64.h" #define TRM "." @@ -24,11 +25,12 @@ static netsec_context *nsc = NULL; * static prototypes */ -static int command(const char *, ...); +static int command(const char *, ...) CHECK_PRINTF(1, 2); static int multiline(void); -static int traverse (int (*)(char *), const char *, ...); -static int vcommand(const char *, va_list); +static int traverse(int (*)(void *, char *), void *closure, + const char *, ...) CHECK_PRINTF(3, 4); +static int vcommand(const char *, va_list) CHECK_PRINTF(1, 0); static int pop_getline (char *, int, netsec_context *); static int pop_sasl_callback(enum sasl_message_type, unsigned const char *, unsigned int, unsigned char **, unsigned int *, @@ -54,23 +56,16 @@ check_mech(char *server_mechs, size_t server_mechs_size) return NOTOK; } - while ((status = multiline()) != DONE) - switch (status) { - case NOTOK: + while ((status = multiline()) != DONE) { + if (status == NOTOK) return NOTOK; - break; - case DONE: /* Shouldn't be possible, but just in case */ - break; - case OK: - if (strncasecmp(response, "SASL ", 5) == 0) { - /* - * We've seen the SASL capability. Grab the mech list - */ - sasl_capability++; - strncpy(server_mechs, response + 5, server_mechs_size); - } - break; - } + + if (strncasecmp(response, "SASL ", 5) == 0) { + /* We've seen the SASL capability. Grab the mech list. */ + sasl_capability++; + strncpy(server_mechs, response + 5, server_mechs_size); + } + } if (!sasl_capability) { snprintf(response, sizeof(response), "POP server does not support " @@ -113,7 +108,7 @@ parse_proxy(char *proxy, char *host) /* put together list of arguments */ p = pargv = mh_xmalloc(pargc * sizeof(char *)); - c = *pargv = mh_xmalloc(plen * sizeof(char)); + c = *pargv = mh_xmalloc(plen); for (cur = pro; *cur; cur++) { if (isspace(*cur) && cur[1] && !isspace(cur[1])) { *c++ = '\0'; @@ -187,7 +182,7 @@ pop_init (char *host, char *port, char *user, char *proxy, int snoop, close(1); free(*argv); free(argv); - exit(10); + exit(1); } /* okay in the parent we do some stuff */ @@ -275,8 +270,10 @@ pop_init (char *host, char *port, char *user, char *proxy, int snoop, case NOTOK: case DONE: - if (poprint) - fprintf (stderr, "%s\n", response); + if (poprint) { + fputs(response, stderr); + putc('\n', stderr); + } netsec_shutdown(nsc); nsc = NULL; return NOTOK; @@ -481,14 +478,14 @@ pop_stat (int *nmsgs, int *nbytes) int -pop_retr (int msgno, int (*action)(char *)) +pop_retr (int msgno, int (*action)(void *, char *), void *closure) { - return traverse (action, "RETR %d", msgno); + return traverse (action, closure, "RETR %d", msgno); } static int -traverse (int (*action)(char *), const char *fmt, ...) +traverse (int (*action)(void *, char *), void *closure, const char *fmt, ...) { int result, snoopstate; va_list ap; @@ -505,21 +502,21 @@ traverse (int (*action)(char *), const char *fmt, ...) if ((snoopstate = netsec_get_snoop(nsc))) netsec_set_snoop(nsc, 0); - for (;;) - switch (multiline ()) { - case NOTOK: - netsec_set_snoop(nsc, snoopstate); - return NOTOK; - - case DONE: - strncpy (response, buffer, sizeof(response)); - netsec_set_snoop(nsc, snoopstate); - return OK; + for (;;) { + result = multiline(); + if (result == OK) { + result = (*action)(closure, response); + if (result == OK) + continue; + } else if (result == DONE) { + strncpy(response, buffer, sizeof(response)); + result = OK; + } + break; + } - case OK: - (*action) (response); - break; - } + netsec_set_snoop(nsc, snoopstate); + return result; } @@ -597,12 +594,14 @@ vcommand (const char *fmt, va_list ap) case OK: if (poprint) fprintf (stderr, "<--- %s\n", response); - return (*response == '+' ? OK : NOTOK); + return *response == '+' ? OK : NOTOK; case NOTOK: case DONE: - if (poprint) - fprintf (stderr, "%s\n", response); + if (poprint) { + fputs(response, stderr); + putc('\n', stderr); + } return NOTOK; }