@k13engineering/linux-fuse 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
+ import { ENOSYS, opcode } from "./constants.js";
1
2
  import {
2
3
  createMessageFromKernelParser,
3
4
  createMessageToKernelParser,
@@ -10,6 +11,10 @@ import {
10
11
  *//*type TFuseResponse
11
12
  */} from "./protocol.js";
12
13
 
14
+ const knownOpcodes = new Set(Object.values(opcode).map((value) => {
15
+ return BigInt(value);
16
+ }));
17
+
13
18
  /*type TRequestHandler = {
14
19
  handleRequest: (args: { request: TFuseRequest }) => Promise<TFuseResponse | undefined>;
15
20
  };*/
@@ -27,6 +32,26 @@ const createFuseServer = ({
27
32
  const messageFromKernelParser = createMessageFromKernelParser();
28
33
  const messageToKernelParser = createMessageToKernelParser();
29
34
 
35
+ const replyNotImplemented = ({ unique }/*: { unique: bigint }*/) => {
36
+ sendMessageToKernel({
37
+ rawMessageToKernel: messageToKernelParser.formatMessageToKernel({
38
+ parsedMessageToKernel: {
39
+ header: {
40
+ unique,
41
+ error: BigInt(-ENOSYS),
42
+ },
43
+ payload: new Uint8Array(0),
44
+ },
45
+ }),
46
+ });
47
+ };
48
+
49
+ const observeResponse = ({ response }/*: { response: TFuseResponse }*/) => {
50
+ if (response.forOpcode === "INIT" && response.errorCode === undefined) {
51
+ messageFromKernelInterpreter.applyInitResult({ result: response.result });
52
+ }
53
+ };
54
+
30
55
  const processRequest = ({ rawIncomingRequest }/*: { rawIncomingRequest: Uint8Array }*/) => {
31
56
 
32
57
  const { error: parseError, parsedMessageFromKernel } = messageFromKernelParser.parseMessageFromKernel({ data: rawIncomingRequest });
@@ -34,6 +59,12 @@ const createFuseServer = ({
34
59
  throw Error("not implemented yet", { cause: parseError });
35
60
  }
36
61
 
62
+ if (!knownOpcodes.has(parsedMessageFromKernel.header.opcode)) {
63
+ // newer kernels may send opcodes this package does not know yet, ENOSYS makes them fall back
64
+ replyNotImplemented({ unique: parsedMessageFromKernel.header.unique });
65
+ return;
66
+ }
67
+
37
68
  const { error: interpretError, interpreted } = messageFromKernelInterpreter.interpretMessageFromKernel({ parsedMessageFromKernel });
38
69
  if (interpretError !== undefined) {
39
70
  throw Error("not implemented yet", { cause: interpretError });
@@ -42,6 +73,8 @@ const createFuseServer = ({
42
73
  requestHandler.handleRequest({ request: interpreted }).then((response) => {
43
74
  if (response !== undefined) {
44
75
 
76
+ observeResponse({ response });
77
+
45
78
  let encoded/*: TParsedMessageToKernel*/;
46
79
 
47
80
  try {
@@ -1,11 +1,16 @@
1
- declare const read: ({ fd, buffer }: {
2
- fd: number;
3
- buffer: Uint8Array;
4
- }) => any;
5
- declare const write: ({ fd, buffer }: {
1
+ import type { TKernel } from "./kernel.js";
2
+ type TOpenatResult = {
3
+ errno: number;
4
+ fd: undefined;
5
+ } | {
6
+ errno: undefined;
6
7
  fd: number;
7
- buffer: Uint8Array;
8
- }) => any;
8
+ };
9
+ type TCloseResult = {
10
+ errno: number;
11
+ } | {
12
+ errno: undefined;
13
+ };
9
14
  type TFsopenResult = {
10
15
  errno: number;
11
16
  fsfd: undefined;
@@ -13,22 +18,11 @@ type TFsopenResult = {
13
18
  errno: undefined;
14
19
  fsfd: number;
15
20
  };
16
- declare const fsopen: ({ fileSystemName, flags, }: {
17
- fileSystemName: string;
18
- flags: bigint;
19
- }) => TFsopenResult;
20
21
  type TFsConfigResult = {
21
22
  errno: number;
22
23
  } | {
23
24
  errno: undefined;
24
25
  };
25
- declare const fsconfig: ({ fd, command, key, value, auxiliaryValue, }: {
26
- fd: number;
27
- command: bigint;
28
- key: string | undefined;
29
- value: string | Uint8Array | undefined;
30
- auxiliaryValue: number;
31
- }) => TFsConfigResult;
32
26
  type TFsMountResult = {
33
27
  errno: number;
34
28
  mountFd: undefined;
@@ -36,11 +30,6 @@ type TFsMountResult = {
36
30
  errno: undefined;
37
31
  mountFd: number;
38
32
  };
39
- declare const fsmount: ({ fd, flags, mountAttributesBitmask, }: {
40
- fd: number;
41
- flags: bigint;
42
- mountAttributesBitmask: bigint;
43
- }) => TFsMountResult;
44
33
  type TMoveMountResult = {
45
34
  errno: number;
46
35
  } | {
@@ -51,23 +40,62 @@ type TFchdirResult = {
51
40
  } | {
52
41
  errno: undefined;
53
42
  };
54
- declare const move_mount: ({ fromFd, fromPath, toFd, toPath, flags, }: {
55
- fromFd: number;
56
- fromPath?: string;
57
- toFd: number;
58
- toPath: string | undefined;
59
- flags: bigint;
60
- }) => TMoveMountResult;
61
43
  type TUmountResult = {
62
44
  errno: number;
63
45
  } | {
64
46
  errno: undefined;
65
47
  };
66
- declare const umount: ({ target, flags, }: {
67
- target: string;
68
- flags: bigint;
69
- }) => TUmountResult;
70
- declare const fchdir: ({ fd, }: {
71
- fd: number;
72
- }) => TFchdirResult;
73
- export { read, write, fsopen, fsconfig, fsmount, move_mount, fchdir, umount };
48
+ declare const createSyscalls: ({ kernel }: {
49
+ kernel: TKernel;
50
+ }) => {
51
+ read: ({ fd, buffer }: {
52
+ fd: number;
53
+ buffer: Uint8Array;
54
+ }) => any;
55
+ write: ({ fd, buffer }: {
56
+ fd: number;
57
+ buffer: Uint8Array;
58
+ }) => any;
59
+ openat: ({ dirFd, path, flags, mode, }: {
60
+ dirFd: number;
61
+ path: string;
62
+ flags: number;
63
+ mode: number;
64
+ }) => TOpenatResult;
65
+ close: ({ fd }: {
66
+ fd: number;
67
+ }) => TCloseResult;
68
+ fsopen: ({ fileSystemName, flags, }: {
69
+ fileSystemName: string;
70
+ flags: bigint;
71
+ }) => TFsopenResult;
72
+ fsconfig: ({ fd, command, key, value, auxiliaryValue, }: {
73
+ fd: number;
74
+ command: bigint;
75
+ key: string | undefined;
76
+ value: string | Uint8Array | undefined;
77
+ auxiliaryValue: number;
78
+ }) => TFsConfigResult;
79
+ fsmount: ({ fd, flags, mountAttributesBitmask, }: {
80
+ fd: number;
81
+ flags: bigint;
82
+ mountAttributesBitmask: bigint;
83
+ }) => TFsMountResult;
84
+ move_mount: ({ fromFd, fromPath, toFd, toPath, flags, }: {
85
+ fromFd: number;
86
+ fromPath?: string;
87
+ toFd: number;
88
+ toPath: string | undefined;
89
+ flags: bigint;
90
+ }) => TMoveMountResult;
91
+ umount: ({ target, flags, }: {
92
+ target: string;
93
+ flags: bigint;
94
+ }) => TUmountResult;
95
+ fchdir: ({ fd, }: {
96
+ fd: number;
97
+ }) => TFchdirResult;
98
+ };
99
+ type TSyscalls = ReturnType<typeof createSyscalls>;
100
+ export { createSyscalls, };
101
+ export type { TSyscalls, };