stat.c - ubase - suckless linux base utils
(HTM) git clone git://git.suckless.org/ubase
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
stat.c (2338B)
---
1 /* See LICENSE file for copyright and license details. */
2 #include <sys/stat.h>
3 #include <sys/sysmacros.h>
4 #include <sys/types.h>
5
6 #include <inttypes.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <time.h>
10 #include <unistd.h>
11
12 #include "util.h"
13
14 static void
15 show_stat_terse(const char *file, struct stat *st)
16 {
17 printf("%s ", file);
18 printf("%lu %lu ", (unsigned long)st->st_size,
19 (unsigned long)st->st_blocks);
20 printf("%04o %u %u ", st->st_mode & 0777, st->st_uid, st->st_gid);
21 printf("%llx ", (unsigned long long)st->st_dev);
22 printf("%lu %lu ", (unsigned long)st->st_ino, (unsigned long)st->st_nlink);
23 printf("%d %d ", major(st->st_rdev), minor(st->st_rdev));
24 printf("%ld %ld %ld ", st->st_atime, st->st_mtime, st->st_ctime);
25 printf("%lu\n", (unsigned long)st->st_blksize);
26 }
27
28 static void
29 show_stat(const char *file, struct stat *st)
30 {
31 char buf[100];
32
33 printf(" File: ā%sā\n", file);
34 printf(" Size: %lu\tBlocks: %lu\tIO Block: %lu\n", (unsigned long)st->st_size,
35 (unsigned long)st->st_blocks, (unsigned long)st->st_blksize);
36 printf("Device: %xh/%ud\tInode: %lu\tLinks %lu\n", major(st->st_dev),
37 minor(st->st_dev), (unsigned long)st->st_ino, (unsigned long)st->st_nlink);
38 printf("Access: %04o\tUid: %u\tGid: %u\n", st->st_mode & 0777, st->st_uid, st->st_gid);
39 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&st->st_atime));
40 printf("Access: %s\n", buf);
41 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&st->st_mtime));
42 printf("Modify: %s\n", buf);
43 strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", localtime(&st->st_ctime));
44 printf("Change: %s\n", buf);
45 }
46
47 static void
48 usage(void)
49 {
50 eprintf("usage: %s [-L] [-t] [file...]\n", argv0);
51 }
52
53 int
54 main(int argc, char *argv[])
55 {
56 struct stat st;
57 int i, ret = 0;
58 int (*fn)(const char *, struct stat *) = lstat;
59 char *fnname = "lstat";
60 void (*showstat)(const char *, struct stat *) = show_stat;
61
62 ARGBEGIN {
63 case 'L':
64 fn = stat;
65 fnname = "stat";
66 break;
67 case 't':
68 showstat = show_stat_terse;
69 break;
70 default:
71 usage();
72 } ARGEND;
73
74 if (argc == 0) {
75 if (fstat(0, &st) < 0)
76 eprintf("stat <stdin>:");
77 show_stat("<stdin>", &st);
78 }
79
80 for (i = 0; i < argc; i++) {
81 if (fn(argv[i], &st) == -1) {
82 weprintf("%s %s:", fnname, argv[i]);
83 ret = 1;
84 continue;
85 }
86 showstat(argv[i], &st);
87 }
88
89 return ret;
90