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

📄 ipv6.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 5 页
字号:
    default:        break;    }    return NULL;#endif}u_char         *var_udp6(register struct variable * vp,         oid * name,         size_t * length,         int exact, size_t * var_len, WriteMethod ** write_method){    oid             newname[MAX_OID_LEN];    oid             savname[MAX_OID_LEN];    int             result;    int             i, j;    caddr_t         p;    static struct in6pcb in6pcb, savpcb;    int             found, savnameLen;#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/    struct inpcbtable udbtable;    caddr_t	    first;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin)    char           *sysctl_buf;    struct xinpgen *xig, *oxig;#else    static struct in6pcb udb6;#endif    DEBUGMSGTL(("mibII/ipv6", "var_udp6: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6", " %d\n", exact));#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/    if (!auto_nlist("udbtable", (char *) &udbtable, sizeof(udbtable)))        return NULL;    first = p = (caddr_t)udbtable.inpt_queue.cqh_first;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)    if (!auto_nlist("udb6", (char *) &udb6, sizeof(udb6)))        return NULL;    p = (caddr_t) udb6.in6p_next;#else    {        const char     *udblist = "net.inet.udp.pcblist";        const char     *pp = udblist;        size_t          len;        if (sysctlbyname(udblist, 0, &len, 0, 0) < 0)            return NULL;        if ((sysctl_buf = malloc(len)) == NULL)            return NULL;        udblist = pp;        if (sysctlbyname(udblist, sysctl_buf, &len, 0, 0) < 0) {            free(sysctl_buf);            return NULL;        }        oxig = (struct xinpgen *) sysctl_buf;        xig = (struct xinpgen *) ((char *) oxig + oxig->xig_len);        p = (caddr_t) ((char *) xig); /* silence compiler warning */    }#endif    found = savnameLen = 0;    memcpy((char *) newname, (char *) vp->name,           (int) vp->namelen * sizeof(oid));    DEBUGMSGTL(("mibII/ipv6", "start: p=%x\n", p));    while (#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/              p &&  p != first#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)              p && (u_long) p != auto_nlist_value("udb6")#else              xig->xig_len > sizeof(struct xinpgen)#endif        ) {        DEBUGMSGTL(("mibII/ipv6", "looping: p=%x\n", p));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)        if (klookup((u_long) p, (char *) &in6pcb, sizeof(in6pcb)) < 0) {            DEBUGMSGTL(("mibII/ipv6", "klookup fail for udb6 at %x\n",                        p));            found = 0;            break;        }#else        in6pcb = ((struct xinpcb *) xig)->xi_inp;#endif#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/        if (in6pcb.in6p_af != AF_INET6)            goto skip;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin)        if (0 == (in6pcb.inp_vflag & INP_IPV6))            goto skip;#endif        j = (int) vp->namelen;        for (i = 0; i < sizeof(struct in6_addr); i++)            newname[j++] = in6pcb.in6p_laddr.s6_addr[i];        newname[j++] = ntohs(in6pcb.in6p_lport);        if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr))            newname[j++] =                ntohs(*(uint16_t *) & in6pcb.in6p_laddr.s6_addr[2]);        else            newname[j++] = 0;        /*XXX*/            DEBUGMSGTL(("mibII/ipv6", "var_udp6 new: %d %d ",                        (int) vp->namelen, j));        DEBUGMSGOID(("mibII/ipv6", newname, j));        DEBUGMSG(("mibII/ipv6", " %d\n", exact));        result = snmp_oid_compare(name, *length, newname, j);        if (exact && (result == 0)) {                memcpy(&savpcb, &in6pcb, sizeof(savpcb));                savnameLen = j;                memcpy(savname, newname, j * sizeof(oid));                found++;                break;        } else if (!exact && (result < 0)) {            /*             *  take the least greater one             */            if ((savnameLen == 0) ||              (snmp_oid_compare(savname, savnameLen, newname, j) > 0)) {                memcpy(&savpcb, &in6pcb, sizeof(savpcb));                savnameLen = j;                memcpy(savname, newname, j * sizeof(oid));                    found++;            }        }      skip:#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/        p = (caddr_t)in6pcb.in6p_queue.cqe_next;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)        p = (caddr_t) in6pcb.in6p_next;#else        xig = (struct xinpgen *) ((char *) xig + xig->xig_len);#endif    }#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin)    free(sysctl_buf);#endif    DEBUGMSGTL(("mibII/ipv6", "found=%d\n", found));    if (!found)        return NULL;    *length = savnameLen;    memcpy((char *) name, (char *) savname, *length * sizeof(oid));    memcpy(&in6pcb, &savpcb, sizeof(savpcb));    *write_method = 0;    *var_len = sizeof(long);    /* default to 'long' results *//*    DEBUGMSGTL(("mibII/ipv6", "var_udp6 found: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6", " %d\n", exact));*/    DEBUGMSGTL(("mibII/ipv6", "magic=%d\n", vp->magic));    switch (vp->magic) {    case IPV6UDPLOCALADDRESS:        *var_len = sizeof(struct in6_addr);        return in6pcb.in6p_laddr.s6_addr;    case IPV6UDPLOCALPORT:        long_return = ntohs(in6pcb.in6p_lport);        return (u_char *) & long_return;    case IPV6UDPIFINDEX:        if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr))            long_return =                ntohs(*(uint16_t *) & in6pcb.in6p_laddr.s6_addr[2]);        else            long_return = 0;        /*XXX*/ return (u_char *) & long_return;    default:        break;    }    ERROR_MSG("");    return NULL;}#ifdef TCP6u_char         *var_tcp6(register struct variable * vp,         oid * name,         size_t * length,         int exact, size_t * var_len, WriteMethod ** write_method){    oid             newname[MAX_OID_LEN];    oid             savname[MAX_OID_LEN];    int             result;    int             i, j;    caddr_t         p;    static struct in6pcb in6pcb, savpcb;    struct tcp6cb   tcp6cb;    int             found, savnameLen;    static int      tcp6statemap[TCP6_NSTATES];    static int      initialized = 0;#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/    struct inpcbtable tcbtable;    caddr_t	    first;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin)    char           *sysctl_buf;    struct xinpgen *xig, *oxig;#else    static struct in6pcb tcb6;#endif    if (!initialized) {        tcp6statemap[TCP6S_CLOSED] = 1;        tcp6statemap[TCP6S_LISTEN] = 2;        tcp6statemap[TCP6S_SYN_SENT] = 3;        tcp6statemap[TCP6S_SYN_RECEIVED] = 4;        tcp6statemap[TCP6S_ESTABLISHED] = 5;        tcp6statemap[TCP6S_CLOSE_WAIT] = 8;        tcp6statemap[TCP6S_FIN_WAIT_1] = 6;        tcp6statemap[TCP6S_CLOSING] = 10;        tcp6statemap[TCP6S_LAST_ACK] = 9;        tcp6statemap[TCP6S_FIN_WAIT_2] = 7;        tcp6statemap[TCP6S_TIME_WAIT] = 11;        initialized++;    }    DEBUGMSGTL(("mibII/ipv6", "var_tcp6: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6", " %d\n", exact));#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/    if (!auto_nlist("tcbtable", (char *) &tcbtable, sizeof(tcbtable)))        return NULL;    first = p = (caddr_t)tcbtable.inpt_queue.cqh_first;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)    if (!auto_nlist("tcb6", (char *) &tcb6, sizeof(tcb6)))        return NULL;    p = (caddr_t) tcb6.in6p_next;#else    {        const char     *tcblist = "net.inet.tcp.pcblist";        const char     *pp = tcblist;        size_t          len;        if (sysctlbyname(tcblist, 0, &len, 0, 0) < 0)            return NULL;        if ((sysctl_buf = malloc(len)) == NULL)            return NULL;        tcblist = pp;        if (sysctlbyname(tcblist, sysctl_buf, &len, 0, 0) < 0) {            free(sysctl_buf);            return NULL;        }        oxig = (struct xinpgen *) sysctl_buf;        xig = (struct xinpgen *) ((char *) oxig + oxig->xig_len);        p = (caddr_t) ((char *) xig); /* silence compiler warning */    }#endif    found = savnameLen = 0;    memcpy((char *) newname, (char *) vp->name,           (int) vp->namelen * sizeof(oid));    DEBUGMSGTL(("mibII/ipv6", "start: p=%x\n", p));    while (#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/              p &&  p != first#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)              p && (u_long) p != auto_nlist_value("tcb6")#else              xig->xig_len > sizeof(struct xinpgen)#endif        ) {        DEBUGMSGTL(("mibII/ipv6", "looping: p=%x\n", p));#if !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)        if (klookup((u_long) p, (char *) &in6pcb, sizeof(in6pcb)) < 0) {            DEBUGMSGTL(("mibII/ipv6", "klookup fail for tcb6 at %x\n",                        p));            found = 0;            break;        }#else        in6pcb = ((struct xinpcb *) xig)->xi_inp;#endif#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/        if (in6pcb.in6p_af != AF_INET6)            goto skip;#elif (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin)        if (0 == (in6pcb.inp_vflag & INP_IPV6))            goto skip;#endif        if (klookup            ((u_long) in6pcb.in6p_ppcb, (char *) &tcp6cb, sizeof(tcp6cb))            < 0) {            DEBUGMSGTL(("mibII/ipv6", "klookup fail for tcb6.tcp6cb at %x\n",                        in6pcb.in6p_ppcb));            found = 0;            break;        }        j = (int) vp->namelen;        for (i = 0; i < sizeof(struct in6_addr); i++)            newname[j++] = in6pcb.in6p_laddr.s6_addr[i];        newname[j++] = ntohs(in6pcb.in6p_lport);        for (i = 0; i < sizeof(struct in6_addr); i++)            newname[j++] = in6pcb.in6p_faddr.s6_addr[i];        newname[j++] = ntohs(in6pcb.in6p_fport);        if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr))            newname[j++] =                ntohs(*(uint16_t *) & in6pcb.in6p_laddr.s6_addr[2]);        else            newname[j++] = 0;        /*XXX*/ newname[j++] = tcp6statemap[tcp6cb.t_state];        DEBUGMSGTL(("mibII/ipv6", "var_tcp6 new: %d %d ",                        (int) vp->namelen, j));        DEBUGMSGOID(("mibII/ipv6", newname, j));        DEBUGMSG(("mibII/ipv6", " %d\n", exact));#if 1                           /* this is very odd but sometimes happen, and cause infinite loop */        if (ntohs(in6pcb.in6p_lport) == 0)            goto skip;#endif        result = snmp_oid_compare(name, *length, newname, j);        if (exact && (result == 0)) {                memcpy(&savpcb, &in6pcb, sizeof(savpcb));                savnameLen = j;                memcpy(savname, newname, j * sizeof(oid));                found++;                break;        } else if (!exact && (result < 0)) {            /*             *  take the least greater one             */            if ((savnameLen == 0) ||              (snmp_oid_compare(savname, savnameLen, newname, j) > 0)) {                memcpy(&savpcb, &in6pcb, sizeof(savpcb));                savnameLen = j;                memcpy(savname, newname, j * sizeof(oid));                    found++;            }        }      skip:#if defined(__NetBSD__) && __NetBSD_Version__ >= 106250000	/*1.6Y*/        p = (caddr_t)in6pcb.in6p_queue.cqe_next;#elif !(defined(__FreeBSD__) && __FreeBSD__ >= 3) && !defined(darwin)        p = (caddr_t) in6pcb.in6p_next;#else        xig = (struct xinpgen *) ((char *) xig + xig->xig_len);#endif    }#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin)    free(sysctl_buf);#endif    DEBUGMSGTL(("mibII/ipv6", "found=%d\n", found));    if (!found)        return NULL;    *length = savnameLen;    memcpy((char *) name, (char *) savname, *length * sizeof(oid));    memcpy(&in6pcb, &savpcb, sizeof(savpcb));    *write_method = 0;    *var_len = sizeof(long);    /* default to 'long' results *//*    DEBUGMSGTL(("mibII/ipv6", "var_tcp6 found: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6", " %d\n", exact));*/    DEBUGMSGTL(("mibII/ipv6", "magic=%d\n", vp->magic));    switch (vp->magic) {    case IPV6TCPLOCALADDR:        *var_len = sizeof(struct in6_addr);        return (u_char *) & in6pcb.in6p_laddr.s6_addr[0];    case IPV6TCPLOCALPORT:        long_return = ntohs(in6pcb.in6p_lport);        return (u_char *) & long_return;    case IPV6TCPREMOTEADDR:        *var_len = sizeof(struct in6_addr);        return (u_char *) & in6pcb.in6p_faddr.s6_addr[0];    case IPV6TCPREMOTEPORT:        long_return = ntohs(in6pcb.in6p_fport);        return (u_char *) & long_return;    case IPV6TCPIFINDEX:        if (IN6_IS_ADDR_LINKLOCAL(&in6pcb.in6p_laddr))            long_return =                ntohs(*(uint16_t *) & in6pcb.in6p_laddr.s6_addr[2]);        else            long_return = 0;        /*XXX*/ return (u_char *) & long_return;    case IPV6TCPCONNSTATE:        long_return = tcp6statemap[tcp6cb.t_state];        return (u_char *) & long_return;    default:        break;    }    ERROR_MSG("");    return NULL;}#else  /* ! TCP6 */static int mapTcpState( int val){    static int      tcpstatemap[16 /*TCP_NSTATES*/];    static int      initialized = 0;    if (!initialized) {        memset(tcpstatemap, 0, sizeof(tcpstatemap));

⌨️ 快捷键说明

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