.TH SNMP_AGENT_API 3 "01 Aug 2002" VVERSIONINFO "Net-SNMP"
.SH NAME
snmp_agent_api \- embedding an agent into a external application
.SH SYNOPSIS
.nf
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

int
main (int argc, char *argv[])
{
  int agentx_subagent = 1;  /* Change this if you're a master agent.  */

  snmp_enable_stderrlog();

  /*  If we're an AgentX subagent...  */
  if (agentx_subagent) {
      /* ...make us an AgentX client.  */
      netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID,
                             NETSNMP_DS_AGENT_ROLE, 1);
  }

  init_agent("yourappname");

  /*  Initialize your MIB code here.  */
  init_my_mib_code();

  /*  `yourappname' will be used to read yourappname.conf files.  */
  init_snmp("yourappname");

  /*  If we're going to be a SNMP master agent...  */
  if (!agentx_subagent)
      init_master_agent();  /*  Listen on default port (161).  */

  /*  Your main loop here...  */
  while (whatever) {
      /* if you use select(), see snmp_api(3) */
      /*     --- OR ---  */
      agent_check_and_process(0); /* 0 == don't block */
  }

  /*  At shutdown time:  */
  snmp_shutdown("yourappname");
}

Then:
$(CC) ... `net-snmp-config --agent-libs`

.fi
.SH DESCRIPTION
.PP
Our goal is to create a easy to use interface to the Net-SNMP package
such that you can take code that you have written that has been
designed to be a Net-SNMP MIB module and embed it into an external
application where you can either chose to be a SNMP master agent or an
AgentX sub-agent using the same MIB module code.  Our suggestion is
that you use our (or another) SNMP agent as the AgentX master agent
and chose to become an AgentX subagent which then attaches to the
master.
.PP
The Net-SNMP package provides a pair of libraries that enables easy
embedding of an SNMP or AgentX agent into an external software
package. AgentX is an extensible protocol designed to allow multiple
SNMP sub-agents all run on one machine under a single SNMP master
agent.  It is defined in RFC 2741.
.PP
You will need to perform a few tasks in order to accomplish
this. First off, you will need to initialize both the SNMP library and
the SNMP agent library. As indicated above, this is done slightly
differently depending on whether or not you are going to perform as a
master agent or an AgentX sub-agent.
.SH CONFIGURATION
.PP
If you intend to operate as an AgentX sub-agent, you will have to
configured the Net-SNMP package with agentx support (which is turned
on by default, so just don't turn it off)
.PP
Additionally, you will need to link against the net-snmp libraries
(use the output of "net-snmp-config --agent-libs" to get a library
list) and call subagent_pre_init() as indicated above.
.SH COMPILING
.PP
In order to make use of any of the above API, you will need to link
against at least the four libraries listed above.
.SH FUNCTIONS
.PP This is a brief description of the functions called above and
where to find out more information on them.  It is certainly not a
complete list of what is available within all the net-snmp libraries. 
.IP "snmp_enable_stderrlog()"
Logs error output from the SNMP agent to the standard error stream.
.IP "netsnmp_ds_set_boolean()"
Please see the
.IR default_store(3)
manual page for more information
about this API.
.IP "init_agent(char *name)"
Initializes the embedded agent.  This should be called before the
.BR "init_snmp()"
call.  
.I name
is used to dictate what .conf file to read when
.BR "init_snmp()"
is called later.
.IP "init_snmp(char *name)"
Initializes the SNMP library.  Note that one of the things this will
do will be to read configuration files in an effort to configure your
application. It will attempt to read the configuration files named by
the
.I name
string that you passed in.  It can be used to configure access
control, for instance.   Please see the
.IR read_config(3) ", " snmp_config(5) ", and " snmpd.conf(5)
manual pages for further details on this subject.
.IP "init_master_agent(void)"
Initializes the master agent and causes it to listen for SNMP requests 
on its default UDP port of 161.
.IP "agent_check_and_process(int block)"
This checks for packets arriving on the SNMP port and processes them
if some are found.  If 
.I block
is non-zero, the function call will block until a packet arrives or an 
alarm must be run (see
.IR snmp_alarm(3) ).
The return value from this function is a positive integer if packets
were processed, zero if an alarm occurred and -1 if an error occured.
.IP "snmp_shutdown(char *name);"
This shuts down the agent, saving any needed persistent storage, etc.
.SH "SEE ALSO"
http://www.net-snmp.org/tutorial-5/toolkit/, select(2), snmp_api(3),
default_store(3), snmp_alarm(3), read_config(3), snmp_config(5),
snmpd.conf(5)
