ubase

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

uptime.c (1454B)


      1 /* See LICENSE file for copyright and license details. */
      2 #include <sys/sysinfo.h>
      3 
      4 #include <stdio.h>
      5 #include <stdlib.h>
      6 #include <string.h>
      7 #include <time.h>
      8 #include <utmpx.h>
      9 
     10 #include "config.h"
     11 #include "util.h"
     12 
     13 static void
     14 usage(void)
     15 {
     16 	eprintf("usage: %s\n", argv0);
     17 }
     18 
     19 int
     20 main(int argc, char *argv[])
     21 {
     22 	struct utmpx utx;
     23 	FILE *ufp;
     24 	struct sysinfo info;
     25 	time_t tmptime;
     26 	struct tm *now;
     27 	unsigned int days, hours, minutes;
     28 	int nusers = 0;
     29 	size_t n;
     30 
     31 	ARGBEGIN {
     32 	default:
     33 		usage();
     34 	} ARGEND;
     35 
     36 	if (sysinfo(&info) < 0)
     37 		eprintf("sysinfo:");
     38 	time(&tmptime);
     39 	now = localtime(&tmptime);
     40 	printf(" %02d:%02d:%02d up ", now->tm_hour, now->tm_min, now->tm_sec);
     41 	info.uptime /= 60;
     42 	minutes = info.uptime % 60;
     43 	info.uptime /= 60;
     44 	hours = info.uptime % 24;
     45 	days = info.uptime / 24;
     46 	if (days)
     47 		printf("%d day%s, ", days, days != 1 ? "s" : "");
     48 	if (hours)
     49 		printf("%2d:%02d, ", hours, minutes);
     50 	else
     51 		printf("%d min, ", minutes);
     52 
     53 	if ((ufp = fopen(UTMP_PATH, "r"))) {
     54 		while ((n = fread(&utx, sizeof(utx), 1, ufp)) > 0) {
     55 			if (!utx.ut_user[0])
     56 				continue;
     57 			if (utx.ut_type != USER_PROCESS)
     58 				continue;
     59 			nusers++;
     60 		}
     61 		if (ferror(ufp))
     62 			eprintf("%s: read error:", UTMP_PATH);
     63 		fclose(ufp);
     64 		printf(" %d user%s, ", nusers, nusers != 1 ? "s" : "");
     65 	}
     66 
     67 	printf(" load average: %.02f, %.02f, %.02f\n",
     68 	       info.loads[0] / 65536.0f,
     69 	       info.loads[1] / 65536.0f,
     70 	       info.loads[2] / 65536.0f);
     71 
     72 	return 0;
     73 }