Blame agent/mibgroup/host/hr_system.c

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
 * Portions of this file are copyrighted by:
Packit fcad23
 * Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
Packit fcad23
 * Use is subject to license terms specified in the COPYING file
Packit fcad23
 * distributed with the Net-SNMP package.
Packit fcad23
 */
Packit fcad23
Packit fcad23
/*
Packit fcad23
 *  Host Resources MIB - system group implementation - hr_system.c
Packit fcad23
 *
Packit fcad23
 */
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
#include <net-snmp/net-snmp-features.h>
Packit fcad23
#if HAVE_STRING_H
Packit fcad23
#include <string.h>
Packit fcad23
#else
Packit fcad23
#include <strings.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#include <net-snmp/net-snmp-includes.h>
Packit fcad23
#include <net-snmp/agent/net-snmp-agent-includes.h>
Packit fcad23
#include <net-snmp/data_access/swrun.h>
Packit fcad23
Packit fcad23
#include "host.h"
Packit fcad23
#include "host_res.h"
Packit fcad23
#include "hr_system.h"
Packit fcad23
#include <net-snmp/agent/auto_nlist.h>
Packit fcad23
Packit fcad23
#ifdef HAVE_SYS_PROC_H
Packit fcad23
#include <sys/param.h>
Packit fcad23
#include "sys/proc.h"
Packit fcad23
#endif
Packit fcad23
#ifndef mingw32
Packit fcad23
#if HAVE_UTMPX_H
Packit fcad23
#include <utmpx.h>
Packit fcad23
#else
Packit fcad23
#include <utmp.h>
Packit fcad23
#endif
Packit fcad23
#endif /* mingw32 */
Packit fcad23
#include <signal.h>
Packit fcad23
#include <errno.h>
Packit fcad23
Packit fcad23
#ifdef WIN32
Packit fcad23
#include <lm.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#ifdef linux
Packit fcad23
#ifdef HAVE_LINUX_TASKS_H
Packit fcad23
#include <linux/tasks.h>
Packit fcad23
#else
Packit fcad23
/*
Packit fcad23
 * If this file doesn't exist, then there is no hard limit on the number
Packit fcad23
 * of processes, so return 0 for hrSystemMaxProcesses.  
Packit fcad23
 */
Packit fcad23
#define NR_TASKS	0
Packit fcad23
#endif
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#if defined(hpux10) || defined(hpux11)
Packit fcad23
#include <sys/pstat.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#if defined(solaris2)
Packit fcad23
#include <kstat.h>
Packit fcad23
#include <sys/var.h>
Packit fcad23
#include <time.h>
Packit fcad23
#include <unistd.h>
Packit fcad23
#include <fcntl.h>
Packit fcad23
#include <sys/types.h>
Packit fcad23
#include <sys/openpromio.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#ifdef HAVE_SYS_SYSCTL_H
Packit fcad23
#include <sys/sysctl.h>
Packit fcad23
#endif
Packit fcad23
Packit fcad23
netsnmp_feature_require(date_n_time)
Packit fcad23
Packit fcad23
#if !defined(UTMP_FILE) && defined(_PATH_UTMP)
Packit fcad23
#define UTMP_FILE _PATH_UTMP
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#if defined(UTMP_FILE) && !HAVE_UTMPX_H
Packit fcad23
void            setutent(void);
Packit fcad23
void            endutent(void);
Packit fcad23
struct utmp    *getutent(void);
Packit fcad23
#endif                          /* UTMP_FILE */
Packit fcad23
Packit fcad23
Packit fcad23
        /*********************
Packit fcad23
	 *
Packit fcad23
	 *  Kernel & interface information,
Packit fcad23
	 *   and internal forward declarations
Packit fcad23
	 *
Packit fcad23
	 *********************/
