commit 9dbc997058e31d1e06395761008826a0bde5b05a
parent 1f7b76f6f2b74c4108eb19f2cae0b0de06cbc856
Author: sin <sin@2f30.org>
Date: Thu, 30 Jan 2014 16:20:27 +0000
Import stat(1) from sbase
This utility uses major()/minor() which are not portable. It
belongs in ubase.
Diffstat:
M | Makefile | | | 1 | + |
A | stat.1 | | | 17 | +++++++++++++++++ |
A | stat.c | | | 75 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
3 files changed, 93 insertions(+), 0 deletions(-)
diff --git a/Makefile b/Makefile
@@ -39,6 +39,7 @@ SRC = \
ps.c \
rmmod.c \
su.c \
+ stat.c \
swapoff.c \
swapon.c \
truncate.c \
diff --git a/stat.1 b/stat.1
@@ -0,0 +1,17 @@
+.TH STAT 1 ubase\-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,75 @@
+/* See LICENSE file for copyright and license details. */
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+#include <inttypes.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.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 = EXIT_SUCCESS;
+ 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: %s\n", Lflag ? "stat" : "lstat",
+ argv[i], strerror(errno));
+ ret = EXIT_FAILURE;
+ 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);
+}