mib.c

来自「eCos操作系统源码」· C语言 代码 · 共 2,472 行 · 第 1/5 页

C
2,472
字号
	      struct variable_list *var,	      struct enum_list *enums,	      const char *hint,	      const char *units){    if (var->type != ASN_OPAQUE#ifdef OPAQUE_SPECIAL_TYPES        && var->type != ASN_OPAQUE_COUNTER64        && var->type != ASN_OPAQUE_U64        && var->type != ASN_OPAQUE_I64        && var->type != ASN_OPAQUE_FLOAT        && var->type != ASN_OPAQUE_DOUBLE#endif /* OPAQUE_SPECIAL_TYPES */      ){	sprintf(buf, "Wrong Type (should be Opaque): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }#ifdef OPAQUE_SPECIAL_TYPES    switch(var->type) {      case ASN_OPAQUE_COUNTER64:      case ASN_OPAQUE_U64:      case ASN_OPAQUE_I64:        sprint_counter64(buf, var, enums, hint, units);        break;      case ASN_OPAQUE_FLOAT:        sprint_float(buf, var, enums, hint, units);        break;      case ASN_OPAQUE_DOUBLE:        sprint_double(buf, var, enums, hint, units);        break;      case ASN_OPAQUE:#endif    if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){	sprintf(buf, "OPAQUE: ");	buf += strlen(buf);    }    sprint_hexstring(buf, var->val.string, var->val_len);    buf += strlen (buf);#ifdef OPAQUE_SPECIAL_TYPES    }#endif    if (units) sprintf (buf, " %s", units);}static voidsprint_object_identifier(char *buf,			 struct variable_list *var,			 struct enum_list *enums,			 const char *hint,			 const char *units){    if (var->type != ASN_OBJECT_ID){	sprintf(buf, "Wrong Type (should be OBJECT IDENTIFIER): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){	sprintf(buf, "OID: ");	buf += strlen(buf);    }    _sprint_objid(buf, (oid *)(var->val.objid), var->val_len / sizeof(oid));    buf += strlen (buf);    if (units) sprintf (buf, " %s", units);}static voidsprint_timeticks(char *buf,		 struct variable_list *var,		 struct enum_list *enums,		 const char *hint,		 const char *units){    char timebuf[32];    if (var->type != ASN_TIMETICKS){	sprintf(buf, "Wrong Type (should be Timeticks): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){	sprintf(buf, "Timeticks: (%lu) ", *(u_long *)(var->val.integer));	buf += strlen(buf);    }    sprintf(buf, "%s", uptimeString(*(u_long *)(var->val.integer), timebuf));    buf += strlen (buf);    if (units) sprintf (buf, " %s", units);}static voidsprint_hinted_integer (char *buf,		       long val,		       const char *hint,		       const char *units){    char code;    int shift, len;    char tmp[256];    char fmt[10];    code = hint[0];    if (hint [1] == '-') {        shift = atoi (hint+2);    }    else shift = 0;    fmt[0] = '%';    fmt[1] = 'l';    fmt[2] = code;    fmt[3] = 0;    sprintf (tmp, fmt, val);    if (shift != 0) {	len = strlen (tmp);	if (shift <= len) {	    tmp[len+1] = 0;	    while (shift--) {		tmp[len] = tmp[len-1];		len--;	    }	    tmp[len] = '.';	}	else {	    tmp[shift+1] = 0;	    while (shift) {		if (len-- > 0) tmp [shift] = tmp [len];		else tmp[shift] = '0';		shift--;	    }	    tmp[0] = '.';	}    }    strcpy (buf, tmp);}static voidsprint_integer(char *buf,	       struct variable_list *var,	       struct enum_list *enums,	       const char *hint,	       const char *units){    char    *enum_string = NULL;    if (var->type != ASN_INTEGER){	sprintf(buf, "Wrong Type (should be INTEGER): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    for (; enums; enums = enums->next)	if (enums->value == *var->val.integer){	    enum_string = enums->label;	    break;	}    if (enum_string == NULL ||        ds_get_boolean(DS_LIBRARY_ID,DS_LIB_PRINT_NUMERIC_ENUM)) {	if (hint) sprint_hinted_integer(buf, *var->val.integer, hint, units);	else sprintf(buf, "%ld", *var->val.integer);    }    else if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT))	sprintf(buf, "%s", enum_string);    else	sprintf(buf, "%s(%ld)", enum_string, *var->val.integer);    buf += strlen (buf);    if (units) sprintf (buf, " %s", units);}static voidsprint_uinteger(char *buf,		struct variable_list *var,		struct enum_list *enums,		const char *hint,		const char *units){    char    *enum_string = NULL;    if (var->type != ASN_UINTEGER){	sprintf(buf, "Wrong Type (should be UInteger32): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    for (; enums; enums = enums->next)	if (enums->value == *var->val.integer){	    enum_string = enums->label;	    break;	}    if (enum_string == NULL ||        ds_get_boolean(DS_LIBRARY_ID,DS_LIB_PRINT_NUMERIC_ENUM))	sprintf(buf, "%lu", *var->val.integer);    else if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT))	sprintf(buf, "%s", enum_string);    else	sprintf(buf, "%s(%lu)", enum_string, *var->val.integer);    buf += strlen (buf);    if (units) sprintf (buf, " %s", units);}static voidsprint_gauge(char *buf,	     struct variable_list *var,	     struct enum_list *enums,	     const char *hint,	     const char *units){    if (var->type != ASN_GAUGE){	sprintf(buf, "Wrong Type (should be Gauge): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT))	sprintf(buf, "%lu", *var->val.integer);    else	sprintf(buf, "Gauge: %lu", *var->val.integer);    buf += strlen (buf);    if (units) sprintf (buf, " %s", units);}static voidsprint_counter(char *buf,	       struct variable_list *var,	       struct enum_list *enums,	       const char *hint,	       const char *units){    if (var->type != ASN_COUNTER){	sprintf(buf, "Wrong Type (should be Counter): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    sprintf(buf, "%lu", *var->val.integer);    buf += strlen (buf);    if (units) sprintf (buf, " %s", units);}static voidsprint_networkaddress(char *buf,		      struct variable_list *var,		      struct enum_list *enums,		      const char *hint,		      const char *units){    int x, len;    u_char *cp;    if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){	sprintf(buf, "Network Address: ");	buf += strlen(buf);    }    cp = var->val.string;    len = var->val_len;    for(x = 0; x < len; x++){	sprintf(buf, "%02X", *cp++);	buf += strlen(buf);	if (x < (len - 1))	    *buf++ = ':';    }}static voidsprint_ipaddress(char *buf,		 struct variable_list *var,		 struct enum_list *enums,		 const char *hint,		 const char *units){    u_char *ip;    if (var->type != ASN_IPADDRESS){	sprintf(buf, "Wrong Type (should be Ipaddress): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    ip = var->val.string;    if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT))	sprintf(buf, "%d.%d.%d.%d",ip[0], ip[1], ip[2], ip[3]);    else	sprintf(buf, "IpAddress: %d.%d.%d.%d",ip[0], ip[1], ip[2], ip[3]);}static voidsprint_null(char *buf,	    struct variable_list *var,	    struct enum_list *enums,	    const char *hint,	    const char *units){    if (var->type != ASN_NULL){	sprintf(buf, "Wrong Type (should be NULL): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    sprintf(buf, "NULL");}static voidsprint_bitstring(char *buf,		 struct variable_list *var,		 struct enum_list *enums,		 const char *hint,		 const char *units){    int len, bit;    u_char *cp;    char *enum_string;    if (var->type != ASN_BIT_STR && var->type != ASN_OCTET_STR){	sprintf(buf, "Wrong Type (should be BIT STRING): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){	*buf++ = '"';	*buf = '\0';    } else {	sprintf(buf, "BITS: ");	buf += strlen(buf);    }    sprint_hexstring(buf, var->val.bitstring, var->val_len);    buf += strlen(buf);    if (ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){	buf += strlen(buf);	*buf++ = '"';	*buf = '\0';    } else {	cp = var->val.bitstring;	for(len = 0; len < (int)var->val_len; len++){	    for(bit = 0; bit < 8; bit++){		if (*cp & (0x80 >> bit)){		    enum_string = NULL;		    for (; enums; enums = enums->next)			if (enums->value == (len * 8) + bit){			    enum_string = enums->label;			    break;			}		    if (enum_string == NULL ||                        ds_get_boolean(DS_LIBRARY_ID,DS_LIB_PRINT_NUMERIC_ENUM))			sprintf(buf, "%d ", (len * 8) + bit);		    else			sprintf(buf, "%s(%d) ", enum_string, (len * 8) + bit);		    buf += strlen(buf);		}	    }	    cp ++;	}    }}static voidsprint_nsapaddress(char *buf,		   struct variable_list *var,		   struct enum_list *enums,		   const char *hint,		   const char *units){    if (var->type != ASN_NSAP){	sprintf(buf, "Wrong Type (should be NsapAddress): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){	sprintf(buf, "NsapAddress: ");	buf += strlen(buf);    }    sprint_hexstring(buf, var->val.string, var->val_len);}static voidsprint_counter64(char *buf,		 struct variable_list *var,		 struct enum_list *enums,		 const char *hint,		 const char *units){    char a64buf[I64CHARSZ+1];  if (var->type != ASN_COUNTER64#ifdef OPAQUE_SPECIAL_TYPES      && var->type != ASN_OPAQUE_COUNTER64      && var->type != ASN_OPAQUE_I64      && var->type != ASN_OPAQUE_U64#endif    ){	sprintf(buf, "Wrong Type (should be Counter64): ");	buf += strlen(buf);	sprint_by_type(buf, var, NULL, NULL, NULL);	return;    }    if (!ds_get_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT)){#ifdef OPAQUE_SPECIAL_TYPES      if (var->type != ASN_COUNTER64) {	sprintf(buf, "Opaque: ");	buf += strlen(buf);      }#endif#ifdef OPAQUE_SPECIAL_TYPES        switch(var->type) {          case ASN_OPAQUE_U64:            sprintf(buf, "UInt64: ");            break;          case ASN_OPAQUE_I64:            sprintf(buf, "Int64: ");            break;          case ASN_COUNTER64:          case ASN_OPAQUE_COUNTER64:#endif            sprintf(buf, "Counter64: ");#ifdef OPAQUE_SPECIAL_TYPES        }#endif	buf += strlen(buf);    }#ifdef OPAQUE_SPECIAL_TYPES    if (var->type == ASN_OPAQUE_I64)    {      printI64(a64buf, var->val.counter64);      sprintf(buf, a64buf);    }    else#endif    {      printU64(a64buf, var->val.counter64);      sprintf(buf, a64buf);    }    buf += strlen (buf);    if (units) sprintf (buf, " %s", units);}static voidsprint_unknowntype(char *buf,		   struct variable_list *var,		   struct enum_list *enums,		   const char *hint,		   const char *units){/*    sprintf(buf, "Variable has bad type"); */    sprint_by_type(buf, var, NULL, NULL, NULL);}static voidsprint_badtype(char *buf,	       struct variable_list *var,	       struct enum_list *enums,	       const char *hint,	       const char *units){    sprintf(buf, "Variable has bad type");}static voidsprint_by_type(char *buf,	       struct variable_list *var,	       struct enum_list *enums,	       const char *hint,	       const char *units){    switch (var->type){	case ASN_INTEGER:	    sprint_integer(buf, var, enums, hint, units);	    break;	case ASN_OCTET_STR:	    sprint_octet_string(buf, var, enums, hint, units);	    break;	case ASN_BIT_STR:	    sprint_bitstring(buf, var, enums, hint, units);	    break;	case ASN_OPAQUE:	    sprint_opaque(buf, var, enums, hint, units);	    break;	case ASN_OBJECT_ID:	    sprint_object_identifier(buf, var, enums, hint, units);	    break;	case ASN_TIMETICKS:	    sprint_timeticks(buf, var, enums, hint, units);	    break;	case ASN_GAUGE:	    sprint_gauge(buf, var, enums, hint, units);	    break;	case ASN_COUNTER:	    sprint_counter(buf, var, enums, hint, units);	    break;	case ASN_IPADDRESS:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?