|
|
1.1 ! root 1: /* values.c - encode values */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/snmp/RCS/values.c,v 7.3 90/07/09 14:49:51 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/snmp/RCS/values.c,v 7.3 90/07/09 14:49:51 mrose Exp $ ! 9: * ! 10: * Contributed by NYSERNet Inc. This work was partially supported by the ! 11: * U.S. Defense Advanced Research Projects Agency and the Rome Air Development ! 12: * Center of the U.S. Air Force Systems Command under contract number ! 13: * F30602-88-C-0016. ! 14: * ! 15: * ! 16: * $Log: values.c,v $ ! 17: * Revision 7.3 90/07/09 14:49:51 mrose ! 18: * sync ! 19: * ! 20: * Revision 7.2 90/04/18 08:52:12 mrose ! 21: * oid_normalize ! 22: * ! 23: * Revision 7.1 90/02/19 15:39:11 mrose ! 24: * one more time ! 25: * ! 26: * Revision 7.0 90/02/17 10:36:50 mrose ! 27: * *** empty log message *** ! 28: * ! 29: */ ! 30: ! 31: /* ! 32: * NOTICE ! 33: * ! 34: * Acquisition, use, and distribution of this module and related ! 35: * materials are subject to the restrictions of a license agreement. ! 36: * Consult the Preface in the User's Manual for the full terms of ! 37: * this agreement. ! 38: * ! 39: */ ! 40: ! 41: ! 42: #include <stdio.h> ! 43: #include "SNMP-types.h" ! 44: #include "objects.h" ! 45: #include "logger.h" ! 46: ! 47: /* */ ! 48: ! 49: #define ADVISE if (o_advise) (*o_advise) ! 50: ! 51: IFP o_advise = NULLIFP; ! 52: ! 53: /* */ ! 54: ! 55: int o_generic (oi, v, offset) ! 56: OI oi; ! 57: register struct type_SNMP_VarBind *v; ! 58: int offset; ! 59: { ! 60: register OID oid = oi -> oi_name; ! 61: register OT ot = oi -> oi_type; ! 62: register OS os = ot -> ot_syntax; ! 63: ! 64: switch (offset) { ! 65: case type_SNMP_PDUs_get__request: ! 66: if (oid -> oid_nelem != ot -> ot_name -> oid_nelem + 1 ! 67: || oid -> oid_elements[oid -> oid_nelem - 1] != 0) ! 68: return int_SNMP_error__status_noSuchName; ! 69: break; ! 70: ! 71: case type_SNMP_PDUs_get__next__request: ! 72: if (oid -> oid_nelem == ot -> ot_name -> oid_nelem) { ! 73: OID new; ! 74: ! 75: if ((new = oid_extend (oid, 1)) == NULLOID) ! 76: return int_SNMP_error__status_genErr; ! 77: new -> oid_elements[new -> oid_nelem - 1] = 0; ! 78: ! 79: if (v -> name) ! 80: free_SNMP_ObjectName (v -> name); ! 81: v -> name = new; ! 82: } ! 83: else ! 84: return NOTOK; ! 85: break; ! 86: ! 87: default: ! 88: return int_SNMP_error__status_genErr; ! 89: } ! 90: ! 91: if (os == NULLOS) { ! 92: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 93: "no syntax defined for object \"%s\"", ot -> ot_text); ! 94: ! 95: return (offset == type_SNMP_PDUs_get__next__request ? NOTOK ! 96: : int_SNMP_error__status_genErr); ! 97: } ! 98: if (ot -> ot_info == NULL) { ! 99: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 100: "no value defined for object \"%s\"", ot -> ot_text); ! 101: ! 102: return (offset == type_SNMP_PDUs_get__next__request ? NOTOK ! 103: : int_SNMP_error__status_noSuchName); ! 104: } ! 105: ! 106: if (v -> value) ! 107: free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; ! 108: if ((*os -> os_encode) (ot -> ot_info, &v -> value) == NOTOK) { ! 109: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 110: "encoding error for variable \"%s\"", ! 111: oid2ode (oi -> oi_name)); ! 112: ! 113: return int_SNMP_error__status_genErr; ! 114: } ! 115: ! 116: return int_SNMP_error__status_noError; ! 117: } ! 118: ! 119: /* */ ! 120: ! 121: int o_number (oi, v, number) ! 122: OI oi; ! 123: register struct type_SNMP_VarBind *v; ! 124: integer number; ! 125: { ! 126: int result; ! 127: register OT ot = oi -> oi_type; ! 128: register OS os = ot -> ot_syntax; ! 129: ! 130: if (os == NULLOS) { ! 131: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 132: "no syntax defined for object \"%s\"", ot -> ot_text); ! 133: ! 134: return int_SNMP_error__status_genErr; ! 135: } ! 136: ! 137: if (v -> value) ! 138: free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; ! 139: result = (*os -> os_encode) (&number, &v -> value); ! 140: ! 141: if (result == NOTOK) { ! 142: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 143: "encoding error for variable \"%s\"", ! 144: oid2ode (oi -> oi_name)); ! 145: ! 146: return int_SNMP_error__status_genErr; ! 147: } ! 148: ! 149: return int_SNMP_error__status_noError; ! 150: } ! 151: ! 152: /* */ ! 153: ! 154: int o_string (oi, v, base, len) ! 155: OI oi; ! 156: register struct type_SNMP_VarBind *v; ! 157: char *base; ! 158: int len; ! 159: { ! 160: int result; ! 161: struct qbuf *value; ! 162: register OT ot = oi -> oi_type; ! 163: register OS os = ot -> ot_syntax; ! 164: ! 165: if (os == NULLOS) { ! 166: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 167: "no syntax defined for object \"%s\"", ot -> ot_text); ! 168: ! 169: return int_SNMP_error__status_genErr; ! 170: } ! 171: ! 172: if ((value = str2qb (base, len, 1)) == NULL) { ! 173: ADVISE (LLOG_EXCEPTIONS, NULLCP, "out of memory"); ! 174: return int_SNMP_error__status_genErr; ! 175: } ! 176: ! 177: if (v -> value) ! 178: free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; ! 179: result = (*os -> os_encode) (value, &v -> value); ! 180: qb_free (value); ! 181: ! 182: if (result == NOTOK) { ! 183: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 184: "encoding error for variable \"%s\"", ! 185: oid2ode (oi -> oi_name)); ! 186: ! 187: return int_SNMP_error__status_genErr; ! 188: } ! 189: ! 190: return int_SNMP_error__status_noError; ! 191: } ! 192: ! 193: /* */ ! 194: ! 195: int o_qbstring (oi, v, value) ! 196: OI oi; ! 197: register struct type_SNMP_VarBind *v; ! 198: struct qbuf *value; ! 199: { ! 200: int result; ! 201: register OT ot = oi -> oi_type; ! 202: register OS os = ot -> ot_syntax; ! 203: ! 204: if (os == NULLOS) { ! 205: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 206: "no syntax defined for object \"%s\"", ot -> ot_text); ! 207: ! 208: return int_SNMP_error__status_genErr; ! 209: } ! 210: ! 211: if (v -> value) ! 212: free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; ! 213: result = (*os -> os_encode) (value, &v -> value); ! 214: ! 215: if (result == NOTOK) { ! 216: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 217: "encoding error for variable \"%s\"", ! 218: oid2ode (oi -> oi_name)); ! 219: ! 220: return int_SNMP_error__status_genErr; ! 221: } ! 222: ! 223: return int_SNMP_error__status_noError; ! 224: } ! 225: ! 226: /* */ ! 227: ! 228: int o_specific (oi, v, value) ! 229: OI oi; ! 230: register struct type_SNMP_VarBind *v; ! 231: caddr_t value; ! 232: { ! 233: int result; ! 234: register OT ot = oi -> oi_type; ! 235: register OS os = ot -> ot_syntax; ! 236: ! 237: if (os == NULLOS) { ! 238: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 239: "no syntax defined for object \"%s\"", ot -> ot_text); ! 240: ! 241: return int_SNMP_error__status_genErr; ! 242: } ! 243: ! 244: if (v -> value) ! 245: free_SNMP_ObjectSyntax (v -> value), v -> value = NULL; ! 246: result = (*os -> os_encode) (value, &v -> value); ! 247: ! 248: if (result == NOTOK) { ! 249: ADVISE (LLOG_EXCEPTIONS, NULLCP, ! 250: "encoding error for variable \"%s\"", ! 251: oid2ode (oi -> oi_name)); ! 252: ! 253: return int_SNMP_error__status_genErr; ! 254: } ! 255: ! 256: return int_SNMP_error__status_noError; ! 257: } ! 258: ! 259: /* */ ! 260: ! 261: int mediaddr2oid (ip, addr, len, islen) ! 262: register unsigned int *ip; ! 263: register u_char *addr; ! 264: int len, ! 265: islen; ! 266: { ! 267: register int i; ! 268: ! 269: if (islen) ! 270: *ip++ = len & 0xff; ! 271: ! 272: for (i = len; i > 0; i--) ! 273: *ip++ = *addr++ & 0xff; ! 274: ! 275: return (len + (islen ? 1 : 0)); ! 276: } ! 277: ! 278: /* */ ! 279: ! 280: OID oid_extend (q, howmuch) ! 281: register OID q; ! 282: int howmuch; ! 283: { ! 284: register unsigned int i, ! 285: *ip, ! 286: *jp; ! 287: OID oid; ! 288: ! 289: if (q == NULLOID) ! 290: return NULLOID; ! 291: if ((i = q -> oid_nelem) < 1) ! 292: return NULLOID; ! 293: if ((oid = (OID) malloc (sizeof *oid)) == NULLOID) ! 294: return NULLOID; ! 295: ! 296: if ((ip = (unsigned int *) ! 297: calloc ((unsigned) (i + howmuch + 1), sizeof *ip)) ! 298: == NULL) { ! 299: free ((char *) oid); ! 300: return NULLOID; ! 301: } ! 302: ! 303: oid -> oid_elements = ip, oid -> oid_nelem = i + howmuch; ! 304: ! 305: for (i = 0, jp = q -> oid_elements; i < oid -> oid_nelem; i++, jp++) ! 306: *ip++ = *jp; ! 307: ! 308: return oid; ! 309: } ! 310: ! 311: /* */ ! 312: ! 313: OID oid_normalize (q, howmuch, bigvalue) ! 314: register OID q; ! 315: int howmuch, ! 316: bigvalue; ! 317: { ! 318: register int i; ! 319: register unsigned int *ip, ! 320: *jp; ! 321: OID oid; ! 322: ! 323: if ((oid = oid_extend (q, howmuch)) == NULL) ! 324: return NULLOID; ! 325: ! 326: for (jp = (ip = oid -> oid_elements + q -> oid_nelem) - 1; ! 327: jp >= oid -> oid_elements; ! 328: jp--) ! 329: if (*jp > 0) { ! 330: *jp -= 1; ! 331: break; ! 332: } ! 333: for (i = howmuch; i > 0; i--) ! 334: *ip++ = (unsigned int) bigvalue; ! 335: ! 336: return oid; ! 337: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.