<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Rstatd_Clients</id>
	<title>Rstatd Clients - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=Rstatd_Clients"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Rstatd_Clients&amp;action=history"/>
	<updated>2026-06-05T03:23:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=Rstatd_Clients&amp;diff=941&amp;oldid=prev</id>
		<title>PeterHarding: New page: =rstat_cl.c=  &lt;pre&gt; /* @(#)rstat.x  2.2 88/08/01 4.0 RPCSRC */ * @(#)rstat.x 1.2 87/09/18 Copyr 1987 Sun Micro */  * * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * ...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=Rstatd_Clients&amp;diff=941&amp;oldid=prev"/>
		<updated>2008-01-30T02:02:16Z</updated>

		<summary type="html">&lt;p&gt;New page: =rstat_cl.c=  &amp;lt;pre&amp;gt; &lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;@(#)rstat.x  2.2 88/08/01 4.0 RPCSRC: &lt;/span&gt; * @(#)rstat.x 1.2 87/09/18 Copyr 1987 Sun Micro */  * * Sun RPC is a product of Sun Microsystems, Inc. and is provided for * ...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=rstat_cl.c=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* @(#)rstat.x  2.2 88/08/01 4.0 RPCSRC */&lt;br /&gt;
* @(#)rstat.x 1.2 87/09/18 Copyr 1987 Sun Micro */&lt;br /&gt;
&lt;br /&gt;
*&lt;br /&gt;
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for&lt;br /&gt;
* unrestricted use provided that this legend is included on all tape&lt;br /&gt;
* media and as a part of the software program in whole or part.  Users&lt;br /&gt;
* may copy or modify Sun RPC without charge, but are not authorized&lt;br /&gt;
* to license or distribute it to anyone else except as part of a product or&lt;br /&gt;
 * program developed by the user.&lt;br /&gt;
 *&lt;br /&gt;
 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE&lt;br /&gt;
 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR&lt;br /&gt;
 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.&lt;br /&gt;
 *&lt;br /&gt;
 * Sun RPC is provided with no support and without any obligation on the&lt;br /&gt;
 * part of Sun Microsystems, Inc. to assist in its use, correction,&lt;br /&gt;
 * modification or enhancement.&lt;br /&gt;
 *&lt;br /&gt;
 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE&lt;br /&gt;
 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC&lt;br /&gt;
 * OR ANY PART THEREOF.&lt;br /&gt;
 *&lt;br /&gt;
 * In no event will Sun Microsystems, Inc. be liable for any lost revenue&lt;br /&gt;
 * or profits or other special, indirect and consequential damages, even if&lt;br /&gt;
 * Sun has been advised of the possibility of such damages.&lt;br /&gt;
 *&lt;br /&gt;
 * Sun Microsystems, Inc.&lt;br /&gt;
 * 2550 Garcia Avenue&lt;br /&gt;
 * Mountain View, California  94043&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Gather statistics on remote machines&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#ifdef RPC_HDR&lt;br /&gt;
&lt;br /&gt;
%#ifndef FSCALE&lt;br /&gt;
%/*&lt;br /&gt;
% * Scale factor for scaled integers used to count load averages.&lt;br /&gt;
% */&lt;br /&gt;
%#define FSHIFT  8               /* bits to right of fixed binary point */&lt;br /&gt;
%#define FSCALE  (1&amp;lt;&amp;lt;FSHIFT)&lt;br /&gt;
%&lt;br /&gt;
%#endif /* ndef FSCALE */&lt;br /&gt;
&lt;br /&gt;
#endif /* def RPC_HDR */&lt;br /&gt;
&lt;br /&gt;
const CPUSTATES = 4;&lt;br /&gt;
const DK_NDRIVE = 4;&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * GMT since 0:00, January 1, 1970&lt;br /&gt;
 */&lt;br /&gt;
struct rstat_timeval {&lt;br /&gt;
        unsigned int tv_sec;    /* seconds */&lt;br /&gt;
        unsigned int tv_usec;   /* and microseconds */&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct statstime {                              /* RSTATVERS_TIME */&lt;br /&gt;
        int cp_time[CPUSTATES];&lt;br /&gt;
        int dk_xfer[DK_NDRIVE];&lt;br /&gt;
        unsigned int v_pgpgin;  /* these are cumulative sum */&lt;br /&gt;
        unsigned int v_pgpgout;&lt;br /&gt;
        unsigned int v_pswpin;&lt;br /&gt;
        unsigned int v_pswpout;&lt;br /&gt;
        unsigned int v_intr;&lt;br /&gt;
        int if_ipackets;&lt;br /&gt;
        int if_ierrors;&lt;br /&gt;
        int if_oerrors;&lt;br /&gt;
        int if_collisions;&lt;br /&gt;
        unsigned int v_swtch;&lt;br /&gt;
        int avenrun[3];         /* scaled by FSCALE */&lt;br /&gt;
        rstat_timeval boottime;&lt;br /&gt;
        rstat_timeval curtime;&lt;br /&gt;
        int if_opackets;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct statsswtch {                     /* RSTATVERS_SWTCH */&lt;br /&gt;
        int cp_time[CPUSTATES];&lt;br /&gt;
        int dk_xfer[DK_NDRIVE];&lt;br /&gt;
        unsigned int v_pgpgin;  /* these are cumulative sum */&lt;br /&gt;
        unsigned int v_pgpgout;&lt;br /&gt;
        unsigned int v_pswpin;&lt;br /&gt;
        unsigned int v_pswpout;&lt;br /&gt;
        unsigned int v_intr;&lt;br /&gt;
        int if_ipackets;&lt;br /&gt;
        int if_ierrors;&lt;br /&gt;
        int if_oerrors;&lt;br /&gt;
        int if_collisions;&lt;br /&gt;
        unsigned int v_swtch;&lt;br /&gt;
        unsigned int avenrun[3];/* scaled by FSCALE */&lt;br /&gt;
        rstat_timeval boottime;&lt;br /&gt;
        int if_opackets;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct stats {                          /* RSTATVERS_ORIG */&lt;br /&gt;
        int cp_time[CPUSTATES];&lt;br /&gt;
	        int dk_xfer[DK_NDRIVE];&lt;br /&gt;
	        unsigned int v_pgpgin;  /* these are cumulative sum */&lt;br /&gt;
	        unsigned int v_pgpgout;&lt;br /&gt;
	        unsigned int v_pswpin;&lt;br /&gt;
	        unsigned int v_pswpout;&lt;br /&gt;
	        unsigned int v_intr;&lt;br /&gt;
	        int if_ipackets;&lt;br /&gt;
	        int if_ierrors;&lt;br /&gt;
	        int if_oerrors;&lt;br /&gt;
	        int if_collisions;&lt;br /&gt;
	        int if_opackets;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	program RSTATPROG {&lt;br /&gt;
	        /*&lt;br /&gt;
	         * Newest version includes current time and context switching info&lt;br /&gt;
	         */&lt;br /&gt;
	        version RSTATVERS_TIME {&lt;br /&gt;
	                statstime&lt;br /&gt;
	                RSTATPROC_STATS(void) = 1;&lt;br /&gt;
&lt;br /&gt;
	                unsigned int&lt;br /&gt;
	                RSTATPROC_HAVEDISK(void) = 2;&lt;br /&gt;
	        } = 3;&lt;br /&gt;
	        /*&lt;br /&gt;
	         * Does not have current time&lt;br /&gt;
	         */&lt;br /&gt;
	        version RSTATVERS_SWTCH {&lt;br /&gt;
	                statsswtch&lt;br /&gt;
	                RSTATPROC_STATS(void) = 1;&lt;br /&gt;
&lt;br /&gt;
	                unsigned int&lt;br /&gt;
	                RSTATPROC_HAVEDISK(void) = 2;&lt;br /&gt;
	        } = 2;&lt;br /&gt;
	        /*&lt;br /&gt;
	         * Old version has no info about current time or context switching&lt;br /&gt;
	         */&lt;br /&gt;
	        version RSTATVERS_ORIG {&lt;br /&gt;
	                stats&lt;br /&gt;
	                RSTATPROC_STATS(void) = 1;&lt;br /&gt;
&lt;br /&gt;
	                unsigned int&lt;br /&gt;
	                RSTATPROC_HAVEDISK(void) = 2;&lt;br /&gt;
	        } = 1;&lt;br /&gt;
	} = 100001;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=rstat_client.c=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Please do not edit this file.&lt;br /&gt;
 * It was generated using rpcgen.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;rpc/rpc.h&amp;gt;&lt;br /&gt;
#if !defined(__WIN32__) &amp;amp;&amp;amp; !defined(_WIN32)&lt;br /&gt;
#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;
#endif&lt;br /&gt;
#include &amp;quot;rstat.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
/* Default timeout can be changed using clnt_control() */&lt;br /&gt;
static struct timeval TIMEOUT = { 25, 0 };&lt;br /&gt;
&lt;br /&gt;
statstime *&lt;br /&gt;
rstatproc_stats_3(argp, clnt)&lt;br /&gt;
        void *argp;&lt;br /&gt;
        CLIENT *clnt;&lt;br /&gt;
{&lt;br /&gt;
        static statstime res;&lt;br /&gt;
&lt;br /&gt;
        bzero((char *)&amp;amp;res, sizeof(res));&lt;br /&gt;
        if (clnt_call(clnt, RSTATPROC_STATS, xdr_void, argp, xdr_statstime, &amp;amp;res, TIMEOUT) != RPC_SUCCESS) {&lt;br /&gt;
                return (NULL);&lt;br /&gt;
        }&lt;br /&gt;
        return (&amp;amp;res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u_int *&lt;br /&gt;
rstatproc_havedisk_3(argp, clnt)&lt;br /&gt;
        void *argp;&lt;br /&gt;
        CLIENT *clnt;&lt;br /&gt;
{&lt;br /&gt;
        static u_int res;&lt;br /&gt;
&lt;br /&gt;
        bzero((char *)&amp;amp;res, sizeof(res));&lt;br /&gt;
        if (clnt_call(clnt, RSTATPROC_HAVEDISK, xdr_void, argp, xdr_u_int, &amp;amp;res, TIMEOUT) != RPC_SUCCESS) {&lt;br /&gt;
                return (NULL);&lt;br /&gt;
        }&lt;br /&gt;
        return (&amp;amp;res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
statsswtch *&lt;br /&gt;
rstatproc_stats_2(argp, clnt)&lt;br /&gt;
        void *argp;&lt;br /&gt;
        CLIENT *clnt;&lt;br /&gt;
{&lt;br /&gt;
        static statsswtch res;&lt;br /&gt;
&lt;br /&gt;
        bzero((char *)&amp;amp;res, sizeof(res));&lt;br /&gt;
        if (clnt_call(clnt, RSTATPROC_STATS, xdr_void, argp, xdr_statsswtch, &amp;amp;res, TIMEOUT) != RPC_SUCCESS) {&lt;br /&gt;
                return (NULL);&lt;br /&gt;
        }&lt;br /&gt;
        return (&amp;amp;res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u_int *&lt;br /&gt;
rstatproc_havedisk_2(argp, clnt)&lt;br /&gt;
        void *argp;&lt;br /&gt;
        CLIENT *clnt;&lt;br /&gt;
{&lt;br /&gt;
        static u_int res;&lt;br /&gt;
&lt;br /&gt;
        bzero((char *)&amp;amp;res, sizeof(res));&lt;br /&gt;
        if (clnt_call(clnt, RSTATPROC_HAVEDISK, xdr_void, argp, xdr_u_int, &amp;amp;res, TIMEOUT) != RPC_SUCCESS) {&lt;br /&gt;
                return (NULL);&lt;br /&gt;
        }&lt;br /&gt;
        return (&amp;amp;res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
stats *&lt;br /&gt;
rstatproc_stats_1(argp, clnt)&lt;br /&gt;
        void *argp;&lt;br /&gt;
        CLIENT *clnt;&lt;br /&gt;
{&lt;br /&gt;
        static stats res;&lt;br /&gt;
&lt;br /&gt;
        bzero((char *)&amp;amp;res, sizeof(res));&lt;br /&gt;
        if (clnt_call(clnt, RSTATPROC_STATS, xdr_void, argp, xdr_stats, &amp;amp;res, TIMEOUT) != RPC_SUCCESS) {&lt;br /&gt;
                return (NULL);&lt;br /&gt;
        }&lt;br /&gt;
        return (&amp;amp;res);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
u_int *&lt;br /&gt;
rstatproc_havedisk_1(argp, clnt)&lt;br /&gt;
        void *argp;&lt;br /&gt;
        CLIENT *clnt;&lt;br /&gt;
{&lt;br /&gt;
        static u_int res;&lt;br /&gt;
&lt;br /&gt;
        bzero((char *)&amp;amp;res, sizeof(res));&lt;br /&gt;
        if (clnt_call(clnt, RSTATPROC_HAVEDISK, xdr_void, argp, xdr_u_int, &amp;amp;res, TIMEOUT) != RPC_SUCCESS) {&lt;br /&gt;
                return (NULL);&lt;br /&gt;
        }&lt;br /&gt;
        return (&amp;amp;res);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=rup.c=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/*-&lt;br /&gt;
 * Copyright (c) 1993, John Brezak&lt;br /&gt;
 * All rights reserved.&lt;br /&gt;
 *&lt;br /&gt;
 * Redistribution and use in source and binary forms, with or without&lt;br /&gt;
 * modification, are permitted provided that the following conditions&lt;br /&gt;
 * are met:&lt;br /&gt;
 * 1. Redistributions of source code must retain the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer.&lt;br /&gt;
 * 2. Redistributions in binary form must reproduce the above copyright&lt;br /&gt;
 *    notice, this list of conditions and the following disclaimer in the&lt;br /&gt;
 *    documentation and/or other materials provided with the distribution.&lt;br /&gt;
 * 3. All advertising materials mentioning features or use of this software&lt;br /&gt;
 *    must display the following acknowledgement:&lt;br /&gt;
 *	This product includes software developed by the University of&lt;br /&gt;
 *	California, Berkeley and its contributors.&lt;br /&gt;
 * 4. Neither the name of the University nor the names of its contributors&lt;br /&gt;
 *    may be used to endorse or promote products derived from this software&lt;br /&gt;
 *    without specific prior written permission.&lt;br /&gt;
 *&lt;br /&gt;
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS&amp;#039;&amp;#039; AND&lt;br /&gt;
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&lt;br /&gt;
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE&lt;br /&gt;
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE&lt;br /&gt;
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL&lt;br /&gt;
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS&lt;br /&gt;
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)&lt;br /&gt;
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&lt;br /&gt;
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY&lt;br /&gt;
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF&lt;br /&gt;
 * SUCH DAMAGE.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
char rcsid[] = &amp;quot;$Id: rup.c,v 1.8 2000/07/22 19:51:40 dholland Exp $&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/param.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;
#include &amp;lt;rpc/rpc.h&amp;gt;&lt;br /&gt;
#include &amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;
#include &amp;lt;rpc/pmap_clnt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;getopt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;err.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#undef FSHIFT			/* Use protocol&amp;#039;s shift and scale values */&lt;br /&gt;
#undef FSCALE&lt;br /&gt;
#include &amp;lt;rpcsvc/rstat.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;quot;../version.h&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#define HOST_WIDTH 24&lt;br /&gt;
&lt;br /&gt;
static int print_rup_data(const char *host, statstime *host_stat);&lt;br /&gt;
&lt;br /&gt;
static int printtime;			/* print the remote host(s)&amp;#039;s time */&lt;br /&gt;
static int printseconds;                /* print in seconds, not formatted */&lt;br /&gt;
&lt;br /&gt;
struct host_list {&lt;br /&gt;
	struct host_list *next;&lt;br /&gt;
	struct in_addr addr;&lt;br /&gt;
} *hosts;&lt;br /&gt;
&lt;br /&gt;
static&lt;br /&gt;
int&lt;br /&gt;
search_host(struct in_addr addr)&lt;br /&gt;
{&lt;br /&gt;
	struct host_list *hp;&lt;br /&gt;
	&lt;br /&gt;
	if (!hosts)&lt;br /&gt;
		return(0);&lt;br /&gt;
&lt;br /&gt;
	for (hp = hosts; hp != NULL; hp = hp-&amp;gt;next) {&lt;br /&gt;
		if (hp-&amp;gt;addr.s_addr == addr.s_addr)&lt;br /&gt;
			return(1);&lt;br /&gt;
	}&lt;br /&gt;
	return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static&lt;br /&gt;
void&lt;br /&gt;
remember_host(struct in_addr addr)&lt;br /&gt;
{&lt;br /&gt;
	struct host_list *hp;&lt;br /&gt;
&lt;br /&gt;
	if (!(hp = (struct host_list *)malloc(sizeof(struct host_list)))) {&lt;br /&gt;
		err(1, &amp;quot;malloc&amp;quot;);&lt;br /&gt;
		/* NOTREACHED */&lt;br /&gt;
	}&lt;br /&gt;
	hp-&amp;gt;addr.s_addr = addr.s_addr;&lt;br /&gt;
	hp-&amp;gt;next = hosts;&lt;br /&gt;
	hosts = hp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
struct rup_data {&lt;br /&gt;
	char *host;&lt;br /&gt;
	struct statstime statstime;&lt;br /&gt;
};&lt;br /&gt;
struct rup_data *rup_data;&lt;br /&gt;
int rup_data_idx = 0;&lt;br /&gt;
int rup_data_max = 0;&lt;br /&gt;
&lt;br /&gt;
enum sort_type { &lt;br /&gt;
	SORT_NONE,&lt;br /&gt;
	SORT_HOST,&lt;br /&gt;
	SORT_LDAV,&lt;br /&gt;
	SORT_UPTIME&lt;br /&gt;
};&lt;br /&gt;
enum sort_type sort_type;&lt;br /&gt;
&lt;br /&gt;
static int&lt;br /&gt;
compare(const void *a1, const void *a2)&lt;br /&gt;
{&lt;br /&gt;
	const struct rup_data *d1 = (const struct rup_data *) a1;&lt;br /&gt;
	const struct rup_data *d2 = (const struct rup_data *) a2;&lt;br /&gt;
&lt;br /&gt;
	switch(sort_type) {&lt;br /&gt;
	case SORT_HOST:&lt;br /&gt;
		return strcmp(d1-&amp;gt;host, d2-&amp;gt;host);&lt;br /&gt;
	case SORT_LDAV:&lt;br /&gt;
		return d1-&amp;gt;statstime.avenrun[0] &lt;br /&gt;
			- d2-&amp;gt;statstime.avenrun[0];&lt;br /&gt;
	case SORT_UPTIME:&lt;br /&gt;
		return d1-&amp;gt;statstime.boottime.tv_sec &lt;br /&gt;
			- d2-&amp;gt;statstime.boottime.tv_sec;&lt;br /&gt;
	default:&lt;br /&gt;
		/* something&amp;#039;s really wrong here */&lt;br /&gt;
		abort();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static&lt;br /&gt;
void&lt;br /&gt;
remember_rup_data(const char *host, const struct statstime *st)&lt;br /&gt;
{&lt;br /&gt;
        if (rup_data_idx &amp;gt;= rup_data_max) {&lt;br /&gt;
                rup_data_max += 16;&lt;br /&gt;
                rup_data = realloc (rup_data, &lt;br /&gt;
				rup_data_max * sizeof(struct rup_data));&lt;br /&gt;
                if (rup_data == NULL) {&lt;br /&gt;
                        err (1, &amp;quot;realloc&amp;quot;);&lt;br /&gt;
			/* NOTREACHED */&lt;br /&gt;
                }&lt;br /&gt;
        }&lt;br /&gt;
	&lt;br /&gt;
	rup_data[rup_data_idx].host = strdup(host);&lt;br /&gt;
	rup_data[rup_data_idx].statstime = *st;&lt;br /&gt;
	rup_data_idx++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
static&lt;br /&gt;
int&lt;br /&gt;
rstat_reply(char *replyp, struct sockaddr_in *raddrp)&lt;br /&gt;
{&lt;br /&gt;
	struct hostent *hp;&lt;br /&gt;
	const char *host;&lt;br /&gt;
	statstime *host_stat = (statstime *)replyp;&lt;br /&gt;
&lt;br /&gt;
	if (!search_host(raddrp-&amp;gt;sin_addr)) {&lt;br /&gt;
		hp = gethostbyaddr((char *)&amp;amp;raddrp-&amp;gt;sin_addr.s_addr,&lt;br /&gt;
			sizeof(struct in_addr), AF_INET);&lt;br /&gt;
&lt;br /&gt;
		if (hp)&lt;br /&gt;
			host = hp-&amp;gt;h_name;&lt;br /&gt;
		else&lt;br /&gt;
			host = inet_ntoa(raddrp-&amp;gt;sin_addr);&lt;br /&gt;
&lt;br /&gt;
		remember_host(raddrp-&amp;gt;sin_addr);&lt;br /&gt;
&lt;br /&gt;
		if (sort_type != SORT_NONE) {&lt;br /&gt;
			remember_rup_data(host, host_stat);&lt;br /&gt;
		} else {&lt;br /&gt;
			print_rup_data(host, host_stat);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static &lt;br /&gt;
int&lt;br /&gt;
print_rup_data(const char *host, statstime *host_stat)&lt;br /&gt;
{&lt;br /&gt;
	time_t hosttime;&lt;br /&gt;
	long uptime;&lt;br /&gt;
&lt;br /&gt;
	printf(&amp;quot;%-*.*s&amp;quot;, HOST_WIDTH, HOST_WIDTH, host);&lt;br /&gt;
&lt;br /&gt;
	hosttime = host_stat-&amp;gt;curtime.tv_sec;&lt;br /&gt;
	host_stat-&amp;gt;curtime.tv_sec -= host_stat-&amp;gt;boottime.tv_sec;&lt;br /&gt;
	uptime = host_stat-&amp;gt;curtime.tv_sec;	/* uptime in seconds */&lt;br /&gt;
	&lt;br /&gt;
	if (printtime) {&lt;br /&gt;
		if (printseconds) {&lt;br /&gt;
			printf(&amp;quot; %-12lld&amp;quot;, (unsigned long long) hosttime);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			struct tm *time = localtime(&amp;amp;hosttime);&lt;br /&gt;
			printf(&amp;quot; %2d:%02d%cm&amp;quot;, time-&amp;gt;tm_hour % 12,&lt;br /&gt;
			       time-&amp;gt;tm_min,&lt;br /&gt;
			       (time-&amp;gt;tm_hour &amp;gt;= 12) ? &amp;#039;p&amp;#039; : &amp;#039;a&amp;#039;);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (printseconds) {&lt;br /&gt;
		printf(&amp;quot; up %12ld&amp;quot;, uptime);&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		uptime /= 60;  /* convert to minutes */&lt;br /&gt;
		printf(&amp;quot; up &amp;quot;);&lt;br /&gt;
		if (uptime &amp;gt; 24*60) {		/* more than 1 day? */ &lt;br /&gt;
			int days = uptime/(24*60);&lt;br /&gt;
			printf(&amp;quot;%3d %s &amp;quot;, days, days &amp;gt; 1 ? &amp;quot;days,&amp;quot; : &amp;quot;day, &amp;quot;);&lt;br /&gt;
			uptime %= (24*60);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			printf(&amp;quot;          &amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		if (uptime &amp;gt; 60) {&lt;br /&gt;
			int hours = uptime/60;&lt;br /&gt;
			int mins = uptime%60;&lt;br /&gt;
			printf(&amp;quot;%2d:%02d,   &amp;quot;, hours, mins);&lt;br /&gt;
		}&lt;br /&gt;
		else {&lt;br /&gt;
			printf(&amp;quot;%2ld mins, &amp;quot;, uptime);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	printf(&amp;quot; load average: %.2f %.2f %.2f\n&amp;quot;,&lt;br /&gt;
	       (double)host_stat-&amp;gt;avenrun[0]/FSCALE,&lt;br /&gt;
	       (double)host_stat-&amp;gt;avenrun[1]/FSCALE,&lt;br /&gt;
	       (double)host_stat-&amp;gt;avenrun[2]/FSCALE);&lt;br /&gt;
&lt;br /&gt;
	return(0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static&lt;br /&gt;
void&lt;br /&gt;
onehost(const char *host)&lt;br /&gt;
{&lt;br /&gt;
	CLIENT *rstat_clnt;&lt;br /&gt;
	statstime host_stat;&lt;br /&gt;
	struct timeval foo;&lt;br /&gt;
	&lt;br /&gt;
	rstat_clnt = clnt_create(host, RSTATPROG, RSTATVERS_TIME, &amp;quot;udp&amp;quot;);&lt;br /&gt;
	if (rstat_clnt == NULL) {&lt;br /&gt;
		warnx(&amp;quot;%s&amp;quot;, clnt_spcreateerror(host));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	memset(&amp;amp;host_stat, 0, sizeof(host_stat));&lt;br /&gt;
	if (clnt_call(rstat_clnt, RSTATPROC_STATS, &lt;br /&gt;
		      (xdrproc_t) xdr_void, NULL, &lt;br /&gt;
		      (xdrproc_t) xdr_statstime, &amp;amp;host_stat, &lt;br /&gt;
		      foo) != RPC_SUCCESS) &lt;br /&gt;
	{&lt;br /&gt;
		warnx(&amp;quot;%s&amp;quot;,  clnt_sperror(rstat_clnt, host));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	print_rup_data(host, &amp;amp;host_stat);&lt;br /&gt;
	clnt_destroy(rstat_clnt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static&lt;br /&gt;
void&lt;br /&gt;
allhosts(void)&lt;br /&gt;
{&lt;br /&gt;
	statstime host_stat;&lt;br /&gt;
	enum clnt_stat clnt_stat;&lt;br /&gt;
	int i;&lt;br /&gt;
&lt;br /&gt;
	if (sort_type != SORT_NONE) {&lt;br /&gt;
		printf(&amp;quot;collecting responses...&amp;quot;);&lt;br /&gt;
		fflush(stdout);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	clnt_stat = clnt_broadcast(RSTATPROG, RSTATVERS_TIME, RSTATPROC_STATS,&lt;br /&gt;
				   (xdrproc_t) xdr_void, NULL,&lt;br /&gt;
				   (xdrproc_t) xdr_statstime, &lt;br /&gt;
				   (char *) &amp;amp;host_stat, &lt;br /&gt;
				   (resultproc_t) rstat_reply);&lt;br /&gt;
	if (clnt_stat != RPC_SUCCESS &amp;amp;&amp;amp; clnt_stat != RPC_TIMEDOUT) {&lt;br /&gt;
		warnx(&amp;quot;%s&amp;quot;, clnt_sperrno(clnt_stat));&lt;br /&gt;
		exit(1);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if (sort_type != SORT_NONE) {&lt;br /&gt;
		putchar(&amp;#039;\n&amp;#039;);&lt;br /&gt;
		qsort(rup_data, rup_data_idx, sizeof(struct rup_data), compare);&lt;br /&gt;
&lt;br /&gt;
		for (i = 0; i &amp;lt; rup_data_idx; i++) {&lt;br /&gt;
			print_rup_data(rup_data[i].host, &amp;amp;rup_data[i].statstime);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static void usage(void)&lt;br /&gt;
{&lt;br /&gt;
	fprintf(stderr, &amp;quot;Usage: rup [-dhlt] [hosts ...]\n&amp;quot;);&lt;br /&gt;
	exit(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[])&lt;br /&gt;
{&lt;br /&gt;
	int ch;&lt;br /&gt;
&lt;br /&gt;
	sort_type = SORT_NONE;&lt;br /&gt;
	while ((ch = getopt(argc, argv, &amp;quot;dshlt&amp;quot;)) != -1)&lt;br /&gt;
		switch (ch) {&lt;br /&gt;
		case &amp;#039;d&amp;#039;:&lt;br /&gt;
			printtime = 1;&lt;br /&gt;
			break;&lt;br /&gt;
		case &amp;#039;s&amp;#039;:&lt;br /&gt;
			printseconds = 1;&lt;br /&gt;
			break;&lt;br /&gt;
		case &amp;#039;h&amp;#039;:&lt;br /&gt;
			sort_type = SORT_HOST;&lt;br /&gt;
			break;&lt;br /&gt;
		case &amp;#039;l&amp;#039;:&lt;br /&gt;
			sort_type = SORT_LDAV;&lt;br /&gt;
			break;&lt;br /&gt;
		case &amp;#039;t&amp;#039;:&lt;br /&gt;
			sort_type = SORT_UPTIME;&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			usage();&lt;br /&gt;
			/*NOTREACHED*/&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	setlinebuf(stdout);&lt;br /&gt;
&lt;br /&gt;
	if (argc == optind)&lt;br /&gt;
		allhosts();&lt;br /&gt;
	else {&lt;br /&gt;
		for (; optind &amp;lt; argc; optind++)&lt;br /&gt;
			onehost(argv[optind]);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	exit(0);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>