ubase

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

commit 74146c54a7b1ae44c892c407139d1f6916cfca10
parent 30e0acef7aa3a268a48265a10e19a127d1d335e5
Author: sin <sin@2f30.org>
Date:   Fri Aug 16 11:55:55 +0100

Add uptime(1)

Diffstat:
Makefile | 3++-
TODO | 1-
uptime.c | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 67 insertions(+), 2 deletions(-)
diff --git a/Makefile b/Makefile @@ -36,7 +36,8 @@ SRC = \ swapon.c \ truncate.c \ umount.c \ - unshare.c + unshare.c \ + uptime.c OBJ = $(SRC:.c=.o) $(LIB) BIN = $(SRC:.c=) diff --git a/TODO b/TODO @@ -6,7 +6,6 @@ Tools * swaplabel(8) * last(1) * losetup(8) - * uptime(1) Other ===== diff --git a/uptime.c b/uptime.c @@ -0,0 +1,65 @@ +/* See LICENSE file for copyright and license details. */ +#include <sys/sysinfo.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <utmp.h> +#include "util.h" + +static void +usage(void) +{ + eprintf("usage: %s\n", argv0); +} + +int +main(int argc, char *argv[]) +{ + struct utmp usr; + FILE *ufp; + struct sysinfo info; + time_t tmptime; + struct tm *now; + unsigned int days, hours, minutes; + int nusers = 0; + + ARGBEGIN { + default: + usage(); + } ARGEND; + + sysinfo(&info); + time(&tmptime); + now = localtime(&tmptime); + printf(" %02d:%02d:%02d up ", now->tm_hour, now->tm_min, now->tm_sec); + info.uptime /= 60; + minutes = info.uptime % 60; + info.uptime /= 60; + hours = info.uptime % 24; + days = info.uptime / 24; + if (days) + printf("%d day%s, ", days, days > 1 ? "s" : ""); + if (hours) + printf("%2d:%02d, ", hours, minutes); + else + printf("%d min, ", minutes); + + if ((ufp = fopen(_PATH_UTMP, "r"))) { + while(fread(&usr, sizeof(usr), 1, ufp) == 1) { + if (!*usr.ut_name || !*usr.ut_line || + usr.ut_line[0] == '~') + continue; + nusers++; + } + fclose(ufp); + printf(" %d user%s, ", nusers, nusers > 1 ? "s" : ""); + } + + printf(" load average: %.02f, %.02f, %.02f\n", + info.loads[0] / 65536.0f, + info.loads[1] / 65536.0f, + info.loads[2] / 65536.0f); + + return 0; +}