|
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 */
|