⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tools.c

📁 snmp up 2
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************-o-****** * dump_chunk * * Parameters: *	*title	(May be NULL.) *	*buf *	 size */voiddump_chunk(const char *debugtoken, const char *title, const u_char * buf,           int size){    u_int           printunit = 64;     /* XXX  Make global. */    char            chunk[SNMP_MAXBUF], *s, *sp;    if (title && (*title != '\0')) {        DEBUGMSGTL((debugtoken, "%s\n", title));    }    memset(chunk, 0, SNMP_MAXBUF);    size = binary_to_hex(buf, size, &s);    sp = s;    while (size > 0) {        if (size > (int) printunit) {            strncpy(chunk, sp, printunit);            chunk[printunit] = '\0';            DEBUGMSGTL((debugtoken, "\t%s\n", chunk));        } else {            DEBUGMSGTL((debugtoken, "\t%s\n", sp));        }        sp += printunit;        size -= printunit;    }    SNMP_FREE(s);}                               /* end dump_chunk() *//*******************************************************************-o-****** * dump_snmpEngineID * * Parameters: *	*estring *	*estring_len *       * Returns: *	Allocated memory pointing to a string of buflen char representing *	a printf'able form of the snmpEngineID. * *	-OR- NULL on error. * * * Translates the snmpEngineID TC into a printable string.  From RFC 2271, * Section 5 (pp. 36-37): * * First bit:	0	Bit string structured by means non-SNMPv3. *  		1	Structure described by SNMPv3 SnmpEngineID TC. *   * Bytes 1-4:		Enterprise ID.  (High bit of first byte is ignored.) *   * Byte 5:	0	(RESERVED by IANA.) *  		1	IPv4 address.		(   4 octets) *  		2	IPv6 address.		(  16 octets) *  		3	MAC address.		(   6 octets) *  		4	Locally defined text.	(0-27 octets) *  		5	Locally defined octets.	(0-27 octets) *  		6-127	(RESERVED for enterprise.) *   * Bytes 6-32:		(Determined by byte 5.) *   * * Non-printable characters are given in hex.  Text is given in quotes. * IP and MAC addresses are given in standard (UN*X) conventions.  Sections * are comma separated. * * esp, remaining_len and s trace the state of the constructed buffer. * s will be defined if there is something to return, and it will point * to the end of the constructed buffer. * * * ASSUME  "Text" means printable characters. * * XXX	Must the snmpEngineID always have a minimum length of 12? *	(Cf. part 2 of the TC definition.) * XXX	Does not enforce upper-bound of 32 bytes. * XXX	Need a switch to decide whether to use DNS name instead of a simple *	IP address. * * FIX	Use something other than sprint_hexstring which doesn't add  *	trailing spaces and (sometimes embedded) newlines... */#ifdef SNMP_TESTING_CODEchar           *dump_snmpEngineID(const u_char * estring, size_t * estring_len){#define eb(b)	( *(esp+b) & 0xff )    int             rval = SNMPERR_SUCCESS, gotviolation = 0, slen = 0;    u_int           remaining_len;    char            buf[SNMP_MAXBUF], *s = NULL, *t;    const u_char   *esp = estring;    struct in_addr  iaddr;    /*     * Sanity check.     */    if (!estring || (*estring_len <= 0)) {        QUITFUN(SNMPERR_GENERR, dump_snmpEngineID_quit);    }    remaining_len = *estring_len;    memset(buf, 0, SNMP_MAXBUF);    /*     * Test first bit.  Return immediately with a hex string, or     * begin by formatting the enterprise ID.     */    if (!(*esp & 0x80)) {        sprint_hexstring(buf, esp, remaining_len);        s = strchr(buf, '\0');        s -= 1;        goto dump_snmpEngineID_quit;    }    s = buf;    s += sprintf(s, "enterprise %d, ", ((*(esp + 0) & 0x7f) << 24) |                 ((*(esp + 1) & 0xff) << 16) |                 ((*(esp + 2) & 0xff) << 8) | ((*(esp + 3) & 0xff)));    /*     * XXX  Ick.      */    if (remaining_len < 5) {    /* XXX  Violating string. */        goto dump_snmpEngineID_quit;    }    esp += 4;                   /* Incremented one more in the switch below. */    remaining_len -= 5;    /*     * Act on the fifth byte.     */    switch ((int) *esp++) {    case 1:                    /* IPv4 address. */        if (remaining_len < 4)            goto dump_snmpEngineID_violation;        memcpy(&iaddr.s_addr, esp, 4);        if (!(t = inet_ntoa(iaddr)))            goto dump_snmpEngineID_violation;        s += sprintf(s, "%s", t);        esp += 4;        remaining_len -= 4;        break;    case 2:                    /* IPv6 address. */        if (remaining_len < 16)            goto dump_snmpEngineID_violation;        s += sprintf(s,                     "%02X%02X %02X%02X %02X%02X %02X%02X::"                     "%02X%02X %02X%02X %02X%02X %02X%02X",                     eb(0), eb(1), eb(2), eb(3),                     eb(4), eb(5), eb(6), eb(7),                     eb(8), eb(9), eb(10), eb(11),                     eb(12), eb(13), eb(14), eb(15));        esp += 16;        remaining_len -= 16;        break;    case 3:                    /* MAC address. */        if (remaining_len < 6)            goto dump_snmpEngineID_violation;        s += sprintf(s, "%02X:%02X:%02X:%02X:%02X:%02X",                     eb(0), eb(1), eb(2), eb(3), eb(4), eb(5));        esp += 6;        remaining_len -= 6;        break;    case 4:                    /* Text. */        /*         * Doesn't exist on all (many) architectures          */        /*         * s += snprintf(s, remaining_len+3, "\"%s\"", esp);          */        s += sprintf(s, "\"%s\"", esp);        goto dump_snmpEngineID_quit;        break;     /*NOTREACHED*/ case 5:    /* Octets. */        sprint_hexstring(s, esp, remaining_len);        s = strchr(buf, '\0');        s -= 1;        goto dump_snmpEngineID_quit;        break;       /*NOTREACHED*/ dump_snmpEngineID_violation:    case 0:                    /* Violation of RESERVED,                                  * *   -OR- of expected length.                                 */        gotviolation = 1;        s += sprintf(s, "!!! ");    default:                   /* Unknown encoding. */        if (!gotviolation) {            s += sprintf(s, "??? ");        }        sprint_hexstring(s, esp, remaining_len);        s = strchr(buf, '\0');        s -= 1;        goto dump_snmpEngineID_quit;    }                           /* endswitch */    /*     * Cases 1-3 (IP and MAC addresses) should not have trailing     * octets, but perhaps they do.  Throw them in too.  XXX     */    if (remaining_len > 0) {        s += sprintf(s, " (??? ");        sprint_hexstring(s, esp, remaining_len);        s = strchr(buf, '\0');        s -= 1;        s += sprintf(s, ")");    }  dump_snmpEngineID_quit:    if (s) {        slen = s - buf + 1;        s = calloc(1, slen);        memcpy(s, buf, (slen) - 1);    }    memset(buf, 0, SNMP_MAXBUF);        /* XXX -- Overkill? XXX: Yes! */    return s;#undef eb}                               /* end dump_snmpEngineID() */#endif                          /* SNMP_TESTING_CODE *//* * create a new time marker. * NOTE: Caller must free time marker when no longer needed. */marker_tatime_newMarker(void){    marker_t        pm = (marker_t) calloc(1, sizeof(struct timeval));    gettimeofday((struct timeval *) pm, 0);    return pm;}/* * set a time marker. */voidatime_setMarker(marker_t pm){    if (!pm)        return;    gettimeofday((struct timeval *) pm, 0);}/* * Returns the difference (in msec) between the two markers */longatime_diff(marker_t first, marker_t second){    struct timeval *tv1, *tv2, diff;    tv1 = (struct timeval *) first;    tv2 = (struct timeval *) second;    diff.tv_sec = tv2->tv_sec - tv1->tv_sec - 1;    diff.tv_usec = tv2->tv_usec - tv1->tv_usec + 1000000;    return (diff.tv_sec * 1000 + diff.tv_usec / 1000);}/* * Returns the difference (in u_long msec) between the two markers */u_longuatime_diff(marker_t first, marker_t second){    struct timeval *tv1, *tv2, diff;    tv1 = (struct timeval *) first;    tv2 = (struct timeval *) second;    diff.tv_sec = tv2->tv_sec - tv1->tv_sec - 1;    diff.tv_usec = tv2->tv_usec - tv1->tv_usec + 1000000;    return (((u_long) diff.tv_sec) * 1000 + diff.tv_usec / 1000);}/* * Returns the difference (in u_long 1/100th secs) between the two markers * (functionally this is what sysUpTime needs) */u_longuatime_hdiff(marker_t first, marker_t second){    struct timeval *tv1, *tv2, diff;    u_long          res;    tv1 = (struct timeval *) first;    tv2 = (struct timeval *) second;    diff.tv_sec = tv2->tv_sec - tv1->tv_sec - 1;    diff.tv_usec = tv2->tv_usec - tv1->tv_usec + 1000000;    res = ((u_long) diff.tv_sec) * 100 + diff.tv_usec / 10000;    return res;}/* * Test: Has (marked time plus delta) exceeded current time (in msec) ? * Returns 0 if test fails or cannot be tested (no marker). */intatime_ready(marker_t pm, int deltaT){    marker_t        now;    long            diff;    if (!pm)        return 0;    now = atime_newMarker();    diff = atime_diff(pm, now);    free(now);    if (diff < deltaT)        return 0;    return 1;}/* * Test: Has (marked time plus delta) exceeded current time (in msec) ? * Returns 0 if test fails or cannot be tested (no marker). */intuatime_ready(marker_t pm, unsigned int deltaT){    marker_t        now;    u_long          diff;    if (!pm)        return 0;    now = atime_newMarker();    diff = uatime_diff(pm, now);    free(now);    if (diff < deltaT)        return 0;    return 1;}        /*         * Time-related utility functions         */                /*                 * Return the number of timeTicks since the given marker                  */intmarker_tticks(marker_t pm){    int             res;    marker_t        now = atime_newMarker();    res = atime_diff(pm, now);    free(now);    return res / 10;            /* atime_diff works in msec, not csec */}inttimeval_tticks(struct timeval *tv){    return marker_tticks((marker_t) tv);}

⌨️ 快捷键说明

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