Blame apps/snmpps.c

Packit fcad23
/*
Packit fcad23
 * snmpps.c - display process table on a network entity via SNMP.
Packit fcad23
 *
Packit fcad23
 */
Packit fcad23
Packit fcad23
/* Portions of this file are subject to the following copyright(s).  See
Packit fcad23
 * the Net-SNMP's COPYING file for more details and other copyrights
Packit fcad23
 * that may apply:
Packit fcad23
 */
Packit fcad23
/***********************************************************************
Packit fcad23
        Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
Packit fcad23
Packit fcad23
                      All Rights Reserved
Packit fcad23
Packit fcad23
Permission to use, copy, modify, and distribute this software and its 
Packit fcad23
documentation for any purpose and without fee is hereby granted, 
Packit fcad23
provided that the above copyright notice appear in all copies and that
Packit fcad23
both that copyright notice and this permission notice appear in 
Packit fcad23
supporting documentation, and that the name of CMU not be
Packit fcad23
used in advertising or publicity pertaining to distribution of the
Packit fcad23
software without specific, written prior permission.  
Packit fcad23
Packit fcad23
CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
Packit fcad23
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit fcad23
CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
Packit fcad23
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit fcad23
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
Packit fcad23
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
Packit fcad23
SOFTWARE.
Packit fcad23
******************************************************************/
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
Packit fcad23
#if HAVE_STDLIB_H
Packit fcad23
#include <stdlib.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_UNISTD_H
Packit fcad23
#include <unistd.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_STRING_H
Packit fcad23
#include <string.h>
Packit fcad23
#else
Packit fcad23
#include <strings.h>
Packit fcad23
#endif
Packit fcad23
#include <sys/types.h>
Packit fcad23
#if HAVE_NETINET_IN_H
Packit fcad23
#include <netinet/in.h>
Packit fcad23
#endif
Packit fcad23
#include <stdio.h>
Packit fcad23
#include <ctype.h>
Packit fcad23
#if TIME_WITH_SYS_TIME
Packit fcad23
# include <sys/time.h>
Packit fcad23
# include <time.h>
Packit fcad23
#else
Packit fcad23
# if HAVE_SYS_TIME_H
Packit fcad23
#  include <sys/time.h>
Packit fcad23
# else
Packit fcad23
#  include <time.h>
Packit fcad23
# endif
Packit fcad23
#endif
Packit fcad23
#if HAVE_SYS_SELECT_H
Packit fcad23
#include <sys/select.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_NETDB_H
Packit fcad23
#include <netdb.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_ARPA_INET_H
Packit fcad23
#include <arpa/inet.h>
Packit fcad23
#endif
Packit fcad23
#if HAVE_NCURSES_CURSES_H
Packit fcad23
#include <ncurses/curses.h>
Packit fcad23
#elif HAVE_CURSES_H
Packit fcad23
#include <curses.h>
Packit fcad23
#endif
Packit fcad23
#include <signal.h>
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-includes.h>
Packit fcad23
Packit fcad23
void
Packit fcad23
usage(void)
Packit fcad23
{
Packit fcad23
    fprintf(stderr, "Usage: snmpps [-Cp] [-Ca] [-C m | n | t] AGENT");
Packit fcad23
    snmp_parse_args_usage(stderr);
Packit fcad23
    fprintf(stderr, "\n\n");
Packit fcad23
    snmp_parse_args_descriptions(stderr);
Packit fcad23
    fprintf(stderr, "\nsnmpps options:\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "\t-Cp\tShow hrSWRunPath instead of hrSWRunName\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "\t-Ca\tShow hrSWRunParameters in addition to hrSWRunName/Path\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "\t-Ct\tSort processes according to CPU time used\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "\t-Cm\tSort processes according to memory usage\n");
Packit fcad23
    fprintf(stderr,
Packit fcad23
            "\t-Cn\tSort processes by PID number (default)\n");
Packit fcad23
}
Packit fcad23
Packit fcad23
int   command_args = 0,
Packit fcad23
      command_path = 0;
