commit d0c87f6d3e3b0d13d8599d02d4a8a5509ee1eaab
parent 0ed2a550037fdd96af7756639cf3210a20deb852
Author: sin <sin@2f30.org>
Date: Thu, 15 Aug 2013 10:04:38 +0100
Add stat(1)
Diffstat:
M | Makefile | | | 1 | + |
A | stat.1 | | | 17 | +++++++++++++++++ |
A | stat.c | | | 73 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 91 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
@@ -86,6 +86,7 @@ SRC = \
sha1sum.c \
sha256sum.c\
sha512sum.c\
+ stat.c \
wc.c \
who.c \
yes.c
diff --git a/stat.1 b/stat.1
@@ -0,0 +1,17 @@
+.TH STAT 1 sbase\-VERSION
+.SH NAME
+stat \- display file status
+.SH SYNOPSIS
+.B stat
+.RB [ \-L ]
+.RI [ file ...]
+.SH DESCRIPTION
+.B stat
+displays information about the given files or stdin if no files
+are specified.
+.SH OPTIONS
+.TP
+.B \-L
+follow links
+.SH SEE ALSO
+.IR stat (2)
diff --git a/stat.c b/stat.c
@@ -0,0 +1,73 @@
+/* See LICENSE file for copyright and license details. */
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <time.h>
+#include "util.h"
+
+static void show_stat(const char *file, struct stat *st);
+
+static void
+usage(void)
+{
+ eprintf("usage: %s [-L] [file...]\n", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct stat st;
+ int i, ret = 0;
+ int Lflag = 0;
+ int (*fn)(const char *, struct stat *);
+
+ ARGBEGIN {
+ case 'L':
+ Lflag = 1;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ if (argc == 0) {
+ if (fstat(STDIN_FILENO, &st) < 0)
+ eprintf("stat <stdin>:");
+ show_stat("<stdin>", &st);
+ }
+
+ for (i = 0; i < argc; i++) {
+ fn = Lflag ? stat : lstat;
+ if (fn(argv[i], &st) == -1) {
+ fprintf(stderr, "%s %s: ", Lflag ? "stat" : "lstat",
+ argv[i]);
+ perror(NULL);
+ ret = 1;
+ continue;
+ }
+ show_stat(argv[i], &st);
+ }
+
+ return ret;
+}
+
+static void
+show_stat(const char *file, struct stat *st)
+{
+ char buf[100];
+
+ printf(" File: ā%sā\n", file);
+ printf(" Size: %lu\tBlocks: %lu\tIO Block: %lu\n", (unsigned long)st->st_size,
+ (unsigned long)st->st_blocks, (unsigned long)st->st_blksize);
+ printf("Device: %xh/%ud\tInode: %lu\tLinks %lu\n", major(st->st_dev),
+ minor(st->st_dev), (unsigned long)st->st_ino, (unsigned long)st->st_nlink);
+ printf("Access: %04o\tUid: %u\tGid: %u\n", st->st_mode & 0777, st->st_uid, st->st_gid);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&st->st_atime));
+ printf("Access: %s\n", buf);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&st->st_mtime));
+ printf("Modify: %s\n", buf);
+ strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&st->st_ctime));
+ printf("Change: %s\n", buf);
+}