rem: return errors;
add: return ok;
context: pipe_bytes (const char *pretty_filename, int fd, off_t n_bytes){  struct charbuffer  {    int nbytes;    char buffer[BUFSIZ];    struct charbuffer *next;  };  typedef struct charbuffer CBUFFER;  CBUFFER *first, *last, *tmp;  int i;			/* Index into buffers.  */  int total_bytes = 0;		/* Total characters in all buffers.  */  int errors = 0;  first = last = (CBUFFER *) xmalloc (sizeof (CBUFFER));  first->nbytes = 0;  first->next = NULL;  tmp = (CBUFFER *) xmalloc (sizeof (CBUFFER));  /* Input is always read into a fresh buffer.  */  while ((tmp->nbytes = safe_read (fd, tmp->buffer, BUFSIZ)) > 0)    {      tmp->next = NULL;      total_bytes += tmp->nbytes;      /* If there is enough room in the last buffer read, just append the new         one to it.  This is because when reading from a pipe, `nbytes' can         often be very small.  */      if (tmp->nbytes + last->nbytes < BUFSIZ)	{	  memcpy (&last->buffer[last->nbytes], tmp->buffer, tmp->nbytes);	  last->nbytes += tmp->nbytes;	}      else	{	  /* If there's not enough room, link the new buffer onto the end of	     the list, then either free up the oldest buffer for the next	     read if that would leave enough characters, or else malloc a new	     one.  Some compaction mechanism is possible but probably not	     worthwhile.  */	  last = last->next = tmp;	  if (total_bytes - first->nbytes > n_bytes)	    {	      tmp = first;	      total_bytes -= first->nbytes;	      first = first->next;	    }	  else	    {	      tmp = (CBUFFER *) xmalloc (sizeof (CBUFFER));	    }	}    }  if (tmp->nbytes == -1)    {      error (0, errno, "%s", pretty_filename);      errors = 1;      free ((char *) tmp);      goto free_cbuffers;    }  free ((char *) tmp);  /* Run through the list, printing characters.  First, skip over unneeded     buffers.  */  for (tmp = first; total_bytes - tmp->nbytes > n_bytes; tmp = tmp->next)    total_bytes -= tmp->nbytes;  /* Find the correct beginning, then print the rest of the file.     We made sure that `total_bytes' - `n_bytes' <= `tmp->nbytes'.  */  if (total_bytes > n_bytes)    i = total_bytes - n_bytes;  else    i = 0;  xwrite (STDOUT_FILENO, &tmp->buffer[i], tmp->nbytes - i);  for (tmp = tmp->next; tmp; tmp = tmp->next)    xwrite (STDOUT_FILENO, tmp->buffer, tmp->nbytes);free_cbuffers:  while (first)    {      tmp = first->next;      free ((char *) first);      first = tmp;    }  return errors;}