83 lines
2.3 KiB
C
83 lines
2.3 KiB
C
|
#if 0
|
||
|
/*─────────────────────────────────────────────────────────────────╗
|
||
|
│ To the extent possible under law, Justine Tunney has waived │
|
||
|
│ all copyright and related or neighboring rights to this file, │
|
||
|
│ as it is written in the following disclaimers: │
|
||
|
│ • http://unlicense.org/ │
|
||
|
│ • http://creativecommons.org/publicdomain/zero/1.0/ │
|
||
|
╚─────────────────────────────────────────────────────────────────*/
|
||
|
#endif
|
||
|
#include "libc/calls/calls.h"
|
||
|
#include "libc/calls/struct/dirent.h"
|
||
|
#include "libc/calls/struct/stat.h"
|
||
|
#include "libc/log/check.h"
|
||
|
#include "libc/runtime/gc.h"
|
||
|
#include "libc/stdio/stdio.h"
|
||
|
#include "libc/str/str.h"
|
||
|
#include "libc/sysv/consts/dt.h"
|
||
|
#include "libc/x/x.h"
|
||
|
|
||
|
struct stat st;
|
||
|
|
||
|
const char *TypeToString(uint8_t type) {
|
||
|
switch (type) {
|
||
|
case DT_UNKNOWN:
|
||
|
return "DT_UNKNOWN";
|
||
|
case DT_FIFO:
|
||
|
return "DT_FIFO";
|
||
|
case DT_CHR:
|
||
|
return "DT_CHR";
|
||
|
case DT_DIR:
|
||
|
return "DT_DIR";
|
||
|
case DT_BLK:
|
||
|
return "DT_BLK";
|
||
|
case DT_REG:
|
||
|
return "DT_REG";
|
||
|
case DT_LNK:
|
||
|
return "DT_LNK";
|
||
|
case DT_SOCK:
|
||
|
return "DT_SOCK";
|
||
|
default:
|
||
|
return "UNKNOWN";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void List(const char *path) {
|
||
|
DIR *d;
|
||
|
struct dirent *e;
|
||
|
const char *vpath;
|
||
|
if (strcmp(path, ".") == 0) {
|
||
|
vpath = "";
|
||
|
} else if (!endswith(path, "/")) {
|
||
|
vpath = gc(xasprintf("%s/", path));
|
||
|
} else {
|
||
|
vpath = path;
|
||
|
}
|
||
|
if (stat(path, &st) != -1) {
|
||
|
if (S_ISDIR(st.st_mode)) {
|
||
|
CHECK((d = opendir(path)));
|
||
|
while ((e = readdir(d))) {
|
||
|
printf("0x%016x 0x%016x %-10s %s%s\n", e->d_ino, e->d_off,
|
||
|
TypeToString(e->d_type), vpath, e->d_name);
|
||
|
}
|
||
|
closedir(d);
|
||
|
} else {
|
||
|
printf("%s\n", path);
|
||
|
}
|
||
|
} else {
|
||
|
fprintf(stderr, "not found: %s\n", path);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int main(int argc, char *argv[]) {
|
||
|
int i;
|
||
|
if (argc == 1) {
|
||
|
List(".");
|
||
|
} else {
|
||
|
for (i = 1; i < argc; ++i) {
|
||
|
List(argv[i]);
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|