Packit fcad23
Packit fcad23
#if defined(solaris2)
Packit fcad23
static struct openpromio * op_malloc(size_t size);
Packit fcad23
static void op_free(struct openpromio *op);
Packit fcad23
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
static int set_solaris_bootcommand_parameter(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len);
Packit fcad23
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
Packit fcad23
static int set_solaris_eeprom_parameter(const char *key, const char *value, size_t value_len);
Packit fcad23
static int get_solaris_eeprom_parameter(const char *parameter, char *output);
Packit fcad23
static long     get_max_solaris_processes(void);
Packit fcad23
#endif
Packit fcad23
Packit fcad23
static int      get_load_dev(void);
Packit fcad23
static int      count_users(void);
Packit fcad23
extern int      count_processes(void);
Packit fcad23
#if USING_HOST_DATA_ACCESS_SWRUN_MODULE
Packit fcad23
static int      count_kthreads = 1;
Packit fcad23
Packit fcad23
static void parse_count_kthreads(const char *token, const char *line)
Packit fcad23
{
Packit fcad23
    count_kthreads = atoi(line);
Packit fcad23
}
Packit fcad23
#endif
Packit fcad23
Packit fcad23
        /*********************
Packit fcad23
	 *
Packit fcad23
	 *  Initialisation & common implementation functions
Packit fcad23
	 *
Packit fcad23
	 *********************/
Packit fcad23
Packit fcad23
#define	HRSYS_UPTIME		1
Packit fcad23
#define	HRSYS_DATE		2
Packit fcad23
#define	HRSYS_LOAD_DEV		3
Packit fcad23
#define	HRSYS_LOAD_PARAM	4
Packit fcad23
#define	HRSYS_USERS		5
Packit fcad23
#define	HRSYS_PROCS		6
Packit fcad23
#define	HRSYS_MAXPROCS		7
Packit fcad23
Packit fcad23
#if defined(solaris2)
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
struct variable2 hrsystem_variables[] = {
Packit fcad23
    {HRSYS_UPTIME, ASN_TIMETICKS, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {1}},
Packit fcad23
    {HRSYS_DATE, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
Packit fcad23
     var_hrsys, 1, {2}},
Packit fcad23
    {HRSYS_LOAD_DEV, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {3}},
Packit fcad23
    {HRSYS_LOAD_PARAM, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE,
Packit fcad23
     var_hrsys, 1, {4}},
Packit fcad23
    {HRSYS_USERS, ASN_GAUGE, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {5}},
Packit fcad23
    {HRSYS_PROCS, ASN_GAUGE, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {6}},
Packit fcad23
    {HRSYS_MAXPROCS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {7}}
Packit fcad23
};
Packit fcad23
#else /* !NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
struct variable2 hrsystem_variables[] = {
Packit fcad23
    {HRSYS_UPTIME, ASN_TIMETICKS, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {1}},
Packit fcad23
    {HRSYS_DATE, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {2}},
Packit fcad23
    {HRSYS_LOAD_DEV, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {3}},
Packit fcad23
    {HRSYS_LOAD_PARAM, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {4}},
Packit fcad23
    {HRSYS_USERS, ASN_GAUGE, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {5}},
Packit fcad23
    {HRSYS_PROCS, ASN_GAUGE, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {6}},
Packit fcad23
    {HRSYS_MAXPROCS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {7}}
Packit fcad23
};
Packit fcad23
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
#else
Packit fcad23
struct variable2 hrsystem_variables[] = {
Packit fcad23
    {HRSYS_UPTIME, ASN_TIMETICKS, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {1}},
Packit fcad23
    {HRSYS_DATE, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {2}},
Packit fcad23
    {HRSYS_LOAD_DEV, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {3}},
Packit fcad23
    {HRSYS_LOAD_PARAM, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {4}},
Packit fcad23
    {HRSYS_USERS, ASN_GAUGE, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {5}},
Packit fcad23
    {HRSYS_PROCS, ASN_GAUGE, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {6}},
Packit fcad23
    {HRSYS_MAXPROCS, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
Packit fcad23
     var_hrsys, 1, {7}}
Packit fcad23
};
Packit fcad23
#endif
Packit fcad23
Packit fcad23
oid             hrsystem_variables_oid[] = { 1, 3, 6, 1, 2, 1, 25, 1 };
Packit fcad23
Packit fcad23
Packit fcad23
void
Packit fcad23
init_hr_system(void)
Packit fcad23
{
Packit fcad23
#ifdef NPROC_SYMBOL
Packit fcad23
    auto_nlist(NPROC_SYMBOL, 0, 0);
Packit fcad23
#endif
Packit fcad23
#if USING_HOST_DATA_ACCESS_SWRUN_MODULE
Packit fcad23
    snmpd_register_const_config_handler("count_kthreads",
Packit fcad23
                                        parse_count_kthreads, NULL,
Packit fcad23
					"0|1    0 to exclude kernel threads from hrSystemProcesses.0");
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    REGISTER_MIB("host/hr_system", hrsystem_variables, variable2,
Packit fcad23
                 hrsystem_variables_oid);
Packit fcad23
} /* end init_hr_system */
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * header_hrsys(...
Packit fcad23
 * Arguments:
Packit fcad23
 * vp     IN      - pointer to variable entry that points here
Packit fcad23
 * name    IN/OUT  - IN/name requested, OUT/name found
Packit fcad23
 * length  IN/OUT  - length of IN/OUT oid's 
Packit fcad23
 * exact   IN      - TRUE if an exact match was requested
Packit fcad23
 * var_len OUT     - length of variable or 0 if function returned
Packit fcad23
 * write_method
Packit fcad23
 */
Packit fcad23
Packit fcad23
int
Packit fcad23
header_hrsys(struct variable *vp,
Packit fcad23
             oid * name,
Packit fcad23
             size_t * length,
Packit fcad23
             int exact, size_t * var_len, WriteMethod ** write_method)
Packit fcad23
{
Packit fcad23
#define HRSYS_NAME_LENGTH	9
Packit fcad23
    oid             newname[MAX_OID_LEN];
Packit fcad23
    int             result;
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("host/hr_system", "var_hrsys: "));
Packit fcad23
    DEBUGMSGOID(("host/hr_system", name, *length));
Packit fcad23
    DEBUGMSG(("host/hr_system", " %d\n", exact));
Packit fcad23
Packit fcad23
    memcpy((char *) newname, (char *) vp->name, vp->namelen * sizeof(oid));
Packit fcad23
    newname[HRSYS_NAME_LENGTH] = 0;
Packit fcad23
    result = snmp_oid_compare(name, *length, newname, vp->namelen + 1);
Packit fcad23
    if ((exact && (result != 0)) || (!exact && (result >= 0)))
Packit fcad23
        return (MATCH_FAILED);
Packit fcad23
    memcpy((char *) name, (char *) newname,
Packit fcad23
           (vp->namelen + 1) * sizeof(oid));
Packit fcad23
    *length = vp->namelen + 1;
Packit fcad23
Packit fcad23
    *write_method = (WriteMethod*)0;
Packit fcad23
    *var_len = sizeof(long);    /* default to 'long' results */
Packit fcad23
    return (MATCH_SUCCEEDED);
Packit fcad23
} /* end header_hrsys */
Packit fcad23
Packit fcad23
Packit fcad23
        /*********************
Packit fcad23
	 *
Packit fcad23
	 *  System specific implementation functions
Packit fcad23
	 *
Packit fcad23
	 *********************/
