X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/1eeed1150149b63d6e49e033697454bc12b533b9..b1644f824d7f4989a94b8a752aadee26cae25069:/lunaix-os/usr/stat.c diff --git a/lunaix-os/usr/stat.c b/lunaix-os/usr/stat.c index 108f462..3e782e9 100644 --- a/lunaix-os/usr/stat.c +++ b/lunaix-os/usr/stat.c @@ -2,6 +2,7 @@ #include #include #include +#include static char buf[256]; @@ -15,7 +16,7 @@ main(int argc, char* argv[]) int fd = open(argv[1], FO_RDONLY | FO_NOFOLLOW); if (fd < 0) { - printf("fail to open %d\n", fd); + printf("fail to open %d\n", errno); return 1; } @@ -28,23 +29,22 @@ main(int argc, char* argv[]) 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)) { + int mode = stat.st_mode >> 16; + if ((mode & F_DEV)) { + ftype = "mappable (sequential) device"; + + if (!((mode & F_SVDEV) ^ F_SVDEV)) { ftype = "volumetric device"; - } else { - ftype = "regular device"; } - } else if ((mode & F_MSLNK)) { + + } else if ((mode & F_SYMLINK)) { 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)) { + } else if (mode == F_FILE) { ftype = "regular file"; } @@ -54,16 +54,25 @@ main(int argc, char* argv[]) stat.st_blocks, stat.st_blksize, stat.st_ioblksize); - printf("Inode: %d; ", stat.st_ino); dev_t* dev; - if (!(stat.mode & F_MDEV)) { + if (!(mode & F_DEV)) { dev = &stat.st_dev; } else { dev = &stat.st_rdev; } + printf("Device: %xh:%xh@%d; Inode: %d; Links: %d\n", + dev->meta, dev->unique, dev->index, + stat.st_ino, stat.st_nlink); + + printf("Access: 0%o; Uid: %d; Gid: %d\n", + stat.st_mode & 0xffff, + stat.st_uid, + stat.st_gid); - printf("Device: %xh:%xh@%d;\n", dev->meta, dev->unique, dev->index); + printf("Access: %lu\n", stat.st_atim); + printf("Modify: %lu\n", stat.st_mtim); + printf("Create: %lu\n", stat.st_ctim); close(fd); return 0;