+#include <stdio.h>
+#include <sys/types.h>
+#include <a.out.h>
+#include <time.h>
+
+struct tm *localtime();
+
+#define DIV60(t) ((t+30)/60) /* x/60 rounded */
+
+struct nlist nl[] = {
+#define X_BOOTIME 0
+ { "_bootime" },
+#define X_AVENRUN 1
+ { "_avenrun" },
+ { 0 }
+};
+
+time_t now, bootime;
+double avenrun[3];
+
+int kmem;
+
+main(argc, argv)
+ char **argv;
+{
+ char obuf[BUFSIZ];
+ register int i, days;
+ register time_t uptime;
+ register struct tm *nowt;
+
+ setbuf(stdout, obuf);
+ nlist("/vmunix" , nl);
+ if (nl[0].n_value == 0) {
+ fprintf(stderr, "No namelist\n");
+ exit(1);
+ }
+ kmem = open("/dev/kmem", 0);
+ if (kmem < 0) {
+ fprintf(stderr ,"No kmem\n");
+ exit(1);
+ }
+ time(&now);
+ nowt = localtime(&now);
+ prtat(nowt);
+ lseek(kmem, (long)nl[X_BOOTIME].n_value, 0);
+ read(kmem, &bootime, sizeof (bootime));
+ uptime = now - bootime;
+ printf(" up");
+ days = uptime / (60*60*24);
+ if (days > 0) {
+ printf(" %d day%s, ", days, days>1?"s":"");
+ uptime %= (60*60*24);
+ }
+ prttime(DIV60(uptime), "");
+ printf("\t\t");
+ printf("load average:");
+ lseek(kmem, (long)nl[X_AVENRUN].n_value, 0);
+ read(kmem, avenrun, sizeof(avenrun));
+ for (i = 0; i < 3; i++) {
+ printf(" %.2f", avenrun[i]);
+ if (i < 2)
+ printf(",");
+ }
+ printf("\n");
+}
+
+prttime(tim, tail)
+ time_t tim;
+ char *tail;
+{
+ register int didhrs = 0;
+
+ if (tim >= 60) {
+ printf("%3d:", tim/60);
+ didhrs++;
+ } else {
+ printf(" ");
+ }
+ tim %= 60;
+ if (tim > 0 || didhrs) {
+ printf(didhrs&&tim<10 ? "%02d" : "%2d", tim);
+ } else {
+ printf(" ");
+ }
+ printf("%s", tail);
+}
+
+/* prtat prints a 12 hour time given a pointer to a time of day */
+prtat(p)
+ struct tm *p;
+{
+ register int t, pm;
+
+ t = p -> tm_hour;
+ pm = (t > 11);
+ if (t > 11)
+ t -= 12;
+ if (t == 0)
+ t = 12;
+ prttime(t*60 + p->tm_min, pm ? "pm" : "am");
+}