uptime for System V

Steven J. McDowall sjm at dayton.UUCP
Mon Sep 15 05:57:36 AEST 1986


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 at dayton)	Steven McDowall
 *
 *	cc -O -o uptime uptime.c
 *	chown root uptime
 *	chmod u+s uptime			So we can read /dev/kmem
 */

# include <sys/types.h>			/* system types */
# include <sys/sysinfo.h>		/* sysinfo structure */
# include <sys/param.h>			/* for HZ */
# include <stdio.h>
# include <nlist.h>
# include <fcntl.h>
# include <time.h>

#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



More information about the Comp.sources.unix mailing list