Packit fcad23
int   topsort = 'c';
Packit fcad23
char *progname;
Packit fcad23
Packit fcad23
static void
Packit fcad23
optProc(int argc, char *const *argv, int opt)
Packit fcad23
{
Packit fcad23
    switch (opt) {
Packit fcad23
    case 'C':
Packit fcad23
        while (*optarg) {
Packit fcad23
            switch (*optarg++) {
Packit fcad23
            case 'a':
Packit fcad23
                command_args = 1;
Packit fcad23
                break;
Packit fcad23
            case 'p':
Packit fcad23
                command_path = 1;
Packit fcad23
                break;
Packit fcad23
            case 'm':
Packit fcad23
                topsort = 'm';
Packit fcad23
                break;
Packit fcad23
            case 'n':
Packit fcad23
                topsort = 'n';
Packit fcad23
                break;
Packit fcad23
            case 't':
Packit fcad23
                topsort = 't';
Packit fcad23
                break;
Packit fcad23
Packit fcad23
            default:
Packit fcad23
                fprintf(stderr,
Packit fcad23
                        "Unknown flag passed to -C: %c\n", optarg[-1]);
Packit fcad23
                exit(1);
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
struct hrSWRunTable {
Packit fcad23
    u_long  hrSWRunIndex;
Packit fcad23
    char   *hrSWRunName;
Packit fcad23
    char   *hrSWRunPath;
Packit fcad23
    char   *hrSWRunParameters;
Packit fcad23
    u_long  hrSWRunID;
Packit fcad23
    u_long  hrSWRunType;
Packit fcad23
    u_long  hrSWRunStatus;
Packit fcad23
    u_long  hrSWRunPerfMem;
Packit fcad23
    u_long  hrSWRunPerfCPU;
Packit fcad23
    u_long  hrSWRunPerfCPUInc;
Packit fcad23
};
Packit fcad23
Packit fcad23
struct cpuStats {
Packit fcad23
    u_long user;
Packit fcad23
    u_long nice;
Packit fcad23
    u_long system;
Packit fcad23
    u_long idle;
Packit fcad23
    u_long wait;
Packit fcad23
    u_long kernel;
Packit fcad23
    u_long intr;
Packit fcad23
    u_long softintr;
Packit fcad23
    u_long steal;
Packit fcad23
    u_long guest;
Packit fcad23
    u_long guestnice;
Packit fcad23
};
Packit fcad23
Packit fcad23
struct memStats {
Packit fcad23
    u_long totalSwap;
Packit fcad23
    u_long availSwap;
Packit fcad23
    u_long totalReal;
Packit fcad23
    u_long availReal;
Packit fcad23
    u_long shared;
Packit fcad23
    u_long buffer;
Packit fcad23
    u_long cached;
Packit fcad23
};
Packit fcad23
Packit fcad23
struct laStats {
Packit fcad23
    u_long la1;
Packit fcad23
    u_long la5;
Packit fcad23
    u_long la15;
Packit fcad23
};
Packit fcad23
Packit fcad23
Packit fcad23
int
Packit fcad23
add(netsnmp_pdu *pdu, const char *mibnodename,
Packit fcad23
    oid * index, size_t indexlen)
Packit fcad23
{
Packit fcad23
    oid             base[MAX_OID_LEN];
Packit fcad23
    size_t          base_length = MAX_OID_LEN;
Packit fcad23
Packit fcad23
    memset(base, 0, MAX_OID_LEN * sizeof(oid));
Packit fcad23
Packit fcad23
    if (!snmp_parse_oid(mibnodename, base, &base_length)) {
Packit fcad23
        snmp_perror(mibnodename);
Packit fcad23
        fprintf(stderr, "couldn't find mib node %s, giving up\n",
Packit fcad23
                mibnodename);
Packit fcad23
#if HAVE_CURSES_H
Packit fcad23
        endwin();
Packit fcad23
#endif
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (index && indexlen) {
Packit fcad23
        memcpy(&(base[base_length]), index, indexlen * sizeof(oid));
Packit fcad23
        base_length += indexlen;
Packit fcad23
    }
Packit fcad23
    DEBUGMSGTL(("add", "created: "));
Packit fcad23
    DEBUGMSGOID(("add", base, base_length));
Packit fcad23
    DEBUGMSG(("add", "\n"));
Packit fcad23
    snmp_add_null_var(pdu, base, base_length);
Packit fcad23
Packit fcad23
    return base_length;
Packit fcad23
}
Packit fcad23
Packit fcad23
netsnmp_variable_list *
Packit fcad23
collect_procs(netsnmp_session *ss, netsnmp_pdu *pdu,
Packit fcad23
        oid * base, size_t base_length)
Packit fcad23
{
Packit fcad23
    netsnmp_pdu    *response;
Packit fcad23
    int             running = 1;
Packit fcad23
    netsnmp_variable_list *saved = NULL, **vlpp = &saved;
Packit fcad23
    int             status;
Packit fcad23
Packit fcad23
    while (running) {
Packit fcad23
        /*
Packit fcad23
         * gotta catch em all, gotta catch em all! 
Packit fcad23
         */
Packit fcad23
        status = snmp_synch_response(ss, pdu, &response);
Packit fcad23
        if (status != STAT_SUCCESS || !response) {
Packit fcad23
            snmp_sess_perror(progname, ss);
Packit fcad23
#if HAVE_CURSES_H
Packit fcad23
            endwin();
Packit fcad23
#endif
Packit fcad23
            exit(1);
Packit fcad23
        }
Packit fcad23
        if (response->errstat != SNMP_ERR_NOERROR) {
Packit fcad23
            fprintf(stderr, "%s: Error in packet: %s\n", progname,
Packit fcad23
                    snmp_errstring(response->errstat));
Packit fcad23
#if HAVE_CURSES_H
Packit fcad23
            endwin();
Packit fcad23
#endif
Packit fcad23
            exit(1);
Packit fcad23
        }
Packit fcad23
        if (snmp_oid_compare(response->variables->name,
Packit fcad23
                             SNMP_MIN(base_length,
Packit fcad23
                                      response->variables->name_length),
Packit fcad23
                             base, base_length) != 0)
Packit fcad23
            running = 0;
Packit fcad23
        else if (response->variables->type == SNMP_NOSUCHINSTANCE ||
Packit fcad23
                    response->variables->type == SNMP_NOSUCHOBJECT ||
Packit fcad23
                response->variables->type == SNMP_ENDOFMIBVIEW)
Packit fcad23
            running = 0;
Packit fcad23
        else {
Packit fcad23
            /*
Packit fcad23
             * get response 
Packit fcad23
             */
Packit fcad23
            *vlpp = response->variables;
Packit fcad23
            (*vlpp)->next_variable = NULL;      /* shouldn't be any, but just in case */
Packit fcad23
Packit fcad23
            /*
Packit fcad23
             * create the next request 
Packit fcad23
             */
Packit fcad23
            pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
Packit fcad23
            snmp_add_null_var(pdu, (*vlpp)->name, (*vlpp)->name_length);
Packit fcad23
Packit fcad23
            /*
Packit fcad23
             * finish loop setup 
Packit fcad23
             */
Packit fcad23
            vlpp = &((*vlpp)->next_variable);
Packit fcad23
            response->variables = NULL; /* ahh, forget about it */
Packit fcad23
        }
Packit fcad23
        snmp_free_pdu(response);
Packit fcad23
    }
Packit fcad23
    return saved;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int
Packit fcad23
collect_perf(netsnmp_session *ss, struct hrSWRunTable **fproc)
Packit fcad23
{
Packit fcad23
    netsnmp_pdu    *pdu;
Packit fcad23
    netsnmp_pdu    *response;
Packit fcad23
    netsnmp_variable_list *vlp;
Packit fcad23
    oid             base[MAX_OID_LEN];
Packit fcad23
    size_t          base_length;
Packit fcad23
    int status, count = 0;
Packit fcad23
    struct hrSWRunTable *procs = malloc(sizeof(struct hrSWRunTable));
Packit fcad23
Packit fcad23
    pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
Packit fcad23
    base_length =
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunIndex", NULL, 0);
Packit fcad23
    memcpy(base, pdu->variables->name, base_length * sizeof(oid));
Packit fcad23
Packit fcad23
    vlp = collect_procs(ss, pdu, base, base_length);
Packit fcad23
Packit fcad23
    while (vlp) {
Packit fcad23
        size_t len;
Packit fcad23
        struct hrSWRunTable proc;
Packit fcad23
        netsnmp_variable_list *vlp2;
Packit fcad23
Packit fcad23
        pdu = snmp_pdu_create(SNMP_MSG_GET);
Packit fcad23
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunName",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunID",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunPath",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunParameters",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunType",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunStatus",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunPerfCPU",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSWRunPerfMem",
Packit fcad23
            &vlp->name[base_length], vlp->name_length - base_length);
Packit fcad23
Packit fcad23
        response = NULL;
Packit fcad23
        status = snmp_synch_response(ss, pdu, &response);
Packit fcad23
        if (status != STAT_SUCCESS || !response) {
Packit fcad23
            snmp_sess_perror(progname, ss);
Packit fcad23
#if HAVE_CURSES_H
Packit fcad23
            endwin();
Packit fcad23
#endif
Packit fcad23
            exit(1);
Packit fcad23
        }
Packit fcad23
        if (response->errstat != SNMP_ERR_NOERROR) {
Packit fcad23
            vlp = vlp->next_variable;
Packit fcad23
            continue;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        memset(&proc, 0, sizeof(proc));
Packit fcad23
Packit fcad23
        proc.hrSWRunIndex = vlp->name[base_length];
Packit fcad23
Packit fcad23
        vlp2 = response->variables;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        len = vlp2->val_len;
Packit fcad23
        proc.hrSWRunName = malloc(len+1);
Packit fcad23
        memcpy(proc.hrSWRunName, vlp2->val.string, len);
Packit fcad23
        proc.hrSWRunName[len] = '\0';
Packit fcad23
Packit fcad23
        vlp2 = vlp2->next_variable;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        proc.hrSWRunID = *vlp2->val.integer;
Packit fcad23
Packit fcad23
        vlp2 = vlp2->next_variable;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        len = vlp2->val_len;
Packit fcad23
        proc.hrSWRunPath = malloc(len+1);
Packit fcad23
        memcpy(proc.hrSWRunPath, vlp2->val.string, len);
Packit fcad23
        proc.hrSWRunPath[len] = '\0';
Packit fcad23
Packit fcad23
        vlp2 = vlp2->next_variable;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        len = vlp2->val_len;
Packit fcad23
        proc.hrSWRunParameters = malloc(len+1);
Packit fcad23
        memcpy(proc.hrSWRunParameters, vlp2->val.string, len);
Packit fcad23
        proc.hrSWRunParameters[len] = '\0';
Packit fcad23
Packit fcad23
        vlp2 = vlp2->next_variable;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        proc.hrSWRunType = *vlp2->val.integer;
Packit fcad23
Packit fcad23
        vlp2 = vlp2->next_variable;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        proc.hrSWRunStatus = *vlp2->val.integer;
Packit fcad23
Packit fcad23
        vlp2 = vlp2->next_variable;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        proc.hrSWRunPerfCPU = *vlp2->val.integer;
Packit fcad23
Packit fcad23
        vlp2 = vlp2->next_variable;
Packit fcad23
        if (vlp2->type == SNMP_NOSUCHINSTANCE) goto next;
Packit fcad23
        proc.hrSWRunPerfMem = *vlp2->val.integer;
Packit fcad23
Packit fcad23
        count++;
Packit fcad23
        procs = realloc(procs, count*sizeof(procs[0]));
Packit fcad23
        procs[count-1] = proc;
Packit fcad23
Packit fcad23
        snmp_free_pdu(response);
Packit fcad23
        vlp2 = vlp;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        free(vlp2);
Packit fcad23
        continue;
Packit fcad23
Packit fcad23
next:
Packit fcad23
        if (proc.hrSWRunName) free(proc.hrSWRunName);
Packit fcad23
        if (proc.hrSWRunPath) free(proc.hrSWRunPath);
Packit fcad23
        if (proc.hrSWRunParameters) free(proc.hrSWRunParameters);
Packit fcad23
        snmp_free_pdu(response);
Packit fcad23
        vlp2 = vlp;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        free(vlp2);
Packit fcad23
    }
Packit fcad23
    *fproc = procs;
Packit fcad23
    return count;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
void free_perf(struct hrSWRunTable *procs, int nproc)
Packit fcad23
{
Packit fcad23
    int i;
Packit fcad23
    for (i = 0; i < nproc; i++) {
Packit fcad23
        struct hrSWRunTable *proc = procs+i;
Packit fcad23
        if (proc->hrSWRunName) free(proc->hrSWRunName);
Packit fcad23
        if (proc->hrSWRunPath) free(proc->hrSWRunPath);
Packit fcad23
        if (proc->hrSWRunParameters) free(proc->hrSWRunParameters);
Packit fcad23
    }
Packit fcad23
    free(procs);
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int collect_cpu(netsnmp_session *ss, struct cpuStats *cpu)
Packit fcad23
{
Packit fcad23
    netsnmp_pdu    *pdu;
Packit fcad23
    netsnmp_pdu    *response;
Packit fcad23
    int status;
Packit fcad23
    int ret = 0;
Packit fcad23
Packit fcad23
    pdu = snmp_pdu_create(SNMP_MSG_GET);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawUser.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawNice.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawSystem.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawIdle.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawWait.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawKernel.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawInterrupt.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawSoftIRQ.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawSteal.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawGuest.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:ssCpuRawGuestNice.0", NULL, 0);
Packit fcad23
Packit fcad23
    status = snmp_synch_response(ss, pdu, &response);
Packit fcad23
    memset(cpu, 0, sizeof(*cpu));
Packit fcad23
    if (status != STAT_SUCCESS || !response ||
Packit fcad23
            response->errstat != SNMP_ERR_NOERROR) {
Packit fcad23
        goto out;
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
        netsnmp_variable_list *vlp = response->variables;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->user = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->nice = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->system = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->idle = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->wait = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->kernel = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
Packit fcad23
        ret = 1;
Packit fcad23
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->intr = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->softintr = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->steal = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->guest = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        cpu->guestnice = *vlp->val.integer;
Packit fcad23
    }
Packit fcad23
out:
Packit fcad23
    if (response) snmp_free_pdu(response);
Packit fcad23
    return ret;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int collect_mem(netsnmp_session *ss, struct memStats *mem)
Packit fcad23
{
Packit fcad23
    netsnmp_pdu    *pdu;
Packit fcad23
    netsnmp_pdu    *response;
Packit fcad23
    int status;
Packit fcad23
    int ret = 0;
Packit fcad23
Packit fcad23
    pdu = snmp_pdu_create(SNMP_MSG_GET);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:memTotalSwap.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:memAvailSwap.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:memTotalReal.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:memAvailReal.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:memShared.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:memBuffer.0", NULL, 0);
Packit fcad23
    add(pdu, "UCD-SNMP-MIB:memCached.0", NULL, 0);
Packit fcad23
Packit fcad23
    status = snmp_synch_response(ss, pdu, &response);
Packit fcad23
    memset(mem, 0, sizeof(*mem));
Packit fcad23
    if (status != STAT_SUCCESS || !response ||
Packit fcad23
            response->errstat != SNMP_ERR_NOERROR) {
Packit fcad23
        goto out;
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
        netsnmp_variable_list *vlp = response->variables;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        mem->totalSwap = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        mem->availSwap = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        mem->totalReal = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        mem->availReal = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
Packit fcad23
        ret = 1;
Packit fcad23
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        mem->shared = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        mem->buffer = *vlp->val.integer;
Packit fcad23
        vlp = vlp->next_variable;
Packit fcad23
        if (vlp->type == SNMP_NOSUCHOBJECT) goto out;
Packit fcad23
        mem->cached = *vlp->val.integer;
Packit fcad23
    }
Packit fcad23
out:
Packit fcad23
    if (response) snmp_free_pdu(response);
Packit fcad23
    return ret;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
char *format_centisec(char *buf, size_t len, unsigned long csec)
Packit fcad23
{
Packit fcad23
    long sec, min, hour, day;
Packit fcad23
Packit fcad23
    day = csec / 100 / 3600 / 24;
Packit fcad23
    csec -= day * 100 * 3600 * 24;
Packit fcad23
    hour = csec / 100 / 3600;
Packit fcad23
    csec -= hour * 100 * 3600;
Packit fcad23
    min = csec / 100 / 60;
Packit fcad23
    csec -= min * 100 * 60;
Packit fcad23
    sec = csec / 100;
Packit fcad23
    csec -= sec * 100;
Packit fcad23
Packit fcad23
    if (day)
Packit fcad23
        snprintf(buf, len, "%ldd%02ld:%02ld:%02ld.%02lu", day, hour, min, sec, csec);
Packit fcad23
    else if (hour)
Packit fcad23
        snprintf(buf, len, "%ld:%02ld:%02ld.%02lu", hour, min, sec, csec);
Packit fcad23
    else if (min)
Packit fcad23
        snprintf(buf, len, "%ld:%02ld.%02lu", min, sec, csec);
Packit fcad23
    else
Packit fcad23
        snprintf(buf, len, "%ld.%02lu", sec, csec);
Packit fcad23
    return buf;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
char *format_sec(char *buf, size_t len, unsigned long csec)
Packit fcad23
{
Packit fcad23
    long sec, min, hour, day;
Packit fcad23
Packit fcad23
    day = csec / 100 / 3600 / 24;
Packit fcad23
    csec -= day * 100 * 3600 * 24;
Packit fcad23
    hour = csec / 100 / 3600;
Packit fcad23
    csec -= hour * 100 * 3600;
Packit fcad23
    min = csec / 100 / 60;
Packit fcad23
    csec -= min * 100 * 60;
Packit fcad23
    sec = csec / 100;
Packit fcad23
    csec -= sec * 100;
Packit fcad23
Packit fcad23
    if (day)
Packit fcad23
        snprintf(buf, len, "%ldd%02ld:%02ld:%02ld", day, hour, min, sec);
Packit fcad23
    else if (hour)
Packit fcad23
        snprintf(buf, len, "%ld:%02ld:%02ld.%02lu", hour, min, sec, csec);
Packit fcad23
    else if (min)
Packit fcad23
        snprintf(buf, len, "%ld:%02ld.%02lu", min, sec, csec);
Packit fcad23
    else
Packit fcad23
        snprintf(buf, len, "%ld.%02lu", sec, csec);
Packit fcad23
    return buf;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
char *format_humanmem(char *buf, size_t len, unsigned long mem)
Packit fcad23
{
Packit fcad23
    if (mem >= 1024*1024)
Packit fcad23
        snprintf(buf, len, "%4.2fGB", (float)mem/(1024*1024));
Packit fcad23
    else if (mem >= 1024)
Packit fcad23
        snprintf(buf, len, "%4.2fMB", (float)mem/1024);
Packit fcad23
    else
Packit fcad23
        snprintf(buf, len, "%4.2fkB", (float)mem);
Packit fcad23
    return buf;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int cpucomp(const void *v1, const void *v2)
Packit fcad23
{
Packit fcad23
    const struct hrSWRunTable *p1 = v1, *p2 = v2;
Packit fcad23
    return p2->hrSWRunPerfCPUInc - p1->hrSWRunPerfCPUInc;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int memcomp(const void *v1, const void *v2)
Packit fcad23
{
Packit fcad23
    const struct hrSWRunTable *p1 = v1, *p2 = v2;
Packit fcad23
    return p2->hrSWRunPerfMem - p1->hrSWRunPerfMem;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int totcomp(const void *v1, const void *v2)
Packit fcad23
{
Packit fcad23
    const struct hrSWRunTable *p1 = v1, *p2 = v2;
Packit fcad23
    return p2->hrSWRunPerfCPU - p1->hrSWRunPerfCPU;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int pidcomp(const void *v1, const void *v2)
Packit fcad23
{
Packit fcad23
    const struct hrSWRunTable *p1 = v1, *p2 = v2;
Packit fcad23
    return p1->hrSWRunIndex - p2->hrSWRunIndex;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int
Packit fcad23
snmpps(int argc, char *argv[])
Packit fcad23
{
Packit fcad23
    netsnmp_session session, *ss;
Packit fcad23
    int             arg;
Packit fcad23
    struct hrSWRunTable *procs;
Packit fcad23
    int             count, pinx = 0;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * get the common command line arguments 
Packit fcad23
     */
Packit fcad23
    switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR:
Packit fcad23
        exit(1);
Packit fcad23
    case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
Packit fcad23
        exit(0);
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR_USAGE:
Packit fcad23
        usage();
Packit fcad23
        exit(1);
Packit fcad23
    default:
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (arg != argc) {
Packit fcad23
        fprintf(stderr, "snmpps: extra argument: %s\n", argv[arg]);
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    SOCK_STARTUP;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * Open an SNMP session.
Packit fcad23
     */
Packit fcad23
    ss = snmp_open(&session);
Packit fcad23
    if (ss == NULL) {
Packit fcad23
        /*
Packit fcad23
         * diagnose snmp_open errors with the input netsnmp_session pointer 
Packit fcad23
         */
Packit fcad23
        snmp_sess_perror("snmpps", &session);
Packit fcad23
        SOCK_CLEANUP;
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    count = collect_perf(ss, &procs);
Packit fcad23
    if (count == 0) {
Packit fcad23
        fprintf(stderr, "snmpps: no processes found\n");
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    switch (topsort) {
Packit fcad23
    case 'm':
Packit fcad23
        qsort(procs, count, sizeof(procs[0]), memcomp);
Packit fcad23
        break;
Packit fcad23
    case 't':
Packit fcad23
        qsort(procs, count, sizeof(procs[0]), totcomp);
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    printf("%7s %4s %6s %10s %11s %-10s\n",
Packit fcad23
        "Index", "Type", "Status", "Memory", "CPU", "Command");
Packit fcad23
Packit fcad23
    while (pinx < count) {
Packit fcad23
        struct hrSWRunTable *proc = procs+pinx;
Packit fcad23
        const char *hr_status, *hr_type;
Packit fcad23
        char b1[15], b2[20];
Packit fcad23
Packit fcad23
        switch (proc->hrSWRunType) {
Packit fcad23
        case 1: hr_type = "Unkn"; break;
Packit fcad23
        case 2: hr_type = "Os"; break;
Packit fcad23
        case 3: hr_type = "Drvr"; break;
Packit fcad23
        case 4: hr_type = "Appl"; break;
Packit fcad23
        default: hr_type = "?"; break;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        switch (proc->hrSWRunStatus) {
Packit fcad23
        case 1: hr_status = "Run"; break;
Packit fcad23
        case 2: hr_status = "Wait"; break;
Packit fcad23
        case 3: hr_status = "Event"; break;
Packit fcad23
        case 4: hr_status = "Inval"; break;
Packit fcad23
        default: hr_status = "?"; break;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        printf("%7lu %4s %6s %10s %11.11s %s %s\n",
Packit fcad23
               proc->hrSWRunIndex,
Packit fcad23
               hr_type,
Packit fcad23
               hr_status,
Packit fcad23
               format_humanmem(b1, sizeof b1, proc->hrSWRunPerfMem),
Packit fcad23
               format_centisec(b2, sizeof b2, proc->hrSWRunPerfCPU),
Packit fcad23
               command_path && proc->hrSWRunPath[0] ? proc->hrSWRunPath : proc->hrSWRunName,
Packit fcad23
               command_args ? proc->hrSWRunParameters : "");
Packit fcad23
Packit fcad23
        pinx++;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    snmp_close(ss);
Packit fcad23
    SOCK_CLEANUP;
Packit fcad23
    return 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
#if HAVE_CURSES_H
Packit fcad23
static void endtop(int sig)
Packit fcad23
{
Packit fcad23
    endwin();
Packit fcad23
    exit(1);
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
int snmptop(int argc, char **argv)
Packit fcad23
{
Packit fcad23
    netsnmp_session session, *ss;
Packit fcad23
    int             arg;
Packit fcad23
    struct hrSWRunTable *oproc;
Packit fcad23
    int             ocount = 0;
Packit fcad23
    int             show_idle = 1;
Packit fcad23
    int             show_os = 1;
Packit fcad23
    char            ch;
Packit fcad23
    struct cpuStats oldCpu;
Packit fcad23
    struct memStats mem;
Packit fcad23
    int             has_cpu, has_mem; 
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * get the common command line arguments 
Packit fcad23
     */
Packit fcad23
    switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR:
Packit fcad23
        exit(1);
Packit fcad23
    case NETSNMP_PARSE_ARGS_SUCCESS_EXIT:
Packit fcad23
        exit(0);
Packit fcad23
    case NETSNMP_PARSE_ARGS_ERROR_USAGE:
Packit fcad23
        usage();
Packit fcad23
        exit(1);
Packit fcad23
    default:
Packit fcad23
        break;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    if (arg != argc) {
Packit fcad23
        fprintf(stderr, "snmptop: extra argument: %s\n", argv[arg]);
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    SOCK_STARTUP;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * Open an SNMP session.
Packit fcad23
     */
Packit fcad23
    ss = snmp_open(&session);
Packit fcad23
    if (ss == NULL) {
Packit fcad23
        /*
Packit fcad23
         * diagnose snmp_open errors with the input netsnmp_session pointer 
Packit fcad23
         */
Packit fcad23
        snmp_sess_perror("snmptop", &session);
Packit fcad23
        SOCK_CLEANUP;
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    ocount = collect_perf(ss, &oproc);
Packit fcad23
    if (ocount == 0) {
Packit fcad23
        fprintf(stderr, "snmptop: no processes found\n");
Packit fcad23
        exit(1);
Packit fcad23
    }
Packit fcad23
Packit fcad23
    collect_cpu(ss, &oldCpu);
Packit fcad23
Packit fcad23
    signal(SIGINT, endtop);
Packit fcad23
    initscr();
Packit fcad23
    cbreak();
Packit fcad23
    noecho();
Packit fcad23
    nonl();
Packit fcad23
    halfdelay(50);
Packit fcad23
Packit fcad23
    while ((ch = getch()) != 'q') {
Packit fcad23
        int ncount;
Packit fcad23
        struct hrSWRunTable *nproc;
Packit fcad23
        int oinx = 0, ninx = 0, line = 0;
Packit fcad23
        netsnmp_pdu    *pdu;
Packit fcad23
        netsnmp_pdu    *response = NULL;
Packit fcad23
        int status;
Packit fcad23
        time_t clock;
Packit fcad23
        struct tm *ptm;
Packit fcad23
        char uptime[40];
Packit fcad23
        char timestr[40];
Packit fcad23
        char b1[15], b2[15], b3[15], b4[15];
Packit fcad23
        struct cpuStats newCpu;
Packit fcad23
Packit fcad23
        if (ch == 'c' || ch == 'm' || ch == 'n' || ch == 't') topsort = ch;
Packit fcad23
        if (ch == 'i') show_idle = !show_idle;
Packit fcad23
        if (ch == 'o') show_os = !show_os;
Packit fcad23
        if (ch == 'a') command_args = !command_args;
Packit fcad23
        if (ch == 'p') command_path = !command_path;
Packit fcad23
Packit fcad23
        ncount = collect_perf(ss, &nproc);
Packit fcad23
Packit fcad23
        while (oinx < ocount && ninx < ncount) {
Packit fcad23
            if (oproc[oinx].hrSWRunIndex == nproc[ninx].hrSWRunIndex) {
Packit fcad23
                nproc[ninx].hrSWRunPerfCPUInc = nproc[ninx].hrSWRunPerfCPU-oproc[oinx].hrSWRunPerfCPU;
Packit fcad23
                ninx++;
Packit fcad23
                oinx++;
Packit fcad23
            }
Packit fcad23
            else if (nproc[oinx].hrSWRunIndex < oproc[ninx].hrSWRunIndex)
Packit fcad23
                oinx++;
Packit fcad23
            else {
Packit fcad23
                nproc[ninx].hrSWRunPerfCPUInc = nproc[ninx].hrSWRunPerfCPU;
Packit fcad23
                ninx++;
Packit fcad23
            }
Packit fcad23
        }
Packit fcad23
        while (ninx < ncount) {
Packit fcad23
            nproc[ninx].hrSWRunPerfCPUInc = nproc[ninx].hrSWRunPerfCPU;
Packit fcad23
            ninx++;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        switch (topsort) {
Packit fcad23
        case 'c':
Packit fcad23
            qsort(nproc, ncount, sizeof(nproc[0]), cpucomp);
Packit fcad23
            break;
Packit fcad23
        case 'm':
Packit fcad23
            qsort(nproc, ncount, sizeof(nproc[0]), memcomp);
Packit fcad23
            break;
Packit fcad23
        case 't':
Packit fcad23
            qsort(nproc, ncount, sizeof(nproc[0]), totcomp);
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        has_cpu = collect_cpu(ss, &newCpu);
Packit fcad23
        has_mem = collect_mem(ss, &mem;;
Packit fcad23
Packit fcad23
        pdu = snmp_pdu_create(SNMP_MSG_GET);
Packit fcad23
        add(pdu, "HOST-RESOURCES-MIB:hrSystemUptime.0", NULL, 0);
Packit fcad23
        status = snmp_synch_response(ss, pdu, &response);
Packit fcad23
        if (status != STAT_SUCCESS || !response ||
Packit fcad23
                response->errstat != SNMP_ERR_NOERROR) {
Packit fcad23
            uptime[0] = '\0';
Packit fcad23
        }
Packit fcad23
        else {
Packit fcad23
            netsnmp_variable_list *vlp = response->variables;
Packit fcad23
            if (vlp->type == SNMP_NOSUCHINSTANCE) abort();
Packit fcad23
            uptime_string_n(*vlp->val.integer, uptime, sizeof(uptime));
Packit fcad23
        }
Packit fcad23
        snmp_free_pdu(response);
Packit fcad23
Packit fcad23
        clock = time(NULL);
Packit fcad23
        ptm = localtime(&clock);
Packit fcad23
        strftime(timestr, sizeof(timestr), "%H:%M:%S", ptm);
Packit fcad23
Packit fcad23
        clear();
Packit fcad23
        move(0, 0);
Packit fcad23
        printw("%s %s%s", session.peername, uptime[0] ? "up " : "", uptime);
Packit fcad23
        move(0, COLS-strlen(timestr)-1);
Packit fcad23
        printw("%s", timestr);
Packit fcad23
        if (has_cpu) {
Packit fcad23
            struct cpuStats deltaCpu;
Packit fcad23
            u_long sumCpu;
Packit fcad23
Packit fcad23
            deltaCpu.user = newCpu.user - oldCpu.user;
Packit fcad23
            deltaCpu.nice = newCpu.nice - oldCpu.nice;
Packit fcad23
            deltaCpu.system = newCpu.system - oldCpu.system;
Packit fcad23
            deltaCpu.idle = newCpu.idle - oldCpu.idle;
Packit fcad23
            deltaCpu.wait = newCpu.wait - oldCpu.wait;
Packit fcad23
            deltaCpu.kernel = newCpu.kernel - oldCpu.kernel;
Packit fcad23
            deltaCpu.intr = newCpu.intr - oldCpu.intr;
Packit fcad23
            deltaCpu.softintr = newCpu.softintr - oldCpu.softintr;
Packit fcad23
            deltaCpu.steal = newCpu.steal - oldCpu.steal;
Packit fcad23
            deltaCpu.guest = newCpu.guest - oldCpu.guest;
Packit fcad23
            deltaCpu.guestnice = newCpu.guestnice - oldCpu.guestnice;
Packit fcad23
            oldCpu = newCpu;
Packit fcad23
            sumCpu = deltaCpu.user + deltaCpu.nice
Packit fcad23
                + deltaCpu.system + deltaCpu.idle
Packit fcad23
                + deltaCpu.wait + deltaCpu.kernel + deltaCpu.steal
Packit fcad23
                + deltaCpu.intr + deltaCpu.softintr
Packit fcad23
                + deltaCpu.guest + deltaCpu.guestnice;
Packit fcad23
Packit fcad23
            printw("\nCPU%%: %4.1fUs %4.1fSy %4.1fId %3.1fWa %3.1fNi %3.1fKe %3.1fHi %3.1fSi %3.1fSt %3.1fGu %3.1fGN",
Packit fcad23
                (float)deltaCpu.user*100/sumCpu,
Packit fcad23
                (float)deltaCpu.system*100/sumCpu,
Packit fcad23
                (float)deltaCpu.idle*100/sumCpu,
Packit fcad23
                (float)deltaCpu.wait*100/sumCpu,
Packit fcad23
                (float)deltaCpu.nice*100/sumCpu,
Packit fcad23
                (float)deltaCpu.kernel*100/sumCpu,
Packit fcad23
                (float)deltaCpu.intr*100/sumCpu,
Packit fcad23
                (float)deltaCpu.softintr*100/sumCpu,
Packit fcad23
                (float)deltaCpu.steal*100/sumCpu,
Packit fcad23
                (float)deltaCpu.guest*100/sumCpu,
Packit fcad23
                (float)deltaCpu.guestnice*100/sumCpu);
Packit fcad23
            line++;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        if (has_mem) {
Packit fcad23
            printw("\nMem:  %10s Total %10s Used %10s Free %10s Buffer",
Packit fcad23
                format_humanmem(b1, sizeof b1, mem.totalReal),
Packit fcad23
                format_humanmem(b2, sizeof b2, mem.totalReal-mem.availReal),
Packit fcad23
                format_humanmem(b3, sizeof b3, mem.availReal),
Packit fcad23
                format_humanmem(b4, sizeof b4, mem.buffer));
Packit fcad23
            line++;
Packit fcad23
            printw("\nSwap: %10s Total %10s Used %10s Free %10s Cached",
Packit fcad23
                format_humanmem(b1, sizeof b1, mem.totalSwap),
Packit fcad23
                format_humanmem(b2, sizeof b2, mem.totalSwap-mem.availSwap),
Packit fcad23
                format_humanmem(b3, sizeof b3, mem.availSwap),
Packit fcad23
                format_humanmem(b4, sizeof b4, mem.cached));
Packit fcad23
            line++;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        printw("\n%7s %4s %6s %10s %11s %5s %-10s",
Packit fcad23
            "Index", "Type", "Status", "Memory", "Total CPU", "%CPU", "Command");
Packit fcad23
        line++;
Packit fcad23
        ninx = 0;
Packit fcad23
        while (line < LINES && ninx < ncount) {
Packit fcad23
            struct hrSWRunTable *proc = nproc+ninx;
Packit fcad23
            const char *hr_status, *hr_type;
Packit fcad23
Packit fcad23
            ninx++;
Packit fcad23
            if (proc->hrSWRunPerfCPUInc == 0 && !show_idle)
Packit fcad23
                continue;
Packit fcad23
            if (proc->hrSWRunType != 4 && !show_os)
Packit fcad23
                continue;
Packit fcad23
Packit fcad23
            line++;
Packit fcad23
Packit fcad23
            switch (proc->hrSWRunType) {
Packit fcad23
            case 1: hr_type = "Unkn"; break;
Packit fcad23
            case 2: hr_type = "Os"; break;
Packit fcad23
            case 3: hr_type = "Drvr"; break;
Packit fcad23
            case 4: hr_type = "Appl"; break;
Packit fcad23
            default: hr_type = "?"; break;
Packit fcad23
            }
Packit fcad23
Packit fcad23
            switch (proc->hrSWRunStatus) {
Packit fcad23
            case 1: hr_status = "Run"; break;
Packit fcad23
            case 2: hr_status = "Wait"; break;
Packit fcad23
            case 3: hr_status = "Event"; break;
Packit fcad23
            case 4: hr_status = "Inval"; break;
Packit fcad23
            default: hr_status = "?"; break;
Packit fcad23
            }
Packit fcad23
Packit fcad23
            printw("\n%7lu %4s %6s %10s %11s %5.1f %s %s",
Packit fcad23
                   proc->hrSWRunIndex,
Packit fcad23
                   hr_type,
Packit fcad23
                   hr_status,
Packit fcad23
                   format_humanmem(b1, sizeof b1, proc->hrSWRunPerfMem),
Packit fcad23
                   format_sec(b2,sizeof b2, proc->hrSWRunPerfCPU),
Packit fcad23
                   (float)proc->hrSWRunPerfCPUInc/5,
Packit fcad23
                   command_path && proc->hrSWRunPath[0] ? proc->hrSWRunPath : proc->hrSWRunName,
Packit fcad23
                   command_args ? proc->hrSWRunParameters : "");
Packit fcad23
        }
Packit fcad23
        refresh();
Packit fcad23
Packit fcad23
        qsort(nproc, ncount, sizeof(nproc[0]), pidcomp);
Packit fcad23
        free_perf(oproc, ocount);
Packit fcad23
        oproc = nproc;
Packit fcad23
        ocount = ncount;
Packit fcad23
    }
Packit fcad23
    endwin();
Packit fcad23
Packit fcad23
    snmp_close(ss);
Packit fcad23
    SOCK_CLEANUP;
Packit fcad23
    return 0;
Packit fcad23
}
Packit fcad23
#else
Packit fcad23
int snmptop(int argc, char **argv)
Packit fcad23
{
Packit fcad23
    fprintf(stderr, "%s: curses not detected during configure\n", progname);
Packit fcad23
    return 1;
Packit fcad23
}
Packit fcad23
#endif
Packit fcad23
Packit fcad23
Packit fcad23
int main(int argc, char **argv)
Packit fcad23
{
Packit fcad23
    progname = strrchr(argv[0], '/');
Packit fcad23
    if (progname) progname++;
Packit fcad23
    else progname = argv[0];
Packit fcad23
    if (strncmp(progname, "lt-", 3) == 0) progname += 3;
Packit fcad23
Packit fcad23
    if (strcmp(progname, "snmpps") == 0) return snmpps(argc, argv);
Packit fcad23
    if (strcmp(progname, "snmptop") == 0) return snmptop(argc, argv);
Packit fcad23
    fprintf(stderr, "%s: unknown prognam name\n", progname);
Packit fcad23
    exit(1);
Packit fcad23
}