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

📄 ipv6.c

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 C
📖 第 1 页 / 共 5 页
字号:
}static intheader_ipv6_scan(register struct variable *vp,                 /*                  * IN - pointer to variable entry that points here                   */                 oid * name,    /* IN/OUT - input name requested, output name found */                 size_t * length,       /* IN/OUT - length of input and output oid's */                 int exact,     /* IN - TRUE if an exact match was requested */                 size_t * var_len,      /* OUT - length of variable or 0 if function returned */                 WriteMethod ** write_method, int from, int to){    oid             newname[MAX_OID_LEN];    int             result;    int             i;    DEBUGMSGTL(("mibII/ipv6", "header_ipv6_scan: "));    DEBUGMSGOID(("mibII/ipv6", name, *length));    DEBUGMSG(("mibII/ipv6", " %d\n", exact));    memcpy((char *) newname, (char *) vp->name,           (int) vp->namelen * sizeof(oid));    for (i = from; i <= to; i++) {        newname[(int) vp->namelen] = i;        result =            snmp_oid_compare(name, *length, newname,                             (int) vp->namelen + 1);        if (((exact && result == 0) || (!exact && result < 0))            && if_getname(i))            break;    }    if (to < i)        return (MATCH_FAILED);    memcpy((char *) name, (char *) newname,           ((int) vp->namelen + 1) * sizeof(oid));    *length = vp->namelen + 1;    *write_method = 0;    *var_len = sizeof(long);    /* default to 'long' results */    return (MATCH_SUCCEEDED);}static struct if_nameindex *ifnames = NULL;#ifdef linuxstatic void     linux_if_freenameindex(struct if_nameindex *);static struct if_nameindex *linux_if_nameindex(void);#endifstatic intif_initialize(void){#ifndef HAVE_IF_NAMEINDEX    return -1;#else#ifndef linux    if (ifnames)        if_freenameindex(ifnames);    ifnames = if_nameindex();#else    if (ifnames)        linux_if_freenameindex(ifnames);    ifnames = linux_if_nameindex();#endif    if (!ifnames) {        ERROR_MSG("if_nameindex() failed");        return -1;    }    return 0;#endif}static intif_maxifindex(void){#ifndef HAVE_IF_NAMEINDEX    return -1;#else    struct if_nameindex *p;    int             max = 0;    if (!ifnames) {        if (if_initialize() < 0)            return -1;    }    for (p = ifnames; p && p->if_index; p++) {        if (max < p->if_index)            max = p->if_index;    }    return max;#endif}static intif_countifindex(void){#ifndef HAVE_IF_NAMEINDEX    return -1;#else    struct if_nameindex *p;    int             count = 0;    if (!ifnames) {        if (if_initialize() < 0)            return -1;    }    for (p = ifnames; p && p->if_index; p++) {        count++;    }    return count;#endif}static char    *if_getname(int idx){#ifndef HAVE_IF_NAMEINDEX    return NULL;#else    struct if_nameindex *p;    if (!ifnames) {        if (if_initialize() < 0)            return NULL;    }    for (p = ifnames; p && p->if_index; p++) {        if (p->if_index == idx)            return p->if_name;    }    return NULL;#endif}#ifdef notusedstatic intif_getindex(const char *name){#ifndef HAVE_IF_NAMEINDEX    return -1;#else    struct if_nameindex *p;    if (!ifnames) {        if (if_initialize() < 0)            return -1;    }    for (p = ifnames; p && p->if_index; p++) {        if (strcmp(name, p->if_name) == 0)            return p->if_index;    }    return -1;#endif}#endif /* notused *//*------------------------------------------------------------*/#ifndef linux/* * KAME dependent part  */static intif_getifnet(int idx, struct ifnet *result){    caddr_t         q;    struct ifnet    tmp;    if (!auto_nlist("ifnet", (char *) &q, sizeof(q)))        return -1;    while (q) {        klookup((u_long) q, (char *) &tmp, sizeof(tmp));        if (idx == tmp.if_index) {            memcpy(result, &tmp, sizeof(tmp));            return 0;        }#if (defined(__FreeBSD__) && __FreeBSD__ >= 3) || defined(darwin)        q = (caddr_t) TAILQ_NEXT(&tmp, if_link);#else# if defined(__NetBSD__) || defined(__OpenBSD__)        q = (caddr_t) TAILQ_NEXT(&tmp, if_list);# else        q = (caddr_t) tmp.if_next;# endif#endif    }    return -1;}#if TRUST_IFLASTCHANGE         /*untrustable value returned... */#ifdef HAVE_NET_IF_MIB_H#if defined(HAVE_SYS_SYSCTL_H) && defined(CTL_NET)static intif_getifmibdata(int idx, struct ifmibdata *result){    int             mib[6] = {        CTL_NET, PF_LINK, NETLINK_GENERIC, IFMIB_IFDATA, 0, IFDATA_GENERAL    };    size_t           len;    struct ifmibdata tmp;    mib[4] = idx;    len = sizeof(struct ifmibdata);    if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), &tmp, &len, 0, 0) < 0)        return -1;    memcpy(result, &tmp, sizeof(tmp));    return 0;}#endif#endif                          /*HAVE_NET_IF_MIB_H */#endif  /* TRUST_IFLASTCHANGE */#ifdef __KAME__#define IPV6_FORWARDING_SYMBOL	"ip6_forwarding"#define IPV6_DEFHLIM_SYMBOL	"ip6_defhlim"#endifu_char         *var_ipv6(register struct variable * vp,         oid * name,         size_t * length,         int exact, size_t * var_len, WriteMethod ** write_method){    int             i;    if (header_ipv6(vp, name, length, exact, var_len, write_method)        == MATCH_FAILED) {        return NULL;    }#if defined(HAVE_SYS_SYSCTL_H) && defined(CTL_NET)    /*     * try with sysctl routines      */    {        int             name[] = { CTL_NET, PF_INET6, IPPROTO_IPV6, 0 };        const char     *namestr = NULL;        int             result;        size_t          resultsiz;        resultsiz = sizeof(result);        switch (vp->magic) {        case IPV6FORWARDING:            name[3] = IPV6CTL_FORWARDING;            namestr = "IPV6CTL_FORWARDING";            if (sysctl                (name, sizeof(name) / sizeof(name[0]), &result, &resultsiz,                 0, 0) < 0) {                DEBUGMSGTL(("mibII/ipv6",                            "sysctl(CTL_NET, PF_INET6, IPPROTO_IPV6, %s)\n",                            namestr));                break;            } else {                if (result)                    long_return = 1;    /* GATEWAY */                else                    long_return = 2;    /* HOST */                return (u_char *) & long_return;            }            break;        case IPV6DEFAULTHOPLIMIT:            name[3] = IPV6CTL_DEFHLIM;            namestr = "IPV6CTL_DEFHLIM";            if (sysctl                (name, sizeof(name) / sizeof(name[0]), &result, &resultsiz,                 0, 0) < 0) {                DEBUGMSGTL(("mibII/ipv6",                            "sysctl(CTL_NET, PF_INET6, IPPROTO_IPV6, %s)\n",                            namestr));                break;            } else {                long_return = result;                return (u_char *) & long_return;            }        }    }#endif                          /* not (HAVE_SYS_SYSCTL_H && CTL_NET) */    /*     * try looking into the kernel variable      */    switch (vp->magic) {#ifdef IPV6_FORWARDING_SYMBOL    case IPV6FORWARDING:        if (auto_nlist(IPV6_FORWARDING_SYMBOL, (char *) &i, sizeof(i))) {            if (i)                long_return = 1;            /*GATEWAY*/            else                long_return = 2;            /*HOST*/ return (u_char *) & long_return;        }        break;#endif#ifdef IPV6_DEFHLIM_SYMBOL    case IPV6DEFAULTHOPLIMIT:        if (auto_nlist(IPV6_DEFHLIM_SYMBOL, (char *) &i, sizeof(i))) {            long_return = i;            return (u_char *) & long_return;        }        break;#endif    case IPV6INTERFACES:#ifdef HAVE_IF_NAMEINDEX        /*         * not really the right answer... we must count IPv6 capable         * interfaces only.         */        long_return = if_countifindex();        if (long_return < 0)            break;        return (u_char *) & long_return;#endif        break;#if 0    case IPV6IFTBLLASTCHG:        long_return = 0;        /*XXX*/ return (u_char *) & long_return;#endif    default:        break;    }    ERROR_MSG("");    return NULL;}u_char         *var_ifv6Entry(register struct variable * vp,              oid * name,              size_t * length,              int exact, size_t * var_len, WriteMethod ** write_method){#ifndef HAVE_IF_NAMEINDEX    return NULL;#else    int             interface;    int             max;    char           *p;    max = if_maxifindex();    if (max < 0)        return NULL;    if (header_ipv6_scan        (vp, name, length, exact, var_len, write_method, 1, max)        == MATCH_FAILED) {        return NULL;    }    interface = name[*length - 1];    DEBUGMSGTL(("mibII/ipv6", "interface: %d(%s)\n",                interface, if_getname(interface)));    if (interface > max)        return NULL;    switch (vp->magic) {    case IPV6IFDESCR:        p = if_getname(interface);        if (p) {            *var_len = strlen(p);            return p;        }        break;    case IPV6IFLOWLAYER:        /*         * should check if type, this is a hard one...          */        *var_len = nullOidLen;        return (u_char *) nullOid;    case IPV6IFEFFECTMTU:        {#if defined(SIOCGIFMTU) && !defined(__OpenBSD__)            struct ifreq    ifr;            int             s;            memset(&ifr, 0, sizeof(ifr));            ifr.ifr_addr.sa_family = AF_INET6;            strncpy(ifr.ifr_name, if_getname(interface),                    sizeof(ifr.ifr_name));            if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)                break;            if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) {                close(s);                break;            }            long_return = ifr.ifr_mtu;            close(s);            return (u_char *) & long_return;#else            break;#endif        }#if 0                           /*not yet */    case IPV6IFREASMMAXSIZE:        /*         * I dunno what the spec means for this MIB          */    case IPV6IFTOKEN:    case IPV6IFTOKENLEN:#endif    case IPV6IFPHYSADDRESS:        {            struct ifnet    ifnet;            struct ifaddr   ifaddr;            static struct sockaddr_dl sdl;            caddr_t         ifa;

⌨️ 快捷键说明

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