Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Path: utzoo!mnetor!seismo!caip!dayton!sjm From: sjm@dayton.UUCP (Steven J. McDowall) Newsgroups: net.sources Subject: uptime for System V Message-ID: <191@dayton.UUCP> Date: Sun, 14-Sep-86 15:57:36 EDT Article-I.D.: dayton.191 Posted: Sun Sep 14 15:57:36 1986 Date-Received: Sun, 14-Sep-86 23:21:46 EDT Reply-To: sjm@dayton.UUCP (Steven J. McDowall) Distribution: world Organization: Dayton-Hudson Dept. Store Co. Lines: 138 Keywords: uptime SysV In response to a request in net.unix (well, no one is perfect :-) and because the program is interesting in its own right, here is the source to a version of uptime (BSD isn't it?) that I wrote for our NCR Tower/32 (Sys V.2 Unix): It's fairly short, and the only mods (if any) you may have to do is change where some of the include files reside. After compilation, move to your favorite directory, and setuid to root (it has to read /dev/kmem). ------------------------------CUT HERE---------------------------- /* * uptime.c -- Print how long the system has been up * System V Implmenentation * * (sjm@dayton) Steven McDowall * * cc -O -o uptime uptime.c * chown root uptime * chmod u+s uptime So we can read /dev/kmem */ # include /* system types */ # include /* sysinfo structure */ # include /* for HZ */ # include # include # include # include #define MINUTES 60 #define HOURS (MINUTES * 60) #define DAYS (HOURS * 24) # define SYSTEM "/unix" # define KMEM "/dev/kmem" struct nlist nl[] = { # define NL_SYSINFO 0 { "sysinfo" }, /* 0 */ # define NL_LBOLT 1 { "lbolt" }, /* 1 */ { 0 } }; int memfd; char *system = SYSTEM; char *kmem = KMEM; char *argv0; main(argc, argv) int argc; char *argv[]; { time_t boothz, uptime; void ptime(); argv0 = argv[0]; init_nlist(); /* get name values, open kmem */ /* Now read kmem to get the boot time */ l_lseek(memfd, (long)nl[NL_LBOLT].n_value, 0); r_read(memfd, (char *)&boothz, sizeof( boothz ) ); uptime = (boothz / HZ); ptime(uptime); } /* main */ init_nlist() { nlist(system, nl); /* get system values */ if(nl[NL_SYSINFO].n_value == 0) { fprintf(stderr, "%s: can't find sysinf structure\n", argv0); exit(1); } /* no value */ if ((memfd = open(kmem, O_RDONLY)) < 0) { fprintf(stderr, "%s: no mem\n", argv0); exit(1); } /* could not open kmem */ } /* init_nlist */ /* lseek with error checking */ l_lseek(fd, offset, whence) int fd, whence; long offset; { if (lseek(fd, offset, whence) == -1) { fprintf(stderr, "%s: error on lseek\n", argv0); exit(1); } } /* read with error checking */ r_read (fd, buf, nbytes) int fd, nbytes; char *buf; { if (read(fd, buf, nbytes) != nbytes) { fprintf(stderr, "%s: error on read\n", argv0); exit(1); } } /* Print the time in a nice format */ void ptime(secs) time_t secs; { short days, hours, minutes; secs -= (days = secs / DAYS) * DAYS; secs -= (hours = secs / HOURS) * HOURS; secs -= (minutes = secs / MINUTES) * MINUTES; printf("The system has been up for "); if (days != 0) printf("%d %s ", days, (days == 1 ? "day" : "days")); if (hours != 0) printf("%d %s ", hours, (hours == 1 ? "hour" : "hours")); if (minutes != 0) printf("%d %s ", minutes, (minutes == 1 ? "minute" : "minutes")); printf("and %d %s.\n", secs, (secs == 1 ? "second" : "seconds")); } -- Steven J. McDowall Dayton-Hudson Dept. Store. Co. UUCP: ihnp4!rosevax!dayton!sjm 700 on the Mall ATT: 1 612 375 2816 Mpls, Mn. 55408