--- /dev/null
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+
+static char buf[256];
+
+int
+main(int argc, char* argv[])
+{
+ if (argc <= 1) {
+ printf("missing operand\n");
+ return 1;
+ }
+
+ int fd = open(argv[1], FO_RDONLY | FO_NOFOLLOW);
+ if (fd < 0) {
+ printf("fail to open %d\n", fd);
+ return 1;
+ }
+
+ struct file_stat stat;
+ if (fstat(fd, &stat) < 0) {
+ printf("fail to get stat %d\n", errno);
+ return 1;
+ }
+
+ printf("File: %s ", argv[1]);
+
+ char* ftype = "directory";
+ int mode = stat.mode;
+ if ((mode & F_MDEV)) {
+ if (!((mode & F_SEQDEV) ^ F_SEQDEV)) {
+ ftype = "sequential device";
+ } else if (!((mode & F_VOLDEV) ^ F_VOLDEV)) {
+ ftype = "volumetric device";
+ } else {
+ ftype = "regular device";
+ }
+ } else if ((mode & F_MSLNK)) {
+ if (readlinkat(fd, NULL, buf, 256) < 0) {
+ printf("fail to readlink %d\n", errno);
+ } else {
+ printf("-> %s", buf);
+ }
+ ftype = "symbolic link";
+ } else if ((mode & F_MFILE)) {
+ ftype = "regular file";
+ }
+
+ printf("\nType: %s\n", ftype);
+ printf("Size: %d; Blocks: %d; FS Block: %d; IO Blocks: %d\n",
+ stat.st_size,
+ stat.st_blocks,
+ stat.st_blksize,
+ stat.st_ioblksize);
+ printf("Inode: %d; ", stat.st_ino);
+
+ dev_t* dev;
+ if (!(stat.mode & F_MDEV)) {
+ dev = &stat.st_dev;
+ } else {
+ dev = &stat.st_rdev;
+ }
+
+ printf("Device: %xh:%xh@%d;\n", dev->meta, dev->unique, dev->index);
+
+ close(fd);
+ return 0;
+}
\ No newline at end of file