summaryrefslogtreecommitdiff
path: root/agent/mibgroup/ucd-snmp/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/ucd-snmp/file.c')
-rw-r--r--agent/mibgroup/ucd-snmp/file.c184
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;
+}