blob: 3fad2ddfbca83867e26065a320c4495d7d7872ea [file] [log] [blame]
/*
* Host Resources MIB - printer device group implementation - hr_print.c
*
*/
#include <config.h>
#include "host_res.h"
#include "hr_print.h"
#define HRPRINT_MONOTONICALLY_INCREASING
/*********************
*
* Kernel & interface information,
* and internal forward declarations
*
*********************/
void Init_HR_Print (void);
int Get_Next_HR_Print (void);
/* void Save_HR_Print (void); */
/* char* describe_printer (void); */
int header_hrprint (struct variable *,oid *, int *, int, int *, WriteMethod **);
/*********************
*
* Initialisation & common implementation functions
*
*********************/
void init_hr_print(void)
{
init_device[ HRDEV_PRINTER ] = Init_HR_Print;
next_device[ HRDEV_PRINTER ] = Get_Next_HR_Print;
/* save_device[ HRDEV_PRINTER ] = Save_HR_Print; */
#ifdef HRPRINT_MONOTONICALLY_INCREASING
dev_idx_inc[ HRDEV_DISK ] = 1;
#endif
/* device_descr[ HRDEV_PRINTER ] = &describe_printer; */
}
#define MATCH_FAILED -1
#define MATCH_SUCCEEDED 0
/*
header_hrprint(...
Arguments:
vp IN - pointer to variable entry that points here
name IN/OUT - IN/name requested, OUT/name found
length IN/OUT - length of IN/OUT oid's
exact IN - TRUE if an exact match was requested
var_len OUT - length of variable or 0 if function returned
write_method
*/
int
header_hrprint(struct variable *vp,
oid *name,
int *length,
int exact,
int *var_len,
WriteMethod **write_method)
{
#define HRPRINT_ENTRY_NAME_LENGTH 11
oid newname[MAX_NAME_LEN];
int print_idx, LowIndex = -1;
int result;
char c_oid[MAX_NAME_LEN];
if (snmp_get_do_debugging()) {
sprint_objid (c_oid, name, *length);
DEBUGMSGTL(("host/hr_print", "var_hrprint: %s %d\n", c_oid, exact));
}
memcpy( (char *)newname,(char *)vp->name, (int)vp->namelen * sizeof(oid));
/* Find "next" print entry */
Init_HR_Print();
for ( ;; ) {
print_idx = Get_Next_HR_Print();
if ( print_idx == -1 )
break;
newname[HRPRINT_ENTRY_NAME_LENGTH] = print_idx;
result = snmp_oid_compare(name, *length, newname, (int)vp->namelen + 1);
if (exact && (result == 0)) {
LowIndex = print_idx;
/* Save printer status information */
break;
}
if ((!exact && (result < 0)) &&
( LowIndex == -1 || print_idx < LowIndex )) {
LowIndex = print_idx;
/* Save printer status information */
#ifdef HRPRINT_MONOTONICALLY_INCREASING
break;
#endif
}
}
if ( LowIndex == -1 ) {
DEBUGMSGTL(("host/hr_print", "... index out of range\n"));
return(MATCH_FAILED);
}
memcpy( (char *)name,(char *)newname, ((int)vp->namelen + 1) * sizeof(oid));
*length = vp->namelen + 1;
*write_method = 0;
*var_len = sizeof(long); /* default to 'long' results */
if (snmp_get_do_debugging()) {
sprint_objid (c_oid, name, *length);
DEBUGMSGTL(("host/hr_print", "... get print stats %s\n", c_oid));
}
return LowIndex;
}
/*********************
*
* System specific implementation functions
*
*********************/
u_char *
var_hrprint(struct variable *vp,
oid *name,
int *length,
int exact,
int *var_len,
WriteMethod **write_method)
{
int print_idx;
print_idx = header_hrprint(vp, name, length, exact, var_len, write_method);
if ( print_idx == MATCH_FAILED )
return NULL;
switch (vp->magic){
case HRPRINT_STATUS:
long_return = 3; /* idle */
return (u_char *)&long_return;
case HRPRINT_ERROR:
long_return = 0; /* Null string */
return (u_char *)&long_return;
default:
ERROR_MSG("");
}
return NULL;
}
/*********************
*
* Internal implementation functions
*
*********************/
static int HRP_index;
void
Init_HR_Print (void)
{
HRP_index = 1;
}
int
Get_Next_HR_Print (void)
{
/*
* The initial implementation system
* has no printers attached, and I've
* no real idea how to detect them,
* so don't bother.
*/
if ( HRP_index < 1 ) /* No printer */
return ( HRDEV_PRINTER << HRDEV_TYPE_SHIFT ) + HRP_index++;
else
return -1;
}