X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/5c8b15d4703e145128f51494ffc496dafd5fe718..8a204aba2ea3f7cf477af48a90afad655276e500:/uip/popsbr.c diff --git a/uip/popsbr.c b/uip/popsbr.c index 8d54e021..d4a65212 100644 --- a/uip/popsbr.c +++ b/uip/popsbr.c @@ -24,11 +24,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 *, @@ -481,14 +482,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 +506,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; }