X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/47e4d2685ab31e71336a7806fdc3dcd2a107f60f..07916b2ff:/uip/popsbr.c?ds=inline diff --git a/uip/popsbr.c b/uip/popsbr.c index 0d655b84..ca6599e0 100644 --- a/uip/popsbr.c +++ b/uip/popsbr.c @@ -27,7 +27,7 @@ static netsec_context *nsc = NULL; static int command(const char *, ...); static int multiline(void); -static int traverse (int (*)(char *), const char *, ...); +static int traverse (int (*)(void *, char *), void *closure, const char *, ...); static int vcommand(const char *, va_list); static int pop_getline (char *, int, netsec_context *); static int pop_sasl_callback(enum sasl_message_type, unsigned const char *, @@ -277,7 +277,7 @@ pop_init (char *host, char *port, char *user, char *proxy, int snoop, case DONE: if (poprint) fprintf (stderr, "%s\n", response); - netsec_shutdown(nsc, 1); + netsec_shutdown(nsc); nsc = NULL; return NOTOK; } @@ -481,66 +481,14 @@ pop_stat (int *nmsgs, int *nbytes) int -pop_list (int msgno, int *nmsgs, int *msgs, int *bytes) +pop_retr (int msgno, int (*action)(void *, char *), void *closure) { - int i; - int *ids = NULL; - - if (msgno) { - if (command ("LIST %d", msgno) == NOTOK) - return NOTOK; - *msgs = *bytes = 0; - if (ids) { - *ids = 0; - sscanf (response, "+OK %d %d %d", msgs, bytes, ids); - } - else - sscanf (response, "+OK %d %d", msgs, bytes); - return OK; - } - - if (command ("LIST") == NOTOK) - return NOTOK; - - for (i = 0; i < *nmsgs; i++) - switch (multiline ()) { - case NOTOK: - return NOTOK; - case DONE: - *nmsgs = ++i; - return OK; - case OK: - *msgs = *bytes = 0; - if (ids) { - *ids = 0; - sscanf (response, "%d %d %d", - msgs++, bytes++, ids++); - } - else - sscanf (response, "%d %d", msgs++, bytes++); - break; - } - for (;;) - switch (multiline ()) { - case NOTOK: - return NOTOK; - case DONE: - return OK; - case OK: - break; - } -} - - -int -pop_retr (int msgno, int (*action)(char *)) -{ - 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; @@ -557,21 +505,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; } @@ -582,27 +530,6 @@ pop_dele (int msgno) } -int -pop_noop (void) -{ - return command ("NOOP"); -} - - -int -pop_rset (void) -{ - return command ("RSET"); -} - - -int -pop_top (int msgno, int lines, int (*action)(char *)) -{ - return traverse (action, "TOP %d %d", msgno, lines); -} - - int pop_quit (void) { @@ -619,7 +546,7 @@ int pop_done (void) { if (nsc) - netsec_shutdown(nsc, 1); + netsec_shutdown(nsc); return OK; }