summaryrefslogtreecommitdiff
path: root/usr/src/cmd/cmd-inet/usr.lib/mipagent/snmp_appl.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/cmd-inet/usr.lib/mipagent/snmp_appl.c')
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/mipagent/snmp_appl.c409
1 files changed, 409 insertions, 0 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.lib/mipagent/snmp_appl.c b/usr/src/cmd/cmd-inet/usr.lib/mipagent/snmp_appl.c
new file mode 100644
index 0000000000..a28dd89456
--- /dev/null
+++ b/usr/src/cmd/cmd-inet/usr.lib/mipagent/snmp_appl.c
@@ -0,0 +1,409 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * file: mipagentsnmp_appl.c
+ *
+ * This file contains the main SNMP routines used for
+ * initialization and shutdown.
+ */
+
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include <impl.h>
+#include <pagent.h>
+
+#include "snmp_stub.h"
+#include "mip.h"
+
+/* GLOBAL VARIABLES */
+
+#ifndef lint
+char default_config_file[] = "/etc/snmp/conf/mipagent.reg";
+char default_sec_config_file[] = "/etc/snmp/conf/mipagent.acl";
+char default_error_file[] = "/var/snmp/mipagent.log";
+#endif
+
+static pthread_t snmpThreadId = 0;
+
+typedef struct {
+ int argc;
+ char *argv;
+} StartupArgs;
+
+static void mipagent_snmp_thread(StartupArgs *args);
+
+#define DEFAULT_SNMP_PORT 161
+
+extern ipaddr_t subagent_addr; /* this was set in setup.c */
+
+extern int SSASubagentOpen(int, char *);
+extern int SSARegSubagent(Agent *);
+extern int SSAMain(int, char **);
+
+/*
+ * Function: register_with_master
+ *
+ * Arguments: subagent_addr - Sub-Agent Address
+ *
+ * Description: This function will register the SNMP
+ * sub-agent with the master SNMP agent.
+ *
+ * Returns: int, 0 if successful
+ */
+static int
+/* LINTED E_FUNC_ARG_UNUSED */
+register_with_master(ipaddr_t subagent_addr)
+{
+ /* LINTED E_FUNC_VAR_UNUSED */
+ Agent subagent;
+
+ return (0);
+
+#if 0
+ /* NOTREACHED */
+
+ agentid = SSASubagentOpen(0, "mipagent");
+ (void) memset(&subagent, 0, sizeof (Agent));
+ subagent.agent_id = agentid;
+
+ /*
+ * Tell master we are ready
+ */
+ subagent.agent_status = SSA_OPER_STATUS_ACTIVE;
+ subagent.address.sin_family = AF_INET;
+ subagent.address.sin_port = DEFAULT_SNMP_PORT;
+ subagent.address.sin_addr.s_addr = subagent_addr;
+ if ((SSARegSubagent(&subagent)) == 0) {
+ return (-1);
+ }
+ return (0);
+#endif
+}
+
+/*
+ * Function: deregister_with_master
+ *
+ * Arguments: subagent_addr - Sub-Agent Address
+ *
+ * Description: This function will inform the
+ * SNMP Master agent that we are
+ * going away.
+ *
+ * Returns: int, 0 if successful
+ */
+static int
+/* LINTED E_FUNC_ARG_UNUSED */
+deregister_with_master(ipaddr_t subagent_addr)
+{
+ /* LINTED E_FUNC_VAR_UNUSED */
+ Agent subagent;
+
+ return (0);
+#if 0
+ /* NOTREACHED */
+
+ if (agentid) {
+ (void) memset(&subagent, 0, sizeof (Agent));
+ subagent.agent_id = agentid;
+
+ /*
+ * Tell master we are going away
+ */
+ subagent.agent_status = SSA_OPER_STATUS_DESTROY;
+ subagent.address.sin_family = AF_INET;
+ subagent.address.sin_port = DEFAULT_SNMP_PORT;
+ subagent.address.sin_addr.s_addr = subagent_addr;
+ if ((SSARegSubagent(&subagent)) == 0) {
+ return (-1);
+ }
+
+ agentid = 0;
+ }
+ return (0);
+#endif
+}
+
+#ifndef lint
+/*
+ * Function: agent_init
+ *
+ * Arguments:
+ *
+ * Description: Stub provided for the SNMP Sub-Agent
+ * initialization. We do not have anything
+ * to do here.
+ *
+ * Returns:
+ */
+void
+agent_init()
+{
+}
+
+
+/*
+ * Function: agent_end
+ *
+ * Arguments:
+ *
+ * Description: Stub provided for the SNMP Sub-Agent
+ * shutdown. We do not have anything
+ * to do here.
+ *
+ * Returns:
+ */
+void
+agent_end()
+{
+}
+
+
+/*
+ * Function: agent_loop
+ *
+ * Arguments:
+ *
+ * Description: The SNMP Loop function, which is
+ * provided because the sub-agent needs it.
+ *
+ * Returns:
+ */
+void
+agent_loop()
+{
+}
+
+
+/*
+ * Function: agent_select_info
+ *
+ * Arguments: fdset - File Descriptor set
+ * numfds - number of file descriptors
+ *
+ * Description: Another stub provided for the SNMP
+ * sub-agent.
+ *
+ * Returns:
+ */
+/* ARGSUSED */
+void
+agent_select_info(fd_set *fdset, int *numfds)
+{
+}
+
+
+/*
+ * Function: agent_select_callback
+ *
+ * Arguments: fdset - File Descriptor set
+ *
+ * Description: Callback routine for the SNMP Sub-Agent,
+ * which we are providing as a stub.
+ *
+ * Returns:
+ */
+/* ARGSUSED */
+void
+agent_select_callback(fd_set *fdset)
+{
+}
+#endif
+/*
+ * Function: startSNMPTaskThread
+ *
+ * Arguments: none
+ *
+ * Description: This function will start the SNMP
+ * sub-agent thread, and register with
+ * the Master SNMP thread.
+ *
+ * Returns: int, 0 if successful
+ */
+int
+startSNMPTaskThread(void)
+{
+ StartupArgs *args;
+ static char *all_args[3];
+ static char arg0[] = "mipagent";
+ static char arg1[] = "-d";
+ static char arg2[] = "1";
+ pthread_attr_t pthreadAttribute;
+ int result;
+
+ result = pthread_attr_init(&pthreadAttribute);
+ if (result) {
+ syslog(LOG_CRIT, "Error Initializing pthread.");
+ return (-1);
+ }
+
+ args = (StartupArgs *) malloc(sizeof (StartupArgs));
+ if (args == NULL) {
+ syslog(LOG_CRIT, "Unable to allocate memory.");
+ return (-1);
+ }
+
+ /*
+ * Call the SSAMain() with "-d 1" argument, so that it doesn't
+ * daemonize the process. "-d 1" attempts to generate debug output.
+ * When mipagent is daemonized, since the stdout is closed, this
+ * will have no effect. When mipagent is not deamonized for debugging
+ * purposes, this will generate useful debug info for SNMP.
+ */
+ all_args[0] = (char *)arg0;
+ all_args[1] = (char *)arg1;
+ all_args[2] = (char *)arg2;
+
+ args->argc = 3;
+ args->argv = (char *)all_args;
+
+ /*
+ * The thread is then started It is mandatory that all
+ * applications have a slaveThread() function declared,
+ * which will be called with the TCB.
+ */
+ result = pthread_create(&snmpThreadId, &pthreadAttribute,
+ (void *(*)()) mipagent_snmp_thread,
+ (void *)args);
+
+ if (result) {
+ syslog(LOG_CRIT, "pthread_create() failed.");
+ free(args);
+ return (-1);
+ }
+
+ /*
+ * In order for system resources the be properly cleaned up,
+ * we need to detach the thread. Otherwise, we need to wait for
+ * a pthread_join(), which we do not want.
+ */
+ result = pthread_detach(snmpThreadId);
+
+ if (result) {
+ syslog(LOG_CRIT, "pthread_detach() failed.");
+ free(args);
+ return (-1);
+ }
+
+ return (0);
+
+}
+
+/*
+ * Function: killSNMPTaskThread
+ *
+ * Arguments:
+ *
+ * Description: This function is used to shutdown the
+ * SNMP Sub-Agent thread.
+ *
+ * Returns:
+ */
+int
+killSNMPTaskThread()
+{
+ int result;
+
+ if (snmpThreadId) {
+ if (deregister_with_master(subagent_addr)) {
+ syslog(LOG_CRIT, "Unable to deregister with sub-agent");
+ }
+
+ /*
+ * Next we need to kill the dispatching thread.
+ */
+ result = pthread_cancel(snmpThreadId);
+
+ if (result) {
+ /*
+ * Well, there's not much we can do here..
+ */
+ syslog(LOG_CRIT, "Unable to kill snmp thread");
+ }
+ }
+
+ return (0);
+}
+
+/*
+ * Function: mipagent_snmp_thread
+ *
+ * Arguments: args - Command Line Arguments
+ *
+ * Description: This function is the main SNMP Sub-Agent
+ * thread. The function will call SSAMain, which
+ * never returns (unless an error occured).
+ *
+ * This thread will remain active until either
+ * the SNMP Sub-Agent main routines returns or
+ * the killSNMPTaskThread() function is called.
+ *
+ * Returns:
+ */
+static void
+mipagent_snmp_thread(StartupArgs *args)
+{
+ int argc;
+ int result;
+ char **argv;
+
+ /*
+ * Register ourselves as a sub-agent with the master SNMP
+ * agent.
+ */
+ result = register_with_master(subagent_addr);
+
+ if (result) {
+ syslog(LOG_CRIT, "Could not register with master SNMP agent.");
+ free(args);
+ pthread_exit(NULL);
+ }
+
+ /*
+ * Let's do the SSAMain thingy... Note that this function should,
+ * in theory, never return. This function will interface with the
+ * SNMP Master Agent.
+ */
+ argc = args->argc;
+ /* LINTED E_BAD_PTR_CAST_ALIGN */
+ argv = (char **)args->argv;
+
+ SSAMain(argc, argv);
+
+ free(args);
+
+ if (deregister_with_master(subagent_addr)) {
+ syslog(LOG_CRIT, "Unable to deregister with sub-agent");
+ }
+
+ pthread_exit(NULL);
+}