Packit fcad23
Packit fcad23
u_char         *
Packit fcad23
var_hrsys(struct variable * vp,
Packit fcad23
          oid * name,
Packit fcad23
          size_t * length,
Packit fcad23
          int exact, size_t * var_len, WriteMethod ** write_method)
Packit fcad23
{
Packit fcad23
    static char     string[129]; /* per MIB, max size is 128 */
Packit fcad23
#if defined(solaris2)
Packit fcad23
    /* max size of nvram property */
Packit fcad23
    char bootparam[8192];
Packit fcad23
#endif
Packit fcad23
    time_t          now;
Packit fcad23
#ifdef linux
Packit fcad23
    FILE           *fp;
Packit fcad23
#endif
Packit fcad23
#if NETSNMP_CAN_USE_SYSCTL && defined(CTL_KERN) && defined(KERN_MAXPROC)
Packit fcad23
    static int      maxproc_mib[] = { CTL_KERN, KERN_MAXPROC };
Packit fcad23
    size_t          buf_size;
Packit fcad23
#endif
Packit fcad23
#if defined(hpux10) || defined(hpux11)
Packit fcad23
    struct pst_static pst_buf;
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    if (header_hrsys(vp, name, length, exact, var_len, write_method) ==
Packit fcad23
        MATCH_FAILED)
Packit fcad23
        return NULL;
Packit fcad23
Packit fcad23
    switch (vp->magic) {
Packit fcad23
    case HRSYS_UPTIME:
Packit fcad23
        long_return = get_uptime();
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    case HRSYS_DATE:
Packit fcad23
#if defined(HAVE_MKTIME) && defined(HAVE_STIME)
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT 
Packit fcad23
        *write_method=ns_set_time;
Packit fcad23
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
#endif
Packit fcad23
        time(&now;;
Packit fcad23
        return (u_char *) date_n_time(&now, var_len);
Packit fcad23
    case HRSYS_LOAD_DEV:
Packit fcad23
        long_return = get_load_dev();
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    case HRSYS_LOAD_PARAM:
Packit fcad23
#ifdef linux
Packit fcad23
        if((fp = fopen("/proc/cmdline", "r")) != NULL) {
Packit fcad23
            fgets(string, sizeof(string), fp);
Packit fcad23
            fclose(fp);
Packit fcad23
        } else {
Packit fcad23
            return NULL;
Packit fcad23
        }
Packit fcad23
#elif defined(solaris2)
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
        *write_method=set_solaris_bootcommand_parameter;
Packit fcad23
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
        if ( get_solaris_eeprom_parameter("boot-command",bootparam) ) {
Packit fcad23
            snmp_log(LOG_ERR,"unable to lookup boot-command from eeprom\n");
Packit fcad23
            return NULL;
Packit fcad23
        }
Packit fcad23
        strlcpy(string,bootparam,sizeof(string));
Packit fcad23
#else
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#endif
Packit fcad23
        sprintf(string, "ask Dave");    /* XXX */
Packit fcad23
#endif
Packit fcad23
        *var_len = strlen(string);
Packit fcad23
        return (u_char *) string;
Packit fcad23
    case HRSYS_USERS:
Packit fcad23
        long_return = count_users();
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    case HRSYS_PROCS:
Packit fcad23
#if USING_HOST_DATA_ACCESS_SWRUN_MODULE
Packit fcad23
        long_return = swrun_count_processes(count_kthreads);
Packit fcad23
#elif USING_HOST_HR_SWRUN_MODULE
Packit fcad23
        long_return = count_processes();
Packit fcad23
#else
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#endif
Packit fcad23
        long_return = 0;
Packit fcad23
#endif
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    case HRSYS_MAXPROCS:
Packit fcad23
#if defined(NR_TASKS)
Packit fcad23
        long_return = NR_TASKS; /* <linux/tasks.h> */
Packit fcad23
#elif NETSNMP_CAN_USE_SYSCTL && defined(CTL_KERN) && defined(KERN_MAXPROC)
Packit fcad23
	{
Packit fcad23
	    int nproc = 0;
Packit fcad23
Packit fcad23
	    buf_size = sizeof(nproc);
Packit fcad23
	    if (sysctl(maxproc_mib, 2, &nproc, &buf_size, NULL, 0) < 0)
Packit fcad23
		return NULL;
Packit fcad23
	    long_return = nproc;
Packit fcad23
	}
Packit fcad23
#elif defined(hpux10) || defined(hpux11)
Packit fcad23
        pstat_getstatic(&pst_buf, sizeof(struct pst_static), 1, 0);
Packit fcad23
        long_return = pst_buf.max_proc;
Packit fcad23
#elif defined(solaris2)
Packit fcad23
        long_return = get_max_solaris_processes();
Packit fcad23
        if (long_return == -1)
Packit fcad23
            return NULL;
Packit fcad23
#elif defined(NPROC_SYMBOL)
Packit fcad23
	{
Packit fcad23
	    int nproc = 0;
Packit fcad23
Packit fcad23
	    auto_nlist(NPROC_SYMBOL, (char *) &nproc, sizeof(nproc));
Packit fcad23
	    long_return = nproc;
Packit fcad23
	}
Packit fcad23
#else
Packit fcad23
#if NETSNMP_NO_DUMMY_VALUES
Packit fcad23
        return NULL;
Packit fcad23
#endif
Packit fcad23
        long_return = 0;
Packit fcad23
#endif
Packit fcad23
        return (u_char *) & long_return;
Packit fcad23
    default:
Packit fcad23
        DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_hrsys\n",
Packit fcad23
                    vp->magic));
Packit fcad23
    }
