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);