185 lines
4.2 KiB
C
185 lines
4.2 KiB
C
/* Portions of this file are subject to the following copyrights. See
|
|
* the Net-SNMP's COPYING file for more details and other copyrights
|
|
* that may apply:
|
|
*/
|
|
/*
|
|
* Copyright © 2003 Sun Microsystems, Inc. All rights reserved.
|
|
* Use is subject to license terms specified in the COPYING file
|
|
* distributed with the Net-SNMP package.
|
|
*/
|
|
#include <net-snmp/net-snmp-config.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#if TIME_WITH_SYS_TIME
|
|
# include <sys/time.h>
|
|
# include <time.h>
|
|
#else
|
|
# if HAVE_SYS_TIME_H
|
|
# include <sys/time.h>
|
|
# else
|
|
# include <time.h>
|
|
# endif
|
|
#endif
|
|
#if HAVE_STRING_H
|
|
#include <string.h>
|
|
#endif
|
|
|
|
#if HAVE_STRING_H
|
|
#include <string.h>
|
|
#endif
|
|
|
|
#include <net-snmp/net-snmp-includes.h>
|
|
#include <net-snmp/agent/net-snmp-agent-includes.h>
|
|
|
|
#include "struct.h"
|
|
#include "file.h"
|
|
#include "util_funcs/header_simple_table.h"
|
|
|
|
#define MAXFILE 20
|
|
|
|
struct filestat fileTable[MAXFILE];
|
|
int fileCount;
|
|
|
|
void
|
|
init_file(void)
|
|
{
|
|
struct variable2 file_table[] = {
|
|
{FILE_INDEX, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
|
|
var_file_table, 1, {1}},
|
|
{FILE_NAME, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
|
|
var_file_table, 1, {2}},
|
|
{FILE_SIZE, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
|
|
var_file_table, 1, {3}},
|
|
{FILE_MAX, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
|
|
var_file_table, 1, {4}},
|
|
{FILE_ERROR, ASN_INTEGER, NETSNMP_OLDAPI_RONLY,
|
|
var_file_table, 1, {100}},
|
|
{FILE_MSG, ASN_OCTET_STR, NETSNMP_OLDAPI_RONLY,
|
|
var_file_table, 1, {101}}
|
|
};
|
|
|
|
/*
|
|
* Define the OID pointer to the top of the mib tree that we're
|
|
* registering underneath
|
|
*/
|
|
oid file_variables_oid[] = { NETSNMP_UCDAVIS_MIB, 15, 1 };
|
|
|
|
/*
|
|
* register ourselves with the agent to handle our mib tree
|
|
*/
|
|
REGISTER_MIB("ucd-snmp/file", file_table, variable2,
|
|
file_variables_oid);
|
|
|
|
snmpd_register_config_handler("file", file_parse_config,
|
|
file_free_config, "file [maxsize]");
|
|
|
|
}
|
|
|
|
void
|
|
file_free_config(void)
|
|
{
|
|
fileCount = 0;
|
|
}
|
|
|
|
void
|
|
file_parse_config(const char *token, char *cptr)
|
|
{
|
|
char *cp;
|
|
|
|
if (fileCount < MAXFILE) {
|
|
fileTable[fileCount].max = -1;
|
|
|
|
cp = copy_nword(cptr, fileTable[fileCount].name, FILE_NAME_MAX);
|
|
|
|
if (strlen(fileTable[fileCount].name) >= FILE_NAME_MAX - 1) {
|
|
config_perror("file name too long");
|
|
return;
|
|
}
|
|
|
|
if (cp)
|
|
fileTable[fileCount].max = strtoul(cp, NULL, 10);
|
|
else
|
|
fileTable[fileCount].max = -1;
|
|
|
|
fileCount++;
|
|
}
|
|
}
|
|
|
|
void
|
|
updateFile(int iindex)
|
|
{
|
|
struct stat sb;
|
|
|
|
if (stat(fileTable[iindex].name, &sb) == 0)
|
|
fileTable[iindex].size = sb.st_size >> 10;
|
|
}
|
|
|
|
/*
|
|
* OID functions
|
|
*/
|
|
|
|
u_char *
|
|
var_file_table(struct variable *vp,
|
|
oid * name,
|
|
size_t * length,
|
|
int exact, size_t * var_len, WriteMethod ** write_method)
|
|
{
|
|
static long long_ret;
|
|
static char error[256];
|
|
int iindex;
|
|
struct filestat *file;
|
|
|
|
if (header_simple_table
|
|
(vp, name, length, exact, var_len, write_method, fileCount))
|
|
return (NULL);
|
|
|
|
iindex = name[*length - 1] - 1;
|
|
|
|
updateFile(iindex);
|
|
|
|
file = &fileTable[iindex];
|
|
|
|
switch (vp->magic) {
|
|
case FILE_INDEX:
|
|
long_ret = iindex + 1;
|
|
return (u_char *) & long_ret;
|
|
|
|
case FILE_NAME:
|
|
*var_len = strlen(file->name);
|
|
return (u_char *) file->name;
|
|
|
|
case FILE_SIZE:
|
|
long_ret = file->size;
|
|
return (u_char *) & long_ret;
|
|
|
|
case FILE_MAX:
|
|
long_ret = file->max;
|
|
return (u_char *) & long_ret;
|
|
|
|
case FILE_ERROR:
|
|
if (file->max >= 0 && file->size > file->max)
|
|
long_ret = 1;
|
|
else
|
|
long_ret = 0;
|
|
|
|
return (u_char *) & long_ret;
|
|
|
|
case FILE_MSG:
|
|
if (file->max >= 0 && file->size > file->max)
|
|
snprintf(error, sizeof(error), FILE_ERROR_MSG, file->name,
|
|
file->max, file->size);
|
|
else
|
|
strcpy(error, "");
|
|
|
|
*var_len = strlen(error);
|
|
return (u_char *) error;
|
|
|
|
default:
|
|
DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_file_table\n",
|
|
vp->magic));
|
|
}
|
|
|
|
return NULL;
|
|
}
|