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

Reply via email to