53 lines
1.5 KiB
Plaintext
53 lines
1.5 KiB
Plaintext
/** Shared helpers for drive-resident /bin scripts (prepended before each command). */
|
|
function bareStdin(ctx) {
|
|
return typeof ctx.shellStdin === 'string' ? ctx.shellStdin : ''
|
|
}
|
|
|
|
async function run(ctx, argv) {
|
|
const vfs = ctx.vfs
|
|
let showAll = false
|
|
let longFmt = false
|
|
const paths = []
|
|
for (let i = 1; i < argv.length; i++) {
|
|
const a = argv[i]
|
|
if (a === '--') {
|
|
paths.push(...argv.slice(i + 1))
|
|
break
|
|
}
|
|
if (a.startsWith('-') && a.length > 1) {
|
|
for (let j = 1; j < a.length; j++) {
|
|
const c = a[j]
|
|
if (c === 'a') showAll = true
|
|
else if (c === 'l') longFmt = true
|
|
else if (c === '1') longFmt = false
|
|
}
|
|
continue
|
|
}
|
|
paths.push(a)
|
|
}
|
|
const targets = paths.length ? paths : ['.']
|
|
|
|
for (const t of targets) {
|
|
if (targets.length > 1) ctx.console.log(t + ':')
|
|
let names
|
|
try {
|
|
names = await vfs.readdir(t)
|
|
} catch (e) {
|
|
ctx.console.error('ls: cannot access ' + t + ': ' + (e.message || e))
|
|
continue
|
|
}
|
|
if (!showAll) names = names.filter((n) => n !== '.' && n !== '..')
|
|
if (!longFmt) {
|
|
ctx.console.log(names.join(' '))
|
|
} else {
|
|
for (const n of names) {
|
|
const sub = t === '.' || t === './' ? n : t.replace(/\/$/, '') + '/' + n
|
|
const st = await vfs.stat(sub)
|
|
const tag = st ? (st.type === 'directory' ? 'd' : '-') : '?'
|
|
const sz = st && st.size != null ? String(st.size) : '0'
|
|
ctx.console.log(tag + 'rwxr-xr-x 1 user user ' + sz + ' ' + n)
|
|
}
|
|
}
|
|
}
|
|
}
|