summaryrefslogtreecommitdiff
path: root/deps/uv/src/unix/core.c
diff options
context:
space:
mode:
authorSaúl Ibarra Corretgé <saghul@gmail.com>2015-06-03 21:18:55 +0200
committerBen Noordhuis <info@bnoordhuis.nl>2015-06-04 00:09:05 +0200
commitaa33db32380fe05a3bc7a2e320bbf63a6adddf08 (patch)
tree6794c5f2c1a46e1e319f50860bf4b7d558b24587 /deps/uv/src/unix/core.c
parenta804026c9b5b9f8d6316fd5e9fdb9f96f7e1c6b3 (diff)
downloadandroid-node-v8-aa33db32380fe05a3bc7a2e320bbf63a6adddf08.tar.gz
android-node-v8-aa33db32380fe05a3bc7a2e320bbf63a6adddf08.tar.bz2
android-node-v8-aa33db32380fe05a3bc7a2e320bbf63a6adddf08.zip
deps: update libuv to version 1.6.0
Fixes: https://github.com/joyent/node/issues/9310 PR-URL: https://github.com/nodejs/io.js/pull/1889 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Diffstat (limited to 'deps/uv/src/unix/core.c')
-rw-r--r--deps/uv/src/unix/core.c97
1 files changed, 92 insertions, 5 deletions
diff --git a/deps/uv/src/unix/core.c b/deps/uv/src/unix/core.c
index 6f284ffa7a..cfb7630436 100644
--- a/deps/uv/src/unix/core.c
+++ b/deps/uv/src/unix/core.c
@@ -38,6 +38,7 @@
#include <limits.h> /* INT_MAX, PATH_MAX */
#include <sys/uio.h> /* writev */
#include <sys/resource.h> /* getrusage */
+#include <pwd.h>
#ifdef __linux__
# include <sys/ioctl.h>
@@ -282,6 +283,9 @@ int uv_backend_timeout(const uv_loop_t* loop) {
if (!QUEUE_EMPTY(&loop->idle_handles))
return 0;
+ if (!QUEUE_EMPTY(&loop->pending_queue))
+ return 0;
+
if (loop->closing_handles)
return 0;
@@ -696,16 +700,20 @@ int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd) {
static int uv__run_pending(uv_loop_t* loop) {
QUEUE* q;
+ QUEUE pq;
uv__io_t* w;
if (QUEUE_EMPTY(&loop->pending_queue))
return 0;
- while (!QUEUE_EMPTY(&loop->pending_queue)) {
- q = QUEUE_HEAD(&loop->pending_queue);
+ QUEUE_INIT(&pq);
+ q = QUEUE_HEAD(&loop->pending_queue);
+ QUEUE_SPLIT(&loop->pending_queue, q, &pq);
+
+ while (!QUEUE_EMPTY(&pq)) {
+ q = QUEUE_HEAD(&pq);
QUEUE_REMOVE(q);
QUEUE_INIT(q);
-
w = QUEUE_DATA(q, uv__io_t, pending_queue);
w->cb(loop, w, UV__POLLOUT);
}
@@ -745,8 +753,8 @@ static void maybe_resize(uv_loop_t* loop, unsigned int len) {
}
nwatchers = next_power_of_two(len + 2) - 2;
- watchers = realloc(loop->watchers,
- (nwatchers + 2) * sizeof(loop->watchers[0]));
+ watchers = uv__realloc(loop->watchers,
+ (nwatchers + 2) * sizeof(loop->watchers[0]));
if (watchers == NULL)
abort();
@@ -983,3 +991,82 @@ int uv__dup2_cloexec(int oldfd, int newfd) {
return r;
}
}
+
+
+int uv_os_homedir(char* buffer, size_t* size) {
+ struct passwd pw;
+ struct passwd* result;
+ char* buf;
+ uid_t uid;
+ size_t bufsize;
+ size_t len;
+ int r;
+
+ if (buffer == NULL || size == NULL || *size == 0)
+ return -EINVAL;
+
+ /* Check if the HOME environment variable is set first */
+ buf = getenv("HOME");
+
+ if (buf != NULL) {
+ len = strlen(buf);
+
+ if (len >= *size) {
+ *size = len;
+ return -ENOBUFS;
+ }
+
+ memcpy(buffer, buf, len + 1);
+ *size = len;
+
+ return 0;
+ }
+
+ /* HOME is not set, so call getpwuid() */
+ bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
+
+ if (bufsize <= 0)
+ return -EIO;
+
+ uid = getuid();
+ buf = NULL;
+
+ for (;;) {
+ uv__free(buf);
+ buf = uv__malloc(bufsize);
+
+ if (buf == NULL)
+ return -ENOMEM;
+
+ r = getpwuid_r(uid, &pw, buf, bufsize, &result);
+
+ if (r != ERANGE)
+ break;
+
+ bufsize *= 2;
+ }
+
+ if (r != 0) {
+ uv__free(buf);
+ return -r;
+ }
+
+ if (result == NULL) {
+ uv__free(buf);
+ return -ENOENT;
+ }
+
+ len = strlen(pw.pw_dir);
+
+ if (len >= *size) {
+ *size = len;
+ uv__free(buf);
+ return -ENOBUFS;
+ }
+
+ memcpy(buffer, pw.pw_dir, len + 1);
+ *size = len;
+ uv__free(buf);
+
+ return 0;
+}