56 lines
1.2 KiB
C
56 lines
1.2 KiB
C
//---
|
|
// builtin:ls - list directory contents
|
|
//---
|
|
#include "fxBoot/builtin.h"
|
|
#include "fxBoot/terminal.h"
|
|
#include "fxBoot/fs/smemfs.h"
|
|
#include <gint/bfile.h>
|
|
|
|
static void smemfs_walk(struct smemfs_inode *inode, int level, uint32_t bitmap)
|
|
{
|
|
const char *records;
|
|
|
|
if (inode == NULL)
|
|
return;
|
|
|
|
/* handle indentation */
|
|
for (int i = 0; i < level; ++i) {
|
|
records = "\t";
|
|
if ((bitmap & (1 << i)) != 0)
|
|
records = "|\t";
|
|
terminal_write(records);
|
|
}
|
|
|
|
/* handle file name and sibling dependencies */
|
|
records = "|-- %s";
|
|
bitmap |= 1 << level;
|
|
if (inode->sibling == NULL) {
|
|
records = "`-- %s";
|
|
bitmap &= ~(1 << level);
|
|
}
|
|
terminal_write(records, inode->name);
|
|
|
|
/* handle file type */
|
|
if (inode->type == BFile_Type_Directory) {
|
|
terminal_write(":\n");
|
|
smemfs_walk(inode->child, level + 1, bitmap);
|
|
smemfs_walk(inode->sibling, level, bitmap);
|
|
return;
|
|
}
|
|
terminal_write("\n");
|
|
smemfs_walk(inode->sibling, level, bitmap);
|
|
}
|
|
|
|
int ls_main(int argc, char **argv)
|
|
{
|
|
(void)argc;
|
|
(void)argv;
|
|
if (smemfs_superblock.fake_root_inode != SMEMFS_FAKE_ROOT_INODE) {
|
|
terminal_write("smemfs not mounted !\n");
|
|
return (84);
|
|
}
|
|
terminal_write("/\n");
|
|
smemfs_walk(smemfs_superblock.root_inode, 0, 0x00000000);
|
|
return (0);
|
|
}
|