fs Make fetch subcmd more configurable

This commit is contained in:
2025-10-11 22:23:10 +02:00
parent 7d81e39de5
commit 0d05abf282

View File

@ -2,6 +2,29 @@
#include <stdint.h>
#include <ulib.h>
struct {
bool plain;
bool names;
bool sizes;
bool types;
bool humsz;
} FS_FETCH_CONFIG = {
.plain = false,
.names = true,
.sizes = true,
.types = true,
.humsz = true,
};
static Arg ARGS[] = {
ARG("-p", ARG_BOOL, &FS_FETCH_CONFIG.plain),
ARG("-n", ARG_BOOL, &FS_FETCH_CONFIG.names),
ARG("-s", ARG_BOOL, &FS_FETCH_CONFIG.sizes),
ARG("-t", ARG_BOOL, &FS_FETCH_CONFIG.types),
ARG("-h", ARG_BOOL, &FS_FETCH_CONFIG.humsz),
ARG_END(),
};
void fs_fetch(void) {
if (argslen() < 2) {
uprintf("fs: Not enough arguments\n");
@ -10,6 +33,17 @@ void fs_fetch(void) {
char *path = *(args()+1);
int32_t ret;
if ((ret = parse_args(args()+2, argslen()-2, ARGS)) < 0) {
uprintf("fs: could not parse args: %d\n", ret);
return;
}
if (FS_FETCH_CONFIG.plain) {
FS_FETCH_CONFIG.sizes = false;
FS_FETCH_CONFIG.types = false;
}
IoctlStat statbuf; ZERO(&statbuf);
if (ioctl(IOCTL_NOHANDLE, IOCTL_STAT, (uint64_t)&statbuf, (uint64_t)path, 0) != E_OK) {
uprintf("fs: could not stat %s\n", path);
@ -44,24 +78,53 @@ void fs_fetch(void) {
IoctlDirent *dirent = &dirents[i];
if (dirent->stat.type == IOCTLSTAT_FILE) {
char *membuf = umalloc(20);
uprintf("%-30s %-15s %-1s\n",
dirent->name,
human_size(dirent->stat.size, membuf, 20),
"F"
);
ufree(membuf);
} else if (dirent->stat.type == IOCTLSTAT_DIR) {
uprintf("%-30s %-15s %-1s\n",
dirent->name,
"-",
"D"
);
if (FS_FETCH_CONFIG.names) {
if (FS_FETCH_CONFIG.plain) {
uprintf("%s ", dirent->name);
} else {
uprintf("%-30s ", dirent->name);
}
}
if (FS_FETCH_CONFIG.sizes) {
if (dirent->stat.type == IOCTLSTAT_FILE) {
if (FS_FETCH_CONFIG.humsz) {
char *membuf = umalloc(20);
if (FS_FETCH_CONFIG.plain) {
uprintf("%s ", human_size(dirent->stat.size, membuf, 20));
} else {
uprintf("%-15s ", human_size(dirent->stat.size, membuf, 20));
}
ufree(membuf);
} else {
if (FS_FETCH_CONFIG.plain) {
uprintf("%zu ", dirent->stat.size);
} else {
uprintf("%-15zu ", dirent->stat.size);
}
}
} else if (dirent->stat.type == IOCTLSTAT_DIR) {
if (FS_FETCH_CONFIG.plain) {
uprintf("- ");
} else {
uprintf("%-15c ", '-');
}
}
}
if (FS_FETCH_CONFIG.types) {
if (dirent->stat.type == IOCTLSTAT_FILE) {
uprintf("%c ", 'F');
} else if (dirent->stat.type == IOCTLSTAT_DIR) {
uprintf("%c ", 'D');
}
}
uprintf("\n");
}
ufree(dirents);
}
}