Packit fcad23
    return NULL;
Packit fcad23
} /* end var_hrsys */
Packit fcad23
Packit fcad23
Packit fcad23
        /*********************
Packit fcad23
	 *
Packit fcad23
	 *  Internal implementation functions
Packit fcad23
	 *
Packit fcad23
	 *********************/
Packit fcad23
Packit fcad23
Packit fcad23
#if defined(solaris2)
Packit fcad23
Packit fcad23
/* functions for malloc and freeing openpromio structure */
Packit fcad23
static struct openpromio * op_malloc(size_t size)
Packit fcad23
{
Packit fcad23
    struct openpromio *op;
Packit fcad23
    op=malloc(sizeof(struct openpromio) + size);
Packit fcad23
    if(op == NULL) {
Packit fcad23
        snmp_log(LOG_ERR,"unable to malloc memory\n");
Packit fcad23
        return NULL;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    memset(op, 0, sizeof(struct openpromio)+size);
Packit fcad23
    op->oprom_size=size;
Packit fcad23
Packit fcad23
    return op;
Packit fcad23
}
Packit fcad23
Packit fcad23
static void op_free(struct openpromio *op) {
Packit fcad23
    free(op);
Packit fcad23
}
Packit fcad23
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
static int
Packit fcad23
set_solaris_bootcommand_parameter(int action,
Packit fcad23
            u_char * var_val,
Packit fcad23
            u_char var_val_type,
Packit fcad23
            size_t var_val_len,
Packit fcad23
            u_char * statP, oid * name, size_t name_len) {
Packit fcad23
Packit fcad23
    static char old_value[1024],*p_old_value=old_value;
Packit fcad23
    int status=0;
Packit fcad23
Packit fcad23
    switch (action) {
Packit fcad23
        case RESERVE1:
Packit fcad23
            /* check type */
Packit fcad23
            if (var_val_type != ASN_OCTET_STR) {
Packit fcad23
                snmp_log(LOG_ERR,"write to set_solaris_bootcommand_parameter not ASN_OCTET_STR\n");
Packit fcad23
                return SNMP_ERR_WRONGTYPE;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
Packit fcad23
        case RESERVE2: {
Packit fcad23
            /* create copy of old value */
Packit fcad23
            if(statP) {
Packit fcad23
                int old_val_len=strlen(statP);
Packit fcad23
                if(old_val_len >= sizeof(old_value)) {
Packit fcad23
                    p_old_value=(char *)malloc(old_val_len+1);
Packit fcad23
                    if(p_old_value==NULL) {
Packit fcad23
                        snmp_log(LOG_ERR,"unable to malloc memory\n");
Packit fcad23
                        return SNMP_ERR_GENERR;
Packit fcad23
                    } 
Packit fcad23
                }
Packit fcad23
                strlcpy(p_old_value,statP,old_val_len+1);
Packit fcad23
            } else { 
Packit fcad23
                p_old_value=NULL;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        case ACTION: {
Packit fcad23
            status=set_solaris_eeprom_parameter("boot-command",(char *)var_val,var_val_len);
Packit fcad23
            if(status!=0) return SNMP_ERR_GENERR;
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        case UNDO: {
Packit fcad23
            /* revert to old value */
Packit fcad23
            if(p_old_value) { 
Packit fcad23
                status=set_solaris_eeprom_parameter("boot-command",(char *)p_old_value,strlen(p_old_value));
Packit fcad23
                p_old_value=old_value; 
Packit fcad23
                if(status!=0) return SNMP_ERR_GENERR;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        case FREE:
Packit fcad23
        case COMMIT:
Packit fcad23
            /* free memory if necessary */
Packit fcad23
            if(p_old_value !=  old_value) {
Packit fcad23
                free(p_old_value);
Packit fcad23
                p_old_value=old_value;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
    }
Packit fcad23
    return SNMP_ERR_NOERROR;
Packit fcad23
}
Packit fcad23
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
Packit fcad23
static int set_solaris_eeprom_parameter(const char *key, const char *value,
Packit fcad23
                                        size_t var_val_len) {
Packit fcad23
Packit fcad23
    int status=0;
Packit fcad23
    char buffer[1024],*pbuffer=buffer;
Packit fcad23
    
Packit fcad23
    if( strlen(key)+strlen(value)+16 > sizeof(buffer) ) {
Packit fcad23
        pbuffer=(char *)malloc(strlen(key)+strlen(value)+16);
Packit fcad23
    } 
Packit fcad23
Packit fcad23
    
Packit fcad23
    sprintf(pbuffer, "eeprom %s=\"%.*s\"\n", key, var_val_len, value);
Packit fcad23
Packit fcad23
    status=system(pbuffer);
Packit fcad23
Packit fcad23
    if(pbuffer!=buffer) free(pbuffer);
Packit fcad23
    return status;
Packit fcad23
}
Packit fcad23
Packit fcad23
static int get_solaris_eeprom_parameter(const char *parameter, char *outbuffer) {
Packit fcad23
Packit fcad23
    int fd=0,status=0;
Packit fcad23
    struct openpromio *openprominfo=NULL;
Packit fcad23
Packit fcad23
    fd=open("/dev/openprom",O_RDONLY);
Packit fcad23
    if ( fd == -1 ) {
Packit fcad23
        snmp_log_perror("/dev/openprom");
Packit fcad23
        return 1;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    openprominfo = op_malloc(8192);
Packit fcad23
    if(!openprominfo) return 1;
Packit fcad23
Packit fcad23
    strcpy(openprominfo->oprom_array,parameter);
Packit fcad23
Packit fcad23
    status=ioctl(fd,OPROMGETOPT,openprominfo);
Packit fcad23
    if ( status == -1 ) {
Packit fcad23
        snmp_log_perror("/dev/openprom");
Packit fcad23
        close(fd);
Packit fcad23
        op_free(openprominfo);
Packit fcad23
        return 1;
Packit fcad23
    }
Packit fcad23
    strcpy(outbuffer,openprominfo->oprom_array);
Packit fcad23
Packit fcad23
    op_free(openprominfo);
Packit fcad23
Packit fcad23
    /* close file */
Packit fcad23
    close(fd);
Packit fcad23
Packit fcad23
    return(0);
Packit fcad23
}
Packit fcad23
Packit fcad23
static long get_max_solaris_processes(void) {
Packit fcad23
Packit fcad23
    kstat_ctl_t *ksc=NULL;
Packit fcad23
    kstat_t *ks=NULL;
Packit fcad23
    struct var v;
Packit fcad23
    static long maxprocs=-1;
Packit fcad23
Packit fcad23
    /* assume only necessary to compute once, since /etc/system must be modified */
Packit fcad23
    if (maxprocs == -1) {
Packit fcad23
        if ( (ksc=kstat_open()) != NULL && 
Packit fcad23
             (ks=kstat_lookup(ksc, "unix", 0, "var")) != NULL && 
Packit fcad23
             (kstat_read(ksc, ks, &v) != -1)) {
Packit fcad23
Packit fcad23
            maxprocs=v.v_proc;
Packit fcad23
        }
Packit fcad23
        if(ksc) {
Packit fcad23
            kstat_close(ksc);
Packit fcad23
        }
Packit fcad23
    }
Packit fcad23
Packit fcad23
    return maxprocs;
Packit fcad23
}
Packit fcad23
Packit fcad23
#endif
Packit fcad23
Packit fcad23
#if defined(HAVE_MKTIME) && defined(HAVE_STIME)
Packit fcad23
#ifndef NETSNMP_NO_WRITE_SUPPORT
Packit fcad23
int
Packit fcad23
ns_set_time(int action,
Packit fcad23
            u_char * var_val,
Packit fcad23
            u_char var_val_type,
Packit fcad23
            size_t var_val_len,
Packit fcad23
            u_char * statP, oid * name, size_t name_len)
Packit fcad23
{
Packit fcad23
Packit fcad23
    static time_t oldtime=0;
Packit fcad23
Packit fcad23
    switch (action) {
Packit fcad23
        case RESERVE1:
Packit fcad23
            /* check type */
Packit fcad23
            if (var_val_type != ASN_OCTET_STR) {
Packit fcad23
                snmp_log(LOG_ERR,"write to ns_set_time not ASN_OCTET_STR\n");
Packit fcad23
                return SNMP_ERR_WRONGTYPE;
Packit fcad23
            }
Packit fcad23
            if (var_val_len != 8 && var_val_len!=11) {
Packit fcad23
                snmp_log(LOG_ERR,"write to ns_set_time not a proper length\n");
Packit fcad23
                return SNMP_ERR_WRONGVALUE;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
Packit fcad23
        case RESERVE2:
Packit fcad23
            break;
Packit fcad23
Packit fcad23
        case FREE:
Packit fcad23
            break;
Packit fcad23
Packit fcad23
        case ACTION: {
Packit fcad23
            long status=0;
Packit fcad23
            time_t seconds=0;
Packit fcad23
            struct tm newtimetm;
Packit fcad23
            int hours_from_utc= 0;
Packit fcad23
            int minutes_from_utc= 0;
Packit fcad23
Packit fcad23
            if (var_val_len == 11) {
Packit fcad23
                /* timezone inforamation was present */
Packit fcad23
                hours_from_utc=(int)var_val[9];
Packit fcad23
                minutes_from_utc=(int)var_val[10];
Packit fcad23
            }
Packit fcad23
Packit fcad23
            newtimetm.tm_sec=(int)var_val[6];
Packit fcad23
            newtimetm.tm_min=(int)var_val[5];
Packit fcad23
            newtimetm.tm_hour=(int)var_val[4];
Packit fcad23
Packit fcad23
            newtimetm.tm_mon=(int)var_val[2]-1;
Packit fcad23
            newtimetm.tm_year=256*(int)var_val[0]+(int)var_val[1]-1900;
Packit fcad23
            newtimetm.tm_mday=(int)var_val[3];
Packit fcad23
Packit fcad23
            /* determine if day light savings time in effect DST */
Packit fcad23
            if ( ( hours_from_utc*60*60+minutes_from_utc*60 ) == abs(timezone) ) {
Packit fcad23
                newtimetm.tm_isdst=0;
Packit fcad23
            } else {
Packit fcad23
                newtimetm.tm_isdst=1;
Packit fcad23
            } 
Packit fcad23
Packit fcad23
            /* create copy of old value */
Packit fcad23
            oldtime=time(NULL);
Packit fcad23
Packit fcad23
            seconds=mktime(&newtimetm);
Packit fcad23
            if(seconds == (time_t)-1) {
Packit fcad23
                snmp_log(LOG_ERR, "Unable to convert time value\n");
Packit fcad23
                return SNMP_ERR_GENERR;
Packit fcad23
            }
Packit fcad23
#ifdef HAVE_STIME
Packit fcad23
            status=stime(&seconds);
Packit fcad23
#else
Packit fcad23
            status=-1;
Packit fcad23
#endif
Packit fcad23
            if(status!=0) {
Packit fcad23
                snmp_log(LOG_ERR, "Unable to set time\n");
Packit fcad23
                return SNMP_ERR_GENERR;
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
        case UNDO: {
Packit fcad23
            /* revert to old value */
Packit fcad23
            int status=0;
Packit fcad23
            if(oldtime != 0) {
Packit fcad23
#ifdef HAVE_STIME
Packit fcad23
                status=stime(&oldtime);
Packit fcad23
#else
Packit fcad23
                status=-1;
Packit fcad23
#endif
Packit fcad23
                oldtime=0;    
Packit fcad23
                if(status!=0) {
Packit fcad23
                    snmp_log(LOG_ERR, "Unable to set time\n");
Packit fcad23
                    return SNMP_ERR_GENERR;
Packit fcad23
                }
Packit fcad23
            }
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
Packit fcad23
        case COMMIT: {
Packit fcad23
            oldtime=0;    
Packit fcad23
            break;
Packit fcad23
        }
Packit fcad23
    }
Packit fcad23
    return SNMP_ERR_NOERROR;
Packit fcad23
}
Packit fcad23
#endif /* !NETSNMP_NO_WRITE_SUPPORT */
Packit fcad23
#endif
Packit fcad23
Packit fcad23
                /*
Packit fcad23
                 *  Return the DeviceIndex corresponding
Packit fcad23
                 *   to the boot device
Packit fcad23
                 */
Packit fcad23
static int
Packit fcad23
get_load_dev(void)
Packit fcad23
{
Packit fcad23
    return (HRDEV_DISK << HRDEV_TYPE_SHIFT);    /* XXX */
Packit fcad23
} /* end get_load_dev */
Packit fcad23
Packit fcad23
static int
Packit fcad23
count_users(void)
Packit fcad23
{
Packit fcad23
    int             total = 0;
Packit fcad23
#ifndef WIN32
Packit fcad23
#if HAVE_UTMPX_H
Packit fcad23
#define setutent setutxent
Packit fcad23
#define pututline pututxline
Packit fcad23
#define getutent getutxent
Packit fcad23
#define endutent endutxent
Packit fcad23
    struct utmpx   *utmp_p;
Packit fcad23
#else
Packit fcad23
    struct utmp    *utmp_p;
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    setutent();
Packit fcad23
    while ((utmp_p = getutent()) != NULL) {
Packit fcad23
#ifndef UTMP_HAS_NO_TYPE
Packit fcad23
        if (utmp_p->ut_type != USER_PROCESS)
Packit fcad23
            continue;
Packit fcad23
#endif
Packit fcad23
#ifndef UTMP_HAS_NO_PID
Packit fcad23
            /* This block of code skips zombie user PIDs in the
Packit fcad23
               utmp/utmpx file that would otherwise be counted as a
Packit fcad23
               current user, but leaves updating the actual
Packit fcad23
               utmp/utmpx file to the system. */
Packit fcad23
            if (kill(utmp_p->ut_pid, 0) == -1 && errno == ESRCH) {
Packit fcad23
                continue;
Packit fcad23
            }
Packit fcad23
#endif
Packit fcad23
            ++total;
Packit fcad23
    }
Packit fcad23
    endutent();
Packit fcad23
#else /* WIN32 */
Packit fcad23
   /* 
Packit fcad23
    * TODO - Error checking.
Packit fcad23
    */
Packit fcad23
	LPWKSTA_INFO_102 wkinfo;
Packit fcad23
	NET_API_STATUS nstatus;
Packit fcad23
	
Packit fcad23
	nstatus = NetWkstaGetInfo(NULL, 102, (LPBYTE*)&wkinfo);
Packit fcad23
	if (nstatus != NERR_Success) {
Packit fcad23
		return 0;
Packit fcad23
	}
Packit fcad23
	total = (int)wkinfo->wki102_logged_on_users;
Packit fcad23
Packit fcad23
	NetApiBufferFree(wkinfo);	
Packit fcad23
#endif /* WIN32 */
Packit fcad23
    return total;
Packit fcad23
}
Packit fcad23
Packit fcad23
#if defined(UTMP_FILE) && !HAVE_UTMPX_H
Packit fcad23
Packit fcad23
static FILE    *utmp_file;
Packit fcad23
static struct utmp utmp_rec;
Packit fcad23
Packit fcad23
void
Packit fcad23
setutent(void)
Packit fcad23
{
Packit fcad23
    if (utmp_file)
Packit fcad23
        fclose(utmp_file);
Packit fcad23
    utmp_file = fopen(UTMP_FILE, "r");
Packit fcad23
}
Packit fcad23
Packit fcad23
void
Packit fcad23
endutent(void)
Packit fcad23
{
Packit fcad23
    if (utmp_file) {
Packit fcad23
        fclose(utmp_file);
Packit fcad23
        utmp_file = NULL;
Packit fcad23
    }
Packit fcad23
}
Packit fcad23
Packit fcad23
struct utmp    *
Packit fcad23
getutent(void)
Packit fcad23
{
Packit fcad23
    if (!utmp_file)
Packit fcad23
        return NULL;
Packit fcad23
    while (fread(&utmp_rec, sizeof(utmp_rec), 1, utmp_file) == 1)
Packit fcad23
        if (*utmp_rec.ut_name && *utmp_rec.ut_line)
Packit fcad23
            return &utmp_rec;
Packit fcad23
    return NULL;
Packit fcad23
}
Packit fcad23
Packit fcad23
#endif                          /* UTMP_FILE */