diff options
Diffstat (limited to 'src/io.c')
-rw-r--r-- | src/io.c | 22 |
1 files changed, 11 insertions, 11 deletions
@@ -11,6 +11,7 @@ # include "config.h" #endif #include <sys/stat.h> +#include <assert.h> #include <errno.h> #include <fcntl.h> #include <limits.h> @@ -65,7 +66,7 @@ static int mkdir_gen(const char *d, unsigned int mode) return 1; if (errno != EEXIST) return -errno; - if (lstat(d, &sb) == 0) { + if (stat(d, &sb) == 0) { #if defined(_WIN32) if (sb.st_mode & S_IFDIR) #else @@ -423,6 +424,7 @@ HX_realpath_symres(struct HX_realpath_state *state, const char *path) return -ELOOP; #endif + assert(state->link_target != nullptr); if (*state->link_target == '/') { *state->dest = '\0'; if (HXmc_setlen(&state->dest, 0) == NULL) @@ -594,39 +596,37 @@ EXPORT_SYMBOL int HX_rrmdir(const char *dir) EXPORT_SYMBOL ssize_t HXio_fullread(int fd, void *vbuf, size_t size) { char *buf = vbuf; - size_t done = 0; if (size > SSIZE_MAX) size = SSIZE_MAX; - while (done < size) { - ssize_t ret = read(fd, buf, size - done); + while (size > 0) { + ssize_t ret = read(fd, buf, size); if (ret < 0) return ret; else if (ret == 0) break; - done += ret; buf += ret; + size -= ret; } - return done; + return buf - static_cast(char *, vbuf); } EXPORT_SYMBOL ssize_t HXio_fullwrite(int fd, const void *vbuf, size_t size) { const char *buf = vbuf; - size_t done = 0; if (size > SSIZE_MAX) size = SSIZE_MAX; - while (done < size) { - ssize_t ret = write(fd, buf, size - done); + while (size > 0) { + ssize_t ret = write(fd, buf, size); if (ret < 0) return ret; else if (ret == 0) break; - done += ret; buf += ret; + size -= ret; } - return done; + return buf - static_cast(const char *, vbuf); } #if __linux__ |