frida-fs 5.0.1 → 5.2.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.
package/index.js DELETED
@@ -1,749 +0,0 @@
1
- import {Buffer} from 'buffer';
2
- import process from 'process';
3
- import stream from 'stream';
4
-
5
- const {platform, pointerSize} = Process;
6
-
7
- const S_IFMT = 0xf000;
8
- const S_IFREG = 0x8000;
9
- const S_IFDIR = 0x4000;
10
- const S_IFCHR = 0x2000;
11
- const S_IFBLK = 0x6000;
12
- const S_IFIFO = 0x1000;
13
- const S_IFLNK = 0xa000;
14
- const S_IFSOCK = 0xc000;
15
-
16
- const universalConstants = {
17
- S_IFMT,
18
- S_IFREG,
19
- S_IFDIR,
20
- S_IFCHR,
21
- S_IFBLK,
22
- S_IFIFO,
23
- S_IFLNK,
24
- S_IFSOCK,
25
-
26
- S_IRWXU: 448,
27
- S_IRUSR: 256,
28
- S_IWUSR: 128,
29
- S_IXUSR: 64,
30
- S_IRWXG: 56,
31
- S_IRGRP: 32,
32
- S_IWGRP: 16,
33
- S_IXGRP: 8,
34
- S_IRWXO: 7,
35
- S_IROTH: 4,
36
- S_IWOTH: 2,
37
- S_IXOTH: 1,
38
-
39
- DT_UNKNOWN: 0,
40
- DT_FIFO: 1,
41
- DT_CHR: 2,
42
- DT_DIR: 4,
43
- DT_BLK: 6,
44
- DT_REG: 8,
45
- DT_LNK: 10,
46
- DT_SOCK: 12,
47
- DT_WHT: 14,
48
- };
49
- const platformConstants = {
50
- darwin: {
51
- O_RDONLY: 0x0,
52
- O_WRONLY: 0x1,
53
- O_RDWR: 0x2,
54
- O_CREAT: 0x200,
55
- O_EXCL: 0x800,
56
- O_NOCTTY: 0x20000,
57
- O_TRUNC: 0x400,
58
- O_APPEND: 0x8,
59
- O_DIRECTORY: 0x100000,
60
- O_NOFOLLOW: 0x100,
61
- O_SYNC: 0x80,
62
- O_DSYNC: 0x400000,
63
- O_SYMLINK: 0x200000,
64
- O_NONBLOCK: 0x4,
65
- },
66
- linux: {
67
- O_RDONLY: 0x0,
68
- O_WRONLY: 0x1,
69
- O_RDWR: 0x2,
70
- O_CREAT: 0x40,
71
- O_EXCL: 0x80,
72
- O_NOCTTY: 0x100,
73
- O_TRUNC: 0x200,
74
- O_APPEND: 0x400,
75
- O_DIRECTORY: 0x10000,
76
- O_NOATIME: 0x40000,
77
- O_NOFOLLOW: 0x20000,
78
- O_SYNC: 0x101000,
79
- O_DSYNC: 0x1000,
80
- O_DIRECT: 0x4000,
81
- O_NONBLOCK: 0x800,
82
- },
83
- };
84
- const constants = Object.assign({}, universalConstants, platformConstants[platform] || {});
85
-
86
- const SEEK_SET = 0;
87
- const SEEK_CUR = 1;
88
- const SEEK_END = 2;
89
-
90
- const EINTR = 4;
91
-
92
- class ReadStream extends stream.Readable {
93
- constructor(path) {
94
- super({
95
- highWaterMark: 4 * 1024 * 1024
96
- });
97
-
98
- this._input = null;
99
- this._readRequest = null;
100
-
101
- const pathStr = Memory.allocUtf8String(path);
102
- const fd = getApi().open(pathStr, constants.O_RDONLY, 0);
103
- if (fd.value === -1) {
104
- process.nextTick(() => {
105
- this.emit('error', new Error(`Unable to open file (${getErrorString(fd.errno)})`));
106
- this.push(null);
107
- });
108
- return;
109
- }
110
-
111
- this._input = new UnixInputStream(fd.value, { autoClose: true });
112
- }
113
-
114
- _read(size) {
115
- if (this._readRequest !== null)
116
- return;
117
-
118
- this._readRequest = this._input.read(size)
119
- .then(buffer => {
120
- this._readRequest = null;
121
-
122
- if (buffer.byteLength === 0) {
123
- this._closeInput();
124
- this.push(null);
125
- return;
126
- }
127
-
128
- if (this.push(Buffer.from(buffer)))
129
- this._read(size);
130
- })
131
- .catch(error => {
132
- this._readRequest = null;
133
- this._closeInput();
134
- this.emit('error', error);
135
- this.push(null);
136
- });
137
- }
138
-
139
- _closeInput() {
140
- if (this._input !== null) {
141
- this._input.close();
142
- this._input = null;
143
- }
144
- }
145
- }
146
-
147
- class WriteStream extends stream.Writable {
148
- constructor(path) {
149
- super({
150
- highWaterMark: 4 * 1024 * 1024
151
- });
152
-
153
- this._output = null;
154
- this._writeRequest = null;
155
-
156
- const pathStr = Memory.allocUtf8String(path);
157
- const flags = constants.O_WRONLY | constants.O_CREAT;
158
- const mode = constants.S_IRUSR | constants.S_IWUSR | constants.S_IRGRP | constants.S_IROTH;
159
- const fd = getApi().open(pathStr, flags, mode);
160
- if (fd.value === -1) {
161
- process.nextTick(() => {
162
- this.emit('error', new Error(`Unable to open file (${getErrorString(fd.errno)})`));
163
- this.push(null);
164
- });
165
- return;
166
- }
167
-
168
- this._output = new UnixOutputStream(fd.value, { autoClose: true });
169
- this.on('finish', () => this._closeOutput());
170
- this.on('error', () => this._closeOutput());
171
- }
172
-
173
- _write(chunk, encoding, callback) {
174
- if (this._writeRequest !== null)
175
- return;
176
-
177
- this._writeRequest = this._output.writeAll(chunk)
178
- .then(size => {
179
- this._writeRequest = null;
180
-
181
- callback();
182
- })
183
- .catch(error => {
184
- this._writeRequest = null;
185
-
186
- callback(error);
187
- });
188
- }
189
-
190
- _closeOutput() {
191
- if (this._output !== null) {
192
- this._output.close();
193
- this._output = null;
194
- }
195
- }
196
- }
197
-
198
- const direntSpecs = {
199
- 'linux-32': {
200
- 'd_name': [11, 'Utf8String'],
201
- 'd_type': [10, 'U8']
202
- },
203
- 'linux-64': {
204
- 'd_name': [19, 'Utf8String'],
205
- 'd_type': [18, 'U8']
206
- },
207
- 'darwin-32': {
208
- 'd_name': [21, 'Utf8String'],
209
- 'd_type': [20, 'U8']
210
- },
211
- 'darwin-64': {
212
- 'd_name': [21, 'Utf8String'],
213
- 'd_type': [20, 'U8']
214
- }
215
- };
216
-
217
- const direntSpec = direntSpecs[`${platform}-${pointerSize * 8}`];
218
-
219
- function readdirSync(path) {
220
- const entries = [];
221
- enumerateDirectoryEntries(path, entry => {
222
- const name = readDirentField(entry, 'd_name');
223
- entries.push(name);
224
- });
225
- return entries;
226
- }
227
-
228
- function list(path) {
229
- const entries = [];
230
- enumerateDirectoryEntries(path, entry => {
231
- entries.push({
232
- name: readDirentField(entry, 'd_name'),
233
- type: readDirentField(entry, 'd_type')
234
- });
235
- });
236
- return entries;
237
- }
238
-
239
- function enumerateDirectoryEntries(path, callback) {
240
- const {opendir, opendir$INODE64, closedir, readdir, readdir$INODE64} = getApi();
241
-
242
- const opendirImpl = opendir$INODE64 || opendir;
243
- const readdirImpl = readdir$INODE64 || readdir;
244
-
245
- const dir = opendirImpl(Memory.allocUtf8String(path));
246
- const dirHandle = dir.value;
247
- if (dirHandle.isNull())
248
- throw new Error(`Unable to open directory (${getErrorString(dir.errno)})`);
249
-
250
- try {
251
- let entry;
252
- while (!((entry = readdirImpl(dirHandle)).isNull())) {
253
- callback(entry);
254
- }
255
- } finally {
256
- closedir(dirHandle);
257
- }
258
- }
259
-
260
- function readDirentField(entry, name) {
261
- const [offset, type] = direntSpec[name];
262
-
263
- const read = (typeof type === 'string') ? Memory['read' + type] : type;
264
-
265
- const value = read(entry.add(offset));
266
- if (value instanceof Int64 || value instanceof UInt64)
267
- return value.valueOf();
268
-
269
- return value;
270
- }
271
-
272
- function readFileSync(path, options = {}) {
273
- if (typeof options === 'string')
274
- options = { encoding: options };
275
- const {encoding = null} = options;
276
-
277
- const {open, close, lseek, read} = getApi();
278
-
279
- const pathStr = Memory.allocUtf8String(path);
280
- const openResult = open(pathStr, constants.O_RDONLY, 0);
281
- const fd = openResult.value;
282
- if (fd === -1)
283
- throw new Error(`Unable to open file (${getErrorString(openResult.errno)})`);
284
-
285
- try {
286
- const fileSize = lseek(fd, 0, SEEK_END).valueOf();
287
-
288
- lseek(fd, 0, SEEK_SET);
289
-
290
- const buf = Memory.alloc(fileSize);
291
- let readResult, n, readFailed;
292
- do {
293
- readResult = read(fd, buf, fileSize);
294
- n = readResult.value.valueOf();
295
- readFailed = n === -1;
296
- } while (readFailed && readResult.errno === EINTR);
297
-
298
- if (readFailed)
299
- throw new Error(`Unable to read ${path} (${getErrorString(readResult.errno)})`);
300
-
301
- if (n !== fileSize.valueOf())
302
- throw new Error('Short read');
303
-
304
- if (encoding === 'utf8') {
305
- return buf.readUtf8String(fileSize);
306
- }
307
-
308
- const value = Buffer.from(buf.readByteArray(fileSize));
309
- if (encoding !== null) {
310
- return value.toString(encoding);
311
- }
312
-
313
- return value;
314
- } finally {
315
- close(fd);
316
- }
317
- }
318
-
319
- function readlinkSync(path) {
320
- const api = getApi();
321
-
322
- const pathStr = Memory.allocUtf8String(path);
323
-
324
- const linkSize = lstatSync(path).size.valueOf();
325
- const buf = Memory.alloc(linkSize);
326
-
327
- const result = api.readlink(pathStr, buf, linkSize);
328
- const n = result.value.valueOf();
329
- if (n === -1)
330
- throw new Error(`Unable to read link (${getErrorString(result.errno)})`);
331
-
332
- return buf.readUtf8String(n);
333
- }
334
-
335
- function unlinkSync(path) {
336
- const {unlink} = getApi();
337
-
338
- const pathStr = Memory.allocUtf8String(path);
339
-
340
- const result = unlink(pathStr);
341
- if (result.value === -1)
342
- throw new Error(`Unable to unlink (${getErrorString(result.errno)})`);
343
- }
344
-
345
- const statFields = new Set([
346
- 'dev',
347
- 'mode',
348
- 'nlink',
349
- 'uid',
350
- 'gid',
351
- 'rdev',
352
- 'blksize',
353
- 'ino',
354
- 'size',
355
- 'blocks',
356
- 'atimeMs',
357
- 'mtimeMs',
358
- 'ctimeMs',
359
- 'birthtimeMs',
360
- 'atime',
361
- 'mtime',
362
- 'ctime',
363
- 'birthtime',
364
- ]);
365
- const statSpecs = {
366
- 'darwin-32': {
367
- size: 108,
368
- fields: {
369
- 'dev': [ 0, 'S32' ],
370
- 'mode': [ 4, 'U16' ],
371
- 'nlink': [ 6, 'U16' ],
372
- 'ino': [ 8, 'U64' ],
373
- 'uid': [ 16, 'U32' ],
374
- 'gid': [ 20, 'U32' ],
375
- 'rdev': [ 24, 'S32' ],
376
- 'atime': [ 28, readTimespec32 ],
377
- 'mtime': [ 36, readTimespec32 ],
378
- 'ctime': [ 44, readTimespec32 ],
379
- 'birthtime': [ 52, readTimespec32 ],
380
- 'size': [ 60, 'S64' ],
381
- 'blocks': [ 68, 'S64' ],
382
- 'blksize': [ 76, 'S32' ],
383
- }
384
- },
385
- 'darwin-64': {
386
- size: 144,
387
- fields: {
388
- 'dev': [ 0, 'S32' ],
389
- 'mode': [ 4, 'U16' ],
390
- 'nlink': [ 6, 'U16' ],
391
- 'ino': [ 8, 'U64' ],
392
- 'uid': [ 16, 'U32' ],
393
- 'gid': [ 20, 'U32' ],
394
- 'rdev': [ 24, 'S32' ],
395
- 'atime': [ 32, readTimespec64 ],
396
- 'mtime': [ 48, readTimespec64 ],
397
- 'ctime': [ 64, readTimespec64 ],
398
- 'birthtime': [ 80, readTimespec64 ],
399
- 'size': [ 96, 'S64' ],
400
- 'blocks': [ 104, 'S64' ],
401
- 'blksize': [ 112, 'S32' ],
402
- }
403
- },
404
- 'linux-32': {
405
- size: 88,
406
- fields: {
407
- 'dev': [ 0, 'U64' ],
408
- 'mode': [ 16, 'U32' ],
409
- 'nlink': [ 20, 'U32' ],
410
- 'ino': [ 12, 'U32' ],
411
- 'uid': [ 24, 'U32' ],
412
- 'gid': [ 28, 'U32' ],
413
- 'rdev': [ 32, 'U64' ],
414
- 'atime': [ 56, readTimespec32 ],
415
- 'mtime': [ 64, readTimespec32 ],
416
- 'ctime': [ 72, readTimespec32 ],
417
- 'size': [ 44, 'S32' ],
418
- 'blocks': [ 52, 'S32' ],
419
- 'blksize': [ 48, 'S32' ],
420
- }
421
- },
422
- 'linux-32-stat64': {
423
- size: 104,
424
- fields: {
425
- 'dev': [ 0, 'U64' ],
426
- 'mode': [ 16, 'U32' ],
427
- 'nlink': [ 20, 'U32' ],
428
- 'ino': [ 96, 'U64' ],
429
- 'uid': [ 24, 'U32' ],
430
- 'gid': [ 28, 'U32' ],
431
- 'rdev': [ 32, 'U64' ],
432
- 'atime': [ 72, readTimespec32 ],
433
- 'mtime': [ 80, readTimespec32 ],
434
- 'ctime': [ 88, readTimespec32 ],
435
- 'size': [ 48, 'S64' ],
436
- 'blocks': [ 64, 'S64' ],
437
- 'blksize': [ 56, 'S32' ],
438
- }
439
- },
440
- 'linux-64': {
441
- size: 144,
442
- fields: {
443
- 'dev': [ 0, 'U64' ],
444
- 'mode': [ 24, 'U32' ],
445
- 'nlink': [ 16, 'U64' ],
446
- 'ino': [ 8, 'U64' ],
447
- 'uid': [ 28, 'U32' ],
448
- 'gid': [ 32, 'U32' ],
449
- 'rdev': [ 40, 'U64' ],
450
- 'atime': [ 72, readTimespec64 ],
451
- 'mtime': [ 88, readTimespec64 ],
452
- 'ctime': [ 104, readTimespec64 ],
453
- 'size': [ 48, 'S64' ],
454
- 'blocks': [ 64, 'S64' ],
455
- 'blksize': [ 56, 'S64' ],
456
- },
457
- },
458
- };
459
- let cachedStatSpec = null;
460
- const statBufSize = 256;
461
-
462
- function getStatSpec() {
463
- if (cachedStatSpec !== null)
464
- return cachedStatSpec;
465
-
466
- const api = getApi();
467
- const stat64Impl = api.stat64 ?? api.__xstat64;
468
-
469
- let platformId = `${platform}-${pointerSize * 8}`;
470
- if (platformId === 'linux-32') {
471
- if (stat64Impl !== undefined)
472
- platformId += '-stat64';
473
- }
474
-
475
- const statSpec = statSpecs[platformId];
476
- if (statSpec === undefined)
477
- throw new Error('Current OS is not yet supported; please open a PR');
478
-
479
- statSpec._stat = stat64Impl ?? api.stat;
480
- statSpec._lstat = api.lstat64 ?? api.__lxstat64 ?? api.lstat;
481
-
482
- cachedStatSpec = statSpec;
483
-
484
- return statSpec;
485
- }
486
-
487
- class Stats {
488
- isFile() {
489
- return (this.mode & S_IFMT) === S_IFREG;
490
- }
491
-
492
- isDirectory() {
493
- return (this.mode & S_IFMT) === S_IFDIR;
494
- }
495
-
496
- isCharacterDevice() {
497
- return (this.mode & S_IFMT) === S_IFCHR;
498
- }
499
-
500
- isBlockDevice() {
501
- return (this.mode & S_IFMT) === S_IFBLK;
502
- }
503
-
504
- isFIFO() {
505
- return (this.mode & S_IFMT) === S_IFIFO;
506
- }
507
-
508
- isSymbolicLink() {
509
- return (this.mode & S_IFMT) === S_IFLNK;
510
- }
511
-
512
- isSocket() {
513
- return (this.mode & S_IFMT) === S_IFSOCK;
514
- }
515
- }
516
-
517
- function statSync(path) {
518
- return performStat(getStatSpec()._stat, path);
519
- }
520
-
521
- function lstatSync(path) {
522
- return performStat(getStatSpec()._lstat, path);
523
- }
524
-
525
- function performStat(impl, path) {
526
- const buf = Memory.alloc(statBufSize);
527
- const result = impl(Memory.allocUtf8String(path), buf);
528
- if (result.value !== 0)
529
- throw new Error(`Unable to stat ${path} (${getErrorString(result.errno)})`);
530
-
531
- return new Proxy(new Stats(), {
532
- has(target, property) {
533
- return statsHasField(property);
534
- },
535
- get(target, property, receiver) {
536
- switch (property) {
537
- case 'prototype':
538
- case 'constructor':
539
- case 'toString':
540
- return target[property];
541
- case 'hasOwnProperty':
542
- return statsHasField;
543
- case 'valueOf':
544
- return receiver;
545
- case 'buffer':
546
- return buf;
547
- default:
548
- if (property in target)
549
- return target[property];
550
- const value = statsReadField.call(receiver, property);
551
- return (value !== null) ? value : undefined;
552
- }
553
- },
554
- set(target, property, value, receiver) {
555
- return false;
556
- },
557
- ownKeys(target) {
558
- return Array.from(statFields);
559
- },
560
- getOwnPropertyDescriptor(target, property) {
561
- return {
562
- writable: false,
563
- configurable: true,
564
- enumerable: true
565
- };
566
- },
567
- });
568
- }
569
-
570
- function statsHasField(name) {
571
- return statFields.has(name);
572
- }
573
-
574
- function statsReadField(name) {
575
- let field = getStatSpec().fields[name];
576
- if (field === undefined) {
577
- if (name === 'birthtime') {
578
- return statsReadField.call(this, 'ctime');
579
- }
580
-
581
- const msPos = name.lastIndexOf('Ms');
582
- if (msPos === name.length - 2) {
583
- return statsReadField.call(this, name.substr(0, msPos)).getTime();
584
- }
585
-
586
- return undefined;
587
- }
588
-
589
- const [offset, type] = field;
590
-
591
- const read = (typeof type === 'string') ? Memory['read' + type] : type;
592
-
593
- const value = read(this.buffer.add(offset));
594
- if (value instanceof Int64 || value instanceof UInt64)
595
- return value.valueOf();
596
-
597
- return value;
598
- }
599
-
600
- function readTimespec32(address) {
601
- const sec = address.readU32();
602
- const nsec = address.add(4).readU32();
603
- const msec = nsec / 1000000;
604
- return new Date((sec * 1000) + msec);
605
- }
606
-
607
- function readTimespec64(address) {
608
- // FIXME: Improve UInt64 to support division
609
- const sec = address.readU64().valueOf();
610
- const nsec = address.add(8).readU64().valueOf();
611
- const msec = nsec / 1000000;
612
- return new Date((sec * 1000) + msec);
613
- }
614
-
615
- function getErrorString(errno) {
616
- return getApi().strerror(errno).readUtf8String();
617
- }
618
-
619
- function callbackify(original) {
620
- return function (...args) {
621
- const numArgsMinusOne = args.length - 1;
622
-
623
- const implArgs = args.slice(0, numArgsMinusOne);
624
- const callback = args[numArgsMinusOne];
625
-
626
- process.nextTick(function () {
627
- try {
628
- const result = original(...implArgs);
629
- callback(null, result);
630
- } catch (e) {
631
- callback(e);
632
- }
633
- });
634
- };
635
- }
636
-
637
- const SF = SystemFunction;
638
- const NF = NativeFunction;
639
-
640
- const ssizeType = (pointerSize === 8) ? 'int64' : 'int32';
641
- const sizeType = 'u' + ssizeType;
642
- const offsetType = (platform === 'darwin' || pointerSize === 8) ? 'int64' : 'int32';
643
-
644
- const apiSpec = [
645
- ['open', SF, 'int', ['pointer', 'int', '...', 'int']],
646
- ['close', NF, 'int', ['int']],
647
- ['lseek', NF, offsetType, ['int', offsetType, 'int']],
648
- ['read', SF, ssizeType, ['int', 'pointer', sizeType]],
649
- ['opendir', SF, 'pointer', ['pointer']],
650
- ['opendir$INODE64', SF, 'pointer', ['pointer']],
651
- ['closedir', NF, 'int', ['pointer']],
652
- ['readdir', NF, 'pointer', ['pointer']],
653
- ['readdir$INODE64', NF, 'pointer', ['pointer']],
654
- ['readlink', SF, ssizeType, ['pointer', 'pointer', sizeType]],
655
- ['unlink', SF, 'int', ['pointer']],
656
- ['stat', SF, 'int', ['pointer', 'pointer']],
657
- ['stat64', SF, 'int', ['pointer', 'pointer']],
658
- ['__xstat64', SF, 'int', ['int', 'pointer', 'pointer'], invokeXstat],
659
- ['lstat', SF, 'int', ['pointer', 'pointer']],
660
- ['lstat64', SF, 'int', ['pointer', 'pointer']],
661
- ['__lxstat64', SF, 'int', ['int', 'pointer', 'pointer'], invokeXstat],
662
- ['strerror', NF, 'pointer', ['int']],
663
- ];
664
-
665
- function invokeXstat(impl, path, buf) {
666
- const STAT_VER_LINUX = 3;
667
- return impl(STAT_VER_LINUX, path, buf);
668
- }
669
-
670
- let cachedApi = null;
671
- function getApi() {
672
- if (cachedApi === null) {
673
- cachedApi = apiSpec.reduce((api, entry) => {
674
- addApiPlaceholder(api, entry);
675
- return api;
676
- }, {});
677
- }
678
- return cachedApi;
679
- }
680
-
681
- function addApiPlaceholder(api, entry) {
682
- const [name] = entry;
683
-
684
- Object.defineProperty(api, name, {
685
- configurable: true,
686
- get() {
687
- const [, Ctor, retType, argTypes, wrapper] = entry;
688
-
689
- let impl = null;
690
- const address = Module.findExportByName(null, name);
691
- if (address !== null)
692
- impl = new Ctor(address, retType, argTypes);
693
-
694
- if (wrapper !== undefined)
695
- impl = wrapper.bind(null, impl);
696
-
697
- Object.defineProperty(api, name, { value: impl });
698
-
699
- return impl;
700
- }
701
- });
702
- }
703
-
704
- export function createReadStream(path) {
705
- return new ReadStream(path);
706
- }
707
-
708
- export function createWriteStream(path) {
709
- return new WriteStream(path);
710
- }
711
-
712
- export const readdir = callbackify(readdirSync);
713
- export const readFile = callbackify(readFileSync);
714
- export const readlink = callbackify(readlinkSync);
715
- export const unlink = callbackify(unlinkSync);
716
- export const stat = callbackify(statSync);
717
- export const lstat = callbackify(lstatSync);
718
-
719
- export {
720
- constants,
721
- readdirSync,
722
- list,
723
- readFileSync,
724
- readlinkSync,
725
- unlinkSync,
726
- statSync,
727
- lstatSync,
728
- Stats,
729
- };
730
-
731
- export default {
732
- constants,
733
- createReadStream,
734
- createWriteStream,
735
- readdir,
736
- readdirSync,
737
- list,
738
- readFile,
739
- readFileSync,
740
- readlink,
741
- readlinkSync,
742
- unlink,
743
- unlinkSync,
744
- stat,
745
- statSync,
746
- lstat,
747
- lstatSync,
748
- Stats,
749
- };