Index: diab-filter.c =================================================================== RCS file: /source/diablo/diablo/filter/diab-filter.c,v retrieving revision 1.8 diff -c -r1.8 diab-filter.c *** diab-filter.c 2000/11/20 10:10:11 1.8 --- diab-filter.c 2001/02/27 05:36:17 *************** *** 32,37 **** --- 32,38 ---- #include "defs.h" Prototype int DiabFilter(char *fpath, char *loc, char *nglist); + Prototype void DiabFilter_freeMem(void); static ssize_t writeAll(int fd, char *buf, ssize_t len); void filter_failed(char *reason, char *fpath); *************** *** 46,51 **** --- 47,59 ---- time_t filter_last_fail = 0; pid_t filter_pid = 0; + int filter_abufsiz = 0; + int filter_nbufsiz = 0; + char *filter_abuf = NULL; + char *filter_nbuf = NULL; + MemPool *filter_abufPool = NULL; + MemPool *filter_nbufPool = NULL; + static ssize_t writeAll(int fd, char *buf, ssize_t len) { *************** *** 62,67 **** --- 70,89 ---- return off; } + void + DiabFilter_freeMem(void) + { + if (filter_abufPool) { + freePool(&filter_abufPool); + filter_abuf = NULL; + } + + if (filter_nbufPool) { + freePool(&filter_nbufPool); + filter_nbuf = NULL; + } + } + void filter_failed(char *reason, char *fpath) { *************** *** 257,264 **** DiabFilter(char *fpath, char *loc, char *nglist) { int rval, count, eoln, nbytes, llen; - static int abufsiz = 0, nbufsiz = 0; - static char *abuf = NULL, *nbuf = NULL; char *aptr, *nptr; if (! loc || ! (aptr = strrchr(loc, ','))) { --- 279,284 ---- *************** *** 267,288 **** llen = atoi(aptr + 1); /* get article length */ ! if (llen >= abufsiz) { count = sizeit(llen); ! if (! (aptr = (char *)realloc(abuf, count))) { ! syslog(LOG_ERR, "realloc %d failed", count); return(-1); } ! abufsiz = count; ! abuf = aptr; ! count = abufsiz * 2 + 6; ! if (! (nptr = (char *)realloc(nbuf, count))) { ! syslog(LOG_ERR, "realloc %d failed", count); return(-1); } ! nbufsiz = count; ! nbuf = nptr; } if (filter_fd_stdin < 0) { --- 287,318 ---- llen = atoi(aptr + 1); /* get article length */ ! if (llen >= filter_abufsiz) { count = sizeit(llen); ! if (filter_abuf) { ! zfree(&filter_abufPool, filter_abuf, filter_abufsiz); ! filter_abuf = NULL; ! } ! aptr = nzalloc(&filter_abufPool, count); ! if (aptr == NULL) { ! syslog(LOG_ERR, "zalloc %d failed", count); return(-1); } ! filter_abufsiz = count; ! filter_abuf = aptr; ! count = filter_abufsiz * 2 + 6; ! if (filter_nbuf) { ! zfree(&filter_nbufPool, filter_nbuf, filter_nbufsiz); ! filter_nbuf = NULL; ! } ! nptr = nzalloc(&filter_nbufPool, count); ! if (nptr == NULL) { ! syslog(LOG_ERR, "zalloc %d failed", count); return(-1); } ! filter_nbufsiz = count; ! filter_nbuf = nptr; } if (filter_fd_stdin < 0) { *************** *** 292,298 **** return(-1); } ! if ((rval = diab_read(loc, abuf, abufsiz)) < 0) { #ifdef DEBUG syslog(LOG_ERR, "diab_read failed: %s", loc); #endif --- 322,328 ---- return(-1); } ! if ((rval = diab_read(loc, filter_abuf, filter_abufsiz)) < 0) { #ifdef DEBUG syslog(LOG_ERR, "diab_read failed: %s", loc); #endif *************** *** 300,307 **** } count = rval; ! aptr = abuf; ! nptr = nbuf; eoln = 0; while (count--) { if (*aptr == '\n') { --- 330,337 ---- } count = rval; ! aptr = filter_abuf; ! nptr = filter_nbuf; eoln = 0; while (count--) { if (*aptr == '\n') { *************** *** 327,336 **** *nptr++ = '\r'; *nptr++ = '\n'; ! nbytes = nptr - nbuf; /* Send the article to the filter ... */ ! if ((rval = writeAll(filter_fd_stdin, nbuf, nbytes)) != nbytes) { syslog(LOG_ERR, "filter write failure: wanted to write %d, wrote %d: %m", nbytes, rval); filter_failed("write", fpath); close_filter_program(); --- 357,366 ---- *nptr++ = '\r'; *nptr++ = '\n'; ! nbytes = nptr - filter_nbuf; /* Send the article to the filter ... */ ! if ((rval = writeAll(filter_fd_stdin, filter_nbuf, nbytes)) != nbytes) { syslog(LOG_ERR, "filter write failure: wanted to write %d, wrote %d: %m", nbytes, rval); filter_failed("write", fpath); close_filter_program(); *************** *** 340,360 **** /* Get the response of the filter ... */ /* XXX this is Pure Evil(tm) because the response isn't going to * have to be atomic */ ! if ((rval = read(filter_fd_stdout, abuf, abufsiz)) <= 0) { syslog(LOG_ERR, "filter read failure: got %d: %m", rval); filter_failed("read", fpath); close_filter_program(); return(-1); } ! abuf[rval] = '\0'; ! if (*abuf == '3') { return(0); } ! if (*abuf == '4') { return(1); } ! syslog(LOG_ERR, "filter read failure: got unknown response: %s", abuf); return(-1); } --- 370,391 ---- /* Get the response of the filter ... */ /* XXX this is Pure Evil(tm) because the response isn't going to * have to be atomic */ ! if ((rval = read(filter_fd_stdout, filter_abuf, filter_abufsiz)) <= 0) { syslog(LOG_ERR, "filter read failure: got %d: %m", rval); filter_failed("read", fpath); close_filter_program(); return(-1); } ! filter_abuf[rval] = '\0'; ! if (*filter_abuf == '3') { return(0); } ! if (*filter_abuf == '4') { return(1); } ! syslog(LOG_ERR, "filter read failure: got unknown response: %s", ! filter_abuf); return(-1); }