manoj 99/10/30 01:05:10
Modified: src/include buff.h src/main buff.c http_protocol.c util_script.c src/modules/standard mod_cgi.c Log: An errnoless interface for ap_bgets Revision Changes Path 1.9 +2 -1 apache-2.0/src/include/buff.h Index: buff.h =================================================================== RCS file: /home/cvs/apache-2.0/src/include/buff.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -u -r1.8 -r1.9 --- buff.h 1999/10/30 05:25:28 1.8 +++ buff.h 1999/10/30 08:05:07 1.9 @@ -184,7 +184,8 @@ /* I/O */ API_EXPORT(ap_status_t) ap_bread(BUFF *fb, void *buf, ap_size_t nbyte, ap_ssize_t *bytes_read); -API_EXPORT(int) ap_bgets(char *s, int n, BUFF *fb); +API_EXPORT(ap_status_t) ap_bgets(char *s, int n, BUFF *fb, + ap_ssize_t *bytes_read); API_EXPORT(int) ap_blookc(BUFF *fb); API_EXPORT(ap_status_t) ap_bwrite(BUFF *fb, const void *buf, ap_size_t nbyte, ap_ssize_t *bytes_written); 1.21 +21 -10 apache-2.0/src/main/buff.c Index: buff.c =================================================================== RCS file: /home/cvs/apache-2.0/src/main/buff.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -u -r1.20 -r1.21 --- buff.c 1999/10/30 05:25:29 1.20 +++ buff.c 1999/10/30 08:05:08 1.21 @@ -429,8 +429,11 @@ * read, it is replaced by a newline character. The string is then * terminated with a null character. * - * Returns the number of bytes stored in buff, or zero on end of - * transmission, or -1 on an error. + * Works a little differently than the other BUFF functions, returning + * APR_EOF on end-of-file instead of just setting bytes_read = 0, + * because it makes code simpler. + * + * XXX - I'm undecided on keeping this function inconsistent - manoj * * Notes: * If null characters are expected in the data stream, then @@ -440,19 +443,20 @@ * CR characters in the byte stream not immediately followed by a LF * will be preserved. */ -API_EXPORT(int) ap_bgets(char *buff, int n, BUFF *fb) +API_EXPORT(ap_status_t) ap_bgets(char *buff, int n, BUFF *fb, + ap_ssize_t *bytes_read) { int i, ch, ct; ap_status_t rv; /* Can't do bgets on an unbuffered stream */ if (!(fb->flags & B_RD)) { - errno = EINVAL; - return -1; + *bytes_read = 0; + return APR_EINVAL; } if (fb->flags & B_RDERR) { - errno = fb->saved_errno; - return -1; + *bytes_read = 0; + return fb->saved_errno; } ct = 0; @@ -466,9 +470,13 @@ break; rv = read_with_errors(fb, fb->inptr, fb->bufsiz, &i); if (rv != APR_SUCCESS) { - errno = rv; buff[ct] = '\0'; - return ct ? ct : -1; + *bytes_read = ct; +#ifdef MIDWAY_ERROR_RETURNS_ERROR_BLAH_BLAH_BLAH + return rv; +#else + return *bytes_read ? APR_SUCCESS : rv; +#endif } fb->incnt = i; if (i == 0) @@ -501,7 +509,10 @@ fb->inptr += i; buff[ct] = '\0'; - return ct; + *bytes_read = ct; + if (i == 0) + return APR_EOF; + return APR_SUCCESS; } /* 1.29 +11 -10 apache-2.0/src/main/http_protocol.c Index: http_protocol.c =================================================================== RCS file: /home/cvs/apache-2.0/src/main/http_protocol.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -u -r1.28 -r1.29 --- http_protocol.c 1999/10/30 05:25:30 1.28 +++ http_protocol.c 1999/10/30 08:05:08 1.29 @@ -674,23 +674,24 @@ static int getline(char *s, int n, BUFF *in, int fold) { char *pos, next; - int retval; + ap_status_t retval; + ap_ssize_t nbytes; int total = 0; pos = s; do { - retval = ap_bgets(pos, n, in); - /* retval == -1 if error, 0 if EOF */ + retval = ap_bgets(pos, n, in, &nbytes); + /* retval == APR_EOF if EOF, normal error codes otherwise */ - if (retval <= 0) - return ((retval < 0) && (total == 0)) ? -1 : total; + if (retval != APR_SUCCESS) /* error or eof */ + return ((retval != APR_EOF) && (total == 0)) ? -1 : total; - /* retval is the number of characters read, not including NUL */ + /* nbytes is the number of characters read, not including NUL */ - n -= retval; /* Keep track of how much of s is full */ - pos += (retval - 1); /* and where s ends */ - total += retval; /* and how long s has become */ + n -= nbytes; /* Keep track of how much of s is full */ + pos += (nbytes - 1); /* and where s ends */ + total += nbytes; /* and how long s has become */ if (*pos == '\n') { /* Did we get a full line of input? */ /* @@ -715,7 +716,7 @@ * the last line was not empty and we have room in the buffer and * the next line begins with a continuation character. */ - } while (fold && (retval != 1) && (n > 1) + } while (fold && (nbytes != 1) && (n > 1) && (next = ap_blookc(in)) && ((next == ' ') || (next == '\t'))); 1.15 +2 -1 apache-2.0/src/main/util_script.c Index: util_script.c =================================================================== RCS file: /home/cvs/apache-2.0/src/main/util_script.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -u -r1.14 -r1.15 --- util_script.c 1999/10/24 19:24:02 1.14 +++ util_script.c 1999/10/30 08:05:09 1.15 @@ -616,7 +616,8 @@ static int getsfunc_BUFF(char *w, int len, void *fb) { - return ap_bgets(w, len, (BUFF *) fb) > 0; + ap_ssize_t n; /* Ignored */ + return ap_bgets(w, len, (BUFF *) fb, &n) == APR_SUCCESS; } API_EXPORT(int) ap_scan_script_header_err_buff(request_rec *r, BUFF *fb, 1.17 +19 -10 apache-2.0/src/modules/standard/mod_cgi.c Index: mod_cgi.c =================================================================== RCS file: /home/cvs/apache-2.0/src/modules/standard/mod_cgi.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -u -r1.16 -r1.17 --- mod_cgi.c 1999/10/30 05:25:31 1.16 +++ mod_cgi.c 1999/10/30 08:05:10 1.17 @@ -201,6 +201,7 @@ ap_file_t *f; int i; struct stat finfo; + ap_ssize_t n; /* Ignored */ if (!conf->logname || ((stat(ap_server_root_relative(r->pool, conf->logname), &finfo) == 0) @@ -208,19 +209,22 @@ (ap_open(&f, ap_server_root_relative(r->pool, conf->logname), APR_APPEND, APR_OS_DEFAULT, r->pool) != APR_SUCCESS)) { /* Soak up script output */ - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in) > 0) + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in, &n) + == APR_SUCCESS) continue; #ifdef WIN32 /* Soak up stderr and redirect it to the error log. * Script output to stderr is already directed to the error log * on Unix, thanks to the magic of fork(). */ - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err) > 0) { + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err, &n) + == APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_NOERRNO, 0, r, "%s", argsbuffer); } #else - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err) > 0) + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err, &n) + == APR_SUCCESS) continue; #endif return ret; @@ -256,18 +260,19 @@ if (sbuf && *sbuf) ap_fprintf(f, "%s\n", sbuf); - if (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in) > 0) { + if (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in, &n) == APR_SUCCESS) { ap_puts("%stdout\n", f); ap_puts(argsbuffer, f); - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in) > 0) + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in, &n) > 0) ap_puts(argsbuffer, f); ap_puts("\n", f); } - if (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err) > 0) { + if (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err, &n) == APR_SUCCESS) { ap_puts("%stderr\n", f); ap_puts(argsbuffer, f); - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err) > 0) + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err, &n) + == APR_SUCCESS) ap_puts(argsbuffer, f); ap_puts("\n", f); } @@ -445,6 +450,7 @@ char *argv0, *dbuf = NULL; char *command; char **argv = NULL; + ap_ssize_t n; /* Ignored */ BUFF *script_out = NULL, *script_in = NULL, *script_err = NULL; char argsbuffer[HUGE_STRING_LEN]; @@ -591,10 +597,12 @@ if (location && location[0] == '/' && r->status == 200) { /* Soak up all the script output */ - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in) > 0) { + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_in, &n) + == APR_SUCCESS) { continue; } - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err) > 0) { + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err, &n) + == APR_SUCCESS) { continue; } /* This redirect needs to be a GET no matter what the original @@ -625,7 +633,8 @@ } ap_bclose(script_in); - while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err) > 0) { + while (ap_bgets(argsbuffer, HUGE_STRING_LEN, script_err, &n) + == APR_SUCCESS) { continue; } ap_bclose(script_err);