Hi!
>Не поделится ли кто примером, как на Си под Linux'ом добавить в
>ядро маршрут?
да запросто:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/route.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
extern int errno;
int main(int argc, char **argv)
{
struct rtentry route_entry;
struct sockaddr_in sa;
const char *route_dst = "1.2.3.4";
const char *route_mask = "255.255.255.0";
const char *route_gw = "1.2.2.4";
int sock_fd;
if ( (sock_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == -1)
{
printf("Error opening socket. %d: %s\n", errno, strerror(errno));
return -1;
}
memset((void *)&route_entry, 0, sizeof(route_entry));
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(route_dst);
memcpy(&route_entry.rt_dst, &sa, sizeof(sa));
sa.sin_addr.s_addr=inet_addr(route_gw);
memcpy(&route_entry.rt_gateway, &sa, sizeof(sa));
sa.sin_addr.s_addr=inet_addr(route_mask);
memcpy(&route_entry.rt_genmask, &sa, sizeof(sa));
route_entry.rt_flags=RTF_UP|RTF_GATEWAY;
route_entry.rt_metric=1;
if (ioctl(sock_fd, SIOCADDRT, &route_entry) == -1)
printf("Error %d: %s\n", errno, strerror(errno));
close(sock_fd);
return 0;
}