/* 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 #include #include #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_STRING_H #include #endif #if HAVE_STRING_H #include #endif #include #include #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; }