|
|
|
@ -1112,7 +1112,7 @@ fdevent_load_file (const char * const fn, off_t *lim, log_error_st *errh, void *
|
|
|
|
|
off_t off = 0; |
|
|
|
|
do { |
|
|
|
|
rd = read(fd, buf+off, (size_t)(sz-off)); |
|
|
|
|
} while (rd > 0 ? (off += rd) != sz : errno == EINTR); |
|
|
|
|
} while (rd > 0 ? (off += rd) != sz : rd < 0 && errno == EINTR); |
|
|
|
|
if (off != sz) { /*(file truncated?)*/ |
|
|
|
|
if (rd >= 0) errno = EIO; |
|
|
|
|
break; |
|
|
|
@ -1136,3 +1136,36 @@ fdevent_load_file (const char * const fn, off_t *lim, log_error_st *errh, void *
|
|
|
|
|
errno = errnum; |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int |
|
|
|
|
fdevent_load_file_bytes (char * const buf, const off_t sz, off_t off, const char * const fn, log_error_st *errh) |
|
|
|
|
{ |
|
|
|
|
int fd = -1; |
|
|
|
|
do { |
|
|
|
|
fd = fdevent_open_cloexec(fn, 1, O_RDONLY, 0); /*(1: follows symlinks)*/ |
|
|
|
|
if (fd < 0) break; |
|
|
|
|
|
|
|
|
|
if (0 != off && (off_t)-1 == lseek(fd, off, SEEK_SET)) break; |
|
|
|
|
off = 0; |
|
|
|
|
|
|
|
|
|
ssize_t rd = 0; |
|
|
|
|
do { |
|
|
|
|
rd = read(fd, buf+off, (size_t)(sz-off)); |
|
|
|
|
} while (rd > 0 ? (off += rd) != sz : rd < 0 && errno == EINTR); |
|
|
|
|
if (off != sz) { /*(file truncated? or incorrect sz requested)*/ |
|
|
|
|
if (rd >= 0) errno = EIO; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
close(fd); |
|
|
|
|
return 0; |
|
|
|
|
} while (0); |
|
|
|
|
int errnum = errno; |
|
|
|
|
if (errh) |
|
|
|
|
log_perror(errh, __FILE__, __LINE__, "%s() %s", __func__, fn); |
|
|
|
|
if (fd >= 0) close(fd); |
|
|
|
|
safe_memclear(buf, (size_t)sz); |
|
|
|
|
errno = errnum; |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|