From: Manoj Kasichainula Date: Sat, 30 Oct 1999 08:05:10 +0000 (+0000) Subject: An errnoless interface for ap_bgets X-Git-Tag: 1.3.10~208 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9056dc8abc06c06a9bb8cf12ab81f94b6cc35118;p=thirdparty%2Fapache%2Fhttpd.git An errnoless interface for ap_bgets git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@84075 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/generators/mod_cgi.c b/modules/generators/mod_cgi.c index 08e7b2fe3f2..811989024d2 100644 --- a/modules/generators/mod_cgi.c +++ b/modules/generators/mod_cgi.c @@ -201,6 +201,7 @@ static int log_script(request_rec *r, cgi_server_conf * conf, int ret, 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 @@ static int log_script(request_rec *r, cgi_server_conf * conf, int ret, (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 @@ static int log_script(request_rec *r, cgi_server_conf * conf, int ret, 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 @@ static int cgi_handler(request_rec *r) 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 @@ static int cgi_handler(request_rec *r) 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 @@ static int cgi_handler(request_rec *r) } 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); diff --git a/modules/http/http_protocol.c b/modules/http/http_protocol.c index fd09d209368..483e46c42a7 100644 --- a/modules/http/http_protocol.c +++ b/modules/http/http_protocol.c @@ -674,23 +674,24 @@ API_EXPORT(int) ap_method_number_of(const char *method) 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 @@ static int getline(char *s, int n, BUFF *in, int fold) * 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'))); diff --git a/server/util_script.c b/server/util_script.c index 187d9015e70..ec6ed259f7c 100644 --- a/server/util_script.c +++ b/server/util_script.c @@ -616,7 +616,8 @@ API_EXPORT(int) ap_scan_script_header_err(request_rec *r, FILE *f, 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,