Blame apps/snmptrapd.c

Packit Service b38f0b
/*
Packit Service b38f0b
 * snmptrapd.c - receive and log snmp traps
Packit Service b38f0b
 *
Packit Service b38f0b
 */
Packit Service b38f0b
/*****************************************************************
Packit Service b38f0b
	Copyright 1989, 1991, 1992 by Carnegie Mellon University
Packit Service b38f0b
Packit Service b38f0b
                      All Rights Reserved
Packit Service b38f0b
Packit Service b38f0b
Permission to use, copy, modify, and distribute this software and its
Packit Service b38f0b
documentation for any purpose and without fee is hereby granted,
Packit Service b38f0b
provided that the above copyright notice appear in all copies and that
Packit Service b38f0b
both that copyright notice and this permission notice appear in
Packit Service b38f0b
supporting documentation, and that the name of CMU not be
Packit Service b38f0b
used in advertising or publicity pertaining to distribution of the
Packit Service b38f0b
software without specific, written prior permission.
Packit Service b38f0b
Packit Service b38f0b
CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
Packit Service b38f0b
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit Service b38f0b
CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
Packit Service b38f0b
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit Service b38f0b
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
Packit Service b38f0b
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
Packit Service b38f0b
SOFTWARE.
Packit Service b38f0b
******************************************************************/
Packit Service b38f0b
#include <net-snmp/net-snmp-config.h>
Packit Service b38f0b
Packit Service b38f0b
#if HAVE_STDLIB_H
Packit Service b38f0b
#include <stdlib.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
#include <unistd.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_STRING_H
Packit Service b38f0b
#include <string.h>
Packit Service b38f0b
#else
Packit Service b38f0b
#include <strings.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#include <sys/types.h>
Packit Service b38f0b
#if HAVE_SYS_WAIT_H
Packit Service b38f0b
#include <sys/wait.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_SYS_SOCKET_H
Packit Service b38f0b
#include <sys/socket.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_SYS_SOCKIO_H
Packit Service b38f0b
#include <sys/sockio.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_NETINET_IN_H
Packit Service b38f0b
#include <netinet/in.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#include <stdio.h>
Packit Service b38f0b
#if !defined(mingw32) && defined(HAVE_SYS_TIME_H)
Packit Service b38f0b
# include <sys/time.h>
Packit Service b38f0b
# if TIME_WITH_SYS_TIME
Packit Service b38f0b
#  include <time.h>
Packit Service b38f0b
# endif
Packit Service b38f0b
#else
Packit Service b38f0b
# include <time.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_SYS_SELECT_H
Packit Service b38f0b
#include <sys/select.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_SYS_PARAM_H
Packit Service b38f0b
#include <sys/param.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_SYSLOG_H
Packit Service b38f0b
#include <syslog.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_SYS_IOCTL_H
Packit Service b38f0b
#include <sys/ioctl.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_NET_IF_H
Packit Service b38f0b
#include <net/if.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_NETDB_H
Packit Service b38f0b
#include <netdb.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_ARPA_INET_H
Packit Service b38f0b
#include <arpa/inet.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_FCNTL_H
Packit Service b38f0b
#include <fcntl.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_PROCESS_H              /* Win32-getpid */
Packit Service b38f0b
#include <process.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_PWD_H
Packit Service b38f0b
#include <pwd.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#if HAVE_GRP_H
Packit Service b38f0b
#include <grp.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
#include <signal.h>
Packit Service b38f0b
#include <errno.h>
Packit Service b38f0b
Packit Service b38f0b
#include <net-snmp/net-snmp-includes.h>
Packit Service b38f0b
#include <net-snmp/agent/net-snmp-agent-includes.h>
Packit Service b38f0b
#include <net-snmp/library/fd_event_manager.h>
Packit Service b38f0b
#include <net-snmp/agent/netsnmp_close_fds.h>
Packit Service b38f0b
#include "../agent_global_vars.h"
Packit Service b38f0b
#include "../agent/mibgroup/snmpv3/snmpEngine.h"
Packit Service b38f0b
#include "../agent/mibgroup/snmpv3/usmUser.h"
Packit Service b38f0b
#include "../agent/mibgroup/agent/nsVacmAccessTable.h"
Packit Service b38f0b
#include "../agent/mibgroup/agentx/subagent.h"
Packit Service b38f0b
#include "snmptrapd_handlers.h"
Packit Service b38f0b
#include "snmptrapd_log.h"
Packit Service b38f0b
#include "snmptrapd_auth.h"
Packit Service b38f0b
#include "snmptrapd_sql.h"
Packit Service b38f0b
#include "notification-log-mib/notification_log.h"
Packit Service b38f0b
#include "tlstm-mib/snmpTlstmCertToTSNTable/snmpTlstmCertToTSNTable.h"
Packit Service b38f0b
#include "mibII/vacm_conf.h"
Packit Service b38f0b
#ifdef NETSNMP_EMBEDDED_PERL
Packit Service b38f0b
#include "snmp_perl.h"
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
/*
Packit Service b38f0b
 * Include winservice.h to support Windows Service
Packit Service b38f0b
 */
Packit Service b38f0b
#ifdef WIN32
Packit Service b38f0b
#include <windows.h>
Packit Service b38f0b
#include <tchar.h>
Packit Service b38f0b
#include <net-snmp/library/winservice.h>
Packit Service b38f0b
Packit Service b38f0b
#define WIN32SERVICE
Packit Service b38f0b
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#if NETSNMP_USE_LIBWRAP
Packit Service b38f0b
#include <tcpd.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#include <net-snmp/net-snmp-features.h>
Packit Service b38f0b
Packit Service b38f0b
#ifndef NETSNMP_NO_SYSTEMD
Packit Service b38f0b
#include <net-snmp/library/sd-daemon.h>
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#ifndef BSD4_3
Packit Service b38f0b
#define BSD4_2
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
char           *logfile = NULL;
Packit Service b38f0b
static int      reconfig = 0;
Packit Service b38f0b
char            ddefault_port[] = "udp:162";	/* Default default port */
Packit Service b38f0b
char           *default_port = ddefault_port;
Packit Service b38f0b
#if HAVE_GETPID
Packit Service b38f0b
    FILE           *PID;
Packit Service b38f0b
    char           *pid_file = NULL;
Packit Service b38f0b
#endif
Packit Service b38f0b
char           *trap1_fmt_str_remember = NULL;
Packit Service b38f0b
int             dofork = 1;
Packit Service b38f0b
Packit Service b38f0b
/*
Packit Service b38f0b
 * These definitions handle 4.2 systems without additional syslog facilities.
Packit Service b38f0b
 */
Packit Service b38f0b
#ifndef LOG_CONS
Packit Service b38f0b
#define LOG_CONS	0       /* Don't bother if not defined... */
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_PID
Packit Service b38f0b
#define LOG_PID		0       /* Don't bother if not defined... */
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL0
Packit Service b38f0b
#define LOG_LOCAL0	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL1
Packit Service b38f0b
#define LOG_LOCAL1	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL2
Packit Service b38f0b
#define LOG_LOCAL2	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL3
Packit Service b38f0b
#define LOG_LOCAL3	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL4
Packit Service b38f0b
#define LOG_LOCAL4	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL5
Packit Service b38f0b
#define LOG_LOCAL5	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL6
Packit Service b38f0b
#define LOG_LOCAL6	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_LOCAL7
Packit Service b38f0b
#define LOG_LOCAL7	0
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef LOG_DAEMON
Packit Service b38f0b
#define LOG_DAEMON	0
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
/*
Packit Service b38f0b
 * Include an extra Facility variable to allow command line adjustment of
Packit Service b38f0b
 * syslog destination 
Packit Service b38f0b
 */
Packit Service b38f0b
int Facility = LOG_DAEMON;
Packit Service b38f0b
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
/*
Packit Service b38f0b
 * SNMP Trap Receiver Status 
Packit Service b38f0b
 */
