manoj       99/10/25 14:12:42

  Modified:    src/main buff.c
  Log:
  The first layer of buff changes to abandon errno. Now .*_with_errors and
  doerror are errno independant, but export the old errno-using interface.
  
  Revision  Changes    Path
  1.12      +54 -49    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.11
  retrieving revision 1.12
  diff -u -d -u -r1.11 -r1.12
  --- buff.c    1999/10/24 19:23:57     1.11
  +++ buff.c    1999/10/25 21:12:34     1.12
  @@ -136,13 +136,11 @@
   
   static void doerror(BUFF *fb, int direction)
   {
  -    int errsave = errno;     /* Save errno to prevent overwriting it below */
  -
  +    /* TODO: doerror should look at fb->saved_errno instead of errno */
  +    errno = fb->saved_errno;
       fb->flags |= (direction == B_RD ? B_RDERR : B_WRERR);
       if (fb->error != NULL)
        (*fb->error) (fb, direction, fb->error_data);
  -
  -    errno = errsave;
   }
   
   /* Buffering routines */
  @@ -316,24 +314,22 @@
   
   
   /* a wrapper around iol_read which checks for errors and EOFs */
  -static int read_with_errors(BUFF *fb, void *buf, int nbyte)
  +static ap_status_t read_with_errors(BUFF *fb, void *buf, ap_size_t nbyte,
  +                                    ap_ssize_t *bytes_read)
   {
  -    int rv;
  -    ap_ssize_t bytes_read;
  +    ap_status_t rv;
   
  -    rv = iol_read(fb->iol, buf, nbyte, &bytes_read);
  -    if (rv == APR_SUCCESS && bytes_read == 0) {
  +    rv = iol_read(fb->iol, buf, nbyte, bytes_read);
  +    if (rv == APR_SUCCESS && *bytes_read == 0) {
        fb->flags |= B_EOF;
       }
       else if (rv != APR_SUCCESS) {
  -        errno = rv;
        fb->saved_errno = rv;
        if (rv != APR_EAGAIN) {
            doerror(fb, B_RD);
        }
  -        return -1;
       }
  -    return bytes_read;
  +    return rv;
   }
   
   
  @@ -345,6 +341,7 @@
   API_EXPORT(int) ap_bread(BUFF *fb, void *buf, int nbyte)
   {
       int i, nrd;
  +    ap_status_t rv;
   
       if (fb->flags & B_RDERR) {
        errno = fb->saved_errno;
  @@ -363,7 +360,12 @@
            fb->inptr += i;
            return i;
        }
  -     return read_with_errors(fb, buf, nbyte);
  +     rv = read_with_errors(fb, buf, nbyte, &i);
  +        if (rv == APR_SUCCESS) {
  +            return i;
  +        }
  +        errno = rv;
  +        return -1;
       }
   
       nrd = fb->incnt;
  @@ -387,16 +389,18 @@
   /* do a single read */
       if (nbyte >= fb->bufsiz) {
   /* read directly into caller's buffer */
  -     i = read_with_errors(fb, buf, nbyte);
  -     if (i == -1) {
  +     rv = read_with_errors(fb, buf, nbyte, &i);
  +     if (rv != APR_SUCCESS) {
  +            errno = rv;
            return nrd ? nrd : -1;
        }
       }
       else {
   /* read into hold buffer, then memcpy */
        fb->inptr = fb->inbase;
  -     i = read_with_errors(fb, fb->inptr, fb->bufsiz);
  -     if (i == -1) {
  +     rv = read_with_errors(fb, fb->inptr, fb->bufsiz, &i);
  +     if (rv != APR_SUCCESS) {
  +            errno = rv;
            return nrd ? nrd : -1;
        }
        fb->incnt = i;
  @@ -431,6 +435,7 @@
   API_EXPORT(int) ap_bgets(char *buff, int n, BUFF *fb)
   {
       int i, ch, ct;
  +    ap_status_t rv;
   
   /* Can't do bgets on an unbuffered stream */
       if (!(fb->flags & B_RD)) {
  @@ -451,8 +456,9 @@
            fb->incnt = 0;
            if (fb->flags & B_EOF)
                break;
  -         i = read_with_errors(fb, fb->inptr, fb->bufsiz);
  -         if (i == -1) {
  +         rv = read_with_errors(fb, fb->inptr, fb->bufsiz, &i);
  +         if (rv != APR_SUCCESS) {
  +                errno = rv;
                buff[ct] = '\0';
                return ct ? ct : -1;
            }
  @@ -540,51 +546,51 @@
   /* A wrapper for writev which deals with error conditions and
    * bytes_sent.
    */
  -static int writev_with_errors(BUFF *fb, const struct iovec *vec, int nvec)
  +static ap_status_t writev_with_errors(BUFF *fb, const struct iovec *vec,
  +                                      int nvec, ap_ssize_t *bytes_written)
   {
  -    int rv;
  -    ap_ssize_t bytes_written;
  +    ap_status_t rv;
   
  -    rv = iol_writev(fb->iol, vec, nvec, &bytes_written);
  +    rv = iol_writev(fb->iol, vec, nvec, bytes_written);
       if (rv != APR_SUCCESS) {
  -        errno = rv;
        fb->saved_errno = rv;
        if (rv != APR_EAGAIN) {
            doerror(fb, B_WR);
        }
  -     return -1;
       }
  -    fb->bytes_sent += bytes_written;
  -    return bytes_written;
  +    fb->bytes_sent += *bytes_written;
  +    return rv;
   }
   
   
   static int writev_it_all(BUFF *fb, struct iovec *vec, int nvec)
   {
       int i;
  -    int rv;
  +    ap_status_t rv;
  +    ap_ssize_t bytes_written;
       int total;
   
       i = 0;
       total = 0;
       while (i < nvec) {
  -     rv = writev_with_errors(fb, vec + i, nvec - i);
  -     if (rv < 0) {
  +     rv = writev_with_errors(fb, vec + i, nvec - i, &bytes_written);
  +     if (rv != APR_SUCCESS) {
  +            errno = rv;
            return total ? total : -1;
        }
  -     total += rv;
  +     total += bytes_written;
        if (fb->flags & B_NONBLOCK) {
            return total;
        }
        /* recalculate to deal with partial writes */
  -     while (rv > 0) {
  -            if (rv < vec[i].iov_len) {
  -                vec[i].iov_base = (char *) vec[i].iov_base + rv;
  -                vec[i].iov_len -= rv;
  +     while (bytes_written > 0) {
  +            if (bytes_written < vec[i].iov_len) {
  +                vec[i].iov_base = (char *) vec[i].iov_base + bytes_written;
  +                vec[i].iov_len -= bytes_written;
                   break;
               }
               else {
  -                rv -= vec[i].iov_len;
  +                bytes_written -= vec[i].iov_len;
                   ++i;
               }
           }
  @@ -687,45 +693,44 @@
   /* A wrapper for write which deals with error conditions and
    * bytes_sent.
    */
  -static int write_with_errors(BUFF *fb, const void *buf, int nbyte)
  +static ap_status_t write_with_errors(BUFF *fb, const void *buf, ap_size_t 
nbyte,
  +                                     ap_ssize_t *bytes_written)
   {
  -    int rv;
  -    ap_ssize_t bytes_written;
  +    ap_status_t rv;
   
  -    rv = iol_write(fb->iol, buf, nbyte, &bytes_written);
  +    rv = iol_write(fb->iol, buf, nbyte, bytes_written);
       if (rv != APR_SUCCESS) {
  -        errno = rv;
        fb->saved_errno = rv;
        if (rv != APR_EAGAIN) {
            doerror(fb, B_WR);
        }
  -     return -1;
       }
  -    fb->bytes_sent += bytes_written;
  -    return bytes_written;
  +    fb->bytes_sent += *bytes_written;
  +    return rv;
   }
   
   
   static int bflush_core(BUFF *fb)
   {
       int total;
  -    int rv;
  +    ap_ssize_t bytes_written;
   
       if (fb->flags & B_CHUNK) {
        end_chunk(fb, 0);
       }
       total = 0;
       while (fb->outcnt > 0) {
  -     rv = write_with_errors(fb, fb->outbase + total, fb->outcnt);
  -     if (rv <= 0) {
  +     (void) write_with_errors(fb, fb->outbase + total, fb->outcnt,
  +                                 &bytes_written);
  +     if (bytes_written <= 0) {       /* error or eof */
            if (total) {
                memmove(fb->outbase, fb->outbase + total, fb->outcnt);
                return total;
            }
            return -1;
        }
  -     fb->outcnt -= rv;
  -     total += rv;
  +     fb->outcnt -= bytes_written;
  +     total += bytes_written;
       }
       if (fb->flags & B_CHUNK) {
        start_chunk(fb);
  
  
  

Reply via email to