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

📄 route_ioctl.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
字号:
/* * Portions of this file are subject to copyright(s).  See the Net-SNMP's * COPYING file for more details and other copyrights that may apply. */#include <net-snmp/net-snmp-config.h>#include <sys/types.h>#if HAVE_SYS_PARAM_H#include <sys/param.h>#endif#if HAVE_SYS_FILE_H#include <sys/file.h>#endif#if HAVE_SYS_SOCKET_H#include <sys/socket.h>#endif#if HAVE_SYS_SOCKIO_H#include <sys/sockio.h>#endif#if HAVE_SYS_IOCTL_H#include <sys/ioctl.h>#endif#if HAVE_SYS_MBUF_H#include <sys/mbuf.h>#endif#if HAVE_SYS_STREAM_H#include <sys/stream.h>#endif#if HAVE_NET_ROUTE_H#include <net/route.h>#endif#if HAVE_NETINET_IN_H#include <netinet/in.h>#endif#if HAVE_ARPA_INET_H#include <arpa/inet.h>#endif#if HAVE_NETDB_H#include <netdb.h>#endif#include <errno.h>#if HAVE_UNISTD_H#include <unistd.h>#endif#include <stdio.h>#include <ctype.h>#if HAVE_STRING_H#include <string.h>#endif#if HAVE_STDLIB_H#include <stdlib.h>#endif#if HAVE_WINSOCK_H#include <winsock.h>#endif#include <net-snmp/net-snmp-includes.h>#include <net-snmp/agent/net-snmp-agent-includes.h>#include <net-snmp/data_access/route.h>#include "ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable.h"#include "route_ioctl.h"#ifdef cygwin#include <windows.h>#endif#ifndef STRUCT_RTENTRY_HAS_RT_DST#   define rt_dst rt_nodes->rn_key#endif#ifndef STRUCT_RTENTRY_HAS_RT_HASH#   define rt_hash rt_pad1#endif#ifdef linux#   define NETSNMP_ROUTE_WRITE_PROTOCOL PF_ROUTE#else#   define NETSNMP_ROUTE_WRITE_PROTOCOL 0#endif#ifdef irix6#define SIOCADDRT SIOCADDMULTI#define SIOCDELRT SIOCDELMULTI#endif#if defined SIOCADDRT && !defined(irix6)int _netsnmp_ioctl_route_set_v4(netsnmp_route_entry * entry){    struct sockaddr_in dst, gateway, mask;    int             s, rc;    RTENTRY         route;    char *          DEBUGSTR;    netsnmp_assert(NULL != entry); /* checked in netsnmp_arch_route_create */    netsnmp_assert((4 == entry->rt_dest_len) && (4 == entry->rt_nexthop_len));    s = socket(AF_INET, SOCK_RAW, NETSNMP_ROUTE_WRITE_PROTOCOL);    if (s < 0) {        snmp_log_perror("socket");        return -3;    }    memset(&route, 0, sizeof(route));    dst.sin_family = AF_INET;    memcpy(&dst.sin_addr.s_addr, entry->rt_dest, 4);    DEBUGSTR = inet_ntoa(dst.sin_addr);    DEBUGMSGTL(("access:route","*** route to %s\n", DEBUGSTR));    gateway.sin_family = AF_INET;    memcpy(&gateway.sin_addr.s_addr, entry->rt_nexthop, 4);    DEBUGSTR = inet_ntoa(gateway.sin_addr);    DEBUGMSGTL(("access:route","    via %s\n", DEBUGSTR));    mask.sin_family = AF_INET;    mask.sin_addr.s_addr = htonl(0);    DEBUGSTR = inet_ntoa(mask.sin_addr);    DEBUGMSGTL(("access:route","    mask %s\n", DEBUGSTR));    memcpy(&route.rt_dst, &dst, sizeof(struct sockaddr_in));    memcpy(&route.rt_gateway, &gateway, sizeof(struct sockaddr_in));    memcpy(&route.rt_genmask, &mask, sizeof(struct sockaddr_in));    if (32 == entry->rt_pfx_len)        route.rt_flags |= RTF_HOST;    if (INETCIDRROUTETYPE_REMOTE == entry->rt_type)        route.rt_flags |= RTF_GATEWAY;    route.rt_flags |= RTF_UP;#ifndef RTENTRY_4_4    route.rt_hash = entry->if_index;#endif    rc = ioctl(s, SIOCADDRT, (caddr_t) & route);    close(s);    if (rc < 0) {        snmp_log_perror("ioctl");        return -4;    }    return 0;}#endif#if defined SIOCDELRT && !defined(irix6)int _netsnmp_ioctl_route_delete_v4(netsnmp_route_entry * entry){    struct sockaddr_in dst;    struct sockaddr_in gateway;    int             s, rc;    RTENTRY         route;    netsnmp_assert(NULL != entry); /* checked in netsnmp_arch_route_delete */    netsnmp_assert((4 == entry->rt_dest_len) && (4 == entry->rt_nexthop_len));    s = socket(AF_INET, SOCK_RAW, NETSNMP_ROUTE_WRITE_PROTOCOL);    if (s < 0) {        snmp_log_perror("socket");        return -3;    }    memset(&route, 0, sizeof(route));    dst.sin_family = AF_INET;    memcpy(&dst.sin_addr.s_addr, entry->rt_dest, 4);    gateway.sin_family = AF_INET;    memcpy(&gateway.sin_addr.s_addr, entry->rt_nexthop, 4);    memcpy(&route.rt_dst, &dst, sizeof(struct sockaddr_in));    memcpy(&route.rt_gateway, &gateway, sizeof(struct sockaddr_in));    if (32 == entry->rt_pfx_len)        route.rt_flags |= RTF_HOST;    if (INETCIDRROUTETYPE_REMOTE == entry->rt_type)        route.rt_flags |= RTF_GATEWAY;    route.rt_flags |= RTF_UP;#ifndef RTENTRY_4_4    route.rt_hash = entry->if_index;#endif    rc = ioctl(s, SIOCDELRT, (caddr_t) & route);    close(s);    if (rc < 0) {        snmp_log_perror("ioctl");        rc = -4;    }    return rc;}#endif                           /* SIOCDELRT */

⌨️ 快捷键说明

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