From ec7d167e3c037f2425c8ebcfa2ea48f31584e92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sa=C3=BAl=20Ibarra=20Corretg=C3=A9?= Date: Wed, 23 Feb 2022 23:44:22 +0100 Subject: [PATCH] fs: fix not exposing tjs.(l)stat Fixes: https://github.com/saghul/txiki.js/issues/218 --- docs/txikijs.d.ts | 43 ++++++++++++++++++++++++++++++------------- src/fs.c | 6 +++--- src/utils.h | 1 + tests/test-fs-stat.js | 10 ++++++++++ 4 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 tests/test-fs-stat.js diff --git a/docs/txikijs.d.ts b/docs/txikijs.d.ts index e15e137c..adbbf490 100644 --- a/docs/txikijs.d.ts +++ b/docs/txikijs.d.ts @@ -341,18 +341,18 @@ declare namespace tjs { } interface StatResult { - st_dev: bigint; - st_mode: bigint; - st_nlink: bigint; - st_uid: bigint; - st_gid: bigint; - st_rdev: bigint; - st_ino: bigint; - st_size: bigint; - st_blksize: bigint; - st_blocks: bigint; - st_flags: bigint; - st_gen: bigint; + st_dev: number; + st_mode: number; + st_nlink: number; + st_uid: number; + st_gid: number; + st_rdev: number; + st_ino: number; + st_size: number; + st_blksize: number; + st_blocks: number; + st_flags: number; + st_gen: number; st_atim: number; st_mtim: number; st_ctim: number; @@ -360,7 +360,7 @@ declare namespace tjs { } /** - * Flag used to check in {@link StatResult}'s `st_flags` field. + * Flag used to check in {@link StatResult}'s `st_mode` field. * See [stat(2)](https://man7.org/linux/man-pages/man2/lstat.2.html) * Available values: * @@ -377,6 +377,23 @@ declare namespace tjs { */ const S_XXX: number; + /** + * Gets file status information. + * See [stat(2)](https://man7.org/linux/man-pages/man2/stat.2.html) + * + * @param path Path to the file. + */ + function stat(path: string): Promise; + + /** + * Gets file status information. If the path is a link it returns information + * about the link itself. + * See [stat(2)](https://man7.org/linux/man-pages/man2/stat.2.html) + * + * @param path Path to the file. + */ + function lstat(path: string): Promise; + /** * Opens the file at the given path. Opening modes: * diff --git a/src/fs.c b/src/fs.c index 6957c83a..10dbb292 100644 --- a/src/fs.c +++ b/src/fs.c @@ -101,7 +101,7 @@ typedef struct { static JSValue js__stat2obj(JSContext *ctx, uv_stat_t *st) { JSValue obj = JS_NewObjectProto(ctx, JS_NULL); #define SET_UINT64_FIELD(x) \ - JS_DefinePropertyValueStr(ctx, obj, STRINGIFY(x), JS_NewBigUint64(ctx, st->x), JS_PROP_C_W_E) + JS_DefinePropertyValueStr(ctx, obj, STRINGIFY(x), JS_NewUint32(ctx, st->x), JS_PROP_C_W_E) SET_UINT64_FIELD(st_dev); SET_UINT64_FIELD(st_mode); SET_UINT64_FIELD(st_nlink); @@ -837,8 +837,8 @@ static const JSCFunctionListEntry tjs_fs_funcs[] = { TJS_CONST(S_ISUID), #endif TJS_CFUNC_DEF("open", 3, tjs_fs_open), - JS_CFUNC_MAGIC_DEF("stat", 1, tjs_fs_stat, 0), - JS_CFUNC_MAGIC_DEF("lstat", 1, tjs_fs_stat, 1), + TJS_CFUNC_MAGIC_DEF("stat", 1, tjs_fs_stat, 0), + TJS_CFUNC_MAGIC_DEF("lstat", 1, tjs_fs_stat, 1), TJS_CFUNC_DEF("realpath", 1, tjs_fs_realpath), TJS_CFUNC_DEF("unlink", 1, tjs_fs_unlink), TJS_CFUNC_DEF("rename", 2, tjs_fs_rename), diff --git a/src/utils.h b/src/utils.h index ddc7a4b4..b7baaab3 100644 --- a/src/utils.h +++ b/src/utils.h @@ -80,6 +80,7 @@ void tjs_assert(const struct AssertionInfo info); #define TJS_CONST(x) JS_PROP_INT32_DEF(#x, x, JS_PROP_ENUMERABLE) #define TJS_CONST2(name, val) JS_PROP_INT32_DEF(name, val, JS_PROP_ENUMERABLE) #define TJS_CFUNC_DEF(name, length, func1) { name, JS_PROP_C_W_E, JS_DEF_CFUNC, 0, .u = { .func = { length, JS_CFUNC_generic, { .generic = func1 } } } } +#define TJS_CFUNC_MAGIC_DEF(name, length, func1, magic) { name, JS_PROP_C_W_E, JS_DEF_CFUNC, magic, .u = { .func = { length, JS_CFUNC_generic_magic, { .generic_magic = func1 } } } } uv_loop_t *tjs_get_loop(JSContext *ctx); int tjs_obj2addr(JSContext *ctx, JSValueConst obj, struct sockaddr_storage *ss); diff --git a/tests/test-fs-stat.js b/tests/test-fs-stat.js new file mode 100644 index 00000000..47a0ea6e --- /dev/null +++ b/tests/test-fs-stat.js @@ -0,0 +1,10 @@ +import assert from './assert.js'; +import { path } from '@tjs/std'; + + +(async () => { + const st = await tjs.stat(path.join(import.meta.dirname, import.meta.basename)); + + assert.ok(st); + assert.eq(st.st_mode & tjs.S_IFREG, tjs.S_IFREG, 'is a regular file'); +})();