apio
140910763e
All checks were successful
Build and test / build (push) Successful in 1m56s
Why are command-line utilities stored in "apps"? And why are apps like "editor" or "terminal" top-level directories? Command-line utilities now go in "utils". GUI stuff now goes in "gui". This includes: libui -> gui/libui, wind -> gui/wind, GUI apps -> gui/apps, editor&terminal -> gui/apps... System services go in "system".
57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
#include <os/ArgumentParser.h>
|
|
#include <os/FileSystem.h>
|
|
#include <os/Mode.h>
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
|
|
static const char* file_type(mode_t mode)
|
|
{
|
|
switch (mode & S_IFMT)
|
|
{
|
|
case S_IFREG: return "regular file";
|
|
case S_IFDIR: return "directory";
|
|
case S_IFCHR: return "character special device";
|
|
case S_IFBLK: return "block special device";
|
|
case S_IFLNK: return "symbolic link";
|
|
case S_IFIFO: return "pipe";
|
|
case S_IFSOCK: return "socket";
|
|
default: return "unknown file type";
|
|
}
|
|
}
|
|
|
|
Result<int> luna_main(int argc, char** argv)
|
|
{
|
|
StringView path;
|
|
bool follow_symlinks { false };
|
|
|
|
os::ArgumentParser parser;
|
|
parser.add_description("Display file metadata.");
|
|
parser.add_system_program_info("stat"_sv);
|
|
parser.add_positional_argument(path, "path", true);
|
|
parser.add_switch_argument(follow_symlinks, 'L', "dereference"_sv, "follow symlinks");
|
|
parser.parse(argc, argv);
|
|
|
|
struct stat st;
|
|
TRY(os::FileSystem::stat(path, st, follow_symlinks));
|
|
|
|
char buf[11];
|
|
os::format_mode(st.st_mode, buf);
|
|
|
|
char atime[256];
|
|
strftime(atime, sizeof(atime), "%Y-%m-%d %H:%M:%S", gmtime(&st.st_atim.tv_sec));
|
|
char mtime[256];
|
|
strftime(mtime, sizeof(mtime), "%Y-%m-%d %H:%M:%S", gmtime(&st.st_mtim.tv_sec));
|
|
char ctime[256];
|
|
strftime(ctime, sizeof(ctime), "%Y-%m-%d %H:%M:%S", gmtime(&st.st_ctim.tv_sec));
|
|
|
|
printf(" File: %s\n", path.chars());
|
|
printf(" Size: %zu (%s)\n", st.st_size, file_type(st.st_mode));
|
|
printf(" Inode: %lu Links: %lu\n", st.st_ino, st.st_nlink);
|
|
printf(" Mode: (%#o/%s) UID: %u GID: %u\n", st.st_mode & ~S_IFMT, buf, st.st_uid, st.st_gid);
|
|
printf("Access: %s.%.9ld\n", atime, st.st_atim.tv_nsec);
|
|
printf("Modify: %s.%.9ld\n", mtime, st.st_mtim.tv_nsec);
|
|
printf("Change: %s.%.9ld\n", ctime, st.st_ctim.tv_nsec);
|
|
|
|
return 0;
|
|
}
|