Packit Service b38f0b
#define SNMPTRAPD_RUNNING 1
Packit Service b38f0b
#define SNMPTRAPD_STOPPED 0
Packit Service b38f0b
int             trapd_status = SNMPTRAPD_STOPPED;
Packit Service b38f0b
/* app_name_long used for SCM, registry etc */
Packit Service b38f0b
LPCTSTR         app_name_long = _T("Net-SNMP Trap Handler");     /* Application Name */
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
const char     *app_name = "snmptrapd";
Packit Service b38f0b
Packit Service b38f0b
void            trapd_update_config(void);
Packit Service b38f0b
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
static void     StopSnmpTrapd(void);
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
usage(void)
Packit Service b38f0b
{
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
    fprintf(stderr, "\nUsage:  snmptrapd [-register] [-quiet] [OPTIONS] [LISTENING ADDRESSES]");
Packit Service b38f0b
    fprintf(stderr, "\n        snmptrapd [-unregister] [-quiet]");
Packit Service b38f0b
#else
Packit Service b38f0b
    fprintf(stderr, "Usage: snmptrapd [OPTIONS] [LISTENING ADDRESSES]\n");
Packit Service b38f0b
#endif
Packit Service b38f0b
    fprintf(stderr, "\n\tNET-SNMP Version:  %s\n", netsnmp_get_version());
Packit Service b38f0b
    fprintf(stderr, "\tWeb:      http://www.net-snmp.org/\n");
Packit Service b38f0b
    fprintf(stderr, "\tEmail:    net-snmp-coders@lists.sourceforge.net\n");
Packit Service b38f0b
    fprintf(stderr, "\n");
Packit Service b38f0b
    fprintf(stderr, "  -a\t\t\tignore authentication failure traps\n");
Packit Service b38f0b
    fprintf(stderr, "  -A\t\t\tappend to log file rather than truncating it\n");
Packit Service b38f0b
    fprintf(stderr, "  -c FILE\t\tread FILE as a configuration file\n");
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -C\t\t\tdo not read the default configuration files\n");
Packit Service b38f0b
    fprintf(stderr, "  -d\t\t\tdump sent and received SNMP packets\n");
Packit Service b38f0b
    fprintf(stderr, "  -D[TOKEN[,...]]\t\tturn on debugging output for the specified TOKENs\n\t\t\t   (ALL gives extremely verbose debugging output)\n");
Packit Service b38f0b
    fprintf(stderr, "  -f\t\t\tdo not fork from the shell\n");
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -F FORMAT\t\tuse specified format for logging to standard error\n");
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
    fprintf(stderr, "  -g GID\t\tchange to this numeric gid after opening\n"
Packit Service b38f0b
	   "\t\t\t  transport endpoints\n");
Packit Service b38f0b
#endif
Packit Service b38f0b
    fprintf(stderr, "  -h, --help\t\tdisplay this usage message\n");
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -H\t\t\tdisplay configuration file directives understood\n");
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -m MIBLIST\t\tuse MIBLIST instead of the default MIB list\n");
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -M DIRLIST\t\tuse DIRLIST as the list of locations\n\t\t\t  to look for MIBs\n");
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -n\t\t\tuse numeric addresses instead of attempting\n\t\t\t  hostname lookups (no DNS)\n");
Packit Service b38f0b
#if HAVE_GETPID
Packit Service b38f0b
    fprintf(stderr, "  -p FILE\t\tstore process id in FILE\n");
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
    fprintf(stderr, "  -register\t\tregister as a Windows service\n");
Packit Service b38f0b
    fprintf(stderr, "  \t\t\t  (followed by -quiet to prevent message popups)\n");
Packit Service b38f0b
    fprintf(stderr, "  \t\t\t  (followed by the startup parameter list)\n");
Packit Service b38f0b
    fprintf(stderr, "  \t\t\t  Note that some parameters are not relevant when running as a service\n");
Packit Service b38f0b
#endif
Packit Service b38f0b
    fprintf(stderr, "  -t\t\t\tPrevent traps from being logged to syslog\n");
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
    fprintf(stderr, "  -u UID\t\tchange to this uid (numeric or textual) after\n"
Packit Service b38f0b
	   "\t\t\t  opening transport endpoints\n");
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
    fprintf(stderr, "  -unregister\t\tunregister as a Windows service\n");
Packit Service b38f0b
    fprintf(stderr, "  \t\t\t  (followed -quiet to prevent message popups)\n");
Packit Service b38f0b
#endif
Packit Service b38f0b
    fprintf(stderr, "  -v, --version\t\tdisplay version information\n");
Packit Service b38f0b
#if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
Packit Service b38f0b
    fprintf(stderr, "  -x ADDRESS\t\tuse ADDRESS as AgentX address\n");
Packit Service b38f0b
    fprintf(stderr, "  -X\t\t\tdon't become a subagent\n");
Packit Service b38f0b
#endif
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -O <OUTOPTS>\t\ttoggle options controlling output display\n");
Packit Service b38f0b
    snmp_out_toggle_options_usage("\t\t\t", stderr);
Packit Service b38f0b
    fprintf(stderr,
Packit Service b38f0b
            "  -L <LOGOPTS>\t\ttoggle options controlling where to log to\n");
Packit Service b38f0b
    snmp_log_options_usage("\t\t\t", stderr);
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
static void
Packit Service b38f0b
version(void)
Packit Service b38f0b
{
Packit Service b38f0b
    printf("\nNET-SNMP Version:  %s\n", netsnmp_get_version());
Packit Service b38f0b
    printf("Web:               http://www.net-snmp.org/\n");
Packit Service b38f0b
    printf("Email:             net-snmp-coders@lists.sourceforge.net\n\n");
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
RETSIGTYPE
Packit Service b38f0b
term_handler(int sig)
Packit Service b38f0b
{
Packit Service b38f0b
    netsnmp_running = 0;
Packit Service b38f0b
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
    /*
Packit Service b38f0b
     * In case of windows, select() in receive() function will not return 
Packit Service b38f0b
     * on signal. Thats why following function is called, which closes the 
Packit Service b38f0b
     * socket descriptors and causes the select() to return
Packit Service b38f0b
     */
Packit Service b38f0b
    snmp_close(main_session);
Packit Service b38f0b
#endif
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
#ifdef SIGHUP
Packit Service b38f0b
RETSIGTYPE
Packit Service b38f0b
hup_handler(int sig)
Packit Service b38f0b
{
Packit Service b38f0b
    reconfig = 1;
Packit Service b38f0b
    signal(SIGHUP, hup_handler);
Packit Service b38f0b
}
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
static int
Packit Service b38f0b
pre_parse(netsnmp_session * session, netsnmp_transport *transport,
Packit Service b38f0b
          void *transport_data, int transport_data_length)
Packit Service b38f0b
{
Packit Service b38f0b
#if NETSNMP_USE_LIBWRAP
Packit Service b38f0b
    char *addr_string = NULL;
Packit Service b38f0b
Packit Service b38f0b
    if (transport != NULL && transport->f_fmtaddr != NULL) {
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Okay I do know how to format this address for logging.  
Packit Service b38f0b
         */
Packit Service b38f0b
        addr_string = transport->f_fmtaddr(transport, transport_data,
Packit Service b38f0b
                                           transport_data_length);
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Don't forget to free() it.  
Packit Service b38f0b
         */
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    if (addr_string != NULL) {
Packit Service b38f0b
      /* Catch udp,udp6,tcp,tcp6 transports using "[" */
Packit Service b38f0b
      char *tcpudpaddr = strstr(addr_string, "[");
Packit Service b38f0b
      if ( tcpudpaddr != 0 ) {
Packit Service b38f0b
	char sbuf[64];
Packit Service b38f0b
	char *xp;
Packit Service b38f0b
Packit Service b38f0b
	strlcpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
Packit Service b38f0b
        xp = strstr(sbuf, "]");
Packit Service b38f0b
        if (xp)
Packit Service b38f0b
            *xp = '\0';
Packit Service b38f0b
Packit Service b38f0b
        if (hosts_ctl("snmptrapd", STRING_UNKNOWN, 
Packit Service b38f0b
		      sbuf, STRING_UNKNOWN) == 0) {
Packit Service b38f0b
            DEBUGMSGTL(("snmptrapd:libwrap", "%s rejected", addr_string));
Packit Service b38f0b
            SNMP_FREE(addr_string);
Packit Service b38f0b
            return 0;
Packit Service b38f0b
        }
Packit Service b38f0b
      }
Packit Service b38f0b
      SNMP_FREE(addr_string);
Packit Service b38f0b
    } else {
Packit Service b38f0b
        if (hosts_ctl("snmptrapd", STRING_UNKNOWN,
Packit Service b38f0b
                      STRING_UNKNOWN, STRING_UNKNOWN) == 0) {
Packit Service b38f0b
            DEBUGMSGTL(("snmptrapd:libwrap", "[unknown] rejected"));
Packit Service b38f0b
            return 0;
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
#endif/*  NETSNMP_USE_LIBWRAP  */
Packit Service b38f0b
    return 1;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
static netsnmp_session *
Packit Service b38f0b
snmptrapd_add_session(netsnmp_transport *t)
Packit Service b38f0b
{
Packit Service b38f0b
    netsnmp_session sess, *session = &sess, *rc = NULL;
Packit Service b38f0b
Packit Service b38f0b
    snmp_sess_init(session);
Packit Service b38f0b
    session->peername = SNMP_DEFAULT_PEERNAME;  /* Original code had NULL here */
Packit Service b38f0b
    session->version = SNMP_DEFAULT_VERSION;
Packit Service b38f0b
    session->community_len = SNMP_DEFAULT_COMMUNITY_LEN;
Packit Service b38f0b
    session->retries = SNMP_DEFAULT_RETRIES;
Packit Service b38f0b
    session->timeout = SNMP_DEFAULT_TIMEOUT;
Packit Service b38f0b
    session->callback = snmp_input;
Packit Service b38f0b
    session->callback_magic = (void *) t;
Packit Service b38f0b
    session->authenticator = NULL;
Packit Service b38f0b
    sess.isAuthoritative = SNMP_SESS_UNKNOWNAUTH;
Packit Service b38f0b
Packit Service b38f0b
    rc = snmp_add(session, t, pre_parse, NULL);
Packit Service b38f0b
    if (rc == NULL) {
Packit Service b38f0b
        snmp_sess_perror("snmptrapd", session);
Packit Service b38f0b
    }
Packit Service b38f0b
    return rc;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
static void
Packit Service b38f0b
snmptrapd_close_sessions(netsnmp_session * sess_list)
Packit Service b38f0b
{
Packit Service b38f0b
    netsnmp_session *s = NULL, *next = NULL;
Packit Service b38f0b
Packit Service b38f0b
    for (s = sess_list; s != NULL; s = next) {
Packit Service b38f0b
        next = s->next;
Packit Service b38f0b
        snmp_close(s);
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
parse_trapd_address(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
    char buf[BUFSIZ];
Packit Service b38f0b
    char *p;
Packit Service b38f0b
    cptr = copy_nword(cptr, buf, sizeof(buf));
Packit Service b38f0b
Packit Service b38f0b
    if (default_port == ddefault_port) {
Packit Service b38f0b
        default_port = strdup(buf);
Packit Service b38f0b
    } else {
Packit Service b38f0b
        p = malloc(strlen(buf) + 1 + strlen(default_port) + 1);
Packit Service b38f0b
        if (p) {
Packit Service b38f0b
            strcpy(p, buf);
Packit Service b38f0b
            strcat(p, ",");
Packit Service b38f0b
            strcat(p, default_port );
Packit Service b38f0b
        }
Packit Service b38f0b
        free(default_port);
Packit Service b38f0b
        default_port = p;
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
free_trapd_address(void)
Packit Service b38f0b
{
Packit Service b38f0b
    if (default_port != ddefault_port) {
Packit Service b38f0b
        free(default_port);
Packit Service b38f0b
        default_port = ddefault_port;
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
parse_config_doNotLogTraps(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
  if (atoi(cptr) > 0)
Packit Service b38f0b
    SyslogTrap++;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
free_config_pidFile(void)
Packit Service b38f0b
{
Packit Service b38f0b
  if (pid_file)
Packit Service b38f0b
    free(pid_file);
Packit Service b38f0b
  pid_file = NULL;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
parse_config_pidFile(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
  free_config_pidFile();
Packit Service b38f0b
  pid_file = strdup (cptr);
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
#ifdef HAVE_UNISTD_H
Packit Service b38f0b
void
Packit Service b38f0b
parse_config_agentuser(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
    if (cptr[0] == '#') {
Packit Service b38f0b
        char           *ecp;
Packit Service b38f0b
        int             uid;
Packit Service b38f0b
Packit Service b38f0b
        uid = strtoul(cptr + 1, &ecp, 10);
Packit Service b38f0b
        if (*ecp != 0) {
Packit Service b38f0b
            config_perror("Bad number");
Packit Service b38f0b
	} else {
Packit Service b38f0b
	    netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
			       NETSNMP_DS_AGENT_USERID, uid);
Packit Service b38f0b
	}
Packit Service b38f0b
#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
Packit Service b38f0b
    } else {
Packit Service b38f0b
        struct passwd *info;
Packit Service b38f0b
Packit Service b38f0b
        info = getpwnam(cptr);
Packit Service b38f0b
        if (info)
Packit Service b38f0b
            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
                               NETSNMP_DS_AGENT_USERID, info->pw_uid);
Packit Service b38f0b
        else
Packit Service b38f0b
            config_perror("User not found in passwd database");
Packit Service b38f0b
        endpwent();
Packit Service b38f0b
#endif
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
parse_config_agentgroup(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
    if (cptr[0] == '#') {
Packit Service b38f0b
        char           *ecp;
Packit Service b38f0b
        int             gid = strtoul(cptr + 1, &ecp, 10);
Packit Service b38f0b
Packit Service b38f0b
        if (*ecp != 0) {
Packit Service b38f0b
            config_perror("Bad number");
Packit Service b38f0b
	} else {
Packit Service b38f0b
            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
			       NETSNMP_DS_AGENT_GROUPID, gid);
Packit Service b38f0b
	}
Packit Service b38f0b
#if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
Packit Service b38f0b
    } else {
Packit Service b38f0b
        struct group   *info;
Packit Service b38f0b
Packit Service b38f0b
        info = getgrnam(cptr);
Packit Service b38f0b
        if (info)
Packit Service b38f0b
            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
                               NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
Packit Service b38f0b
        else
Packit Service b38f0b
            config_perror("Group not found in group database");
Packit Service b38f0b
        endgrent();
Packit Service b38f0b
#endif
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
parse_config_doNotFork(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
  if (netsnmp_ds_parse_boolean(cptr) == 1)
Packit Service b38f0b
    dofork = 0;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
parse_config_ignoreAuthFailure(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
  if (netsnmp_ds_parse_boolean(cptr) == 1)
Packit Service b38f0b
    dropauth = 1;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
void
Packit Service b38f0b
parse_config_outputOption(const char *token, char *cptr)
Packit Service b38f0b
{
Packit Service b38f0b
  char *cp;
Packit Service b38f0b
Packit Service b38f0b
  cp = snmp_out_toggle_options(cptr);
Packit Service b38f0b
  if (cp != NULL) {
Packit Service b38f0b
    fprintf(stderr, "Unknown output option passed to -O: %c\n",
Packit Service b38f0b
        *cp);
Packit Service b38f0b
  }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
static void
Packit Service b38f0b
snmptrapd_main_loop(void)
Packit Service b38f0b
{
Packit Service b38f0b
    int             count, numfds, block;
Packit Service b38f0b
    fd_set          readfds,writefds,exceptfds;
Packit Service b38f0b
    struct timeval  timeout, *tvp;
Packit Service b38f0b
Packit Service b38f0b
    while (netsnmp_running) {
Packit Service b38f0b
        if (reconfig) {
Packit Service b38f0b
                /*
Packit Service b38f0b
                 * If we are logging to a file, receipt of SIGHUP also
Packit Service b38f0b
                 * indicates that the log file should be closed and
Packit Service b38f0b
                 * re-opened.  This is useful for users that want to
Packit Service b38f0b
                 * rotate logs in a more predictable manner.
Packit Service b38f0b
                 */
Packit Service b38f0b
                netsnmp_logging_restart();
Packit Service b38f0b
                snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
Packit Service b38f0b
                         netsnmp_get_version());
Packit Service b38f0b
            trapd_update_config();
Packit Service b38f0b
            if (trap1_fmt_str_remember) {
Packit Service b38f0b
                parse_format( NULL, trap1_fmt_str_remember );
Packit Service b38f0b
            }
Packit Service b38f0b
            reconfig = 0;
Packit Service b38f0b
        }
Packit Service b38f0b
        numfds = 0;
Packit Service b38f0b
        FD_ZERO(&readfds);
Packit Service b38f0b
        FD_ZERO(&writefds);
Packit Service b38f0b
        FD_ZERO(&exceptfds);
Packit Service b38f0b
        block = 0;
Packit Service b38f0b
        tvp = &timeout;
Packit Service b38f0b
        timerclear(tvp);
Packit Service b38f0b
        tvp->tv_sec = 5;
Packit Service b38f0b
        snmp_select_info(&numfds, &readfds, tvp, &block);
Packit Service b38f0b
        if (block == 1)
Packit Service b38f0b
            tvp = NULL;         /* block without timeout */
Packit Service b38f0b
#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
Packit Service b38f0b
        netsnmp_external_event_info(&numfds, &readfds, &writefds, &exceptfds);
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
Packit Service b38f0b
        count = select(numfds, &readfds, &writefds, &exceptfds, tvp);
Packit Service b38f0b
        if (count > 0) {
Packit Service b38f0b
#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
Packit Service b38f0b
            netsnmp_dispatch_external_events(&count, &readfds, &writefds,
Packit Service b38f0b
                                             &exceptfds);
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
Packit Service b38f0b
            /* If there are any more events after external events, then
Packit Service b38f0b
             * try SNMP events. */
Packit Service b38f0b
            if (count > 0) {
Packit Service b38f0b
                snmp_read(&readfds);
Packit Service b38f0b
            }
Packit Service b38f0b
        } else {
Packit Service b38f0b
            switch (count) {
Packit Service b38f0b
            case 0:
Packit Service b38f0b
                snmp_timeout();
Packit Service b38f0b
                break;
Packit Service b38f0b
            case -1:
Packit Service b38f0b
                if (errno == EINTR)
Packit Service b38f0b
                    continue;
Packit Service b38f0b
                snmp_log_perror("select");
Packit Service b38f0b
                netsnmp_running = 0;
Packit Service b38f0b
                break;
Packit Service b38f0b
            default:
Packit Service b38f0b
                fprintf(stderr, "select returned %d\n", count);
Packit Service b38f0b
                netsnmp_running = 0;
Packit Service b38f0b
            }
Packit Service b38f0b
	}
Packit Service b38f0b
	run_alarms();
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
/*******************************************************************-o-******
Packit Service b38f0b
 * main - Non Windows
Packit Service b38f0b
 * SnmpTrapdMain - Windows to support windows service
Packit Service b38f0b
 *
Packit Service b38f0b
 * Parameters:
Packit Service b38f0b
 *	 argc
Packit Service b38f0b
 *	*argv[]
Packit Service b38f0b
 *      
Packit Service b38f0b
 * Returns:
Packit Service b38f0b
 *	0	Always succeeds.  (?)
Packit Service b38f0b
 *
Packit Service b38f0b
 *
Packit Service b38f0b
 * Setup and start the trap receiver daemon.
Packit Service b38f0b
 *
Packit Service b38f0b
 * Also successfully EXITs with zero for some options.
Packit Service b38f0b
 */
Packit Service b38f0b
int
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
SnmpTrapdMain(int argc, TCHAR * argv[])
Packit Service b38f0b
#else
Packit Service b38f0b
main(int argc, char *argv[])
Packit Service b38f0b
#endif
Packit Service b38f0b
{
Packit Service b38f0b
    static const char options[] = "aAc:CdD::efF:g:hHI:L:m:M:no:O:Ptu:vx:X-:"
Packit Service b38f0b
#if HAVE_GETPID
Packit Service b38f0b
        "p:"
Packit Service b38f0b
#endif
Packit Service b38f0b
        ;
Packit Service b38f0b
    netsnmp_session *sess_list = NULL, *ss = NULL;
Packit Service b38f0b
    netsnmp_transport *transport = NULL;
Packit Service b38f0b
    int             arg, i = 0;
Packit Service b38f0b
    int             uid = 0, gid = 0;
Packit Service b38f0b
    int             exit_code = 1;
Packit Service b38f0b
    char           *cp, *listen_ports = NULL;
Packit Service b38f0b
#if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
Packit Service b38f0b
    int             agentx_subagent = 1;
Packit Service b38f0b
#endif
Packit Service b38f0b
    netsnmp_trapd_handler *traph;
Packit Service b38f0b
#ifndef WIN32
Packit Service b38f0b
    int             prepared_sockets = 0;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
Packit Service b38f0b
#ifndef NETSNMP_NO_SYSTEMD
Packit Service b38f0b
    /* check if systemd has sockets for us and don't close them */
Packit Service b38f0b
    prepared_sockets = netsnmp_sd_listen_fds(0);
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifndef WIN32
Packit Service b38f0b
    /*
Packit Service b38f0b
     * close all non-standard file descriptors we may have
Packit Service b38f0b
     * inherited from the shell.
Packit Service b38f0b
     */
Packit Service b38f0b
    if (!prepared_sockets)
Packit Service b38f0b
        netsnmp_close_fds(2);
Packit Service b38f0b
#endif
Packit Service b38f0b
    
Packit Service b38f0b
#ifdef SIGTERM
Packit Service b38f0b
    signal(SIGTERM, term_handler);
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef SIGHUP
Packit Service b38f0b
    signal(SIGHUP, SIG_IGN);   /* do not terminate on early SIGHUP */
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#ifdef SIGINT
Packit Service b38f0b
    signal(SIGINT, term_handler);
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef SIGPIPE
Packit Service b38f0b
    signal(SIGPIPE, SIG_IGN);   /* 'Inline' failure of wayward readers */
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * register our configuration handlers now so -H properly displays them 
Packit Service b38f0b
     */
Packit Service b38f0b
    snmptrapd_register_configs( );
Packit Service b38f0b
#ifdef NETSNMP_USE_MYSQL
Packit Service b38f0b
    snmptrapd_register_sql_configs( );
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef NETSNMP_SECMOD_USM
Packit Service b38f0b
    init_usm_conf( "snmptrapd" );
Packit Service b38f0b
#endif /* NETSNMP_SECMOD_USM */
Packit Service b38f0b
    register_config_handler("snmptrapd", "snmpTrapdAddr",
Packit Service b38f0b
                            parse_trapd_address, free_trapd_address, "string");
Packit Service b38f0b
Packit Service b38f0b
    register_config_handler("snmptrapd", "doNotLogTraps",
Packit Service b38f0b
                            parse_config_doNotLogTraps, NULL, "(1|yes|true|0|no|false)");
Packit Service b38f0b
#if HAVE_GETPID
Packit Service b38f0b
    register_config_handler("snmptrapd", "pidFile",
Packit Service b38f0b
                            parse_config_pidFile, NULL, "string");
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef HAVE_UNISTD_H
Packit Service b38f0b
    register_config_handler("snmptrapd", "agentuser",
Packit Service b38f0b
                            parse_config_agentuser, NULL, "userid");
Packit Service b38f0b
    register_config_handler("snmptrapd", "agentgroup",
Packit Service b38f0b
                            parse_config_agentgroup, NULL, "groupid");
Packit Service b38f0b
#endif
Packit Service b38f0b
    
Packit Service b38f0b
    register_config_handler("snmptrapd", "doNotFork",
Packit Service b38f0b
                            parse_config_doNotFork, NULL, "(1|yes|true|0|no|false)");
Packit Service b38f0b
Packit Service b38f0b
    register_config_handler("snmptrapd", "ignoreAuthFailure",
Packit Service b38f0b
                            parse_config_ignoreAuthFailure, NULL, "(1|yes|true|0|no|false)");
Packit Service b38f0b
Packit Service b38f0b
    register_config_handler("snmptrapd", "outputOption",
Packit Service b38f0b
                            parse_config_outputOption, NULL, "string");
Packit Service b38f0b
Packit Service b38f0b
#ifndef NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG
Packit Service b38f0b
#ifdef WIN32
Packit Service b38f0b
    snmp_log_syslogname(app_name_long);
Packit Service b38f0b
#else
Packit Service b38f0b
    snmp_log_syslogname(app_name);
Packit Service b38f0b
#endif
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG */
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * Now process options normally.  
Packit Service b38f0b
     */
Packit Service b38f0b
Packit Service b38f0b
    while ((arg = getopt(argc, argv, options)) != EOF) {
Packit Service b38f0b
        switch (arg) {
Packit Service b38f0b
        case '-':
Packit Service b38f0b
            if (strcasecmp(optarg, "help") == 0 ||
Packit Service b38f0b
                strcasecmp(optarg, "version") == 0) {
Packit Service b38f0b
                version();
Packit Service b38f0b
                exit_code = 0;
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
Packit Service b38f0b
            handle_long_opt(optarg);
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'a':
Packit Service b38f0b
            dropauth = 1;
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'A':
Packit Service b38f0b
            netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID,
Packit Service b38f0b
                                   NETSNMP_DS_LIB_APPEND_LOGFILES, 1);
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'c':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                netsnmp_ds_set_string(NETSNMP_DS_LIBRARY_ID, 
Packit Service b38f0b
				      NETSNMP_DS_LIB_OPTIONALCONFIG, optarg);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'C':
Packit Service b38f0b
            netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit Service b38f0b
				   NETSNMP_DS_LIB_DONT_READ_CONFIGS, 1);
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'd':
Packit Service b38f0b
            netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
Packit Service b38f0b
                                   NETSNMP_DS_LIB_DUMP_PACKET, 1);
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'D':
Packit Service b38f0b
            debug_register_tokens(optarg);
Packit Service b38f0b
            snmp_set_do_debugging(1);
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'f':
Packit Service b38f0b
            dofork = 0;
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'F':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                if (( strncmp( optarg, "print",   5 ) == 0 ) ||
Packit Service b38f0b
                    ( strncmp( optarg, "syslog",  6 ) == 0 ) ||
Packit Service b38f0b
                    ( strncmp( optarg, "execute", 7 ) == 0 )) {
Packit Service b38f0b
                    /* New style: "type=format" */
Packit Service b38f0b
                    trap1_fmt_str_remember = strdup(optarg);
Packit Service b38f0b
                    cp = strchr( trap1_fmt_str_remember, '=' );
Packit Service b38f0b
                    if (cp)
Packit Service b38f0b
                        *cp = ' ';
Packit Service b38f0b
                } else {
Packit Service b38f0b
                    /* Old style: implicitly "print=format" */
Packit Service b38f0b
                    trap1_fmt_str_remember = malloc(strlen(optarg) + 7);
Packit Service b38f0b
                    sprintf( trap1_fmt_str_remember, "print %s", optarg );
Packit Service b38f0b
                }
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
        case 'g':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
				   NETSNMP_DS_AGENT_GROUPID, gid = atoi(optarg));
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
        case 'h':
Packit Service b38f0b
            usage();
Packit Service b38f0b
            exit_code = 0;
Packit Service b38f0b
            goto out;
Packit Service b38f0b
Packit Service b38f0b
        case 'H':
Packit Service b38f0b
            init_agent("snmptrapd");
Packit Service b38f0b
#ifdef USING_NOTIFICATION_LOG_MIB_NOTIFICATION_LOG_MODULE
Packit Service b38f0b
            init_notification_log();
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef NETSNMP_EMBEDDED_PERL
Packit Service b38f0b
            init_perl();
Packit Service b38f0b
#endif
Packit Service b38f0b
            init_snmp("snmptrapd");
Packit Service b38f0b
            fprintf(stderr, "Configuration directives understood:\n");
Packit Service b38f0b
            read_config_print_usage("  ");
Packit Service b38f0b
            exit_code = 0;
Packit Service b38f0b
            goto out;
Packit Service b38f0b
Packit Service b38f0b
        case 'I':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                add_to_init_list(optarg);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
	case 'S':
Packit Service b38f0b
            fprintf(stderr,
Packit Service b38f0b
                    "Warning: -S option has been withdrawn; use -Ls <facility> instead\n");
Packit Service b38f0b
            goto out;
Packit Service b38f0b
Packit Service b38f0b
        case 'm':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                setenv("MIBS", optarg, 1);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'M':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                setenv("MIBDIRS", optarg, 1);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'n':
Packit Service b38f0b
            netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
				   NETSNMP_DS_APP_NUMERIC_IP, 1);
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'o':
Packit Service b38f0b
            fprintf(stderr,
Packit Service b38f0b
                    "Warning: -o option has been withdrawn; use -Lf <file> instead\n");
Packit Service b38f0b
            goto out;
Packit Service b38f0b
Packit Service b38f0b
        case 'O':
Packit Service b38f0b
            cp = snmp_out_toggle_options(optarg);
Packit Service b38f0b
            if (cp != NULL) {
Packit Service b38f0b
                fprintf(stderr, "Unknown output option passed to -O: %c\n",
Packit Service b38f0b
			*cp);
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        case 'L':
Packit Service b38f0b
	    if  (snmp_log_options( optarg, argc, argv ) < 0 ) {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
#if HAVE_GETPID
Packit Service b38f0b
        case 'p':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                parse_config_pidFile(NULL, optarg);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
        case 'P':
Packit Service b38f0b
            fprintf(stderr,
Packit Service b38f0b
                    "Warning: -P option has been withdrawn; use -f -Le instead\n");
Packit Service b38f0b
            goto out;
Packit Service b38f0b
Packit Service b38f0b
        case 's':
Packit Service b38f0b
            fprintf(stderr,
Packit Service b38f0b
                    "Warning: -s option has been withdrawn; use -Lsd instead\n");
Packit Service b38f0b
            goto out;
Packit Service b38f0b
Packit Service b38f0b
        case 't':
Packit Service b38f0b
            SyslogTrap++;
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
        case 'u':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                char           *ecp;
Packit Service b38f0b
Packit Service b38f0b
                uid = strtoul(optarg, &ecp, 10);
Packit Service b38f0b
#if HAVE_GETPWNAM && HAVE_PWD_H
Packit Service b38f0b
                if (*ecp) {
Packit Service b38f0b
                    struct passwd  *info;
Packit Service b38f0b
Packit Service b38f0b
                    info = getpwnam(optarg);
Packit Service b38f0b
                    uid = info ? info->pw_uid : -1;
Packit Service b38f0b
                    endpwent();
Packit Service b38f0b
                }
Packit Service b38f0b
#endif
Packit Service b38f0b
                if (uid < 0) {
Packit Service b38f0b
                    fprintf(stderr, "Bad user id: %s\n", optarg);
Packit Service b38f0b
                    goto out;
Packit Service b38f0b
                }
Packit Service b38f0b
                netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
				   NETSNMP_DS_AGENT_USERID, uid);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
        case 'v':
Packit Service b38f0b
            version();
Packit Service b38f0b
            exit(0);
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
#if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
Packit Service b38f0b
        case 'x':
Packit Service b38f0b
            if (optarg != NULL) {
Packit Service b38f0b
                netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
Packit Service b38f0b
                                      NETSNMP_DS_AGENT_X_SOCKET, optarg);
Packit Service b38f0b
            } else {
Packit Service b38f0b
                usage();
Packit Service b38f0b
                goto out;
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
         case 'X':
Packit Service b38f0b
            agentx_subagent = 0;
Packit Service b38f0b
            break;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
        default:
Packit Service b38f0b
            fprintf(stderr, "invalid option: -%c\n", arg);
Packit Service b38f0b
            usage();
Packit Service b38f0b
            goto out;
Packit Service b38f0b
            break;
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    if (optind < argc) {
Packit Service b38f0b
        /*
Packit Service b38f0b
         * There are optional transport addresses on the command line.  
Packit Service b38f0b
         */
Packit Service b38f0b
        for (i = optind; i < argc; i++) {
Packit Service b38f0b
            char *astring;
Packit Service b38f0b
            if (listen_ports != NULL) {
Packit Service b38f0b
                astring = malloc(strlen(listen_ports) + 2 + strlen(argv[i]));
Packit Service b38f0b
                if (astring == NULL) {
Packit Service b38f0b
                    fprintf(stderr, "malloc failure processing argv[%d]\n", i);
Packit Service b38f0b
                    goto out;
Packit Service b38f0b
                }
Packit Service b38f0b
                sprintf(astring, "%s,%s", listen_ports, argv[i]);
Packit Service b38f0b
                free(listen_ports);
Packit Service b38f0b
                listen_ports = astring;
Packit Service b38f0b
            } else {
Packit Service b38f0b
                listen_ports = strdup(argv[i]);
Packit Service b38f0b
                if (listen_ports == NULL) {
Packit Service b38f0b
                    fprintf(stderr, "malloc failure processing argv[%d]\n", i);
Packit Service b38f0b
                    goto out;
Packit Service b38f0b
                }
Packit Service b38f0b
            }
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    SOCK_STARTUP;
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * I'm being lazy here, and not checking the
Packit Service b38f0b
     * return value from these registration calls.
Packit Service b38f0b
     * Don't try this at home, children!
Packit Service b38f0b
     */
Packit Service b38f0b
    if (0 == snmp_get_do_logging()) {
Packit Service b38f0b
#ifndef NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG
Packit Service b38f0b
        traph = netsnmp_add_global_traphandler(NETSNMPTRAPD_PRE_HANDLER,
Packit Service b38f0b
                                               syslog_handler);
Packit Service b38f0b
        traph->authtypes = TRAP_AUTH_LOG;
Packit Service b38f0b
        snmp_enable_syslog();
Packit Service b38f0b
#else /* NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG */
Packit Service b38f0b
#ifndef NETSNMP_FEATURE_REMOVE_LOGGING_STDIO
Packit Service b38f0b
        traph = netsnmp_add_global_traphandler(NETSNMPTRAPD_PRE_HANDLER,
Packit Service b38f0b
                                               print_handler);
Packit Service b38f0b
        traph->authtypes = TRAP_AUTH_LOG;
Packit Service b38f0b
        snmp_enable_stderr();
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_REMOVE_LOGGING_STDIO */
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG */
Packit Service b38f0b
    } else {
Packit Service b38f0b
        traph = netsnmp_add_global_traphandler(NETSNMPTRAPD_PRE_HANDLER,
Packit Service b38f0b
                                               print_handler);
Packit Service b38f0b
        traph->authtypes = TRAP_AUTH_LOG;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
#if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
Packit Service b38f0b
    /*
Packit Service b38f0b
     * we're an agentx subagent? 
Packit Service b38f0b
     */
Packit Service b38f0b
    if (agentx_subagent) {
Packit Service b38f0b
        /*
Packit Service b38f0b
         * make us a agentx client. 
Packit Service b38f0b
         */
Packit Service b38f0b
        netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
Packit Service b38f0b
			       NETSNMP_DS_AGENT_ROLE, 1);
Packit Service b38f0b
    }
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * don't fail if we can't do agentx (ie, socket not there, or not root) 
Packit Service b38f0b
     */
Packit Service b38f0b
    netsnmp_ds_toggle_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
			      NETSNMP_DS_AGENT_NO_ROOT_ACCESS);
Packit Service b38f0b
    /*
Packit Service b38f0b
     * ignore any warning messages.
Packit Service b38f0b
     */
Packit Service b38f0b
    netsnmp_ds_toggle_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
			      NETSNMP_DS_AGENT_NO_CONNECTION_WARNINGS);
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * initialize the agent library 
Packit Service b38f0b
     */
Packit Service b38f0b
    init_agent("snmptrapd");
Packit Service b38f0b
Packit Service b38f0b
#if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
Packit Service b38f0b
#ifdef NETSNMP_FEATURE_CHECKING
Packit Service b38f0b
    netsnmp_feature_require(register_snmpEngine_scalars_context)
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_CHECKING */
Packit Service b38f0b
    /*
Packit Service b38f0b
     * initialize local modules 
Packit Service b38f0b
     */
Packit Service b38f0b
    if (agentx_subagent) {
Packit Service b38f0b
        subagent_init();
Packit Service b38f0b
#ifdef USING_NOTIFICATION_LOG_MIB_NOTIFICATION_LOG_MODULE
Packit Service b38f0b
        /* register the notification log table */
Packit Service b38f0b
        if (should_init("notificationLogMib")) {
Packit Service b38f0b
            netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
Packit Service b38f0b
                              NETSNMP_DS_NOTIF_LOG_CTX,
Packit Service b38f0b
                              "snmptrapd");
Packit Service b38f0b
            traph = netsnmp_add_global_traphandler(NETSNMPTRAPD_POST_HANDLER,
Packit Service b38f0b
                                                   notification_handler);
Packit Service b38f0b
            traph->authtypes = TRAP_AUTH_LOG;
Packit Service b38f0b
            init_notification_log();
Packit Service b38f0b
        }
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef USING_SNMPV3_SNMPENGINE_MODULE
Packit Service b38f0b
        /*
Packit Service b38f0b
         * register scalars from SNMP-FRAMEWORK-MIB::snmpEngineID group;
Packit Service b38f0b
         * allows engineID probes via the master agent under the
Packit Service b38f0b
         * snmptrapd context
Packit Service b38f0b
         */
Packit Service b38f0b
        register_snmpEngine_scalars_context("snmptrapd");
Packit Service b38f0b
#endif
Packit Service b38f0b
    }
Packit Service b38f0b
#endif /* USING_AGENTX_SUBAGENT_MODULE && !NETSNMP_SNMPTRAPD_DISABLE_AGENTX */
Packit Service b38f0b
Packit Service b38f0b
    /* register our authorization handler */
Packit Service b38f0b
    init_netsnmp_trapd_auth();
Packit Service b38f0b
Packit Service b38f0b
#if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
Packit Service b38f0b
    if (agentx_subagent) {
Packit Service b38f0b
#ifdef USING_SNMPV3_USMUSER_MODULE
Packit Service b38f0b
#ifdef NETSNMP_FEATURE_CHECKING
Packit Service b38f0b
        netsnmp_feature_require(init_register_usmUser_context)
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_CHECKING */
Packit Service b38f0b
        /* register ourselves as having a USM user database */
Packit Service b38f0b
        init_register_usmUser_context("snmptrapd");
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef USING_AGENT_NSVACMACCESSTABLE_MODULE
Packit Service b38f0b
        /* register net-snmp vacm extensions */
Packit Service b38f0b
        init_register_nsVacm_context("snmptrapd");
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef USING_TLSTM_MIB_SNMPTLSTMCERTTOTSNTABLE_MODULE
Packit Service b38f0b
        init_snmpTlstmCertToTSNTable_context("snmptrapd");
Packit Service b38f0b
#endif
Packit Service b38f0b
    }
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#ifdef NETSNMP_EMBEDDED_PERL
Packit Service b38f0b
    init_perl();
Packit Service b38f0b
    {
Packit Service b38f0b
        /* set the default path to load */
Packit Service b38f0b
        char            init_file[SNMP_MAXBUF];
Packit Service b38f0b
        snprintf(init_file, sizeof(init_file) - 1,
Packit Service b38f0b
                 "%s/%s", SNMPSHAREPATH, "snmp_perl_trapd.pl");
Packit Service b38f0b
        netsnmp_ds_set_string(NETSNMP_DS_APPLICATION_ID,
Packit Service b38f0b
                              NETSNMP_DS_AGENT_PERL_INIT_FILE,
Packit Service b38f0b
                              init_file);
Packit Service b38f0b
    }
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * Initialize the world.
Packit Service b38f0b
     */
Packit Service b38f0b
    init_snmp("snmptrapd");
Packit Service b38f0b
Packit Service b38f0b
#ifdef SIGHUP
Packit Service b38f0b
    signal(SIGHUP, hup_handler);
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    if (trap1_fmt_str_remember) {
Packit Service b38f0b
        parse_format( NULL, trap1_fmt_str_remember );
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
			       NETSNMP_DS_AGENT_QUIT_IMMEDIATELY)) {
Packit Service b38f0b
        /*
Packit Service b38f0b
         * just starting up to process specific configuration and then
Packit Service b38f0b
         * shutting down immediately. 
Packit Service b38f0b
         */
Packit Service b38f0b
        netsnmp_running = 0;
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * if no logging options on command line or in conf files, use syslog
Packit Service b38f0b
     */
Packit Service b38f0b
    if (0 == snmp_get_do_logging()) {
Packit Service b38f0b
#ifndef NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG
Packit Service b38f0b
#ifdef WIN32
Packit Service b38f0b
        snmp_enable_syslog_ident(app_name_long, Facility);
Packit Service b38f0b
#else
Packit Service b38f0b
        snmp_enable_syslog_ident(app_name, Facility);
Packit Service b38f0b
#endif        
Packit Service b38f0b
#endif /* NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG */
Packit Service b38f0b
    }
Packit Service b38f0b
Packit Service b38f0b
    if (listen_ports)
Packit Service b38f0b
        cp = listen_ports;
Packit Service b38f0b
    else
Packit Service b38f0b
        cp = default_port;
Packit Service b38f0b
Packit Service b38f0b
    while (cp != NULL) {
Packit Service b38f0b
        char *sep = strchr(cp, ',');
Packit Service b38f0b
Packit Service b38f0b
        if (sep != NULL) {
Packit Service b38f0b
            *sep = 0;
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        transport = netsnmp_transport_open_server("snmptrap", cp);
Packit Service b38f0b
        if (transport == NULL) {
Packit Service b38f0b
            snmp_log(LOG_ERR, "couldn't open %s -- errno %d (\"%s\")\n",
Packit Service b38f0b
                     cp, errno, strerror(errno));
Packit Service b38f0b
            snmptrapd_close_sessions(sess_list);
Packit Service b38f0b
            goto sock_cleanup;
Packit Service b38f0b
        } else {
Packit Service b38f0b
            ss = snmptrapd_add_session(transport);
Packit Service b38f0b
            if (ss == NULL) {
Packit Service b38f0b
                /*
Packit Service b38f0b
                 * Shouldn't happen?  We have already opened the transport
Packit Service b38f0b
                 * successfully so what could have gone wrong?  
Packit Service b38f0b
                 */
Packit Service b38f0b
                snmptrapd_close_sessions(sess_list);
Packit Service b38f0b
                snmp_log(LOG_ERR, "couldn't open snmp - %s", strerror(errno));
Packit Service b38f0b
                goto sock_cleanup;
Packit Service b38f0b
            } else {
Packit Service b38f0b
                ss->next = sess_list;
Packit Service b38f0b
                sess_list = ss;
Packit Service b38f0b
            }
Packit Service b38f0b
        }
Packit Service b38f0b
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Process next listen address, if there is one.  
Packit Service b38f0b
         */
Packit Service b38f0b
Packit Service b38f0b
        if (sep != NULL) {
Packit Service b38f0b
            *sep = ',';
Packit Service b38f0b
            cp = sep + 1;
Packit Service b38f0b
        } else {
Packit Service b38f0b
            cp = NULL;
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
    SNMP_FREE(listen_ports); /* done with them */
Packit Service b38f0b
Packit Service b38f0b
#ifdef NETSNMP_USE_MYSQL
Packit Service b38f0b
    if( netsnmp_mysql_init() ) {
Packit Service b38f0b
        fprintf(stderr, "MySQL initialization failed\n");
Packit Service b38f0b
        goto sock_cleanup;
Packit Service b38f0b
    }
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#ifndef WIN32
Packit Service b38f0b
    /*
Packit Service b38f0b
     * fork the process to the background if we are not printing to stderr 
Packit Service b38f0b
     */
Packit Service b38f0b
    if (dofork && netsnmp_running) {
Packit Service b38f0b
        int             fd;
Packit Service b38f0b
Packit Service b38f0b
#if HAVE_FORKALL
Packit Service b38f0b
        switch (forkall()) {
Packit Service b38f0b
#else
Packit Service b38f0b
        switch (fork()) {
Packit Service b38f0b
#endif
Packit Service b38f0b
        case -1:
Packit Service b38f0b
            fprintf(stderr, "bad fork - %s\n", strerror(errno));
Packit Service b38f0b
            goto sock_cleanup;
Packit Service b38f0b
Packit Service b38f0b
        case 0:
Packit Service b38f0b
            /*
Packit Service b38f0b
             * become process group leader 
Packit Service b38f0b
             */
Packit Service b38f0b
            if (setsid() == -1) {
Packit Service b38f0b
                fprintf(stderr, "bad setsid - %s\n", strerror(errno));
Packit Service b38f0b
                goto sock_cleanup;
Packit Service b38f0b
            }
Packit Service b38f0b
Packit Service b38f0b
            /*
Packit Service b38f0b
             * if we are forked, we don't want to print out to stdout or stderr 
Packit Service b38f0b
             */
Packit Service b38f0b
            fd = open("/dev/null", O_RDWR);
Packit Service b38f0b
            if (fd >= 0) {
Packit Service b38f0b
                dup2(fd, STDIN_FILENO);
Packit Service b38f0b
                dup2(fd, STDOUT_FILENO);
Packit Service b38f0b
                dup2(fd, STDERR_FILENO);
Packit Service b38f0b
                close(fd);
Packit Service b38f0b
            }
Packit Service b38f0b
            break;
Packit Service b38f0b
Packit Service b38f0b
        default:
Packit Service b38f0b
            _exit(0);
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
#endif                          /* WIN32 */
Packit Service b38f0b
#if HAVE_GETPID
Packit Service b38f0b
    if (pid_file != NULL) {
Packit Service b38f0b
        if ((PID = fopen(pid_file, "w")) == NULL) {
Packit Service b38f0b
            snmp_log_perror("fopen");
Packit Service b38f0b
            goto sock_cleanup;
Packit Service b38f0b
        }
Packit Service b38f0b
        fprintf(PID, "%d\n", (int) getpid());
Packit Service b38f0b
        fclose(PID);
Packit Service b38f0b
        free_config_pidFile();
Packit Service b38f0b
    }
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    snmp_log(LOG_INFO, "NET-SNMP version %s\n", netsnmp_get_version());
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * ignore early sighup during startup
Packit Service b38f0b
     */
Packit Service b38f0b
    reconfig = 0;
Packit Service b38f0b
Packit Service b38f0b
#if HAVE_UNISTD_H
Packit Service b38f0b
#ifdef HAVE_SETGID
Packit Service b38f0b
    if ((gid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
				  NETSNMP_DS_AGENT_GROUPID)) > 0) {
Packit Service b38f0b
        DEBUGMSGTL(("snmptrapd/main", "Changing gid to %d.\n", gid));
Packit Service b38f0b
        if (setgid(gid) == -1
Packit Service b38f0b
#ifdef HAVE_SETGROUPS
Packit Service b38f0b
            || setgroups(1, (gid_t *)&gid) == -1
Packit Service b38f0b
#endif
Packit Service b38f0b
            ) {
Packit Service b38f0b
            snmp_log_perror("setgid failed");
Packit Service b38f0b
            if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
					NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
Packit Service b38f0b
                goto sock_cleanup;
Packit Service b38f0b
            }
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
#endif
Packit Service b38f0b
#ifdef HAVE_SETUID
Packit Service b38f0b
    if ((uid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
				  NETSNMP_DS_AGENT_USERID)) > 0) {
Packit Service b38f0b
        DEBUGMSGTL(("snmptrapd/main", "Changing uid to %d.\n", uid));
Packit Service b38f0b
        if (setuid(uid) == -1) {
Packit Service b38f0b
            snmp_log_perror("setuid failed");
Packit Service b38f0b
            if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
Packit Service b38f0b
					NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
Packit Service b38f0b
                goto sock_cleanup;
Packit Service b38f0b
            }
Packit Service b38f0b
        }
Packit Service b38f0b
    }
Packit Service b38f0b
#endif
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * Let systemd know we're up.
Packit Service b38f0b
     */
Packit Service b38f0b
#ifndef NETSNMP_NO_SYSTEMD
Packit Service b38f0b
    netsnmp_sd_notify(1, "READY=1\n");
Packit Service b38f0b
    if (prepared_sockets)
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Clear the environment variable, we already processed all the sockets
Packit Service b38f0b
         * by now.
Packit Service b38f0b
         */
Packit Service b38f0b
        netsnmp_sd_listen_fds(1);
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
    trapd_status = SNMPTRAPD_RUNNING;
Packit Service b38f0b
#endif
Packit Service b38f0b
Packit Service b38f0b
    snmptrapd_main_loop();
Packit Service b38f0b
Packit Service b38f0b
    if (snmp_get_do_logging()) {
Packit Service b38f0b
        struct tm      *tm;
Packit Service b38f0b
        time_t          timer;
Packit Service b38f0b
        time(&timer;;
Packit Service b38f0b
        tm = localtime(&timer;;
Packit Service b38f0b
        snmp_log(LOG_INFO,
Packit Service b38f0b
                "%.4d-%.2d-%.2d %.2d:%.2d:%.2d NET-SNMP version %s Stopped.\n",
Packit Service b38f0b
                 tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour,
Packit Service b38f0b
                 tm->tm_min, tm->tm_sec, netsnmp_get_version());
Packit Service b38f0b
    }
Packit Service b38f0b
    snmp_log(LOG_INFO, "Stopping snmptrapd\n");
Packit Service b38f0b
    
Packit Service b38f0b
#ifdef NETSNMP_EMBEDDED_PERL
Packit Service b38f0b
    shutdown_perl();
Packit Service b38f0b
#endif
Packit Service b38f0b
    snmptrapd_close_sessions(sess_list);
Packit Service b38f0b
    snmp_shutdown("snmptrapd");
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
    trapd_status = SNMPTRAPD_STOPPED;
Packit Service b38f0b
#endif
Packit Service b38f0b
    snmp_disable_log();
Packit Service b38f0b
Packit Service b38f0b
    exit_code = 0;
Packit Service b38f0b
Packit Service b38f0b
sock_cleanup:
Packit Service b38f0b
    SOCK_CLEANUP;
Packit Service b38f0b
Packit Service b38f0b
out:
Packit Service b38f0b
    return exit_code;
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
/*
Packit Service b38f0b
 * Read the configuration files. Implemented as a signal handler so that
Packit Service b38f0b
 * receipt of SIGHUP will cause configuration to be re-read when the
Packit Service b38f0b
 * trap daemon is running detatched from the console.
Packit Service b38f0b
 *
Packit Service b38f0b
 */
Packit Service b38f0b
void
Packit Service b38f0b
trapd_update_config(void)
Packit Service b38f0b
{
Packit Service b38f0b
    free_config();
Packit Service b38f0b
#ifdef USING_MIBII_VACM_CONF_MODULE
Packit Service b38f0b
    vacm_standard_views(0,0,NULL,NULL);
Packit Service b38f0b
#endif
Packit Service b38f0b
    read_configs();
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
/*
Packit Service b38f0b
 * Windows Service Related functions 
Packit Service b38f0b
 */
Packit Service b38f0b
#ifdef WIN32SERVICE
Packit Service b38f0b
/************************************************************
Packit Service b38f0b
* main function for Windows
Packit Service b38f0b
* Parse command line arguments for startup options,
Packit Service b38f0b
* to start as service or console mode application in windows.
Packit Service b38f0b
* Invokes appropriate startup functions depending on the 
Packit Service b38f0b
* parameters passed
Packit Service b38f0b
*************************************************************/
Packit Service b38f0b
int
Packit Service b38f0b
    __cdecl
Packit Service b38f0b
_tmain(int argc, TCHAR * argv[])
Packit Service b38f0b
{
Packit Service b38f0b
    /*
Packit Service b38f0b
     * Define Service Name and Description, which appears in windows SCM 
Packit Service b38f0b
     */
Packit Service b38f0b
    LPCTSTR         lpszServiceName = app_name_long;      /* Service Registry Name */
Packit Service b38f0b
    LPCTSTR         lpszServiceDisplayName = _T("Net-SNMP Trap Handler");       /* Display Name */
Packit Service b38f0b
    LPCTSTR         lpszServiceDescription =
Packit Service b38f0b
#ifdef IFDESCR
Packit Service b38f0b
        _T("SNMPv2c / SNMPv3 trap/inform receiver from Net-SNMP. Supports MIB objects for IP,ICMP,TCP,UDP, and network interface sub-layers.");
Packit Service b38f0b
#else
Packit Service b38f0b
        _T("SNMPv2c / SNMPv3 trap/inform receiver from Net-SNMP");
Packit Service b38f0b
#endif
Packit Service b38f0b
    InputParams     InputOptions;
Packit Service b38f0b
Packit Service b38f0b
    int             nRunType = RUN_AS_CONSOLE;
Packit Service b38f0b
    int             quiet = 0;
Packit Service b38f0b
Packit Service b38f0b
    nRunType = ParseCmdLineForServiceOption(argc, argv, &quiet);
Packit Service b38f0b
Packit Service b38f0b
    switch (nRunType) {
Packit Service b38f0b
    case REGISTER_SERVICE:
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Register As service 
Packit Service b38f0b
         */
Packit Service b38f0b
        InputOptions.Argc = argc;
Packit Service b38f0b
        InputOptions.Argv = argv;
Packit Service b38f0b
        exit (RegisterService(lpszServiceName,
Packit Service b38f0b
                        lpszServiceDisplayName,
Packit Service b38f0b
                        lpszServiceDescription, &InputOptions, quiet));
Packit Service b38f0b
        break;
Packit Service b38f0b
    case UN_REGISTER_SERVICE:
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Unregister service 
Packit Service b38f0b
         */
Packit Service b38f0b
        exit (UnregisterService(lpszServiceName, quiet));
Packit Service b38f0b
        exit(0);
Packit Service b38f0b
        break;
Packit Service b38f0b
    case RUN_AS_SERVICE:
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Run as service 
Packit Service b38f0b
         */
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Register Stop Function 
Packit Service b38f0b
         */
Packit Service b38f0b
        RegisterStopFunction(StopSnmpTrapd);
Packit Service b38f0b
        return RunAsService(SnmpTrapdMain);
Packit Service b38f0b
        break;
Packit Service b38f0b
    default:
Packit Service b38f0b
        /*
Packit Service b38f0b
         * Run in console mode 
Packit Service b38f0b
         */
Packit Service b38f0b
        return SnmpTrapdMain(argc, argv);
Packit Service b38f0b
        break;
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
/*
Packit Service b38f0b
 * To stop Snmp Trap Receiver daemon
Packit Service b38f0b
 * This portion is still not working
Packit Service b38f0b
 */
Packit Service b38f0b
void
Packit Service b38f0b
StopSnmpTrapd(void)
Packit Service b38f0b
{
Packit Service b38f0b
    /*
Packit Service b38f0b
     * Shut Down Service
Packit Service b38f0b
     */
Packit Service b38f0b
    term_handler(1);
Packit Service b38f0b
Packit Service b38f0b
    /*
Packit Service b38f0b
     * Wait till trap receiver is completely stopped 
Packit Service b38f0b
     */
Packit Service b38f0b
Packit Service b38f0b
    while (trapd_status != SNMPTRAPD_STOPPED) {
Packit Service b38f0b
        Sleep(100);
Packit Service b38f0b
    }
Packit Service b38f0b
}
Packit Service b38f0b
Packit Service b38f0b
#endif /*WIN32SERVICE*/