Changeset 3266


Ignore:
Timestamp:
May 1, 2007, 5:50:01 PM (18 years ago)
Author:
bird
Message:

Same problem as in zread.c with \r\n -> \n translation screwing up lseek assumptions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/essentials/app-shells/bash/input.c

    r3259 r3266  
    446446{
    447447  ssize_t nr;
     448#ifdef __OS2__
     449  off_t end, start = bp->b_size > 1 ? lseek (bp->b_fd, 0, SEEK_CUR) : -1;
     450#endif
    448451
    449452  nr = zread (bp->b_fd, bp->b_buffer, bp->b_size);
    450453  if (nr <= 0)
    451454    {
     455#ifdef __OS2__
     456l_readerror:
     457#endif
    452458      bp->b_used = 0;
    453459      bp->b_buffer[0] = 0;
     
    459465    }
    460466
    461 #if defined (__CYGWIN__) || defined (__OS2__)
    462   /* If on cygwin and OS/2, translate \r\n to \n. */
     467#ifdef __OS2__
     468  /* \r\n -> \n translation screws us down in sync_buffered_stream,
     469     so, we have to check if translation took place and wind back
     470     to right before the first one. New line characters are read
     471     one by one. (Same as in zread.c.) */
     472  if (start >= 0
     473   && (end = lseek (bp->b_fd, 0, SEEK_CUR)) > 0
     474   && nr != end - start)
     475    {
     476      if (bp->b_buffer[0] == '\n')
     477        {
     478          if (lseek (bp->b_fd, start, SEEK_SET) >= 0)
     479            {
     480              nr = zread (bp->b_fd, bp->b_buffer, 1);
     481              if (nr <= 0)
     482                goto l_readerror;
     483            }
     484        }
     485      else
     486        {
     487          char *nl = memchr (&bp->b_buffer[0], '\n', nr);
     488          if (nl != NULL
     489           && lseek (bp->b_fd, start + (nl - &bp->b_buffer[0]), SEEK_SET) >= 0)
     490              nr = nl - &bp->b_buffer[0];
     491        }
     492    }
     493#endif
     494
     495#if defined (__CYGWIN__)
     496  /* If on cygwin, translate \r\n to \n. */
    463497  if (nr >= 2 && bp->b_buffer[nr - 2] == '\r' && bp->b_buffer[nr - 1] == '\n')
    464498    {
Note: See TracChangeset for help on using the changeset viewer.