ubase

suckless linux base utils
git clone git://git.2f30.org/ubase
Log | Files | Refs | README | LICENSE

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:
MMakefile | 1+
Astat.1 | 17+++++++++++++++++
Astat.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); +}