/* TODO: add support for links. */ int uv_fs_lstat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int len = strlen(path); char* path2 = NULL; int has_backslash = (path[len - 1] == '\\' || path[len - 1] == '/'); if (path[len - 1] == '\\' || path[len - 1] == '/') { path2 = strdup(path); if (!path2) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } path2[len - 1] = '\0'; } if (cb) { uv_fs_req_init_async(loop, req, UV_FS_LSTAT, NULL, cb); if (path2) { req->path = path2; } else { req->path = strdup(path); } QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_LSTAT); fs__stat(req, path2 ? path2 : path); if (path2) { free(path2); } SET_UV_LAST_ERROR_FROM_REQ(req); } return 0; }
int uv_fs_stat(uv_loop_t* loop, uv_fs_t* req, const char* path, uv_fs_cb cb) { int len = strlen(path); char* path2 = NULL; int has_backslash = (path[len - 1] == '\\' || path[len - 1] == '/'); if (path[len - 1] == '\\' || path[len - 1] == '/') { path2 = strdup(path); if (!path2) { uv_fatal_error(ERROR_OUTOFMEMORY, "malloc"); } path2[len - 1] = '\0'; } if (cb) { uv_fs_req_init_async(loop, req, UV_FS_STAT, cb); if (path2) { WRAP_REQ_ARGS1(req, path2); req->flags |= UV_FS_FREE_ARG0; } else { WRAP_REQ_ARGS1(req, path); STRDUP_ARG(req, 0); } QUEUE_FS_TP_JOB(loop, req); } else { uv_fs_req_init_sync(loop, req, UV_FS_STAT); fs__stat(req, path2 ? path2 : path); if (path2) { free(path2); } } return 0; }
static DWORD WINAPI uv_fs_thread_proc(void* parameter) { uv_fs_t* req = (uv_fs_t*) parameter; uv_loop_t* loop = req->loop; assert(req != NULL); assert(req->type == UV_FS); switch (req->fs_type) { case UV_FS_OPEN: fs__open(req, req->path, (int)req->arg0, (int)req->arg1); break; case UV_FS_CLOSE: fs__close(req, (uv_file)req->arg0); break; case UV_FS_READ: fs__read(req, (uv_file) req->arg0, req->arg1, (size_t) req->arg2, (off_t) req->arg3); break; case UV_FS_WRITE: fs__write(req, (uv_file)req->arg0, req->arg1, (size_t) req->arg2, (off_t) req->arg3); break; case UV_FS_UNLINK: fs__unlink(req, req->path); break; case UV_FS_MKDIR: fs__mkdir(req, req->path, (int)req->arg0); break; case UV_FS_RMDIR: fs__rmdir(req, req->path); break; case UV_FS_READDIR: fs__readdir(req, req->path, (int)req->arg0); break; case UV_FS_STAT: case UV_FS_LSTAT: fs__stat(req, req->path); break; case UV_FS_FSTAT: fs__fstat(req, (uv_file)req->arg0); break; case UV_FS_RENAME: fs__rename(req, req->path, (const char*)req->arg0); break; case UV_FS_FSYNC: case UV_FS_FDATASYNC: fs__fsync(req, (uv_file)req->arg0); break; case UV_FS_FTRUNCATE: fs__ftruncate(req, (uv_file)req->arg0, (off_t)req->arg1); break; case UV_FS_SENDFILE: fs__sendfile(req, (uv_file) req->arg0, (uv_file) req->arg1, (off_t) req->arg2, (size_t) req->arg3); break; case UV_FS_CHMOD: fs__chmod(req, req->path, (int)req->arg0); break; case UV_FS_FCHMOD: fs__fchmod(req, (uv_file)req->arg0, (int)req->arg1); break; case UV_FS_UTIME: fs__utime(req, req->path, req->arg4, req->arg5); break; case UV_FS_FUTIME: fs__futime(req, (uv_file)req->arg0, req->arg4, req->arg5); break; case UV_FS_LINK: fs__link(req, req->path, (const char*)req->arg0); break; case UV_FS_SYMLINK: fs__symlink(req, req->path, (const char*)req->arg0, (int)req->arg1); break; case UV_FS_READLINK: fs__readlink(req, req->path); break; case UV_FS_CHOWN: case UV_FS_FCHOWN: fs__nop(req); break; default: assert(!"bad uv_fs_type"); } POST_COMPLETION_FOR_REQ(loop, req); return 0; }