pike.git / src / modules / _Stdio / file.c

version» Context lines:

pike.git/src/modules/_Stdio/file.c:750:    int e = 0;       buffer_set_flags(&buf, BUFFER_GROW_EXACT);       while (bytes) {    size_t len = MINIMUM(DIRECT_BUFSIZE, bytes);    ptrdiff_t i;       /* make space for exactly len bytes plus the terminating null byte */    if (UNLIKELY(!buffer_ensure_space_nothrow(&buf, len+1))) { -  buffer_free(&buf); +     e = ENOMEM;    break;    }       THREADS_ALLOW();       i = fd_read(fd, buffer_alloc_unsafe(&buf, len), len);       THREADS_DISALLOW();    -  check_threads_etc(); -  +     if (LIKELY(i >= 0)) {    if ((size_t)i < len) buffer_remove(&buf, len - i);    bytes -= i;    if (!i || !all) break;    } else {    e=errno; -  +  buffer_remove(&buf, len); +  +  check_threads_etc(); +     if (e == EINTR) {    e = 0; -  buffer_remove(&buf, len); +     continue;    }    -  buffer_free(&buf); +     break;    }    }       -  if (e) { +  if (e && !buffer_content_length(&buf)) { +  buffer_free(&buf);    *err = e;    return NULL;    }       if(!SAFE_IS_ZERO(& THIS->event_cbs[PIKE_FD_READ]))    ADD_FD_EVENTS (THIS, PIKE_BIT_FD_READ);       return buffer_finish_pike_string(&buf);   }