ext/libuv/src/unix/fs.c in libuv-2.0.8 vs ext/libuv/src/unix/fs.c in libuv-2.0.9
- old
+ new
@@ -31,10 +31,11 @@
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <limits.h> /* PATH_MAX */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/time.h>
@@ -148,13 +149,13 @@
if (no_utimesat)
goto skip;
ts[0].tv_sec = req->atime;
- ts[0].tv_nsec = (unsigned long)(req->atime * 1000000) % 1000000 * 1000;
+ ts[0].tv_nsec = (uint64_t)(req->atime * 1000000) % 1000000 * 1000;
ts[1].tv_sec = req->mtime;
- ts[1].tv_nsec = (unsigned long)(req->mtime * 1000000) % 1000000 * 1000;
+ ts[1].tv_nsec = (uint64_t)(req->mtime * 1000000) % 1000000 * 1000;
r = uv__utimesat(req->file, NULL, ts, 0);
if (r == 0)
return r;
@@ -164,13 +165,13 @@
no_utimesat = 1;
skip:
tv[0].tv_sec = req->atime;
- tv[0].tv_usec = (unsigned long)(req->atime * 1000000) % 1000000;
+ tv[0].tv_usec = (uint64_t)(req->atime * 1000000) % 1000000;
tv[1].tv_sec = req->mtime;
- tv[1].tv_usec = (unsigned long)(req->mtime * 1000000) % 1000000;
+ tv[1].tv_usec = (uint64_t)(req->mtime * 1000000) % 1000000;
snprintf(path, sizeof(path), "/proc/self/fd/%d", (int) req->file);
r = utimes(path, tv);
if (r == 0)
return r;
@@ -195,18 +196,25 @@
|| defined(__NetBSD__) \
|| defined(__OpenBSD__) \
|| defined(__sun)
struct timeval tv[2];
tv[0].tv_sec = req->atime;
- tv[0].tv_usec = (unsigned long)(req->atime * 1000000) % 1000000;
+ tv[0].tv_usec = (uint64_t)(req->atime * 1000000) % 1000000;
tv[1].tv_sec = req->mtime;
- tv[1].tv_usec = (unsigned long)(req->mtime * 1000000) % 1000000;
+ tv[1].tv_usec = (uint64_t)(req->mtime * 1000000) % 1000000;
# if defined(__sun)
return futimesat(req->file, NULL, tv);
# else
return futimes(req->file, tv);
# endif
+#elif defined(_AIX71)
+ struct timespec ts[2];
+ ts[0].tv_sec = req->atime;
+ ts[0].tv_nsec = (uint64_t)(req->atime * 1000000) % 1000000 * 1000;
+ ts[1].tv_sec = req->mtime;
+ ts[1].tv_nsec = (uint64_t)(req->mtime * 1000000) % 1000000 * 1000;
+ return futimens(req->file, ts);
#else
errno = ENOSYS;
return -1;
#endif
}
@@ -241,11 +249,11 @@
/* In case of failure `uv__cloexec` will leave error in `errno`,
* so it is enough to just set `r` to `-1`.
*/
if (r >= 0 && uv__cloexec(r, 1) != 0) {
r = uv__close(r);
- if (r != 0 && r != -EINPROGRESS)
+ if (r != 0)
abort();
r = -1;
}
if (req->cb != NULL)
@@ -360,13 +368,14 @@
out:
saved_errno = errno;
if (dents != NULL) {
int i;
+ /* Memory was allocated using the system allocator, so use free() here. */
for (i = 0; i < n; i++)
- uv__free(dents[i]);
- uv__free(dents);
+ free(dents[i]);
+ free(dents);
}
errno = saved_errno;
req->ptr = NULL;
@@ -381,11 +390,11 @@
if (pathmax == -1) {
#if defined(PATH_MAX)
return PATH_MAX;
#else
- return 4096;
+#error "PATH_MAX undefined in the current platform"
#endif
}
return pathmax;
}
@@ -799,29 +808,38 @@
static int uv__fs_stat(const char *path, uv_stat_t *buf) {
struct stat pbuf;
int ret;
+
ret = stat(path, &pbuf);
- uv__to_stat(&pbuf, buf);
+ if (ret == 0)
+ uv__to_stat(&pbuf, buf);
+
return ret;
}
static int uv__fs_lstat(const char *path, uv_stat_t *buf) {
struct stat pbuf;
int ret;
+
ret = lstat(path, &pbuf);
- uv__to_stat(&pbuf, buf);
+ if (ret == 0)
+ uv__to_stat(&pbuf, buf);
+
return ret;
}
static int uv__fs_fstat(int fd, uv_stat_t *buf) {
struct stat pbuf;
int ret;
+
ret = fstat(fd, &pbuf);
- uv__to_stat(&pbuf, buf);
+ if (ret == 0)
+ uv__to_stat(&pbuf, buf);
+
return ret;
}
typedef ssize_t (*uv__fs_buf_iter_processor)(uv_fs_t* req);