static ssize_t uv__fs_realpath(uv_fs_t* req) { char* buf; #if defined(_POSIX_VERSION) && _POSIX_VERSION >= 200809L buf = realpath(req->path, NULL); if (buf == NULL) return -1; #else ssize_t len; len = uv__fs_pathmax_size(req->path); buf = uv__malloc(len + 1); if (buf == NULL) { errno = ENOMEM; return -1; } if (realpath(req->path, buf) == NULL) { uv__free(buf); return -1; } #endif req->ptr = buf; return 0; }
static ssize_t uv__fs_readlink(uv_fs_t* req) { ssize_t len; char* buf; len = uv__fs_pathmax_size(req->path); buf = uv__malloc(len + 1); if (buf == NULL) { errno = ENOMEM; return -1; } #if defined(__MVS__) len = os390_readlink(req->path, buf, len); #else len = readlink(req->path, buf, len); #endif if (len == -1) { uv__free(buf); return -1; } buf[len] = '\0'; req->ptr = buf; return 0; }
static ssize_t uv__fs_realpath(uv_fs_t* req) { ssize_t len; char* buf; len = uv__fs_pathmax_size(req->path); buf = uv__malloc(len + 1); if (buf == NULL) { errno = ENOMEM; return -1; } if (realpath(req->path, buf) == NULL) { uv__free(buf); return -1; } req->ptr = buf; return 0; }
static ssize_t uv__fs_readlink(uv_fs_t* req) { ssize_t maxlen; ssize_t len; char* buf; char* newbuf; #if defined(UV__FS_PATH_MAX_FALLBACK) /* We may not have a real PATH_MAX. Read size of link. */ struct stat st; int ret; ret = lstat(req->path, &st); if (ret != 0) return -1; if (!S_ISLNK(st.st_mode)) { errno = EINVAL; return -1; } maxlen = st.st_size; /* According to readlink(2) lstat can report st_size == 0 for some symlinks, such as those in /proc or /sys. */ if (maxlen == 0) maxlen = uv__fs_pathmax_size(req->path); #else maxlen = uv__fs_pathmax_size(req->path); #endif buf = uv__malloc(maxlen); if (buf == NULL) { errno = ENOMEM; return -1; } #if defined(__MVS__) len = os390_readlink(req->path, buf, maxlen); #else len = readlink(req->path, buf, maxlen); #endif if (len == -1) { uv__free(buf); return -1; } /* Uncommon case: resize to make room for the trailing nul byte. */ if (len == maxlen) { newbuf = uv__realloc(buf, len + 1); if (newbuf == NULL) { uv__free(buf); return -1; } buf = newbuf; } buf[len] = '\0'; req->ptr = buf; return 0; }