📄 mib.c
字号:
char buf[SPRINT_MAX_LEN];
int ret;
if (strchr(input, ':')) {
return get_node(input, output, out_len);
}
if (*input == '.')
input++;
else {
/* get past leading '.', append '.' to Prefix. */
if (*Prefix == '.')
strcpy(buf, Prefix+1);
else
strcpy(buf, Prefix);
strcat(buf, ".");
strcat(buf, input);
input = buf;
}
if (root == NULL){
SET_SNMP_ERROR(SNMPERR_NOMIB);
*out_len = 0;
return(0);
}
if ((ret = parse_subtree(root, input, output, out_len)) <= 0)
{
int errc = (ret ? ret : SNMPERR_UNKNOWN_OBJID);
SET_SNMP_ERROR(errc);
return (0);
}
*out_len = ret;
return (1);
}
/*
* RECURSIVE helper methods for read_objid
* Returns:
* < 0 the SNMPERR_ errorcode
* = 0 input string is empty.
* > 0 the number of sub-identifiers found in the input string.
*/
static int
parse_subtree(struct tree *subtree,
const char *input,
oid *output,
size_t *out_len) /* number of subid's */
{
char buf[SPRINT_MAX_LEN], *to = buf, *cp;
u_long subid = 0;
struct tree *tp;
int ret, len;
/*
* No empty strings. Can happen if there is a trailing '.' or two '.'s
* in a row, i.e. "..".
*/
if ((*input == '\0') ||
(*input == '.'))
return (0);
if (*input == '"' || *input == '\'') {
/*
* This is a string that should be converted into an OID
* Note: assumes variable length index is required, and prepends
* the string length.
*/
if ((cp = strchr(input+1, *input)) == NULL) {
/* error. Should be a matching quote somewhere. */
return (0);
}
/* is there room enough for the string in question plus its length */
len = cp-input-1;
if ((int)*out_len <= len){
return (SNMPERR_LONG_OID);
}
/* copy everything in */
if (*input++ == '"') {
/* add the length for " quoted objects */
*output++ = len++;
}
*out_len -= len;
while (input < cp) {
*output++ = *input++;
}
/* Now, we assume that nothing beyond this exists in the parse
tree, which should always be true (or else we have a really wacked
mib designer somewhere. */
input = cp + 1; /* past the quote */
if (*input != '.')
return (len);
ret = parse_subtree(NULL, ++input, output, out_len);
if (ret <= 0)
return (ret);
return ret+len;
} else if (isdigit(*input)) {
/*
* Read the number, then try to find it in the subtree.
*/
while (isdigit(*input)) {
*to++ = *input;
subid *= 10;
subid += *input++ - '0';
}
if (*input != '.' && *input != 0) {
while (*input != 0 && *input != '.') *to++ = *input++;
*to = 0;
snmp_set_detail(buf);
return SNMPERR_BAD_SUBID;
}
*to = '\0';
for (tp = subtree; tp; tp = tp->next_peer) {
if (tp->subid == subid)
goto found;
}
}
else {
/*
* Read the name into a buffer.
*/
while ((*input != '\0') &&
(*input != '.')) {
*to++ = *input++;
}
*to = '\0';
/*
* Find the name in the subtree;
*/
for (tp = subtree; tp; tp = tp->next_peer) {
if (strcasecmp(tp->label, buf) == 0) {
subid = tp->subid;
goto found;
}
}
/*
* If we didn't find the entry, punt...
*/
if (tp == NULL) {
snmp_set_detail(buf);
return (SNMPERR_BAD_SUBID);
}
}
found:
if(subid > (u_long)MAX_SUBID){
snmp_set_detail(buf);
return (SNMPERR_MAX_SUBID);
}
if ((int)*out_len <= 0){
return (SNMPERR_LONG_OID);
}
(*out_len)--;
*output++ = subid;
if (*input != '.')
return (1);
ret = parse_subtree(tp ? tp->child_list : NULL,
++input, output, out_len);
if (ret <= 0)
return (ret);
return ret+1;
}
static struct tree *
_sprint_objid(char *buf,
oid *objid,
size_t objidlen) /* number of subidentifiers */
{
char tempbuf[SPRINT_MAX_LEN], *cp;
struct tree *subtree = tree_head;
char *midpoint = 0;
*tempbuf = '.'; /* this is a fully qualified name */
subtree = _get_symbol(objid, objidlen, subtree, tempbuf + 1, 0, &midpoint);
if (ds_get_boolean(DS_LIBRARY_ID,DS_LIB_PRINT_NUMERIC_OIDS)) {
cp = tempbuf;
} else if (ds_get_int(DS_LIBRARY_ID, DS_LIB_PRINT_SUFFIX_ONLY)){
for(cp = tempbuf; *cp; cp++)
;
if (midpoint)
cp = midpoint-2; /* beyond the '.' */
else {
while(cp >= tempbuf){
if (isalpha(*cp))
break;
cp--;
}
}
while(cp >= tempbuf){
if (*cp == '.')
break;
cp--;
}
cp++;
if (ds_get_int(DS_LIBRARY_ID, DS_LIB_PRINT_SUFFIX_ONLY) == 2 && cp > tempbuf) {
char modbuf[256];
char *mod = module_name(subtree->modid, modbuf);
size_t len = strlen(mod);
if ((int)len+1 >= cp-tempbuf) {
memmove(tempbuf+len+2, cp, strlen(cp)+1);
cp = tempbuf+len+2;
}
cp -= len+2;
memcpy(cp, mod, len);
cp[len] = ':';
cp[len+1] = ':';
}
}
else if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_PRINT_FULL_OID)) {
PrefixListPtr pp = &mib_prefixes[0];
int ii;
size_t ilen, tlen;
const char *testcp;
cp = tempbuf; tlen = strlen(tempbuf);
ii = 0;
while (pp->str) {
ilen = pp->len; testcp = pp->str;
if ((tlen > ilen) && !memcmp(tempbuf, testcp, ilen)) {
cp += (ilen + 1);
break;
}
pp++;
}
}
else cp = tempbuf;
strcpy(buf, cp);
return subtree;
}
char * sprint_objid(char *buf, oid *objid, size_t objidlen)
{
_sprint_objid(buf,objid,objidlen);
return buf;
}
void
print_objid(oid *objid,
size_t objidlen) /* number of subidentifiers */
{
fprint_objid(stdout, objid, objidlen);
}
void
fprint_objid(FILE *f,
oid *objid,
size_t objidlen) /* number of subidentifiers */
{
char buf[SPRINT_MAX_LEN];
_sprint_objid(buf, objid, objidlen);
fprintf(f, "%s\n", buf);
}
void
sprint_variable(char *buf,
oid *objid,
size_t objidlen,
struct variable_list *variable)
{
struct tree *subtree;
subtree = _sprint_objid(buf, objid, objidlen);
buf += strlen(buf);
if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT))
strcat(buf, " ");
else
strcat(buf, " = ");
buf += strlen(buf);
if (variable->type == SNMP_NOSUCHOBJECT)
strcpy(buf, "No Such Object available on this agent");
else if (variable->type == SNMP_NOSUCHINSTANCE)
strcpy(buf, "No Such Instance currently exists");
else if (variable->type == SNMP_ENDOFMIBVIEW)
strcpy(buf, "No more variables left in this MIB View");
else if (subtree) {
if (subtree->printer)
(*subtree->printer)(buf, variable, subtree->enums, subtree->hint, subtree->units);
else {
sprint_by_type(buf, variable, subtree->enums, subtree->hint, subtree->units);
}
}
else { /* handle rare case where tree is empty */
sprint_by_type(buf, variable, 0, 0, 0);
}
}
void
print_variable(oid *objid,
size_t objidlen,
struct variable_list *variable)
{
fprint_variable(stdout, objid, objidlen, variable);
}
void
fprint_variable(FILE *f,
oid *objid,
size_t objidlen,
struct variable_list *variable)
{
char buf[SPRINT_MAX_LEN];
sprint_variable(buf, objid, objidlen, variable);
fprintf(f, "%s\n", buf);
}
void
sprint_value(char *buf,
oid *objid,
size_t objidlen,
struct variable_list *variable)
{
char tempbuf[SPRINT_MAX_LEN];
struct tree *subtree = tree_head;
if (variable->type == SNMP_NOSUCHOBJECT)
sprintf(buf, "No Such Object available on this agent");
else if (variable->type == SNMP_NOSUCHINSTANCE)
sprintf(buf, "No Such Instance currently exists");
else if (variable->type == SNMP_ENDOFMIBVIEW)
sprintf(buf, "No more variables left in this MIB View");
else {
subtree = get_symbol(objid, objidlen, subtree, tempbuf);
if (subtree->printer)
(*subtree->printer)(buf, variable, subtree->enums, subtree->hint, subtree->units);
else {
sprint_by_type(buf, variable, subtree->enums, subtree->hint, subtree->units);
}
}
}
void
print_value(oid *objid,
size_t objidlen,
struct variable_list *variable)
{
fprint_value(stdout, objid, objidlen, variable);
}
void
fprint_value(FILE *f,
oid *objid,
size_t objidlen,
struct variable_list *variable)
{
char tempbuf[SPRINT_MAX_LEN];
sprint_value(tempbuf, objid, objidlen, variable);
fprintf(f, "%s\n", tempbuf);
}
/*
* Append a quoted printable string to buffer "buf"
* that represents a range of sub-identifiers "objid".
*
* Display '.' for all non-printable sub-identifiers.
* If successful, "buf" points past the appended string.
*/
char *
dump_oid_to_string(oid *objid,
size_t objidlen,
char *buf,
char quotechar)
{
if (buf)
{ int ii, alen;
char *scp;
char *cp = buf + (strlen(buf));
scp = cp;
for (ii= 0, alen = 0; ii < (int)objidlen; ii++)
{
oid tst = objid[ii];
if ((tst > 254) || (!isprint(tst)))
tst = (oid)'.';
if (alen == 0) *cp++ = quotechar;
*cp++ = (char)tst;
alen++;
}
if (alen) *cp++ = quotechar;
*cp = '\0';
buf = cp;
}
return buf;
}
struct tree *
_get_symbol(oid *objid,
size_t objidlen,
struct tree *subtree,
char *buf,
struct index_list *in_dices,
char **end_of_known)
{
struct tree *return_tree = NULL;
if (!objid || !buf)
return NULL;
for(; subtree; subtree = subtree->next_peer){
if (*objid == subtree->subid){
if (subtree->indexes)
in_dices = subtree->indexes;
if (!strncmp( subtree->label, ANON, ANON_LEN) ||
ds_get_boolean(DS_LIBRARY_ID,DS_LIB_PRINT_NUMERIC_OIDS))
sprintf(buf, "%lu", subtree->subid);
else
strcpy(buf, subtree->label);
goto found;
}
}
if (end_of_known)
*end_of_known = buf;
/* subtree not found */
while (in_dices && (objidlen > 0) &&
!ds_get_boolean(DS_LIBRARY_ID,DS_LIB_PRINT_NUMERIC_OIDS) &&
!ds_get_boolean(DS_LIBRARY_ID,DS_LIB_DONT_BREAKDOWN_OIDS)) {
size_t numids;
struct tree *tp;
tp = find_tree_node(in_dices->ilabel, -1);
if (0 == tp) {
/* ack. Can't find an index in the mib tree. bail */
goto finish_it;
}
switch(tp->type) {
case TYPE_OCTETSTR:
if (in_dices->isimplied) {
numids = objidlen;
buf = dump_oid_to_string(objid, numids, buf, '\'');
} else {
numids = (size_t)*objid+1;
if (numids > objidlen)
goto finish_it;
if (numids == 1) {
*buf++ = '"'; *buf++ = '"';
}
else
buf = dump_oid_to_string(objid+1, numids-1, buf, '"');
}
objid += (numids);
objidlen -= (numids);
*buf++ = '.';
*buf = '\0';
break;
case TYPE_INTEGER:
sprintf(buf, "%lu.", *objid++);
while(*buf)
buf++;
objidlen--;
break;
case TYPE_OBJID:
if (in_dices->isimplied) {
numids = objidlen;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -