@ecmaos/coreutils 0.3.1 → 0.4.2
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +48 -0
- package/dist/commands/awk.d.ts +4 -0
- package/dist/commands/awk.d.ts.map +1 -0
- package/dist/commands/awk.js +324 -0
- package/dist/commands/awk.js.map +1 -0
- package/dist/commands/chgrp.d.ts +4 -0
- package/dist/commands/chgrp.d.ts.map +1 -0
- package/dist/commands/chgrp.js +187 -0
- package/dist/commands/chgrp.js.map +1 -0
- package/dist/commands/chmod.d.ts.map +1 -1
- package/dist/commands/chmod.js +139 -2
- package/dist/commands/chmod.js.map +1 -1
- package/dist/commands/chown.d.ts +4 -0
- package/dist/commands/chown.d.ts.map +1 -0
- package/dist/commands/chown.js +257 -0
- package/dist/commands/chown.js.map +1 -0
- package/dist/commands/cksum.d.ts +4 -0
- package/dist/commands/cksum.d.ts.map +1 -0
- package/dist/commands/cksum.js +124 -0
- package/dist/commands/cksum.js.map +1 -0
- package/dist/commands/cmp.d.ts +4 -0
- package/dist/commands/cmp.d.ts.map +1 -0
- package/dist/commands/cmp.js +120 -0
- package/dist/commands/cmp.js.map +1 -0
- package/dist/commands/column.d.ts +4 -0
- package/dist/commands/column.d.ts.map +1 -0
- package/dist/commands/column.js +274 -0
- package/dist/commands/column.js.map +1 -0
- package/dist/commands/cp.d.ts.map +1 -1
- package/dist/commands/cp.js +81 -4
- package/dist/commands/cp.js.map +1 -1
- package/dist/commands/cron.d.ts.map +1 -1
- package/dist/commands/cron.js +116 -23
- package/dist/commands/cron.js.map +1 -1
- package/dist/commands/curl.d.ts +4 -0
- package/dist/commands/curl.d.ts.map +1 -0
- package/dist/commands/curl.js +238 -0
- package/dist/commands/curl.js.map +1 -0
- package/dist/commands/du.d.ts +4 -0
- package/dist/commands/du.d.ts.map +1 -0
- package/dist/commands/du.js +168 -0
- package/dist/commands/du.js.map +1 -0
- package/dist/commands/echo.d.ts.map +1 -1
- package/dist/commands/echo.js +125 -2
- package/dist/commands/echo.js.map +1 -1
- package/dist/commands/env.d.ts +4 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +129 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/expand.d.ts +4 -0
- package/dist/commands/expand.d.ts.map +1 -0
- package/dist/commands/expand.js +197 -0
- package/dist/commands/expand.js.map +1 -0
- package/dist/commands/factor.d.ts +4 -0
- package/dist/commands/factor.d.ts.map +1 -0
- package/dist/commands/factor.js +141 -0
- package/dist/commands/factor.js.map +1 -0
- package/dist/commands/fmt.d.ts +4 -0
- package/dist/commands/fmt.d.ts.map +1 -0
- package/dist/commands/fmt.js +278 -0
- package/dist/commands/fmt.js.map +1 -0
- package/dist/commands/fold.d.ts +4 -0
- package/dist/commands/fold.d.ts.map +1 -0
- package/dist/commands/fold.js +253 -0
- package/dist/commands/fold.js.map +1 -0
- package/dist/commands/groups.d.ts +4 -0
- package/dist/commands/groups.d.ts.map +1 -0
- package/dist/commands/groups.js +61 -0
- package/dist/commands/groups.js.map +1 -0
- package/dist/commands/head.d.ts.map +1 -1
- package/dist/commands/head.js +184 -77
- package/dist/commands/head.js.map +1 -1
- package/dist/commands/hostname.d.ts +4 -0
- package/dist/commands/hostname.d.ts.map +1 -0
- package/dist/commands/hostname.js +80 -0
- package/dist/commands/hostname.js.map +1 -0
- package/dist/commands/less.d.ts.map +1 -1
- package/dist/commands/less.js +1 -0
- package/dist/commands/less.js.map +1 -1
- package/dist/commands/man.d.ts.map +1 -1
- package/dist/commands/man.js +3 -1
- package/dist/commands/man.js.map +1 -1
- package/dist/commands/mount.d.ts +4 -0
- package/dist/commands/mount.d.ts.map +1 -0
- package/dist/commands/mount.js +1136 -0
- package/dist/commands/mount.js.map +1 -0
- package/dist/commands/od.d.ts +4 -0
- package/dist/commands/od.d.ts.map +1 -0
- package/dist/commands/od.js +342 -0
- package/dist/commands/od.js.map +1 -0
- package/dist/commands/pr.d.ts +4 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +298 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/printf.d.ts +4 -0
- package/dist/commands/printf.d.ts.map +1 -0
- package/dist/commands/printf.js +271 -0
- package/dist/commands/printf.js.map +1 -0
- package/dist/commands/readlink.d.ts +4 -0
- package/dist/commands/readlink.d.ts.map +1 -0
- package/dist/commands/readlink.js +104 -0
- package/dist/commands/readlink.js.map +1 -0
- package/dist/commands/realpath.d.ts +4 -0
- package/dist/commands/realpath.d.ts.map +1 -0
- package/dist/commands/realpath.js +111 -0
- package/dist/commands/realpath.js.map +1 -0
- package/dist/commands/rev.d.ts +4 -0
- package/dist/commands/rev.d.ts.map +1 -0
- package/dist/commands/rev.js +134 -0
- package/dist/commands/rev.js.map +1 -0
- package/dist/commands/shuf.d.ts +4 -0
- package/dist/commands/shuf.d.ts.map +1 -0
- package/dist/commands/shuf.js +221 -0
- package/dist/commands/shuf.js.map +1 -0
- package/dist/commands/sleep.d.ts +4 -0
- package/dist/commands/sleep.d.ts.map +1 -0
- package/dist/commands/sleep.js +102 -0
- package/dist/commands/sleep.js.map +1 -0
- package/dist/commands/strings.d.ts +4 -0
- package/dist/commands/strings.d.ts.map +1 -0
- package/dist/commands/strings.js +170 -0
- package/dist/commands/strings.js.map +1 -0
- package/dist/commands/tac.d.ts +4 -0
- package/dist/commands/tac.d.ts.map +1 -0
- package/dist/commands/tac.js +130 -0
- package/dist/commands/tac.js.map +1 -0
- package/dist/commands/time.d.ts +4 -0
- package/dist/commands/time.d.ts.map +1 -0
- package/dist/commands/time.js +126 -0
- package/dist/commands/time.js.map +1 -0
- package/dist/commands/umount.d.ts +4 -0
- package/dist/commands/umount.d.ts.map +1 -0
- package/dist/commands/umount.js +103 -0
- package/dist/commands/umount.js.map +1 -0
- package/dist/commands/uname.d.ts +4 -0
- package/dist/commands/uname.d.ts.map +1 -0
- package/dist/commands/uname.js +149 -0
- package/dist/commands/uname.js.map +1 -0
- package/dist/commands/unexpand.d.ts +4 -0
- package/dist/commands/unexpand.d.ts.map +1 -0
- package/dist/commands/unexpand.js +286 -0
- package/dist/commands/unexpand.js.map +1 -0
- package/dist/commands/uptime.d.ts +4 -0
- package/dist/commands/uptime.d.ts.map +1 -0
- package/dist/commands/uptime.js +62 -0
- package/dist/commands/uptime.js.map +1 -0
- package/dist/commands/view.d.ts +1 -0
- package/dist/commands/view.d.ts.map +1 -1
- package/dist/commands/view.js +408 -66
- package/dist/commands/view.js.map +1 -1
- package/dist/commands/yes.d.ts +4 -0
- package/dist/commands/yes.d.ts.map +1 -0
- package/dist/commands/yes.js +58 -0
- package/dist/commands/yes.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -1
- package/package.json +12 -3
- package/src/commands/awk.ts +340 -0
- package/src/commands/chmod.ts +141 -2
- package/src/commands/chown.ts +321 -0
- package/src/commands/cksum.ts +133 -0
- package/src/commands/cmp.ts +126 -0
- package/src/commands/column.ts +273 -0
- package/src/commands/cp.ts +93 -4
- package/src/commands/cron.ts +115 -23
- package/src/commands/curl.ts +231 -0
- package/src/commands/echo.ts +122 -2
- package/src/commands/env.ts +143 -0
- package/src/commands/expand.ts +207 -0
- package/src/commands/factor.ts +151 -0
- package/src/commands/fmt.ts +293 -0
- package/src/commands/fold.ts +257 -0
- package/src/commands/groups.ts +72 -0
- package/src/commands/head.ts +176 -77
- package/src/commands/hostname.ts +81 -0
- package/src/commands/less.ts +1 -0
- package/src/commands/man.ts +4 -1
- package/src/commands/mount.ts +1302 -0
- package/src/commands/od.ts +327 -0
- package/src/commands/pr.ts +291 -0
- package/src/commands/printf.ts +271 -0
- package/src/commands/readlink.ts +102 -0
- package/src/commands/realpath.ts +126 -0
- package/src/commands/rev.ts +143 -0
- package/src/commands/shuf.ts +218 -0
- package/src/commands/sleep.ts +109 -0
- package/src/commands/strings.ts +176 -0
- package/src/commands/tac.ts +138 -0
- package/src/commands/time.ts +144 -0
- package/src/commands/umount.ts +116 -0
- package/src/commands/uname.ts +130 -0
- package/src/commands/unexpand.ts +305 -0
- package/src/commands/uptime.ts +73 -0
- package/src/commands/view.ts +463 -73
- package/src/index.ts +82 -0
- package/tsconfig.json +4 -0
package/dist/commands/chmod.js
CHANGED
|
@@ -4,11 +4,147 @@ import { TerminalCommand } from '../shared/terminal-command.js';
|
|
|
4
4
|
import { writelnStderr } from '../shared/helpers.js';
|
|
5
5
|
function printUsage(process, terminal) {
|
|
6
6
|
const usage = `Usage: chmod [OPTION]... MODE[,MODE]... FILE...
|
|
7
|
+
or: chmod [OPTION]... OCTAL-MODE FILE...
|
|
7
8
|
Change the mode of each FILE to MODE.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
--help display this help and exit
|
|
11
|
+
|
|
12
|
+
Each MODE is of the form '[ugoa]*([-+=]([rwxXst]*|[ugo]))+|[-+=][0-7]+'.
|
|
13
|
+
|
|
14
|
+
MODE can be specified in two ways:
|
|
15
|
+
|
|
16
|
+
Numeric mode (octal):
|
|
17
|
+
MODE is an octal number representing the permissions:
|
|
18
|
+
4 = read (r)
|
|
19
|
+
2 = write (w)
|
|
20
|
+
1 = execute (x)
|
|
21
|
+
|
|
22
|
+
The three digits represent user, group, and other permissions.
|
|
23
|
+
Each digit is the sum of the desired permissions:
|
|
24
|
+
- 7 = 4+2+1 = read + write + execute (rwx)
|
|
25
|
+
- 6 = 4+2 = read + write (rw-)
|
|
26
|
+
- 5 = 4+1 = read + execute (r-x)
|
|
27
|
+
- 4 = 4 = read only (r--)
|
|
28
|
+
|
|
29
|
+
Examples:
|
|
30
|
+
755 = rwxr-xr-x (user: rwx, group: r-x, other: r-x)
|
|
31
|
+
644 = rw-r--r-- (user: rw-, group: r--, other: r--)
|
|
32
|
+
600 = rw------- (user: rw-, group: ---, other: ---)
|
|
33
|
+
|
|
34
|
+
Symbolic mode:
|
|
35
|
+
[ugoa]*[-+=][rwxXst]*
|
|
36
|
+
|
|
37
|
+
The format is: [who][operator][permissions]
|
|
38
|
+
|
|
39
|
+
'who' (optional, defaults to 'a' if omitted):
|
|
40
|
+
u user (owner)
|
|
41
|
+
g group
|
|
42
|
+
o other
|
|
43
|
+
a all (user, group, and other)
|
|
44
|
+
|
|
45
|
+
'operator':
|
|
46
|
+
+ add the specified permissions
|
|
47
|
+
- remove the specified permissions
|
|
48
|
+
= set the exact permissions (clears others)
|
|
49
|
+
|
|
50
|
+
'permissions' (one or more):
|
|
51
|
+
r read
|
|
52
|
+
w write
|
|
53
|
+
x execute
|
|
54
|
+
X execute only if file is a directory or already has execute
|
|
55
|
+
s setuid/setgid
|
|
56
|
+
t sticky bit
|
|
57
|
+
|
|
58
|
+
Examples:
|
|
59
|
+
chmod 755 file Set file to rwxr-xr-x
|
|
60
|
+
chmod +x file Add execute permission for all
|
|
61
|
+
chmod u+x file Add execute permission for user
|
|
62
|
+
chmod g-w file Remove write permission for group
|
|
63
|
+
chmod o=r file Set other permissions to read-only
|
|
64
|
+
chmod u=rwx,g=rx,o=r file Set specific permissions for each class
|
|
65
|
+
chmod a-w file Remove write permission for all
|
|
66
|
+
chmod u+x,g+x file Add execute for user and group
|
|
67
|
+
|
|
68
|
+
Multiple modes can be specified separated by commas:
|
|
69
|
+
chmod u+x,g-w file Add execute for user, remove write for group`;
|
|
10
70
|
writelnStderr(process, terminal, usage);
|
|
11
71
|
}
|
|
72
|
+
function parseNumericMode(mode) {
|
|
73
|
+
if (/^0?[0-7]{1,4}$/.test(mode)) {
|
|
74
|
+
return parseInt(mode, 8);
|
|
75
|
+
}
|
|
76
|
+
if (/^0o[0-7]{1,4}$/i.test(mode)) {
|
|
77
|
+
return parseInt(mode.slice(2), 8);
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
function parseSymbolicMode(mode, currentMode) {
|
|
82
|
+
const parts = mode.split(',');
|
|
83
|
+
let newMode = currentMode;
|
|
84
|
+
for (const part of parts) {
|
|
85
|
+
const match = part.match(/^([ugoa]*)([+\-=])([rwxXst]*)$/);
|
|
86
|
+
if (!match) {
|
|
87
|
+
throw new Error(`Invalid mode: ${part}`);
|
|
88
|
+
}
|
|
89
|
+
const [, who, op, perms = ''] = match;
|
|
90
|
+
const whoSet = who || 'a';
|
|
91
|
+
if ((op === '+' || op === '-') && !perms) {
|
|
92
|
+
throw new Error(`Invalid mode: ${part} (missing permissions)`);
|
|
93
|
+
}
|
|
94
|
+
const userBits = 0o400 | 0o200 | 0o100;
|
|
95
|
+
const groupBits = 0o040 | 0o020 | 0o010;
|
|
96
|
+
const otherBits = 0o004 | 0o002 | 0o001;
|
|
97
|
+
let permBits = 0;
|
|
98
|
+
if (perms.includes('r'))
|
|
99
|
+
permBits |= 0o444;
|
|
100
|
+
if (perms.includes('w'))
|
|
101
|
+
permBits |= 0o222;
|
|
102
|
+
if (perms.includes('x'))
|
|
103
|
+
permBits |= 0o111;
|
|
104
|
+
if (perms.includes('X')) {
|
|
105
|
+
if (currentMode & 0o111)
|
|
106
|
+
permBits |= 0o111;
|
|
107
|
+
}
|
|
108
|
+
if (perms.includes('s'))
|
|
109
|
+
permBits |= 0o6000;
|
|
110
|
+
if (perms.includes('t'))
|
|
111
|
+
permBits |= 0o1000;
|
|
112
|
+
let targetBits = 0;
|
|
113
|
+
if (whoSet.includes('u') || whoSet.includes('a'))
|
|
114
|
+
targetBits |= userBits;
|
|
115
|
+
if (whoSet.includes('g') || whoSet.includes('a'))
|
|
116
|
+
targetBits |= groupBits;
|
|
117
|
+
if (whoSet.includes('o') || whoSet.includes('a'))
|
|
118
|
+
targetBits |= otherBits;
|
|
119
|
+
switch (op) {
|
|
120
|
+
case '+':
|
|
121
|
+
newMode |= (permBits & targetBits);
|
|
122
|
+
break;
|
|
123
|
+
case '-':
|
|
124
|
+
newMode &= ~(permBits & targetBits);
|
|
125
|
+
break;
|
|
126
|
+
case '=':
|
|
127
|
+
newMode &= ~targetBits;
|
|
128
|
+
newMode |= (permBits & targetBits);
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return newMode;
|
|
133
|
+
}
|
|
134
|
+
async function parseMode(mode, fs, filePath) {
|
|
135
|
+
const numericMode = parseNumericMode(mode);
|
|
136
|
+
if (numericMode !== null) {
|
|
137
|
+
return numericMode;
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const stats = await fs.stat(filePath);
|
|
141
|
+
const currentMode = stats.mode & 0o7777;
|
|
142
|
+
return parseSymbolicMode(mode, currentMode);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
throw new Error(`Cannot access ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
12
148
|
export function createCommand(kernel, shell, terminal) {
|
|
13
149
|
return new TerminalCommand({
|
|
14
150
|
command: 'chmod',
|
|
@@ -44,7 +180,8 @@ export function createCommand(kernel, shell, terminal) {
|
|
|
44
180
|
for (const target of targets) {
|
|
45
181
|
const fullPath = path.resolve(shell.cwd, target);
|
|
46
182
|
try {
|
|
47
|
-
await shell.context.fs.promises
|
|
183
|
+
const numericMode = await parseMode(mode, shell.context.fs.promises, fullPath);
|
|
184
|
+
await shell.context.fs.promises.chmod(fullPath, numericMode);
|
|
48
185
|
}
|
|
49
186
|
catch (error) {
|
|
50
187
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chmod.js","sourceRoot":"","sources":["../../src/commands/chmod.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEpD,SAAS,UAAU,CAAC,OAA4B,EAAE,QAAkB;IAClE,MAAM,KAAK,GAAG
|
|
1
|
+
{"version":3,"file":"chmod.js","sourceRoot":"","sources":["../../src/commands/chmod.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Kernel, Shell, Terminal } from '@ecmaos/types';
|
|
2
|
+
import { TerminalCommand } from '../shared/terminal-command.js';
|
|
3
|
+
export declare function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal): TerminalCommand;
|
|
4
|
+
//# sourceMappingURL=chown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chown.d.ts","sourceRoot":"","sources":["../../src/commands/chown.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAQ,MAAM,eAAe,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAuO/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAsF/F"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { TerminalCommand } from '../shared/terminal-command.js';
|
|
4
|
+
import { writelnStderr, writelnStdout } from '../shared/helpers.js';
|
|
5
|
+
function printUsage(process, terminal) {
|
|
6
|
+
const usage = `Usage: chown [OPTION]... [OWNER][:[GROUP]] FILE...
|
|
7
|
+
or: chown [OPTION]... :GROUP FILE...
|
|
8
|
+
or: chown [OPTION]... --reference=RFILE FILE...
|
|
9
|
+
Change the owner and/or group of each FILE to OWNER and/or GROUP.
|
|
10
|
+
|
|
11
|
+
-R, --recursive operate on files and directories recursively
|
|
12
|
+
-v, --verbose output a diagnostic for every file processed
|
|
13
|
+
-c, --changes like verbose but report only when a change is made
|
|
14
|
+
--help display this help and exit
|
|
15
|
+
|
|
16
|
+
OWNER and GROUP can be specified as:
|
|
17
|
+
- A numeric user ID (UID) or group ID (GID)
|
|
18
|
+
- A username (resolved to UID)
|
|
19
|
+
- A group name (resolved to GID, if supported)
|
|
20
|
+
|
|
21
|
+
The format OWNER:GROUP means set both owner and group.
|
|
22
|
+
The format OWNER: means set owner and set group to owner's primary group.
|
|
23
|
+
The format :GROUP means set group only (keep current owner).
|
|
24
|
+
The format OWNER.GROUP is also accepted (same as OWNER:GROUP).
|
|
25
|
+
|
|
26
|
+
Examples:
|
|
27
|
+
chown root file Change owner of file to root
|
|
28
|
+
chown root:root file Change owner and group to root
|
|
29
|
+
chown :users file Change group to users (keep owner)
|
|
30
|
+
chown root: file Change owner to root, group to root's primary group
|
|
31
|
+
chown -R root:root /dir Recursively change owner and group
|
|
32
|
+
chown -v user file Verbose output while changing owner
|
|
33
|
+
chown -c user file Report only when changes are made`;
|
|
34
|
+
writelnStderr(process, terminal, usage);
|
|
35
|
+
}
|
|
36
|
+
function parseOwnershipSpec(spec, kernel) {
|
|
37
|
+
const result = {
|
|
38
|
+
ownerOnly: false,
|
|
39
|
+
groupOnly: false,
|
|
40
|
+
setGroupToOwnerPrimary: false
|
|
41
|
+
};
|
|
42
|
+
if (spec.startsWith(':')) {
|
|
43
|
+
result.groupOnly = true;
|
|
44
|
+
const groupSpec = spec.slice(1);
|
|
45
|
+
if (!groupSpec) {
|
|
46
|
+
throw new Error('Invalid ownership spec: missing group after colon');
|
|
47
|
+
}
|
|
48
|
+
result.group = resolveGroup(groupSpec, kernel);
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
if (spec.endsWith(':')) {
|
|
52
|
+
result.ownerOnly = true;
|
|
53
|
+
result.setGroupToOwnerPrimary = true;
|
|
54
|
+
const ownerSpec = spec.slice(0, -1);
|
|
55
|
+
if (!ownerSpec) {
|
|
56
|
+
throw new Error('Invalid ownership spec: missing owner before colon');
|
|
57
|
+
}
|
|
58
|
+
result.owner = resolveOwner(ownerSpec, kernel);
|
|
59
|
+
const ownerUser = kernel.users.get(result.owner);
|
|
60
|
+
if (ownerUser) {
|
|
61
|
+
result.group = ownerUser.gid;
|
|
62
|
+
}
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
const colonIndex = spec.indexOf(':');
|
|
66
|
+
const dotIndex = spec.indexOf('.');
|
|
67
|
+
if (colonIndex === -1 && dotIndex === -1) {
|
|
68
|
+
result.owner = resolveOwner(spec, kernel);
|
|
69
|
+
result.ownerOnly = true;
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
const separatorIndex = colonIndex !== -1 ? colonIndex : dotIndex;
|
|
73
|
+
const ownerSpec = spec.slice(0, separatorIndex);
|
|
74
|
+
const groupSpec = spec.slice(separatorIndex + 1);
|
|
75
|
+
if (!ownerSpec && !groupSpec) {
|
|
76
|
+
throw new Error('Invalid ownership spec: both owner and group are empty');
|
|
77
|
+
}
|
|
78
|
+
if (ownerSpec) {
|
|
79
|
+
result.owner = resolveOwner(ownerSpec, kernel);
|
|
80
|
+
}
|
|
81
|
+
if (groupSpec) {
|
|
82
|
+
result.group = resolveGroup(groupSpec, kernel);
|
|
83
|
+
}
|
|
84
|
+
return result;
|
|
85
|
+
}
|
|
86
|
+
function resolveOwner(ownerSpec, kernel) {
|
|
87
|
+
const numericUid = parseInt(ownerSpec, 10);
|
|
88
|
+
if (!isNaN(numericUid) && numericUid.toString() === ownerSpec) {
|
|
89
|
+
return numericUid;
|
|
90
|
+
}
|
|
91
|
+
const user = Array.from(kernel.users.all.values()).find((u) => u.username === ownerSpec);
|
|
92
|
+
if (!user) {
|
|
93
|
+
throw new Error(`Invalid user: ${ownerSpec}`);
|
|
94
|
+
}
|
|
95
|
+
return user.uid;
|
|
96
|
+
}
|
|
97
|
+
function resolveGroup(groupSpec, kernel) {
|
|
98
|
+
const numericGid = parseInt(groupSpec, 10);
|
|
99
|
+
if (!isNaN(numericGid) && numericGid.toString() === groupSpec) {
|
|
100
|
+
return numericGid;
|
|
101
|
+
}
|
|
102
|
+
const user = Array.from(kernel.users.all.values()).find((u) => u.username === groupSpec);
|
|
103
|
+
if (user) {
|
|
104
|
+
return user.gid;
|
|
105
|
+
}
|
|
106
|
+
throw new Error(`Invalid group: ${groupSpec}`);
|
|
107
|
+
}
|
|
108
|
+
async function getCurrentOwnership(fs, filePath) {
|
|
109
|
+
try {
|
|
110
|
+
const stats = await fs.stat(filePath);
|
|
111
|
+
return { uid: stats.uid, gid: stats.gid };
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
throw new Error(`Cannot access ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async function changeOwnership(fs, filePath, spec, kernel) {
|
|
118
|
+
const current = await getCurrentOwnership(fs, filePath);
|
|
119
|
+
let newUid = current.uid;
|
|
120
|
+
let newGid = current.gid;
|
|
121
|
+
if (spec.ownerOnly) {
|
|
122
|
+
newUid = spec.owner ?? current.uid;
|
|
123
|
+
if (spec.setGroupToOwnerPrimary && spec.owner !== undefined) {
|
|
124
|
+
const ownerUser = kernel.users.get(spec.owner);
|
|
125
|
+
if (ownerUser) {
|
|
126
|
+
newGid = ownerUser.gid;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else if (spec.group !== undefined) {
|
|
130
|
+
newGid = spec.group;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else if (spec.groupOnly) {
|
|
134
|
+
newGid = spec.group ?? current.gid;
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
if (spec.owner !== undefined) {
|
|
138
|
+
newUid = spec.owner;
|
|
139
|
+
}
|
|
140
|
+
if (spec.group !== undefined) {
|
|
141
|
+
newGid = spec.group;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
await fs.chown(filePath, newUid, newGid);
|
|
145
|
+
return { uid: newUid, gid: newGid };
|
|
146
|
+
}
|
|
147
|
+
async function processFile(fs, filePath, spec, kernel, options, process, terminal, relativePath) {
|
|
148
|
+
try {
|
|
149
|
+
const current = await getCurrentOwnership(fs, filePath);
|
|
150
|
+
const newOwnership = await changeOwnership(fs, filePath, spec, kernel);
|
|
151
|
+
const changed = current.uid !== newOwnership.uid || current.gid !== newOwnership.gid;
|
|
152
|
+
if (options.verbose || (options.changes && changed)) {
|
|
153
|
+
const changeInfo = changed
|
|
154
|
+
? `changed ownership of '${relativePath}' from ${current.uid}:${current.gid} to ${newOwnership.uid}:${newOwnership.gid}`
|
|
155
|
+
: `ownership of '${relativePath}' retained as ${newOwnership.uid}:${newOwnership.gid}`;
|
|
156
|
+
await writelnStdout(process, terminal, changeInfo);
|
|
157
|
+
}
|
|
158
|
+
if (options.recursive) {
|
|
159
|
+
try {
|
|
160
|
+
const stats = await fs.stat(filePath);
|
|
161
|
+
if (stats.isDirectory()) {
|
|
162
|
+
const entries = await fs.readdir(filePath);
|
|
163
|
+
for (const entry of entries) {
|
|
164
|
+
const entryPath = path.join(filePath, entry);
|
|
165
|
+
const entryRelativePath = path.join(relativePath, entry);
|
|
166
|
+
await processFile(fs, entryPath, spec, kernel, options, process, terminal, entryRelativePath);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
172
|
+
await writelnStderr(process, terminal, `chown: ${relativePath}: ${errorMessage}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
179
|
+
await writelnStderr(process, terminal, `chown: ${relativePath}: ${errorMessage}`);
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
export function createCommand(kernel, shell, terminal) {
|
|
184
|
+
return new TerminalCommand({
|
|
185
|
+
command: 'chown',
|
|
186
|
+
description: 'Change file owner and group',
|
|
187
|
+
kernel,
|
|
188
|
+
shell,
|
|
189
|
+
terminal,
|
|
190
|
+
run: async (pid, argv) => {
|
|
191
|
+
const process = kernel.processes.get(pid);
|
|
192
|
+
if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
|
|
193
|
+
printUsage(process, terminal);
|
|
194
|
+
return 0;
|
|
195
|
+
}
|
|
196
|
+
let recursive = false;
|
|
197
|
+
let verbose = false;
|
|
198
|
+
let changes = false;
|
|
199
|
+
const args = [];
|
|
200
|
+
for (const arg of argv) {
|
|
201
|
+
if (arg === '-R' || arg === '--recursive') {
|
|
202
|
+
recursive = true;
|
|
203
|
+
}
|
|
204
|
+
else if (arg === '-v' || arg === '--verbose') {
|
|
205
|
+
verbose = true;
|
|
206
|
+
}
|
|
207
|
+
else if (arg === '-c' || arg === '--changes') {
|
|
208
|
+
changes = true;
|
|
209
|
+
}
|
|
210
|
+
else if (arg === '--reference') {
|
|
211
|
+
await writelnStderr(process, terminal, chalk.red('chown: --reference option not yet implemented'));
|
|
212
|
+
return 1;
|
|
213
|
+
}
|
|
214
|
+
else if (arg && !arg.startsWith('-')) {
|
|
215
|
+
args.push(arg);
|
|
216
|
+
}
|
|
217
|
+
else if (arg.startsWith('-')) {
|
|
218
|
+
await writelnStderr(process, terminal, chalk.red(`chown: invalid option '${arg}'`));
|
|
219
|
+
await writelnStderr(process, terminal, 'Try \'chown --help\' for more information.');
|
|
220
|
+
return 1;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (args.length === 0) {
|
|
224
|
+
await writelnStderr(process, terminal, chalk.red('chown: missing operand'));
|
|
225
|
+
await writelnStderr(process, terminal, 'Try \'chown --help\' for more information.');
|
|
226
|
+
return 1;
|
|
227
|
+
}
|
|
228
|
+
const ownershipSpec = args[0];
|
|
229
|
+
const targets = args.slice(1);
|
|
230
|
+
if (!ownershipSpec || targets.length === 0) {
|
|
231
|
+
await writelnStderr(process, terminal, chalk.red('chown: missing operand'));
|
|
232
|
+
await writelnStderr(process, terminal, 'Try \'chown --help\' for more information.');
|
|
233
|
+
return 1;
|
|
234
|
+
}
|
|
235
|
+
let spec;
|
|
236
|
+
try {
|
|
237
|
+
spec = parseOwnershipSpec(ownershipSpec, kernel);
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
241
|
+
await writelnStderr(process, terminal, chalk.red(`chown: invalid ownership spec '${ownershipSpec}': ${errorMessage}`));
|
|
242
|
+
return 1;
|
|
243
|
+
}
|
|
244
|
+
let hasError = false;
|
|
245
|
+
const options = { recursive, verbose, changes };
|
|
246
|
+
for (const target of targets) {
|
|
247
|
+
const fullPath = path.resolve(shell.cwd, target);
|
|
248
|
+
const error = await processFile(shell.context.fs.promises, fullPath, spec, kernel, options, process, terminal, target);
|
|
249
|
+
if (error) {
|
|
250
|
+
hasError = true;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return hasError ? 1 : 0;
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=chown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chown.js","sourceRoot":"","sources":["../../src/commands/chown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Kernel, Shell, Terminal } from '@ecmaos/types';
|
|
2
|
+
import { TerminalCommand } from '../shared/terminal-command.js';
|
|
3
|
+
export declare function createCommand(kernel: Kernel, shell: Shell, terminal: Terminal): TerminalCommand;
|
|
4
|
+
//# sourceMappingURL=cksum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cksum.d.ts","sourceRoot":"","sources":["../../src/commands/cksum.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAiC/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CAiG/F"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import { TerminalCommand } from '../shared/terminal-command.js';
|
|
3
|
+
import { writelnStderr } from '../shared/helpers.js';
|
|
4
|
+
function printUsage(process, terminal) {
|
|
5
|
+
const usage = `Usage: cksum [FILE]...
|
|
6
|
+
Print CRC checksum and byte count for each FILE.
|
|
7
|
+
|
|
8
|
+
If no FILE is specified, or if FILE is -, read standard input.
|
|
9
|
+
|
|
10
|
+
--help display this help and exit`;
|
|
11
|
+
writelnStderr(process, terminal, usage);
|
|
12
|
+
}
|
|
13
|
+
function calculateCRC32(data) {
|
|
14
|
+
let crc = 0xffffffff;
|
|
15
|
+
const polynomial = 0xedb88320;
|
|
16
|
+
for (let i = 0; i < data.length; i++) {
|
|
17
|
+
const byte = data[i];
|
|
18
|
+
if (byte === undefined)
|
|
19
|
+
continue;
|
|
20
|
+
crc ^= byte;
|
|
21
|
+
for (let j = 0; j < 8; j++) {
|
|
22
|
+
if (crc & 1) {
|
|
23
|
+
crc = (crc >>> 1) ^ polynomial;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
crc = crc >>> 1;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
31
|
+
}
|
|
32
|
+
export function createCommand(kernel, shell, terminal) {
|
|
33
|
+
return new TerminalCommand({
|
|
34
|
+
command: 'cksum',
|
|
35
|
+
description: 'Print CRC checksum and byte count',
|
|
36
|
+
kernel,
|
|
37
|
+
shell,
|
|
38
|
+
terminal,
|
|
39
|
+
run: async (pid, argv) => {
|
|
40
|
+
const process = kernel.processes.get(pid);
|
|
41
|
+
if (!process)
|
|
42
|
+
return 1;
|
|
43
|
+
if (argv.length > 0 && (argv[0] === '--help' || argv[0] === '-h')) {
|
|
44
|
+
printUsage(process, terminal);
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
const files = [];
|
|
48
|
+
for (const arg of argv) {
|
|
49
|
+
if (!arg)
|
|
50
|
+
continue;
|
|
51
|
+
if (arg === '--help' || arg === '-h') {
|
|
52
|
+
printUsage(process, terminal);
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
else if (!arg.startsWith('-')) {
|
|
56
|
+
files.push(arg);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
await writelnStderr(process, terminal, `cksum: invalid option -- '${arg.slice(1)}'`);
|
|
60
|
+
await writelnStderr(process, terminal, "Try 'cksum --help' for more information.");
|
|
61
|
+
return 1;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const writer = process.stdout.getWriter();
|
|
65
|
+
try {
|
|
66
|
+
if (files.length === 0) {
|
|
67
|
+
if (!process.stdin) {
|
|
68
|
+
return 0;
|
|
69
|
+
}
|
|
70
|
+
const reader = process.stdin.getReader();
|
|
71
|
+
const chunks = [];
|
|
72
|
+
try {
|
|
73
|
+
while (true) {
|
|
74
|
+
const { done, value } = await reader.read();
|
|
75
|
+
if (done)
|
|
76
|
+
break;
|
|
77
|
+
if (value) {
|
|
78
|
+
chunks.push(value);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
reader.releaseLock();
|
|
84
|
+
}
|
|
85
|
+
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
86
|
+
const data = new Uint8Array(totalLength);
|
|
87
|
+
let offset = 0;
|
|
88
|
+
for (const chunk of chunks) {
|
|
89
|
+
data.set(chunk, offset);
|
|
90
|
+
offset += chunk.length;
|
|
91
|
+
}
|
|
92
|
+
const crc = calculateCRC32(data);
|
|
93
|
+
await writer.write(new TextEncoder().encode(`${crc} ${data.length}\n`));
|
|
94
|
+
return 0;
|
|
95
|
+
}
|
|
96
|
+
for (const file of files) {
|
|
97
|
+
const fullPath = path.resolve(shell.cwd, file);
|
|
98
|
+
try {
|
|
99
|
+
if (fullPath.startsWith('/dev')) {
|
|
100
|
+
await writelnStderr(process, terminal, `cksum: ${file}: cannot checksum device files`);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
const data = await shell.context.fs.promises.readFile(fullPath);
|
|
104
|
+
const bytes = new Uint8Array(data);
|
|
105
|
+
const crc = calculateCRC32(bytes);
|
|
106
|
+
await writer.write(new TextEncoder().encode(`${crc} ${bytes.length} ${file}\n`));
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
await writelnStderr(process, terminal, `cksum: ${file}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return 0;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
await writelnStderr(process, terminal, `cksum: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
writer.releaseLock();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=cksum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cksum.js","sourceRoot":"","sources":["../../src/commands/cksum.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cmp.d.ts","sourceRoot":"","sources":["../../src/commands/cmp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAErE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAa/D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAG,eAAe,CA6G/F"}
|