blob: 9e345d8a5c1c62f1b08645ffc0b6986a9c9570bc [file] [log] [blame]
/* 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;
}