Import of bsnmpd 1.6
This commit is contained in:
parent
f8a0b913e2
commit
8eecd77ad5
@ -1,3 +1,36 @@
|
||||
1.6
|
||||
New gensnmpdef tool. Needs libsmi.
|
||||
|
||||
Make build infrastructure more intelligent.
|
||||
|
||||
Fix a typo in the mibII counter retrival code.
|
||||
|
||||
Add a new field to struct snmp_node for snmp agents: tree_data.
|
||||
This field can be used by the application.
|
||||
|
||||
Fix a syntax error in the example configuration file (thanks to
|
||||
David J Duchscher).
|
||||
|
||||
Fix a long standing problem with the module loading code
|
||||
and a memory leak. When a module could not be loaded usually
|
||||
a core dump was generated. This was caused by wrong handling
|
||||
of malloced memory in the module table dependency. While
|
||||
fixing this problem it became obvious that dynamic allocated
|
||||
data which was held in a dependency could be lost, because
|
||||
there was no guarantee that the dependency handler ever was
|
||||
call (in case of an error in a SET handler or an earlier
|
||||
dependency in the same PDU) thus causing this memory to leak.
|
||||
To fix this a third dependency operation is introduced
|
||||
SNMP_DEPOP_FINISH which is invoked just before a dependency
|
||||
is freed at the very end of the SET PDU handling. This
|
||||
means also that finalizers (set_atfinish) can be converted
|
||||
to DEPOP_FINISH handler in almost all cases. The only case
|
||||
where this is not so easy is when a finializer was registered
|
||||
for a simple SET operation. In this case an artifical dependency
|
||||
would be needed. Because this seems to occure very seldom the
|
||||
snmp_set_atfinish() call is removed. Thanks to Paul-Henning Kamp
|
||||
for an initial fix for the core dump.
|
||||
|
||||
09-Dec-2003
|
||||
First step on factoring out the transport mapping stuff into
|
||||
loadable modules.
|
||||
|
@ -1 +1 @@
|
||||
1.5a
|
||||
1.6
|
||||
|
73
contrib/bsnmp/gensnmpdef/gensnmpdef.1
Normal file
73
contrib/bsnmp/gensnmpdef/gensnmpdef.1
Normal file
@ -0,0 +1,73 @@
|
||||
.\"
|
||||
.\" Copyright (c) 2004
|
||||
.\" Hartmut Brandt
|
||||
.\" All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution of this software and documentation and use in source and
|
||||
.\" binary forms, with or without modification, are permitted provided that
|
||||
.\" the following conditions are met:
|
||||
.\"
|
||||
.\" 1. Redistributions of source code or documentation must retain the above
|
||||
.\" copyright notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. Neither the name of the author nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
|
||||
.\" AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
.\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
.\" FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
.\" THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
.\" LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
.\" OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/gensnmpdef/gensnmpdef.1,v 1.1 2004/04/14 09:54:51 novo Exp $
|
||||
.\"
|
||||
.\" Author: Harti Brandt <harti@freebsd.org>
|
||||
.\"
|
||||
.Dd April 14, 2004
|
||||
.Dt gensnmpdef 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm gensnmpdef
|
||||
.Nd "generate a MIB description file from MIBs"
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl h
|
||||
.Op Fl c Ar cut
|
||||
.Ar name Op Ar ...
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
utility is used to create an initial MIB description file from
|
||||
one or more MIBs. The description file must be edited to be actually useful
|
||||
for feeding it into
|
||||
.Xr gensnmptree 1 .
|
||||
.Pp
|
||||
The
|
||||
.Fl c
|
||||
option specifies the number of initial sub-oids that should be omitted
|
||||
from the tree.
|
||||
.Xr gensnmptree 1
|
||||
automatically adds 1.3.6 in front of all OIDs so the default value
|
||||
of 3 is just correct in most cases.
|
||||
.Pp
|
||||
.Nm
|
||||
does no attempt on sorting the OID tree so in case of complex and
|
||||
non-standard MIBs it is necessay to sort the tree in the resulting definition
|
||||
file by hand.
|
||||
.Sh SEE ALSO
|
||||
.Xr snmpd 1
|
||||
.Sh BUGS
|
||||
The utility is by no means bullet-proof and may fail for complex
|
||||
or non-standard MIBs.
|
||||
Its output is expected to be edited by hand.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
433
contrib/bsnmp/gensnmpdef/gensnmpdef.c
Normal file
433
contrib/bsnmp/gensnmpdef/gensnmpdef.c
Normal file
@ -0,0 +1,433 @@
|
||||
/*
|
||||
* Copyright (c) 2004
|
||||
* Hartmut Brandt.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Author: Harti Brandt <harti@freebsd.org>
|
||||
*
|
||||
* Redistribution of this software and documentation and use in source and
|
||||
* binary forms, with or without modification, are permitted provided that
|
||||
* the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code or documentation must retain the above
|
||||
* copyright notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the author nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
|
||||
* AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
||||
* THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/gensnmpdef/gensnmpdef.c,v 1.2 2004/04/14 09:54:51 novo Exp $
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <assert.h>
|
||||
#include <smi.h>
|
||||
|
||||
static const char usgtxt[] =
|
||||
"Usage: gensnmpdef [-h] [-c <cut>] MIB [MIB ...]\n"
|
||||
"Options:\n"
|
||||
" -c specify the number of initial sub-oids to cut from the oids\n"
|
||||
" -h print this help\n"
|
||||
"MIBs are searched according to the libsmi(3) search rules and can\n"
|
||||
"be specified either by path or module name\n";
|
||||
|
||||
static SmiNode *last_node;
|
||||
static u_int cut = 3;
|
||||
|
||||
static void print_node(SmiNode *n, u_int level);
|
||||
|
||||
static void
|
||||
save_node(SmiNode *n)
|
||||
{
|
||||
if (n != NULL)
|
||||
last_node = n;
|
||||
}
|
||||
|
||||
static void
|
||||
pindent(u_int level)
|
||||
{
|
||||
if (level >= cut)
|
||||
printf("%*s", (level - cut) * 2, "");
|
||||
}
|
||||
|
||||
static void
|
||||
print_name(SmiNode *n)
|
||||
{
|
||||
char *p;
|
||||
|
||||
for (p = n->name; *p != '\0'; p++) {
|
||||
if (*p == '-')
|
||||
printf("_");
|
||||
else
|
||||
printf("%c", *p);
|
||||
}
|
||||
}
|
||||
|
||||
static u_int
|
||||
close_node(u_int n, u_int level)
|
||||
{
|
||||
while (n--) {
|
||||
pindent(level);
|
||||
level--;
|
||||
if (level >= cut)
|
||||
printf(")\n");
|
||||
}
|
||||
return (level);
|
||||
}
|
||||
|
||||
static u_int
|
||||
open_node(const SmiNode *n, u_int level, SmiNode **last)
|
||||
{
|
||||
SmiNode *n1;
|
||||
u_int i;
|
||||
|
||||
if (*last != NULL) {
|
||||
for (i = 0; i < (*last)->oidlen - 1; i++) {
|
||||
if (i >= n->oidlen) {
|
||||
level = close_node((*last)->oidlen -
|
||||
n->oidlen, level);
|
||||
break;
|
||||
}
|
||||
if ((*last)->oid[i] != n->oid[i])
|
||||
break;
|
||||
}
|
||||
if (i < (*last)->oidlen - 1)
|
||||
level = close_node((*last)->oidlen - 1 - i,
|
||||
level - 1) + 1;
|
||||
}
|
||||
|
||||
while (level < n->oidlen - 1) {
|
||||
if (level >= cut) {
|
||||
pindent(level);
|
||||
printf("(%u", n->oid[level]);
|
||||
n1 = smiGetNodeByOID(level + 1, n->oid);
|
||||
printf(" ");
|
||||
print_name(n1);
|
||||
printf("\n");
|
||||
}
|
||||
level++;
|
||||
}
|
||||
return (level);
|
||||
}
|
||||
|
||||
static const char *const type_names[] = {
|
||||
[SMI_BASETYPE_UNKNOWN] = "UNKNOWN_TYPE",
|
||||
[SMI_BASETYPE_INTEGER32] = "INTEGER",
|
||||
[SMI_BASETYPE_OCTETSTRING] = "OCTETSTRING",
|
||||
[SMI_BASETYPE_OBJECTIDENTIFIER] = "OID",
|
||||
[SMI_BASETYPE_UNSIGNED32] = "UNSIGNED32",
|
||||
[SMI_BASETYPE_INTEGER64] = "INTEGER64",
|
||||
[SMI_BASETYPE_UNSIGNED64] = "UNSIGNED64",
|
||||
[SMI_BASETYPE_FLOAT32] = "FLOAT32",
|
||||
[SMI_BASETYPE_FLOAT64] = "FLOAT64",
|
||||
[SMI_BASETYPE_FLOAT128] = "FLOAT128",
|
||||
[SMI_BASETYPE_ENUM] = "INTEGER",
|
||||
[SMI_BASETYPE_BITS] = "BITS",
|
||||
};
|
||||
|
||||
static const char *const type_map[] = {
|
||||
"Gauge32", "GAUGE",
|
||||
"Gauge", "GAUGE",
|
||||
"TimeTicks", "TIMETICKS",
|
||||
"Counter32", "COUNTER",
|
||||
"Counter", "COUNTER",
|
||||
"Counter64", "COUNTER64",
|
||||
"Integer32", "INTEGER32",
|
||||
"IpAddress", "IPADDRESS",
|
||||
NULL
|
||||
};
|
||||
|
||||
static void
|
||||
print_type(SmiNode *n)
|
||||
{
|
||||
SmiType *type;
|
||||
u_int m;
|
||||
|
||||
type = smiGetNodeType(n);
|
||||
assert(type != NULL);
|
||||
|
||||
if (type->name != NULL) {
|
||||
for (m = 0; type_map[m] != NULL; m += 2)
|
||||
if (strcmp(type_map[m], type->name) == 0) {
|
||||
printf("%s", type_map[m + 1]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
printf("%s", type_names[type->basetype]);
|
||||
}
|
||||
|
||||
static void
|
||||
print_access(SmiAccess a)
|
||||
{
|
||||
if (a == SMI_ACCESS_READ_ONLY)
|
||||
printf(" GET");
|
||||
else if (a == SMI_ACCESS_READ_WRITE)
|
||||
printf(" GET SET");
|
||||
}
|
||||
|
||||
static void
|
||||
print_scalar(SmiNode *n, u_int level)
|
||||
{
|
||||
SmiNode *p;
|
||||
|
||||
assert (n->nodekind == SMI_NODEKIND_SCALAR);
|
||||
|
||||
save_node(n);
|
||||
|
||||
pindent(level);
|
||||
printf("(%u ", n->oid[level]);
|
||||
print_name(n);
|
||||
printf(" ");
|
||||
print_type(n);
|
||||
|
||||
/* generate the operation from the parent node name */
|
||||
p = smiGetParentNode(n);
|
||||
printf(" op_%s", p->name);
|
||||
|
||||
print_access(n->access);
|
||||
|
||||
printf(")\n");
|
||||
}
|
||||
|
||||
static void
|
||||
print_notification(SmiNode *n, u_int level)
|
||||
{
|
||||
|
||||
assert (n->nodekind == SMI_NODEKIND_NOTIFICATION);
|
||||
|
||||
save_node(n);
|
||||
|
||||
pindent(level);
|
||||
printf("(%u ", n->oid[level]);
|
||||
print_name(n);
|
||||
printf(" OID");
|
||||
|
||||
printf(" op_%s)\n", n->name);
|
||||
}
|
||||
|
||||
static void
|
||||
print_col(SmiNode *n, u_int level)
|
||||
{
|
||||
assert (n->nodekind == SMI_NODEKIND_COLUMN);
|
||||
|
||||
save_node(n);
|
||||
|
||||
pindent(level);
|
||||
printf("(%u ", n->oid[level]);
|
||||
print_name(n);
|
||||
printf(" ");
|
||||
print_type(n);
|
||||
print_access(n->access);
|
||||
printf(")\n");
|
||||
}
|
||||
|
||||
static void
|
||||
print_index(SmiNode *row)
|
||||
{
|
||||
SmiElement *e;
|
||||
|
||||
e = smiGetFirstElement(row);
|
||||
while (e != NULL) {
|
||||
printf(" ");
|
||||
print_type(smiGetElementNode(e));
|
||||
e = smiGetNextElement(e);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_table(SmiNode *n, u_int level)
|
||||
{
|
||||
SmiNode *row, *col, *rel;
|
||||
|
||||
assert (n->nodekind == SMI_NODEKIND_TABLE);
|
||||
|
||||
save_node(n);
|
||||
|
||||
pindent(level);
|
||||
printf("(%u ", n->oid[level]);
|
||||
print_name(n);
|
||||
printf("\n");
|
||||
|
||||
row = smiGetFirstChildNode(n);
|
||||
if (row->nodekind != SMI_NODEKIND_ROW)
|
||||
errx(1, "%s: kind %u, not row", __func__, row->nodekind);
|
||||
|
||||
save_node(n);
|
||||
|
||||
pindent(level + 1);
|
||||
printf("(%u ", row->oid[level + 1]);
|
||||
print_name(row);
|
||||
printf(" :");
|
||||
|
||||
/* index */
|
||||
rel = smiGetRelatedNode(row);
|
||||
switch (row->indexkind) {
|
||||
|
||||
case SMI_INDEX_INDEX:
|
||||
print_index(row);
|
||||
break;
|
||||
|
||||
case SMI_INDEX_AUGMENT:
|
||||
if (rel == NULL)
|
||||
errx(1, "%s: cannot find augemented table", row->name);
|
||||
print_index(rel);
|
||||
break;
|
||||
|
||||
default:
|
||||
errx(1, "%s: cannot handle index kind %u", row->name,
|
||||
row->indexkind);
|
||||
}
|
||||
|
||||
printf(" op_%s", n->name);
|
||||
printf("\n");
|
||||
|
||||
col = smiGetFirstChildNode(row);
|
||||
while (col != NULL) {
|
||||
print_col(col, level + 2);
|
||||
col = smiGetNextChildNode(col);
|
||||
}
|
||||
pindent(level + 1);
|
||||
printf(")\n");
|
||||
|
||||
pindent(level);
|
||||
printf(")\n");
|
||||
}
|
||||
|
||||
static void
|
||||
print_it(SmiNode *n, u_int level)
|
||||
{
|
||||
switch (n->nodekind) {
|
||||
|
||||
case SMI_NODEKIND_NODE:
|
||||
print_node(n, level);
|
||||
break;
|
||||
|
||||
case SMI_NODEKIND_SCALAR:
|
||||
print_scalar(n, level);
|
||||
break;
|
||||
|
||||
case SMI_NODEKIND_TABLE:
|
||||
print_table(n, level);
|
||||
break;
|
||||
|
||||
case SMI_NODEKIND_COMPLIANCE:
|
||||
case SMI_NODEKIND_GROUP:
|
||||
save_node(n);
|
||||
break;
|
||||
|
||||
case SMI_NODEKIND_NOTIFICATION:
|
||||
print_notification(n, level);
|
||||
break;
|
||||
|
||||
default:
|
||||
errx(1, "cannot handle %u nodes", n->nodekind);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
print_node(SmiNode *n, u_int level)
|
||||
{
|
||||
assert (n->nodekind == SMI_NODEKIND_NODE);
|
||||
|
||||
save_node(n);
|
||||
|
||||
pindent(level);
|
||||
printf("(%u ", n->oid[level]);
|
||||
print_name(n);
|
||||
printf("\n");
|
||||
|
||||
n = smiGetFirstChildNode(n);
|
||||
while (n != NULL) {
|
||||
print_it(n, level + 1);
|
||||
n = smiGetNextChildNode(n);
|
||||
}
|
||||
pindent(level);
|
||||
printf(")\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int opt;
|
||||
int flags;
|
||||
SmiModule **mods;
|
||||
char *name;
|
||||
SmiNode *n, *last;
|
||||
u_int level;
|
||||
long u;
|
||||
char *end;
|
||||
|
||||
smiInit(NULL);
|
||||
|
||||
while ((opt = getopt(argc, argv, "c:h")) != -1)
|
||||
switch (opt) {
|
||||
|
||||
case 'c':
|
||||
errno = 0;
|
||||
u = strtol(optarg, &end, 10);
|
||||
if (errno != 0)
|
||||
err(1, "argument to -c");
|
||||
if (*end != '\0')
|
||||
err(1, "%s: not a number", optarg);
|
||||
if (u < 0 || u > 5)
|
||||
err(1, "%s: out of range", optarg);
|
||||
cut = (u_int)u;
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
fprintf(stderr, usgtxt);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
argc -= optind;
|
||||
argv += optind;
|
||||
|
||||
flags = smiGetFlags();
|
||||
flags |= SMI_FLAG_ERRORS;
|
||||
smiSetFlags(flags);
|
||||
|
||||
mods = malloc(sizeof(mods[0]) * argc);
|
||||
if (mods == NULL)
|
||||
err(1, NULL);
|
||||
|
||||
for (opt = 0; opt < argc; opt++) {
|
||||
if ((name = smiLoadModule(argv[opt])) == NULL)
|
||||
err(1, "%s: cannot load", argv[opt]);
|
||||
mods[opt] = smiGetModule(name);
|
||||
}
|
||||
level = 0;
|
||||
last = NULL;
|
||||
for (opt = 0; opt < argc; opt++) {
|
||||
n = smiGetFirstNode(mods[opt], SMI_NODEKIND_ANY);
|
||||
for (;;) {
|
||||
level = open_node(n, level, &last);
|
||||
print_it(n, level);
|
||||
last = n;
|
||||
|
||||
if (last_node == NULL ||
|
||||
(n = smiGetNextNode(last_node, SMI_NODEKIND_ANY))
|
||||
== NULL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
level = close_node(last->oidlen - 1, level - 1);
|
||||
return (0);
|
||||
}
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/gensnmptree/gensnmptree.c,v 1.36 2003/12/03 09:56:57 hbb Exp $
|
||||
* $Begemot: bsnmp/gensnmptree/gensnmptree.c,v 1.37 2004/04/13 15:18:15 novo Exp $
|
||||
*
|
||||
* Generate OID table from table description.
|
||||
*
|
||||
@ -522,7 +522,7 @@ gen_node(struct node *np, struct asn_oid *oid, u_int idx, const char *func)
|
||||
fprintf(fp, "0");
|
||||
if (np->flags & FL_SET)
|
||||
fprintf(fp, "|SNMP_NODE_CANSET");
|
||||
fprintf(fp, ", %#x, NULL },\n", idx);
|
||||
fprintf(fp, ", %#x, NULL, NULL },\n", idx);
|
||||
oid->len--;
|
||||
return;
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/lib/asn1.3,v 1.3 2003/12/02 15:45:48 hbb Exp $
|
||||
.\" $Begemot: bsnmp/lib/asn1.3,v 1.4 2004/04/13 17:01:31 novo Exp $
|
||||
.\"
|
||||
.Dd August 15, 2002
|
||||
.Dt asn1 3
|
||||
@ -481,4 +481,4 @@ followed by the error message and an optional dump of the buffer.
|
||||
This implementation conforms to the applicable IETF RFCs and ITU-T
|
||||
recommendations.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq brandt@fokus.gmd.de
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
||||
|
@ -30,14 +30,14 @@
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/lib/bsnmpagent.3,v 1.2 2003/12/02 16:13:45 hbb Exp $
|
||||
.\" $Begemot: bsnmp/lib/bsnmpagent.3,v 1.5 2004/04/13 17:01:31 novo Exp $
|
||||
.\"
|
||||
.Dd August 16, 2002
|
||||
.Dt bsnmpagent 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm bsnmpagent
|
||||
.Nm snmp_depop_t ,
|
||||
.Nm snmp_set_finish_t ,
|
||||
.Nm snmp_op_t ,
|
||||
.Nm tree ,
|
||||
.Nm tree_size ,
|
||||
@ -49,10 +49,10 @@
|
||||
.Nm snmp_set ,
|
||||
.Nm snmp_make_errresp ,
|
||||
.Nm snmp_dep_lookup ,
|
||||
.Nm snmp_set_atfinish ,
|
||||
.Nm snmp_init_context ,
|
||||
.Nm snmp_dep_commit ,
|
||||
.Nm snmp_dep_rollback
|
||||
.Nm snmp_dep_rollback ,
|
||||
.Nm snmp_dep_finish
|
||||
.Nd "SNMP agent library"
|
||||
.Sh LIBRARY
|
||||
Begemot SNMP library
|
||||
@ -63,8 +63,6 @@ Begemot SNMP library
|
||||
.In snmpagent.h
|
||||
.Ft typedef int
|
||||
.Fn (*snmp_depop_t) "struct snmp_context *ctx" "struct snmp_dependency *dep" "enum snmp_depop op"
|
||||
.Ft typedef void
|
||||
.Fn (*snmp_set_finish_t) "struct snmp_context *ctx" "int fail" "void *uarg"
|
||||
.Ft typedef int
|
||||
.Fn (*snmp_op_t) "struct snmp_context *ctx" "struct snmp_value *val" "u_int len" "u_int idx" "enum snmp_op op"
|
||||
.Vt extern struct snmp_node *tree ;
|
||||
@ -83,14 +81,14 @@ Begemot SNMP library
|
||||
.Fn snmp_make_errresp "const struct snmp_pdu *pdu" "struct asn_buf *req_b" "struct asn_buf *resp_b"
|
||||
.Ft struct snmp_dependency *
|
||||
.Fn snmp_dep_lookup "struct snmp_context *ctx" "const struct asn_oid *base" "const struct asn_oid *idx" "size_t alloc" "snmp_depop_t func"
|
||||
.Ft int
|
||||
.Fn snmp_set_atfinish "struct snmp_context *ctx" "snmp_set_finish_t func" "void *uarg"
|
||||
.Ft struct snmp_context *
|
||||
.Fn snmp_init_context "void"
|
||||
.Ft int
|
||||
.Fn snmp_dep_commit "struct snmp_context *ctx"
|
||||
.Ft int
|
||||
.Fn snmp_dep_rollback "struct snmp_context *ctx"
|
||||
.Ft void
|
||||
.Fn snmp_dep_finish "struct snmp_context *ctx"
|
||||
.Sh DESCRIPTION
|
||||
The SNMP library contains routines to easily build SNMP agent applications
|
||||
that use SNMP versions 1 or 2. Note, however, that it may be even easier to
|
||||
@ -121,6 +119,7 @@ struct snmp_node {
|
||||
u_int flags;
|
||||
u_int32_t index; /* index data */
|
||||
void *data; /* application data */
|
||||
void *tree_data; /* application data */
|
||||
};
|
||||
.Ed
|
||||
.Pp
|
||||
@ -233,6 +232,7 @@ struct snmp_context {
|
||||
struct snmp_scratch *scratch;
|
||||
struct snmp_dependency *dep;
|
||||
void *data; /* user data */
|
||||
enum snmp_ret code; /* return code */
|
||||
};
|
||||
|
||||
struct snmp_scratch {
|
||||
@ -334,7 +334,10 @@ the callbacks is ignored (an error message is generated via
|
||||
.Fn snmp_error ).
|
||||
.It
|
||||
Now the dependencies are freed and the finalizers are called
|
||||
with a fail flag of 0. Then the function returns
|
||||
with a fail flag of 0. For each dependency just before freeing it
|
||||
its callback is called with
|
||||
.Li SNMP_DEPOP_FINISH.
|
||||
Then the function returns
|
||||
.Li SNMP_ERR_OK .
|
||||
.El
|
||||
.Pp
|
||||
@ -362,19 +365,11 @@ When all SNMP_OP_SET operations have succeeded the dependencies are executed.
|
||||
At this stage the dependency callback has all information about the given
|
||||
table row that was available in this SET PDU and can operate accordingly.
|
||||
.Pp
|
||||
If a SNMP_OP_SET operation fails, the dependency callbacks are never
|
||||
called. The nodes SNMP_OP_ROLLBACK operations have to ensure, that
|
||||
any dynamically allocated data is freed.
|
||||
.Pp
|
||||
Finalizers are a
|
||||
.Sq last change
|
||||
to do processing.
|
||||
They are called after everything has been done, just before returning to the
|
||||
user. They get a flag, that tells them, whether the return to the user is a good
|
||||
one or not. The typical use is to finally remove deleted table elements.
|
||||
Finalizers are created with
|
||||
.Fn snmp_set_atfinish
|
||||
which takes the callback function and a user data pointer as argument.
|
||||
It is guaranteed that each dependency callback is executed at minimum once
|
||||
- with an operation of
|
||||
.Li SNMP_OP_ROLLBACK .
|
||||
This ensures that all dynamically allocated resources in a callback can be
|
||||
freed correctly.
|
||||
.Pp
|
||||
The function
|
||||
.Fn snmp_make_errresp
|
||||
@ -385,7 +380,7 @@ the bindings field from the original PDUs buffer directly to the response
|
||||
PDU and thus does not depend on the decodability of this field. It may return
|
||||
the same values as the operation functions.
|
||||
.Pp
|
||||
The next three functions allow some parts of the SET operation to be executed.
|
||||
The next four functions allow some parts of the SET operation to be executed.
|
||||
This is only used in
|
||||
.Xr snmpd 1
|
||||
to implement the configuration as a single transaction.
|
||||
@ -400,6 +395,9 @@ The function
|
||||
.Fn snmp_dep_rollback
|
||||
executes SNMP_DEPOP_ROLLBACK starting at the previous of the current
|
||||
dependency in the context.
|
||||
The function
|
||||
.Fn snmp_dep_finish
|
||||
executes SNMP_DEPOP_FINISH for all dependencies.
|
||||
.Sh DIAGNOSTICS
|
||||
If an error occures in any of the function an error indication as described
|
||||
above is returned. Additionally the functions may call snmp_error on unexected
|
||||
@ -414,4 +412,4 @@ errors.
|
||||
This implementation conforms to the applicable IETF RFCs and ITU-T
|
||||
recommendations.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq brandt@fokus.gmd.de
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/lib/bsnmpclient.3,v 1.5 2003/12/08 17:11:58 hbb Exp $
|
||||
.\" $Begemot: bsnmp/lib/bsnmpclient.3,v 1.6 2004/04/13 17:01:31 novo Exp $
|
||||
.\"
|
||||
.Dd August 15, 2002
|
||||
.Dt bsnmpclient 3
|
||||
@ -592,5 +592,5 @@ filed of
|
||||
This implementation conforms to the applicable IETF RFCs and ITU-T
|
||||
recommendations.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq brandt@fokus.gmd.de
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
||||
.An Kendy Kutzner Aq kutzner@fokus.gmd.de
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/lib/bsnmplib.3,v 1.3 2003/12/02 16:14:28 hbb Exp $
|
||||
.\" $Begemot: bsnmp/lib/bsnmplib.3,v 1.4 2004/04/13 17:01:31 novo Exp $
|
||||
.\"
|
||||
.Dd August 15, 2002
|
||||
.Dt bsnmplib 3
|
||||
@ -303,4 +303,4 @@ Encoding failed.
|
||||
This implementation conforms to the applicable IETF RFCs and ITU-T
|
||||
recommendations.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq brandt@fokus.gmd.de
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/lib/snmpagent.c,v 1.16 2003/12/03 09:55:58 hbb Exp $
|
||||
* $Begemot: bsnmp/lib/snmpagent.c,v 1.17 2004/04/13 14:58:46 novo Exp $
|
||||
*
|
||||
* SNMP Agent functions
|
||||
*/
|
||||
@ -68,23 +68,12 @@ struct depend {
|
||||
};
|
||||
TAILQ_HEAD(depend_list, depend);
|
||||
|
||||
/*
|
||||
* Structure to hold atfinish functions during SET processing.
|
||||
*/
|
||||
struct finish {
|
||||
STAILQ_ENTRY(finish) link;
|
||||
snmp_set_finish_t func;
|
||||
void *arg;
|
||||
};
|
||||
STAILQ_HEAD(finish_list, finish);
|
||||
|
||||
/*
|
||||
* Set context
|
||||
*/
|
||||
struct context {
|
||||
struct snmp_context ctx;
|
||||
struct depend_list dlist;
|
||||
struct finish_list flist;
|
||||
const struct snmp_node *node[SNMP_MAX_BINDINGS];
|
||||
struct snmp_scratch scratch[SNMP_MAX_BINDINGS];
|
||||
struct depend *depend;
|
||||
@ -108,7 +97,6 @@ snmp_init_context(void)
|
||||
|
||||
memset(context, 0, sizeof(*context));
|
||||
TAILQ_INIT(&context->dlist);
|
||||
STAILQ_INIT(&context->flist);
|
||||
|
||||
return (&context->ctx);
|
||||
}
|
||||
@ -621,6 +609,20 @@ snmp_dep_rollback(struct snmp_context *ctx)
|
||||
return (ret1);
|
||||
}
|
||||
|
||||
void
|
||||
snmp_dep_finish(struct snmp_context *ctx)
|
||||
{
|
||||
struct context *context = (struct context *)ctx;
|
||||
struct depend *d;
|
||||
|
||||
while ((d = TAILQ_FIRST(&context->dlist)) != NULL) {
|
||||
ctx->dep = &d->dep;
|
||||
(void)d->func(ctx, ctx->dep, SNMP_DEPOP_FINISH);
|
||||
TAILQ_REMOVE(&context->dlist, d, link);
|
||||
free(d);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Do a SET operation.
|
||||
*/
|
||||
@ -630,18 +632,14 @@ snmp_set(struct snmp_pdu *pdu, struct asn_buf *resp_b,
|
||||
{
|
||||
int ret;
|
||||
u_int i;
|
||||
enum snmp_ret code;
|
||||
enum asn_err asnerr;
|
||||
struct context context;
|
||||
const struct snmp_node *np;
|
||||
struct finish *f;
|
||||
struct depend *d;
|
||||
struct snmp_value *b;
|
||||
enum snmp_syntax except;
|
||||
|
||||
memset(&context, 0, sizeof(context));
|
||||
TAILQ_INIT(&context.dlist);
|
||||
STAILQ_INIT(&context.flist);
|
||||
context.ctx.data = data;
|
||||
|
||||
memset(resp, 0, sizeof(*resp));
|
||||
@ -739,7 +737,7 @@ snmp_set(struct snmp_pdu *pdu, struct asn_buf *resp_b,
|
||||
resp->nbindings++;
|
||||
}
|
||||
|
||||
code = SNMP_RET_OK;
|
||||
context.ctx.code = SNMP_RET_OK;
|
||||
|
||||
/*
|
||||
* 2. Call the SET method for each node. If a SET fails, rollback
|
||||
@ -811,7 +809,7 @@ snmp_set(struct snmp_pdu *pdu, struct asn_buf *resp_b,
|
||||
rollback(&context, pdu, i);
|
||||
snmp_pdu_free(resp);
|
||||
|
||||
code = SNMP_RET_ERR;
|
||||
context.ctx.code = SNMP_RET_ERR;
|
||||
|
||||
goto errout;
|
||||
}
|
||||
@ -836,7 +834,7 @@ snmp_set(struct snmp_pdu *pdu, struct asn_buf *resp_b,
|
||||
rollback(&context, pdu, i);
|
||||
snmp_pdu_free(resp);
|
||||
|
||||
code = SNMP_RET_ERR;
|
||||
context.ctx.code = SNMP_RET_ERR;
|
||||
|
||||
goto errout;
|
||||
}
|
||||
@ -868,31 +866,19 @@ snmp_set(struct snmp_pdu *pdu, struct asn_buf *resp_b,
|
||||
if (snmp_fix_encoding(resp_b, resp) != SNMP_CODE_OK) {
|
||||
snmp_error("set: fix_encoding failed");
|
||||
snmp_pdu_free(resp);
|
||||
code = SNMP_RET_IGN;
|
||||
context.ctx.code = SNMP_RET_IGN;
|
||||
}
|
||||
|
||||
/*
|
||||
* Done
|
||||
*/
|
||||
errout:
|
||||
while ((d = TAILQ_FIRST(&context.dlist)) != NULL) {
|
||||
TAILQ_REMOVE(&context.dlist, d, link);
|
||||
free(d);
|
||||
}
|
||||
|
||||
/*
|
||||
* call finish function
|
||||
*/
|
||||
while ((f = STAILQ_FIRST(&context.flist)) != NULL) {
|
||||
STAILQ_REMOVE_HEAD(&context.flist, link);
|
||||
(*f->func)(&context.ctx, code != SNMP_RET_OK, f->arg);
|
||||
free(f);
|
||||
}
|
||||
snmp_dep_finish(&context.ctx);
|
||||
|
||||
if (TR(SET))
|
||||
snmp_debug("set: returning %d", code);
|
||||
snmp_debug("set: returning %d", context.ctx.code);
|
||||
|
||||
return (code);
|
||||
return (context.ctx.code);
|
||||
}
|
||||
/*
|
||||
* Lookup a dependency. If it doesn't exist, create one
|
||||
@ -940,26 +926,6 @@ snmp_dep_lookup(struct snmp_context *ctx, const struct asn_oid *obj,
|
||||
return (&d->dep);
|
||||
}
|
||||
|
||||
/*
|
||||
* Register a finish function.
|
||||
*/
|
||||
int
|
||||
snmp_set_atfinish(struct snmp_context *ctx, snmp_set_finish_t func, void *arg)
|
||||
{
|
||||
struct context *context;
|
||||
struct finish *f;
|
||||
|
||||
context = (struct context *)(void *)
|
||||
((char *)ctx - offsetof(struct context, ctx));
|
||||
if ((f = malloc(sizeof(struct finish))) == NULL)
|
||||
return (-1);
|
||||
f->func = func;
|
||||
f->arg = arg;
|
||||
STAILQ_INSERT_TAIL(&context->flist, f, link);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Make an error response from a PDU. We do this without decoding the
|
||||
* variable bindings. This means we can sent the junk back to a caller
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/lib/snmpagent.h,v 1.10 2003/12/03 09:55:58 hbb Exp $
|
||||
* $Begemot: bsnmp/lib/snmpagent.h,v 1.12 2004/04/13 15:18:15 novo Exp $
|
||||
*
|
||||
* Header file for SNMP functions. This requires snmp.h to be included.
|
||||
*/
|
||||
@ -39,12 +39,22 @@
|
||||
|
||||
struct snmp_dependency;
|
||||
|
||||
enum snmp_ret {
|
||||
/* OK, generate a response */
|
||||
SNMP_RET_OK = 0,
|
||||
/* Error, ignore packet (no response) */
|
||||
SNMP_RET_IGN = 1,
|
||||
/* Error, generate response from original packet */
|
||||
SNMP_RET_ERR = 2
|
||||
};
|
||||
|
||||
/* Semi-Opaque object for SET operations */
|
||||
struct snmp_context {
|
||||
u_int var_index;
|
||||
struct snmp_scratch *scratch;
|
||||
struct snmp_dependency *dep;
|
||||
void *data; /* user data */
|
||||
enum snmp_ret code; /* return code */
|
||||
};
|
||||
|
||||
struct snmp_scratch {
|
||||
@ -56,7 +66,8 @@ struct snmp_scratch {
|
||||
|
||||
enum snmp_depop {
|
||||
SNMP_DEPOP_COMMIT,
|
||||
SNMP_DEPOP_ROLLBACK
|
||||
SNMP_DEPOP_ROLLBACK,
|
||||
SNMP_DEPOP_FINISH
|
||||
};
|
||||
|
||||
typedef int (*snmp_depop_t)(struct snmp_context *, struct snmp_dependency *,
|
||||
@ -67,11 +78,6 @@ struct snmp_dependency {
|
||||
struct asn_oid idx;
|
||||
};
|
||||
|
||||
/*
|
||||
* Functions to be called at the end of a SET operation.
|
||||
*/
|
||||
typedef void (*snmp_set_finish_t)(struct snmp_context *, int fail, void *);
|
||||
|
||||
/*
|
||||
* The TREE
|
||||
*/
|
||||
@ -88,15 +94,6 @@ enum snmp_op {
|
||||
SNMP_OP_ROLLBACK,
|
||||
};
|
||||
|
||||
enum snmp_ret {
|
||||
/* OK, generate a response */
|
||||
SNMP_RET_OK = 0,
|
||||
/* Error, ignore packet (no response) */
|
||||
SNMP_RET_IGN = 1,
|
||||
/* Error, generate response from original packet */
|
||||
SNMP_RET_ERR = 2
|
||||
};
|
||||
|
||||
typedef int (*snmp_op_t)(struct snmp_context *, struct snmp_value *,
|
||||
u_int, u_int, enum snmp_op);
|
||||
|
||||
@ -109,6 +106,7 @@ struct snmp_node {
|
||||
u_int flags;
|
||||
u_int32_t index; /* index data */
|
||||
void *data; /* application data */
|
||||
void *tree_data; /* application data */
|
||||
};
|
||||
extern struct snmp_node *tree;
|
||||
extern u_int tree_size;
|
||||
@ -150,10 +148,9 @@ enum snmp_ret snmp_make_errresp(const struct snmp_pdu *, struct asn_buf *,
|
||||
struct snmp_dependency *snmp_dep_lookup(struct snmp_context *,
|
||||
const struct asn_oid *, const struct asn_oid *, size_t, snmp_depop_t);
|
||||
|
||||
int snmp_set_atfinish(struct snmp_context *, snmp_set_finish_t func, void *arg);
|
||||
|
||||
struct snmp_context *snmp_init_context(void);
|
||||
int snmp_dep_commit(struct snmp_context *);
|
||||
int snmp_dep_rollback(struct snmp_context *);
|
||||
void snmp_dep_finish(struct snmp_context *);
|
||||
|
||||
#endif
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmp_mibII/mibII.c,v 1.17 2003/12/03 10:01:19 hbb Exp $
|
||||
* $Begemot: bsnmp/snmp_mibII/mibII.c,v 1.18 2004/04/13 14:58:46 novo Exp $
|
||||
*
|
||||
* Implementation of the standard interfaces and ip MIB.
|
||||
*/
|
||||
@ -466,7 +466,7 @@ get_physaddr(struct mibif *ifp, struct sockaddr_dl *sdl, u_char *ptr)
|
||||
|
||||
if (sdl->sdl_alen == 0) {
|
||||
/* no address */
|
||||
if (ifp->physaddrlen != NULL) {
|
||||
if (ifp->physaddrlen != 0) {
|
||||
if ((rcv = mib_find_rcvaddr(ifp->index, ifp->physaddr,
|
||||
ifp->physaddrlen)) != NULL)
|
||||
mib_rcvaddr_delete(rcv);
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmp_mibII/mibII_interfaces.c,v 1.10 2003/12/03 10:01:19 hbb Exp $
|
||||
* $Begemot: bsnmp/snmp_mibII/mibII_interfaces.c,v 1.12 2004/04/13 15:19:59 novo Exp $
|
||||
*
|
||||
* Interfaces group.
|
||||
*/
|
||||
@ -132,6 +132,9 @@ ifchange_func(struct snmp_context *ctx __unused, struct snmp_dependency *dep,
|
||||
ifp->trap_enable = ifc->rb_traps;
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
case SNMP_DEPOP_FINISH:
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
}
|
||||
abort();
|
||||
}
|
||||
@ -470,7 +473,7 @@ op_ifxtable(struct snmp_context *ctx, struct snmp_value *value,
|
||||
case LEAF_ifHCOutOctets:
|
||||
if (!(ifp->flags & MIBIF_HIGHSPEED))
|
||||
goto again;
|
||||
value->v.counter64 = ifp->hc_inoctets;
|
||||
value->v.counter64 = ifp->hc_outoctets;
|
||||
break;
|
||||
|
||||
case LEAF_ifHCOutUcastPkts:
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmp_mibII/mibII_ipaddr.c,v 1.7 2003/12/03 10:01:19 hbb Exp $
|
||||
* $Begemot: bsnmp/snmp_mibII/mibII_ipaddr.c,v 1.8 2004/04/13 14:58:46 novo Exp $
|
||||
*
|
||||
* IP address table. This table is writeable!
|
||||
*
|
||||
@ -137,36 +137,17 @@ modify(struct update *upd, struct mibifa *ifa)
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
|
||||
/*
|
||||
* Remove an IP address from an interface. This is called when
|
||||
* the SET finishes.
|
||||
*/
|
||||
static void
|
||||
destroy_func(struct snmp_context *ctx __unused, int fail __unused, void *arg)
|
||||
{
|
||||
struct mibifa *ifa = arg;
|
||||
|
||||
if (ifa->flags & MIBIFA_DESTROYED) {
|
||||
TAILQ_REMOVE(&mibifa_list, ifa, link);
|
||||
free(ifa);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Destroy the given row in the table. We remove the address from the
|
||||
* system, but keep the structure around for the COMMIT. It's deleted
|
||||
* only in the finish function.
|
||||
* only in the FINISH operation.
|
||||
*/
|
||||
static int
|
||||
destroy(struct snmp_context *ctx, struct update *upd, struct mibifa *ifa)
|
||||
destroy(struct snmp_context *ctx __unused, struct update *upd,
|
||||
struct mibifa *ifa)
|
||||
{
|
||||
if (mib_destroy_ifa(ifa))
|
||||
return (SNMP_ERR_GENERR);
|
||||
if (snmp_set_atfinish(ctx, destroy_func, ifa)) {
|
||||
syslog(LOG_ERR, "atfinish: %m");
|
||||
mib_undestroy_ifa(ifa);
|
||||
return (SNMP_ERR_GENERR);
|
||||
}
|
||||
upd->rb |= RB_DESTROY;
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
@ -219,6 +200,15 @@ update_func(struct snmp_context *ctx, struct snmp_dependency *dep,
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
case SNMP_DEPOP_FINISH:
|
||||
if ((upd->rb & RB_DESTROY) &&
|
||||
(ifa = mib_find_ifa(upd->addr)) != NULL &&
|
||||
(ifa->flags & MIBIFA_DESTROYED)) {
|
||||
TAILQ_REMOVE(&mibifa_list, ifa, link);
|
||||
free(ifa);
|
||||
}
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
abort();
|
||||
}
|
||||
|
@ -30,12 +30,13 @@
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/snmp_mibII/snmp_mibII.3,v 1.2 2003/12/03 10:01:19 hbb Exp $
|
||||
.\" $Begemot: bsnmp/snmp_mibII/snmp_mibII.3,v 1.3 2004/04/13 17:01:31 novo Exp $
|
||||
.\"
|
||||
.Dd August 19, 2002
|
||||
.Dt snmp_mibII 3
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm mibII ,
|
||||
.Nm mibif_notify_f ,
|
||||
.Nm mib_netsock ,
|
||||
.Nm mib_if_set_dyn ,
|
||||
@ -61,7 +62,7 @@
|
||||
.Nm mibif_unnotify
|
||||
.Nd "mib-2 module for snmpd.
|
||||
.Sh LIBRARY
|
||||
.Pq begemotSnmpdModulePath."mibII" = "/usr/local/lib/snmp_mibII.so"
|
||||
.Pq begemotSnmpdModulePath."mibII" = "@MODPATH@snmp_mibII.so"
|
||||
.Sh SYNOPSIS
|
||||
.In bsnmp/snmpmod.h
|
||||
.In bsnmp/snmp_mibII.h
|
||||
@ -116,7 +117,7 @@ The
|
||||
module implements parts of the internet standard MIB-2. Most of the relevant
|
||||
MIBs are implemented. Some of the tables are restricted to be read-only
|
||||
instead of read-write. The exact current implementation can be found in
|
||||
.Pa /usr/local/include/bsnmp/mibII_tree.def .
|
||||
.Pa @DEFPATH@mibII_tree.def .
|
||||
The module also exports a number of functions and global variables for use
|
||||
by other modules, that need to handle network interfaces. This man page describes
|
||||
these functions.
|
||||
@ -333,11 +334,12 @@ Both functions need the pointers to the interfaces. Entries are automatically
|
||||
deleted if any of the interfaces of the entry is destroyed. The functions handle
|
||||
both the stack table and the reverse stack table.
|
||||
.Sh FILES
|
||||
.Bl -tag -width ".It Pa /usr/local/include/bsnmp/mibII_tree.def" -compact
|
||||
.It Pa /usr/local/include/bsnmp/mibII_tree.def
|
||||
.Bl -tag -width ".It Pa @DEFPATH@mibII_tree.def" -compact
|
||||
.It Pa @DEFPATH@mibII_tree.def
|
||||
The description of the MIB tree implemented by
|
||||
.Nm .
|
||||
.It Pa /usr/local/share/snmp/mibs
|
||||
.It Pa @MIBSPATH@
|
||||
The various internet MIBs.
|
||||
.Sh SEE ALSO
|
||||
.Xr snmpmod 3 ,
|
||||
@ -345,4 +347,4 @@ The various internet MIBs.
|
||||
.Sh STANDARDS
|
||||
This implementation conforms to the applicable IETF RFCs.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq brandt@fokus.gmd.de
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
||||
|
@ -30,7 +30,7 @@
|
||||
-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
-- EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
--
|
||||
-- $Begemot: bsnmp/snmpd/BEGEMOT-SNMPD.txt,v 1.21 2003/12/09 12:28:52 hbb Exp $
|
||||
-- $Begemot: bsnmp/snmpd/BEGEMOT-SNMPD.txt,v 1.22 2004/04/13 15:21:46 novo Exp $
|
||||
--
|
||||
-- Begemot Private SNMPd MIB.
|
||||
--
|
||||
@ -38,7 +38,7 @@ BEGEMOT-SNMPD-MIB DEFINITIONS ::= BEGIN
|
||||
|
||||
IMPORTS
|
||||
MODULE-IDENTITY, OBJECT-TYPE, OBJECT-IDENTITY, Counter32,
|
||||
Unsigned32
|
||||
Unsigned32, IpAddress
|
||||
FROM SNMPv2-SMI
|
||||
TEXTUAL-CONVENTION, TruthValue, RowStatus
|
||||
FROM SNMPv2-TC
|
||||
@ -144,7 +144,7 @@ begemotSnmpdVersionEnable OBJECT-TYPE
|
||||
|
||||
0x00000001 - SNMPv1
|
||||
0x00000002 - SNMPv2c"
|
||||
DEFVAL { 0x3 }
|
||||
DEFVAL { 3 }
|
||||
::= { begemotSnmpdConfig 5 }
|
||||
|
||||
--
|
||||
@ -475,7 +475,7 @@ begemotSnmpdLocalPortEntry OBJECT-TYPE
|
||||
|
||||
BegemotSnmpdLocalPortEntry ::= SEQUENCE {
|
||||
begemotSnmpdLocalPortPath OCTET STRING,
|
||||
begemotSnmpdLocalPortStatus INTEGER
|
||||
begemotSnmpdLocalPortStatus INTEGER,
|
||||
begemotSnmpdLocalPortType INTEGER
|
||||
}
|
||||
|
||||
@ -536,7 +536,7 @@ begemotSnmpdTransportEntry OBJECT-TYPE
|
||||
|
||||
BegemotSnmpdTransportEntry ::= SEQUENCE {
|
||||
begemotSnmpdTransportName OCTET STRING,
|
||||
begemotSnmpdTransportStatus INTEGER
|
||||
begemotSnmpdTransportStatus INTEGER,
|
||||
begemotSnmpdTransportOid OBJECT IDENTIFIER
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmpd/action.c,v 1.56 2003/12/09 12:28:52 hbb Exp $
|
||||
* $Begemot: bsnmp/snmpd/action.c,v 1.57 2004/04/13 14:58:46 novo Exp $
|
||||
*
|
||||
* Variable access for SNMPd
|
||||
*/
|
||||
@ -730,26 +730,6 @@ struct module_dep {
|
||||
struct lmodule *m;
|
||||
};
|
||||
|
||||
static void
|
||||
finish_unload(struct snmp_context *ctx __unused, int fail, void *arg)
|
||||
{
|
||||
struct lmodule *m = arg;
|
||||
|
||||
if (!fail) {
|
||||
lm_unload(m);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
finish_load(struct snmp_context *ctx __unused, int fail, void *arg)
|
||||
{
|
||||
struct lmodule *m = arg;
|
||||
|
||||
if (!fail) {
|
||||
lm_start(m);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
dep_modules(struct snmp_context *ctx, struct snmp_dependency *dep,
|
||||
enum snmp_depop op)
|
||||
@ -762,31 +742,44 @@ dep_modules(struct snmp_context *ctx, struct snmp_dependency *dep,
|
||||
if (mdep->path == NULL) {
|
||||
/* unload - find the module */
|
||||
TAILQ_FOREACH(mdep->m, &lmodules, link)
|
||||
if (strcmp(mdep->m->section, mdep->section) == 0)
|
||||
if (strcmp(mdep->m->section,
|
||||
mdep->section) == 0)
|
||||
break;
|
||||
if (mdep->m == NULL)
|
||||
/* no such module - that's ok */
|
||||
return (SNMP_ERR_NOERROR);
|
||||
if (snmp_set_atfinish(ctx, finish_unload, mdep->m))
|
||||
return (SNMP_ERR_RES_UNAVAIL);
|
||||
|
||||
/* handle unloading in the finalizer */
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
/* load */
|
||||
if ((mdep->m = lm_load(mdep->path, mdep->section)) == NULL)
|
||||
return (SNMP_ERR_RES_UNAVAIL);
|
||||
if (snmp_set_atfinish(ctx, finish_load, mdep->m)) {
|
||||
lm_unload(mdep->m);
|
||||
if ((mdep->m = lm_load(mdep->path, mdep->section)) == NULL) {
|
||||
/* could not load */
|
||||
return (SNMP_ERR_RES_UNAVAIL);
|
||||
}
|
||||
/* start in finalizer */
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
case SNMP_DEPOP_ROLLBACK:
|
||||
if (mdep->path == NULL) {
|
||||
/* rollback unload - the finish function takes care */
|
||||
/* rollback unload - the finalizer takes care */
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
/* rollback load */
|
||||
lm_unload(mdep->m);
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
case SNMP_DEPOP_FINISH:
|
||||
if (mdep->path == NULL) {
|
||||
if (mdep->m != NULL && ctx->code == SNMP_RET_OK)
|
||||
lm_unload(mdep->m);
|
||||
} else {
|
||||
if (mdep->m != NULL && ctx->code == SNMP_RET_OK &&
|
||||
community != COMM_INITIALIZE)
|
||||
lm_start(mdep->m);
|
||||
free(mdep->path);
|
||||
}
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
abort();
|
||||
}
|
||||
@ -900,8 +893,6 @@ op_modules(struct snmp_context *ctx, struct snmp_value *value,
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
case SNMP_OP_ROLLBACK:
|
||||
/* must be module path */
|
||||
free(ctx->scratch->ptr1);
|
||||
case SNMP_OP_COMMIT:
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/snmpd/bsnmpd.1,v 1.1 2003/12/03 10:08:33 hbb Exp $
|
||||
.\" $Begemot: bsnmp/snmpd/bsnmpd.1,v 1.3 2004/04/13 17:01:31 novo Exp $
|
||||
.\"
|
||||
.Dd August 15, 2002
|
||||
.Dt SNMPD 1
|
||||
@ -239,9 +239,9 @@ is
|
||||
Default pid file.
|
||||
.It Pa /etc:/usr/etc/:/usr/local/etc
|
||||
This is the default search path for system include files.
|
||||
.It Pa /usr/local/share/snmp/mibs/FOKUS-MIB.txt
|
||||
.It Pa /usr/local/share/snmp/mibs/BEGEMOT-MIB.txt
|
||||
.It Pa /usr/local/share/snmp/mibs/BEGEMOT-SNMPD.txt
|
||||
.It Pa @MIBSPATH@FOKUS-MIB.txt
|
||||
.It Pa @MIBSPATH@BEGEMOT-MIB.txt
|
||||
.It Pa @MIBSPATH@BEGEMOT-SNMPD.txt
|
||||
The definitions for the MIBs implemented in the daemon.
|
||||
.El
|
||||
.Sh SEE ALSO
|
||||
@ -251,6 +251,6 @@ The
|
||||
.Nm
|
||||
conforms to the applicable IETF RFCs.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq brandt@fokus.gmd.de
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
||||
.Sh BUGS
|
||||
Sure.
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmpd/config.c,v 1.19 2003/12/03 10:08:47 hbb Exp $
|
||||
* $Begemot: bsnmp/snmpd/config.c,v 1.20 2004/04/13 14:58:46 novo Exp $
|
||||
*
|
||||
* Parse configuration file.
|
||||
*/
|
||||
@ -1328,6 +1328,8 @@ read_config(const char *fname, struct lmodule *lodmod)
|
||||
}
|
||||
|
||||
do_commit();
|
||||
snmp_dep_finish(snmp_ctx);
|
||||
|
||||
macro_free_all();
|
||||
|
||||
free(snmp_ctx);
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmpd/main.c,v 1.82 2003/12/09 12:28:52 hbb Exp $
|
||||
* $Begemot: bsnmp/snmpd/main.c,v 1.85 2004/04/14 15:39:14 novo Exp $
|
||||
*
|
||||
* SNMPd main stuff.
|
||||
*/
|
||||
@ -840,7 +840,7 @@ recv_dgram(struct port_input *pi)
|
||||
cmsg.hdr.cmsg_type = SCM_CREDS;
|
||||
} else {
|
||||
msg.msg_control = NULL;
|
||||
msg.msg_controllen = NULL;
|
||||
msg.msg_controllen = 0;
|
||||
}
|
||||
msg.msg_flags = 0;
|
||||
|
||||
@ -2015,14 +2015,14 @@ tree_merge(const struct snmp_node *ntree, u_int nsize, struct lmodule *mod)
|
||||
|
||||
xtree = realloc(tree, sizeof(*tree) * (tree_size + nsize));
|
||||
if (xtree == NULL) {
|
||||
syslog(LOG_ERR, "lm_load: %m");
|
||||
syslog(LOG_ERR, "tree_merge: %m");
|
||||
return (-1);
|
||||
}
|
||||
tree = xtree;
|
||||
memcpy(&tree[tree_size], ntree, sizeof(*tree) * nsize);
|
||||
|
||||
for (i = 0; i < nsize; i++)
|
||||
tree[tree_size + i].data = mod;
|
||||
tree[tree_size + i].tree_data = mod;
|
||||
|
||||
tree_size += nsize;
|
||||
|
||||
@ -2040,7 +2040,7 @@ tree_unmerge(struct lmodule *mod)
|
||||
u_int s, d;
|
||||
|
||||
for(s = d = 0; s < tree_size; s++)
|
||||
if (tree[s].data != mod) {
|
||||
if (tree[s].tree_data != mod) {
|
||||
if (s != d)
|
||||
tree[d] = tree[s];
|
||||
d++;
|
||||
|
@ -30,7 +30,7 @@
|
||||
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
# $Begemot: bsnmp/snmpd/snmpd.config,v 1.12 2003/12/03 10:08:47 hbb Exp $
|
||||
# $Begemot: bsnmp/snmpd/snmpd.config,v 1.13 2004/04/13 15:00:00 novo Exp $
|
||||
#
|
||||
# Example configuration file.
|
||||
#
|
||||
@ -68,9 +68,9 @@ begemotSnmpdPortStatus.127.0.0.1.161 = 1
|
||||
begemotSnmpdLocalPortStatus."/var/run/snmpd.sock" = 1
|
||||
|
||||
# send traps to the traphost
|
||||
begemotTrapSinkStatus[$(traphost)].$(trapport) = 4
|
||||
begemotTrapSinkVersion[$(traphost)].$(trapport) = 2
|
||||
begemotTrapSinkComm[$(traphost)].$(trapport) = $(trap)
|
||||
begemotTrapSinkStatus.[$(traphost)].$(trapport) = 4
|
||||
begemotTrapSinkVersion.[$(traphost)].$(trapport) = 2
|
||||
begemotTrapSinkComm.[$(traphost)].$(trapport) = $(trap)
|
||||
|
||||
sysContact = $(contact)
|
||||
sysLocation = $(location)
|
||||
|
@ -30,7 +30,7 @@
|
||||
.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
.\" EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.\" $Begemot: bsnmp/snmpd/snmpmod.3,v 1.5 2003/12/08 16:55:58 hbb Exp $
|
||||
.\" $Begemot: bsnmp/snmpd/snmpmod.3,v 1.6 2004/04/13 15:22:52 novo Exp $
|
||||
.\"
|
||||
.Dd August 16, 2002
|
||||
.Dt snmpmod 3
|
||||
@ -864,4 +864,4 @@ beginning at position
|
||||
This implementation conforms to the applicable IETF RFCs and ITU-T
|
||||
recommendations.
|
||||
.Sh AUTHORS
|
||||
.An Hartmut Brandt Aq brandt@fokus.gmd.de
|
||||
.An Hartmut Brandt Aq harti@freebsd.org
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmpd/trans_lsock.c,v 1.3 2003/12/09 12:28:53 hbb Exp $
|
||||
* $Begemot: bsnmp/snmpd/trans_lsock.c,v 1.4 2004/04/13 14:58:46 novo Exp $
|
||||
*
|
||||
* Local domain socket transport
|
||||
*/
|
||||
@ -90,7 +90,7 @@ lsock_stop(int force)
|
||||
if (my_trans != NULL) {
|
||||
if (!force && trans_first_port(my_trans) != NULL)
|
||||
return (SNMP_ERR_GENERR);
|
||||
trans_iter_port(my_trans, lsock_remove, NULL);
|
||||
trans_iter_port(my_trans, lsock_remove, 0);
|
||||
return (trans_unregister(my_trans));
|
||||
}
|
||||
return (SNMP_ERR_NOERROR);
|
||||
@ -117,10 +117,9 @@ lsock_open_port(u_char *name, size_t namelen, struct lsock_port **pp,
|
||||
int err;
|
||||
struct sockaddr_un sa;
|
||||
|
||||
if (namelen == 0 || namelen + 1 > sizeof(sa.sun_path)) {
|
||||
free(name);
|
||||
if (namelen == 0 || namelen + 1 > sizeof(sa.sun_path))
|
||||
return (SNMP_ERR_BADVALUE);
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case LOCP_DGRAM_UNPRIV:
|
||||
is_stream = 0;
|
||||
@ -143,25 +142,21 @@ lsock_open_port(u_char *name, size_t namelen, struct lsock_port **pp,
|
||||
break;
|
||||
|
||||
default:
|
||||
free(name);
|
||||
return (SNMP_ERR_BADVALUE);
|
||||
}
|
||||
|
||||
if ((port = malloc(sizeof(*port))) == NULL) {
|
||||
free(name);
|
||||
if ((port = malloc(sizeof(*port))) == NULL)
|
||||
return (SNMP_ERR_GENERR);
|
||||
}
|
||||
|
||||
memset(port, 0, sizeof(*port));
|
||||
if (!is_stream) {
|
||||
if ((peer = malloc(sizeof(*peer))) == NULL) {
|
||||
free(name);
|
||||
free(port);
|
||||
return (SNMP_ERR_GENERR);
|
||||
}
|
||||
memset(peer, 0, sizeof(*peer));
|
||||
}
|
||||
if ((port->name = malloc(namelen + 1)) == NULL) {
|
||||
free(name);
|
||||
free(port);
|
||||
if (!is_stream)
|
||||
free(peer);
|
||||
@ -444,18 +439,7 @@ struct lsock_dep {
|
||||
#define LD_TYPE 0x01
|
||||
#define LD_STATUS 0x02
|
||||
#define LD_CREATE 0x04 /* rollback create */
|
||||
|
||||
/*
|
||||
* Finish handler for deleting a port - this cannot fail :-)
|
||||
*/
|
||||
static void
|
||||
lsock_del(struct snmp_context *ctx __unused, int fail, void *arg)
|
||||
{
|
||||
struct lsock_dep *ld = (struct lsock_dep *)(void *)arg;
|
||||
|
||||
if (!fail)
|
||||
lsock_close_port(&ld->port->tport);
|
||||
}
|
||||
#define LD_DELETE 0x08 /* rollback delete */
|
||||
|
||||
/*
|
||||
* dependency handler for lsock ports
|
||||
@ -484,16 +468,12 @@ lsock_func(struct snmp_context *ctx, struct snmp_dependency *dep,
|
||||
ld->set |= LD_CREATE;
|
||||
}
|
||||
} else if (!ld->status) {
|
||||
/* delete - hard to roll back so defer to
|
||||
* finish handler */
|
||||
if (snmp_set_atfinish(ctx, lsock_del, ld->port))
|
||||
err = SNMP_ERR_RES_UNAVAIL;
|
||||
/* delete - hard to roll back so defer to finalizer */
|
||||
ld->set |= LD_DELETE;
|
||||
} else
|
||||
/* modify - read-only */
|
||||
err = SNMP_ERR_READONLY;
|
||||
|
||||
free(ld->path);
|
||||
ld->path = NULL;
|
||||
return (err);
|
||||
|
||||
case SNMP_DEPOP_ROLLBACK:
|
||||
@ -502,6 +482,12 @@ lsock_func(struct snmp_context *ctx, struct snmp_dependency *dep,
|
||||
lsock_close_port(&ld->port->tport);
|
||||
}
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
case SNMP_DEPOP_FINISH:
|
||||
if ((ld->set & LD_DELETE) && ctx->code == SNMP_RET_OK)
|
||||
lsock_close_port(&ld->port->tport);
|
||||
free(ld->path);
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
abort();
|
||||
}
|
||||
|
@ -30,7 +30,7 @@
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Begemot: bsnmp/snmpd/trap.c,v 1.6 2003/12/03 10:08:47 hbb Exp $
|
||||
* $Begemot: bsnmp/snmpd/trap.c,v 1.7 2004/04/13 14:58:46 novo Exp $
|
||||
*
|
||||
* TrapSinkTable
|
||||
*/
|
||||
@ -202,21 +202,10 @@ trapsink_unmodify(struct trapsink *t, struct trapsink_dep *tdep)
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
|
||||
static void
|
||||
trapsink_finish(struct snmp_context *ctx __unused, int fail, void *arg)
|
||||
{
|
||||
struct trapsink *t = arg;
|
||||
|
||||
if (!fail)
|
||||
trapsink_free(t);
|
||||
}
|
||||
|
||||
static int
|
||||
trapsink_destroy(struct snmp_context *ctx, struct trapsink *t,
|
||||
trapsink_destroy(struct snmp_context *ctx __unused, struct trapsink *t,
|
||||
struct trapsink_dep *tdep)
|
||||
{
|
||||
if (snmp_set_atfinish(ctx, trapsink_finish, t))
|
||||
return (SNMP_ERR_RES_UNAVAIL);
|
||||
t->status = TRAPSINK_DESTROY;
|
||||
tdep->rb_status = t->status;
|
||||
tdep->rb |= TDEP_DESTROY;
|
||||
@ -277,6 +266,12 @@ trapsink_dep(struct snmp_context *ctx, struct snmp_dependency *dep,
|
||||
if(tdep->rb & TDEP_DESTROY)
|
||||
return (trapsink_undestroy(t, tdep));
|
||||
return (SNMP_ERR_NOERROR);
|
||||
|
||||
case SNMP_DEPOP_FINISH:
|
||||
if ((tdep->rb & TDEP_DESTROY) && t != NULL &&
|
||||
ctx->code == SNMP_RET_OK)
|
||||
trapsink_free(t);
|
||||
return (SNMP_ERR_NOERROR);
|
||||
}
|
||||
abort();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user