X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fpopsbr.c;h=839e3d33d9891b485d8ddddbfb3e376d9d927ff4;hp=aa396fd23844bb060d987f062ab744c805231c99;hb=d8916ff5d389de5ab225cd6f40aeda1b285d0f28;hpb=99e5043db7ee6cf80f93708610a6e584a8068c6a diff --git a/uip/popsbr.c b/uip/popsbr.c index aa396fd..839e3d3 100644 --- a/uip/popsbr.c +++ b/uip/popsbr.c @@ -9,9 +9,7 @@ */ #include - -extern int client(char *args, char *protocol, char *service, int rproto, - char *response, int len_response); +#include #if defined(NNTP) && !defined(PSHSBR) # undef NNTP @@ -26,8 +24,8 @@ extern int client(char *args, char *protocol, char *service, int rproto, #endif #ifdef CYRUS_SASL -# include -# include +# include +# include #endif /* CYRUS_SASL */ #include @@ -80,6 +78,8 @@ static sasl_callback_t callbacks[] = { #define POP_SASL_CB_N_PASS 1 { SASL_CB_LOG, NULL, NULL }, { SASL_CB_LIST_END, NULL, NULL }, + +#define SASL_BUFFER_SIZE 262144 }; #else /* CYRUS_SASL */ # define sasl_fgetc fgetc @@ -103,9 +103,9 @@ static int pop_auth_sasl(char *, char *, char *); static int sasl_fgetc(FILE *); #endif /* CYRUS_SASL */ -static int traverse (int (*)(), const char *, ...); +static int traverse (int (*)(char *), const char *, ...); static int vcommand(const char *, va_list); -static int getline (char *, int, FILE *); +static int sasl_getline (char *, int, FILE *); static int putline (char *, FILE *); @@ -254,7 +254,7 @@ pop_auth_sasl(char *user, char *host, char *mech) */ memset(&secprops, 0, sizeof(secprops)); - secprops.maxbufsize = BUFSIZ; + secprops.maxbufsize = SASL_BUFFER_SIZE; secprops.max_ssf = UINT_MAX; result = sasl_setprop(conn, SASL_SEC_PROPS, &secprops); @@ -383,7 +383,8 @@ pop_auth_sasl(char *user, char *host, char *mech) } /* - * Limit this to what we can deal with. + * Limit this to what we can deal with. Shouldn't matter much because + * this is only outgoing data (which should be small) */ if (maxoutbuf == 0 || maxoutbuf > BUFSIZ) @@ -432,10 +433,7 @@ sasl_get_pass(sasl_conn_t *conn, void *context, int id, sasl_secret_t **psecret) len = strlen(pass); - *psecret = (sasl_secret_t *) malloc(sizeof(sasl_secret_t) + len); - - if (! *psecret) - return SASL_NOMEM; + *psecret = (sasl_secret_t *) mh_xmalloc(sizeof(sasl_secret_t) + len); (*psecret)->len = len; strcpy((char *) (*psecret)->data, pass); @@ -457,11 +455,11 @@ parse_proxy(char *proxy, char *host) int pargc = 2; int hlen = strlen(host); int plen = 1; - char *cur, *pro; + unsigned char *cur, *pro; char *c; /* skip any initial space */ - for (pro = proxy; isspace(*pro); pro++) + for (pro = (unsigned char *) proxy; isspace(*pro); pro++) continue; /* calculate required size for argument array */ @@ -476,8 +474,8 @@ parse_proxy(char *proxy, char *host) } /* put together list of arguments */ - p = pargv = malloc(pargc * sizeof(char *)); - c = *pargv = malloc(plen * sizeof(char)); + p = pargv = mh_xmalloc(pargc * sizeof(char *)); + c = *pargv = mh_xmalloc(plen * sizeof(char)); for (cur = pro; *cur; cur++) { if (isspace(*cur) && cur[1] && !isspace(cur[1])) { *c++ = '\0'; @@ -500,6 +498,13 @@ pop_init (char *host, char *user, char *pass, char *proxy, int snoop, int fd1, fd2; char buffer[BUFSIZ]; +#ifdef APOP + int apop; + + if ((apop = rpop) < 0) + rpop = 0; +#endif + if (proxy && *proxy) { int pid; int inpipe[2]; /* for reading from the server */ @@ -549,30 +554,24 @@ pop_init (char *host, char *user, char *pass, char *proxy, int snoop, } else { -#ifdef APOP - int apop; - - if ((apop = rpop) < 0) - rpop = 0; -#endif - #ifndef NNTP -# ifdef KPOP if ( kpop ) { +# ifdef KPOP snprintf (buffer, sizeof(buffer), "%s/%s", KPOP_PRINCIPAL, "kpop"); if ((fd1 = client (host, "tcp", buffer, 0, response, sizeof(response))) == NOTOK) { return NOTOK; } - } else { +# else /* KPOP */ + snprintf (response, sizeof(response), "this version of nmh compiled without KPOP support"); + return NOTOK; # endif /* KPOP */ - if ((fd1 = client (host, "tcp", POPSERVICE, rpop, response, sizeof(response))) == NOTOK) { + } else { + if ((fd1 = client (host, POPSERVICE, response, sizeof(response), snoop)) == NOTOK) { return NOTOK; } -# ifdef KPOP } -# endif /* KPOP */ #else /* NNTP */ - if ((fd1 = client (host, "tcp", "nntp", rpop, response, sizeof(response))) == NOTOK) + if ((fd1 = client (host, "nntp", response, sizeof(response), snoop)) == NOTOK) return NOTOK; #endif @@ -598,7 +597,7 @@ pop_init (char *host, char *user, char *pass, char *proxy, int snoop, SIGNAL (SIGPIPE, SIG_IGN); - switch (getline (response, sizeof response, input)) { + switch (sasl_getline (response, sizeof response, input)) { case OK: if (poprint) fprintf (stderr, "<--- %s\n", response); @@ -824,7 +823,7 @@ pop_list (int msgno, int *nmsgs, int *msgs, int *bytes) int -pop_retr (int msgno, int (*action)()) +pop_retr (int msgno, int (*action)(char *)) { #ifndef NNTP return traverse (action, "RETR %d", (targ_t) msgno); @@ -835,7 +834,7 @@ pop_retr (int msgno, int (*action)()) static int -traverse (int (*action)(), const char *fmt, ...) +traverse (int (*action)(char *), const char *fmt, ...) { int result; va_list ap; @@ -896,7 +895,7 @@ pop_rset (void) int -pop_top (int msgno, int lines, int (*action)()) +pop_top (int msgno, int lines, int (*action)(char *)) { #ifndef NNTP return traverse (action, "TOP %d %d", (targ_t) msgno, (targ_t) lines); @@ -929,20 +928,20 @@ pop_xtnd (int (*action)(), char *fmt, ...) snprintf (buffer, sizeof(buffer), fmt, a, b, c, d); ap = brkstring (buffer, " ", "\n"); /* a hack, i know... */ - if (!strcasecmp(ap[0], "x-bboards")) { /* XTND "X-BBOARDS group */ + if (!mh_strcasecmp(ap[0], "x-bboards")) { /* XTND "X-BBOARDS group */ /* most of these parameters are meaningless under NNTP. * bbc.c was modified to set AKA and LEADERS as appropriate, * the rest are left blank. */ return OK; } - if (!strcasecmp (ap[0], "archive") && ap[1]) { + if (!mh_strcasecmp (ap[0], "archive") && ap[1]) { snprintf (xtnd_name, sizeof(xtnd_name), "%s", ap[1]); /* save the name */ xtnd_last = 0; xtnd_first = 1; /* setup to fail in pop_stat */ return OK; } - if (!strcasecmp (ap[0], "bboards")) { + if (!mh_strcasecmp (ap[0], "bboards")) { if (ap[1]) { /* XTND "BBOARDS group" */ snprintf (xtnd_name, sizeof(xtnd_name), "%s", ap[1]); /* save the name */ @@ -1042,7 +1041,7 @@ vcommand (const char *fmt, va_list ap) fprintf(stderr, "(decrypted) "); #endif /* CYRUS_SASL */ - switch (getline (response, sizeof response, input)) { + switch (sasl_getline (response, sizeof response, input)) { case OK: if (poprint) fprintf (stderr, "<--- %s\n", response); @@ -1073,7 +1072,7 @@ multiline (void) { char buffer[BUFSIZ + TRMLEN]; - if (getline (buffer, sizeof buffer, input) != OK) + if (sasl_getline (buffer, sizeof buffer, input) != OK) return NOTOK; #ifdef DEBUG if (poprint) { @@ -1102,7 +1101,7 @@ multiline (void) */ static int -getline (char *s, int n, FILE *iop) +sasl_getline (char *s, int n, FILE *iop) { int c; char *p; @@ -1187,7 +1186,7 @@ sasl_fgetc(FILE *f) static int cnt = 0; unsigned int retbufsize = 0; int cc, result; - char *retbuf, tmpbuf[BUFSIZ]; + char *retbuf, tmpbuf[SASL_BUFFER_SIZE]; /* * If we have some leftover data, return that @@ -1239,12 +1238,7 @@ sasl_fgetc(FILE *f) } if (retbufsize > size) { - buffer = realloc(buffer, retbufsize); - if (!buffer) { - snprintf(response, sizeof(response), "Error during realloc in " - "read routine: %s", strerror(errno)); - return -2; - } + buffer = mh_xrealloc(buffer, retbufsize); size = retbufsize; }