📄 mib.c
字号:
} else {
numids = (size_t)*objid+1;
}
if ( numids > objidlen)
goto finish_it;
_get_symbol(objid, numids, NULL, buf, NULL, NULL);
objid += (numids);
objidlen -= (numids);
buf += strlen(buf);
*buf++ = '.';
*buf = '\0';
break;
default:
goto finish_it;
break;
}
in_dices = in_dices->next;
}
finish_it:
while(objidlen-- > 0){ /* output rest of name, uninterpreted */
sprintf(buf, "%lu.", *objid++);
while(*buf)
buf++;
}
*(buf - 1) = '\0'; /* remove trailing dot */
return NULL;
found:
if (objidlen > 1){
while(*buf)
buf++;
*buf++ = '.';
*buf = '\0';
return_tree = _get_symbol(objid + 1, objidlen - 1, subtree->child_list,
buf, in_dices, end_of_known);
}
if (return_tree != NULL)
return return_tree;
else
return subtree;
}
struct tree *
get_symbol(oid *objid,
size_t objidlen,
struct tree *subtree,
char *buf)
{
return _get_symbol(objid,objidlen,subtree,buf,0,0);
}
/*
* Clone of get_symbol that doesn't take a buffer argument
*/
struct tree *
get_tree(oid *objid,
size_t objidlen,
struct tree *subtree)
{
struct tree *return_tree = NULL;
for(; subtree; subtree = subtree->next_peer){
if (*objid == subtree->subid)
goto found;
}
return NULL;
found:
if (objidlen > 1)
return_tree = get_tree(objid + 1, objidlen - 1, subtree->child_list);
if (return_tree != NULL)
return return_tree;
else
return subtree;
}
void
print_description(oid *objid,
size_t objidlen) /* number of subidentifiers */
{
fprint_description(stdout, objid, objidlen);
}
void
fprint_description(FILE *f,
oid *objid,
size_t objidlen) /* number of subidentifiers */
{
struct tree *tp = get_tree(objid, objidlen, tree_head);
struct tree *subtree = tree_head;
fprintf(f, "%s OBJECT-TYPE\n", tp->label);
print_tree_node(f, tp);
fprintf(f, "::= {");
while (objidlen > 1) {
for(; subtree; subtree = subtree->next_peer){
if (*objid == subtree->subid){
if (strncmp( subtree->label, ANON, ANON_LEN))
fprintf(f, " %s(%lu)", subtree->label, subtree->subid);
else
fprintf(f, " %lu", subtree->subid);
break;
}
}
if (subtree == 0) break;
objid++; objidlen--; subtree = subtree->child_list;
if (subtree == 0) break;
}
fprintf(f, " %lu }\n", *objid);
}
void
print_tree_node(FILE *f,
struct tree *tp)
{
const char *cp;
char str[MAXTOKEN];
int i, prevmod;
if (tp) {
module_name(tp->modid, str);
fprintf(f, " -- FROM\t%s", str);
for (i = 1, prevmod = tp->modid; i < tp->number_modules; i++) {
if (prevmod != tp->module_list[i]) {
module_name(tp->module_list[i], str);
fprintf(f, ", %s", str);
}
prevmod = tp->module_list[i];
}
fprintf(f, "\n");
if (tp->tc_index != -1) {
fprintf(f, " -- TEXTUAL CONVENTION %s\n", get_tc_descriptor(tp->tc_index));
}
switch (tp->type) {
case TYPE_OBJID: cp = "OBJECT IDENTIFIER"; break;
case TYPE_OCTETSTR: cp = "OCTET STRING"; break;
case TYPE_INTEGER: cp = "INTEGER"; break;
case TYPE_NETADDR: cp = "NetworkAddress"; break;
case TYPE_IPADDR: cp = "IpAddress"; break;
case TYPE_COUNTER: cp = "Counter"; break;
case TYPE_GAUGE: cp = "Gauge"; break;
case TYPE_TIMETICKS: cp = "TimeTicks"; break;
case TYPE_OPAQUE: cp = "Opaque"; break;
case TYPE_NULL: cp = "NULL"; break;
case TYPE_COUNTER64: cp = "Counter64"; break;
case TYPE_BITSTRING: cp = "BIT STRING"; break;
case TYPE_NSAPADDRESS: cp = "NsapAddress"; break;
case TYPE_UINTEGER: cp = "UInteger32"; break;
case 0: cp = NULL; break;
default: sprintf(str,"type_%d", tp->type); cp = str;
}
#if SNMP_TESTING_CODE
if (!cp && (tp->ranges || tp->enums)) { /* ranges without type ? */
sprintf(str,"?0 with %s %s ?",
tp->ranges ? "Range" : "",
tp->enums ? "Enum" : "");
cp = str;
}
#endif /* SNMP_TESTING_CODE */
if (cp) fprintf(f, " SYNTAX\t%s", cp);
if (tp->ranges) {
struct range_list *rp = tp->ranges;
int first = 1;
fprintf(f, " (");
while (rp) {
if (first) first = 0;
else fprintf(f, " | ");
if (rp->low == rp->high) fprintf(f, "%d", rp->low);
else fprintf(f, "%d..%d", rp->low, rp->high);
rp = rp->next;
}
fprintf(f, ") ");
}
if (tp->enums) {
struct enum_list *ep = tp->enums;
int first = 1;
fprintf(f," { ");
while (ep) {
if (first) first = 0;
else fprintf(f, ", ");
fprintf(f, "%s(%d)", ep->label, ep->value);
ep = ep->next;
}
fprintf(f," } ");
}
if (cp) fprintf(f, "\n");
if (tp->hint) fprintf(f, " DISPLAY-HINT\t\"%s\"\n", tp->hint);
if (tp->units) fprintf(f, " UNITS\t\"%s\"\n", tp->units);
switch (tp->access) {
case MIB_ACCESS_READONLY: cp = "read-only"; break;
case MIB_ACCESS_READWRITE: cp = "read-write"; break;
case MIB_ACCESS_WRITEONLY: cp = "write-only"; break;
case MIB_ACCESS_NOACCESS: cp = "not-accessible"; break;
case MIB_ACCESS_NOTIFY: cp = "accessible-for-notify"; break;
case MIB_ACCESS_CREATE: cp = "read-create"; break;
case 0: cp = NULL; break;
default: sprintf(str,"access_%d", tp->access); cp = str;
}
if (cp) fprintf(f, " MAX-ACCESS\t%s\n", cp);
switch (tp->status) {
case MIB_STATUS_MANDATORY: cp = "mandatory"; break;
case MIB_STATUS_OPTIONAL: cp = "optional"; break;
case MIB_STATUS_OBSOLETE: cp = "obsolete"; break;
case MIB_STATUS_DEPRECATED: cp = "deprecated"; break;
case MIB_STATUS_CURRENT: cp = "current"; break;
case 0: cp = NULL; break;
default: sprintf(str,"status_%d", tp->status); cp = str;
}
#if SNMP_TESTING_CODE
if (!cp && (tp->indexes)) { /* index without status ? */
sprintf(str,"?0 with %s ?",
tp->indexes ? "Index" : "");
cp = str;
}
#endif /* SNMP_TESTING_CODE */
if (cp) fprintf(f, " STATUS\t%s\n", cp);
if (tp->indexes) {
struct index_list *ip = tp->indexes;
int first=1;
fprintf(f, " INDEXES\t");
fprintf(f," { ");
while (ip) {
if (first) first = 0;
else fprintf(f, ", ");
if (ip->isimplied)
fprintf(f, "IMPLIED ");
fprintf(f, "%s", ip->ilabel);
ip = ip->next;
}
fprintf(f," }\n");
}
if (tp->description) fprintf(f, " DESCRIPTION\t\"%s\"\n", tp->description);
}
else
fprintf(f, "No description\n");
}
int
get_module_node(const char *fname,
const char *module,
oid *objid,
size_t *objidlen)
{
int modid, rc = 0;
struct tree *tp;
char *name, *cp;
if ( !strcmp(module, "ANY") )
modid = -1;
else {
read_module(module);
modid = which_module( module );
if (modid == -1) return 0;
}
/* Isolate the first component of the name ... */
name = strdup(fname);
cp = strchr( name, '.' );
if ( cp != NULL ) {
*cp = '\0';
cp++;
}
/* ... and locate it in the tree. */
tp = find_tree_node(name, modid);
if (tp){
size_t maxlen = *objidlen;
/* Set the first element of the object ID */
if (node_to_oid(tp, objid, objidlen)) {
rc = 1;
/* If the name requested was more than one element,
tag on the rest of the components */
if (cp != NULL)
rc = _add_strings_to_oid(tp, cp, objid, objidlen, maxlen);
}
}
free(name);
return (rc);
}
/*
* Populate object identifier from a node in the MIB hierarchy.
* Build up the object ID, working backwards,
* starting from the end of the objid buffer.
* When the top of the MIB tree is reached, adjust the buffer.
*
* The buffer length is set to the number of subidentifiers
* for the object identifier associated with the MIB node.
* Returns the number of subidentifiers copied.
*
* If 0 is returned, the objid buffer is too small,
* and the buffer contents are indeterminate.
* The buffer length can be used to create a larger buffer.
*/
int
node_to_oid(struct tree *tp, oid *objid, size_t *objidlen)
{
int numids, lenids;
oid *op;
if (!tp || !objid || !objidlen)
return 0;
lenids = (int)*objidlen;
op = objid + lenids; /* points after the last element */
for(numids = 0; tp; tp = tp->parent, numids++)
{
if (numids >= lenids) continue;
--op;
*op = tp->subid;
}
*objidlen = (size_t)numids;
if (numids > lenids) {
return 0;
}
if (numids < lenids)
memmove(objid, op, numids * sizeof(oid));
return (numids);
}
static int
_add_strings_to_oid(struct tree *tp, char *cp,
oid *objid, size_t *objidlen,
size_t maxlen)
{
int subid;
struct tree *tp2 = NULL;
char *cp2 = NULL;
char doingquote = 0;
while ( cp != NULL ) {
cp2 = strchr( cp, '.' ); /* Isolate the next entry */
if ( cp2 != NULL ) {
*cp2 = '\0';
cp2++;
}
if ( *cp == '"' || *cp == '\'') { /* Is it the beggining
of a quoted string */
doingquote = *cp++;
/* insert length if requested */
if (doingquote == '"') {
if (*objidlen >= maxlen)
return 0;
objid[ *objidlen ] = (strchr(cp,doingquote) - cp);
(*objidlen)++;
}
while(*cp != doingquote) {
if (*objidlen >= maxlen)
return 0;
objid[ *objidlen ] = *cp++;
(*objidlen)++;
}
tp = NULL; /* must be pure numeric from here, right? */
cp = cp2;
continue;
}
/* Is it numeric ? */
if ( isdigit( *cp ) )
subid=(strtol(cp,0,0));
else
subid = -1;
/* Search for the appropriate child */
if ( tp != NULL )
tp2 = tp->child_list;
while ( tp2 != NULL ) {
if (( (int)tp2->subid == subid ) ||
( !strcasecmp( tp2->label, cp ))) {
if (*objidlen >= maxlen)
return 0;
objid[ *objidlen ] = tp2->subid;
(*objidlen)++;
tp = tp2;
break;
}
tp2 = tp2->next_peer;
}
if ( tp2 == NULL ) {
if ( subid == -1 ) {
return 0;
}
/* pure numeric from now on */
if (*objidlen >= maxlen)
return 0;
objid[ *objidlen ] = subid;
(*objidlen)++;
tp = NULL;
}
cp = cp2;
}
return 1;
}
/*
* see comments on find_best_tree_node for usage after first time.
*/
int
get_wild_node(const char *name,
oid *objid,
size_t *objidlen)
{
struct tree *tp = find_best_tree_node(name, tree_head, NULL);
if (!tp)
return 0;
return get_node(tp->label, objid, objidlen);
}
int
get_node(const char *name,
oid *objid,
size_t *objidlen)
{
char *cp;
int res;
if (( cp=strchr(name, ':')) == NULL )
res = get_module_node( name, "ANY", objid, objidlen );
else {
char *module;
/*
* requested name is of the form
* "module:subidentifier"
*/
module = (char *)malloc((size_t)(cp-name+1));
memcpy(module,name,(size_t)(cp-name));
module[cp-name] = 0;
cp++; /* cp now point to the subidentifier */
if (*cp == ':') cp++;
/* 'cp' and 'name' *do* go that way round! */
res = get_module_node( cp, module, objid, objidlen );
free(module);
}
if (res == 0) {
SET_SNMP_ERROR(SNMPERR_UNKNOWN_OBJID);
}
return res;
}
#ifdef testing
main(int argc, char* argv[])
{
oid objid[MAX_OID_LEN];
int objidlen = MAX_OID_LEN;
int count;
struct variable_list variable;
init_mib();
if (argc < 2)
print_subtree(stdout, tree_head, 0);
variable.type = ASN_INTEGER;
variable.val.integer = 3;
variable.val_len = 4;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -