diff options
Diffstat (limited to 'agent/mibgroup/ucd-snmp/file.c')
-rw-r--r-- | agent/mibgroup/ucd-snmp/file.c | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/agent/mibgroup/ucd-snmp/file.c b/agent/mibgroup/ucd-snmp/file.c new file mode 100644 index 0000000..9e345d8 --- /dev/null +++ b/agent/mibgroup/ucd-snmp/file.c @@ -0,0 +1,184 @@ +/* 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; +} |