mirror of
https://github.com/Waujito/youtubeUnblock.git
synced 2025-12-31 11:45:49 +03:00
Specify dependencies libs explicitly.
Such setup is better for cross compilation. Also changed Makefile to properly make the project with these libraries.
This commit is contained in:
11
deps/libnfnetlink/src/Makefile.am
vendored
Normal file
11
deps/libnfnetlink/src/Makefile.am
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
include $(top_srcdir)/Make_global.am
|
||||
|
||||
lib_LTLIBRARIES = libnfnetlink.la
|
||||
|
||||
libnfnetlink_la_LDFLAGS = -Wc,-nostartfiles \
|
||||
-version-info $(LIBVERSION) \
|
||||
-Wl,--version-script=$(srcdir)/nfnl.version
|
||||
libnfnetlink_la_SOURCES = libnfnetlink.c iftable.c rtnl.c nfnl.version
|
||||
EXTRA_libnfnetlink_la_DEPENDENCIES = $(srcdir)/nfnl.version
|
||||
|
||||
noinst_HEADERS = iftable.h rtnl.h
|
||||
348
deps/libnfnetlink/src/iftable.c
vendored
Normal file
348
deps/libnfnetlink/src/iftable.c
vendored
Normal file
@@ -0,0 +1,348 @@
|
||||
/* iftable - table of network interfaces
|
||||
*
|
||||
* (C) 2004 by Astaro AG, written by Harald Welte <hwelte@astaro.com>
|
||||
* (C) 2008 by Pablo Neira Ayuso <pablo@netfilter.org>
|
||||
*
|
||||
* This software is Free Software and licensed under GNU GPLv2+.
|
||||
*/
|
||||
|
||||
/* IFINDEX handling */
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <linux/netdevice.h>
|
||||
|
||||
#include <libnfnetlink/libnfnetlink.h>
|
||||
#include "rtnl.h"
|
||||
#include "linux_list.h"
|
||||
|
||||
/**
|
||||
* \defgroup iftable Functions in iftable.c [DEPRECATED]
|
||||
* This documentation is provided for the benefit of maintainers of legacy code.
|
||||
*
|
||||
* New applications should use
|
||||
* [libmnl](https://netfilter.org/projects/libmnl/doxygen/html/).
|
||||
* @{
|
||||
*/
|
||||
|
||||
struct ifindex_node {
|
||||
struct list_head head;
|
||||
|
||||
uint32_t index;
|
||||
uint32_t type;
|
||||
uint32_t alen;
|
||||
uint32_t flags;
|
||||
char addr[8];
|
||||
char name[16];
|
||||
};
|
||||
|
||||
struct nlif_handle {
|
||||
struct list_head ifindex_hash[16];
|
||||
struct rtnl_handle *rtnl_handle;
|
||||
struct rtnl_handler ifadd_handler;
|
||||
struct rtnl_handler ifdel_handler;
|
||||
};
|
||||
|
||||
/* iftable_add - Add/Update an entry to/in the interface table
|
||||
* @n: netlink message header of a RTM_NEWLINK message
|
||||
* @arg: not used
|
||||
*
|
||||
* This function adds/updates an entry in the intrface table.
|
||||
* Returns -1 on error, 1 on success.
|
||||
*/
|
||||
static int iftable_add(struct nlmsghdr *n, void *arg)
|
||||
{
|
||||
unsigned int hash, found = 0;
|
||||
struct ifinfomsg *ifi_msg = NLMSG_DATA(n);
|
||||
struct ifindex_node *this;
|
||||
struct rtattr *cb[IFLA_MAX+1];
|
||||
struct nlif_handle *h = arg;
|
||||
|
||||
if (n->nlmsg_type != RTM_NEWLINK)
|
||||
return -1;
|
||||
|
||||
if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi_msg)))
|
||||
return -1;
|
||||
|
||||
rtnl_parse_rtattr(cb, IFLA_MAX, IFLA_RTA(ifi_msg), IFLA_PAYLOAD(n));
|
||||
|
||||
if (!cb[IFLA_IFNAME])
|
||||
return -1;
|
||||
|
||||
hash = ifi_msg->ifi_index & 0xF;
|
||||
list_for_each_entry(this, &h->ifindex_hash[hash], head) {
|
||||
if (this->index == ifi_msg->ifi_index) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
this = malloc(sizeof(*this));
|
||||
if (!this)
|
||||
return -1;
|
||||
|
||||
this->index = ifi_msg->ifi_index;
|
||||
}
|
||||
|
||||
this->type = ifi_msg->ifi_type;
|
||||
this->flags = ifi_msg->ifi_flags;
|
||||
if (cb[IFLA_ADDRESS]) {
|
||||
unsigned int alen;
|
||||
this->alen = alen = RTA_PAYLOAD(cb[IFLA_ADDRESS]);
|
||||
if (alen > sizeof(this->addr))
|
||||
alen = sizeof(this->addr);
|
||||
memcpy(this->addr, RTA_DATA(cb[IFLA_ADDRESS]), alen);
|
||||
} else {
|
||||
this->alen = 0;
|
||||
memset(this->addr, 0, sizeof(this->addr));
|
||||
}
|
||||
strcpy(this->name, RTA_DATA(cb[IFLA_IFNAME]));
|
||||
|
||||
if (!found)
|
||||
list_add(&this->head, &h->ifindex_hash[hash]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* iftable_del - Delete an entry from the interface table
|
||||
* @n: netlink message header of a RTM_DELLINK nlmsg
|
||||
* @arg: not used
|
||||
*
|
||||
* Delete an entry from the interface table.
|
||||
* Returns -1 on error, 0 if no matching entry was found or 1 on success.
|
||||
*/
|
||||
static int iftable_del(struct nlmsghdr *n, void *arg)
|
||||
{
|
||||
struct ifinfomsg *ifi_msg = NLMSG_DATA(n);
|
||||
struct rtattr *cb[IFLA_MAX+1];
|
||||
struct nlif_handle *h = arg;
|
||||
struct ifindex_node *this, *tmp;
|
||||
unsigned int hash;
|
||||
|
||||
if (n->nlmsg_type != RTM_DELLINK)
|
||||
return -1;
|
||||
|
||||
if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi_msg)))
|
||||
return -1;
|
||||
|
||||
rtnl_parse_rtattr(cb, IFLA_MAX, IFLA_RTA(ifi_msg), IFLA_PAYLOAD(n));
|
||||
|
||||
hash = ifi_msg->ifi_index & 0xF;
|
||||
list_for_each_entry_safe(this, tmp, &h->ifindex_hash[hash], head) {
|
||||
if (this->index == ifi_msg->ifi_index) {
|
||||
list_del(&this->head);
|
||||
free(this);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Get the name for an ifindex
|
||||
*
|
||||
* \param nlif_handle A pointer to a ::nlif_handle created
|
||||
* \param index ifindex to be resolved
|
||||
* \param name interface name, pass a buffer of IFNAMSIZ size
|
||||
* \return -1 on error, 1 on success
|
||||
*/
|
||||
int nlif_index2name(struct nlif_handle *h,
|
||||
unsigned int index,
|
||||
char *name)
|
||||
{
|
||||
unsigned int hash;
|
||||
struct ifindex_node *this;
|
||||
|
||||
assert(h != NULL);
|
||||
assert(name != NULL);
|
||||
|
||||
if (index == 0) {
|
||||
strcpy(name, "*");
|
||||
return 1;
|
||||
}
|
||||
|
||||
hash = index & 0xF;
|
||||
list_for_each_entry(this, &h->ifindex_hash[hash], head) {
|
||||
if (this->index == index) {
|
||||
strcpy(name, this->name);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** Get the flags for an ifindex
|
||||
*
|
||||
* \param nlif_handle A pointer to a ::nlif_handle created
|
||||
* \param index ifindex to be resolved
|
||||
* \param flags pointer to variable used to store the interface flags
|
||||
* \return -1 on error, 1 on success
|
||||
*/
|
||||
int nlif_get_ifflags(const struct nlif_handle *h,
|
||||
unsigned int index,
|
||||
unsigned int *flags)
|
||||
{
|
||||
unsigned int hash;
|
||||
struct ifindex_node *this;
|
||||
|
||||
assert(h != NULL);
|
||||
assert(flags != NULL);
|
||||
|
||||
if (index == 0) {
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
hash = index & 0xF;
|
||||
list_for_each_entry(this, &h->ifindex_hash[hash], head) {
|
||||
if (this->index == index) {
|
||||
*flags = this->flags;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** Initialize interface table
|
||||
*
|
||||
* Initialize rtnl interface and interface table
|
||||
* Call this before any nlif_* function
|
||||
*
|
||||
* \return file descriptor to netlink socket
|
||||
*/
|
||||
struct nlif_handle *nlif_open(void)
|
||||
{
|
||||
int i;
|
||||
struct nlif_handle *h;
|
||||
|
||||
h = calloc(1, sizeof(struct nlif_handle));
|
||||
if (h == NULL)
|
||||
goto err;
|
||||
|
||||
for (i=0; i<16; i++)
|
||||
INIT_LIST_HEAD(&h->ifindex_hash[i]);
|
||||
|
||||
h->ifadd_handler.nlmsg_type = RTM_NEWLINK;
|
||||
h->ifadd_handler.handlefn = iftable_add;
|
||||
h->ifadd_handler.arg = h;
|
||||
h->ifdel_handler.nlmsg_type = RTM_DELLINK;
|
||||
h->ifdel_handler.handlefn = iftable_del;
|
||||
h->ifdel_handler.arg = h;
|
||||
|
||||
h->rtnl_handle = rtnl_open();
|
||||
if (h->rtnl_handle == NULL)
|
||||
goto err;
|
||||
|
||||
if (rtnl_handler_register(h->rtnl_handle, &h->ifadd_handler) < 0)
|
||||
goto err_close;
|
||||
|
||||
if (rtnl_handler_register(h->rtnl_handle, &h->ifdel_handler) < 0)
|
||||
goto err_unregister;
|
||||
|
||||
return h;
|
||||
|
||||
err_unregister:
|
||||
rtnl_handler_unregister(h->rtnl_handle, &h->ifadd_handler);
|
||||
err_close:
|
||||
rtnl_close(h->rtnl_handle);
|
||||
free(h);
|
||||
err:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Destructor of interface table
|
||||
*
|
||||
* \param nlif_handle A pointer to a ::nlif_handle created
|
||||
* via nlif_open()
|
||||
*/
|
||||
void nlif_close(struct nlif_handle *h)
|
||||
{
|
||||
int i;
|
||||
struct ifindex_node *this, *tmp;
|
||||
|
||||
assert(h != NULL);
|
||||
|
||||
rtnl_handler_unregister(h->rtnl_handle, &h->ifadd_handler);
|
||||
rtnl_handler_unregister(h->rtnl_handle, &h->ifdel_handler);
|
||||
rtnl_close(h->rtnl_handle);
|
||||
|
||||
for (i=0; i<16; i++) {
|
||||
list_for_each_entry_safe(this, tmp, &h->ifindex_hash[i], head) {
|
||||
list_del(&this->head);
|
||||
free(this);
|
||||
}
|
||||
}
|
||||
|
||||
free(h);
|
||||
h = NULL; /* bugtrap */
|
||||
}
|
||||
|
||||
/** Receive message from netlink and update interface table
|
||||
*
|
||||
* \param nlif_handle A pointer to a ::nlif_handle created
|
||||
* \return 0 if OK
|
||||
*/
|
||||
int nlif_catch(struct nlif_handle *h)
|
||||
{
|
||||
assert(h != NULL);
|
||||
|
||||
if (h->rtnl_handle)
|
||||
return rtnl_receive(h->rtnl_handle);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int nlif_catch_multi(struct nlif_handle *h)
|
||||
{
|
||||
assert(h != NULL);
|
||||
|
||||
if (h->rtnl_handle)
|
||||
return rtnl_receive_multi(h->rtnl_handle);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* nlif_query - request a dump of interfaces available in the system
|
||||
* @h: pointer to a valid nlif_handler
|
||||
*/
|
||||
int nlif_query(struct nlif_handle *h)
|
||||
{
|
||||
assert(h != NULL);
|
||||
|
||||
if (rtnl_dump_type(h->rtnl_handle, RTM_GETLINK) < 0)
|
||||
return -1;
|
||||
|
||||
return nlif_catch_multi(h);
|
||||
}
|
||||
|
||||
/** Returns socket descriptor for the netlink socket
|
||||
*
|
||||
* \param nlif_handle A pointer to a ::nlif_handle created
|
||||
* \return The fd or -1 if there's an error
|
||||
*/
|
||||
int nlif_fd(struct nlif_handle *h)
|
||||
{
|
||||
assert(h != NULL);
|
||||
|
||||
if (h->rtnl_handle)
|
||||
return h->rtnl_handle->rtnl_fd;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
12
deps/libnfnetlink/src/iftable.h
vendored
Normal file
12
deps/libnfnetlink/src/iftable.h
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
#ifndef _IFTABLE_H
|
||||
#define _IFTABLE_H
|
||||
|
||||
int iftable_delete(uint32_t dst, uint32_t mask, uint32_t gw, uint32_t oif);
|
||||
int iftable_insert(uint32_t dst, uint32_t mask, uint32_t gw, uint32_t oif);
|
||||
|
||||
int iftable_init(void);
|
||||
void iftable_fini(void);
|
||||
|
||||
int iftable_dump(FILE *outfd);
|
||||
int iftable_up(unsigned int index);
|
||||
#endif
|
||||
1602
deps/libnfnetlink/src/libnfnetlink.c
vendored
Normal file
1602
deps/libnfnetlink/src/libnfnetlink.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
55
deps/libnfnetlink/src/nfnl.version
vendored
Normal file
55
deps/libnfnetlink/src/nfnl.version
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
NFNETLINK_1.0.1 {
|
||||
global:
|
||||
nfnl_fd;
|
||||
nfnl_portid;
|
||||
nfnl_open;
|
||||
nfnl_close;
|
||||
nfnl_subsys_open;
|
||||
nfnl_subsys_close;
|
||||
nfnl_set_sequence_tracking;
|
||||
nfnl_unset_sequence_tracking;
|
||||
nfnl_set_rcv_buffer_size;
|
||||
nfnl_send;
|
||||
nfnl_sendmsg;
|
||||
nfnl_sendiov;
|
||||
nfnl_fill_hdr;
|
||||
nfnl_talk;
|
||||
nfnl_listen;
|
||||
nfnl_recv;
|
||||
nfnl_callback_register;
|
||||
nfnl_callback_unregister;
|
||||
nfnl_handle_packet;
|
||||
nfnl_parse_hdr;
|
||||
nfnl_check_attributes;
|
||||
nfnl_get_msg_first;
|
||||
nfnl_get_msg_next;
|
||||
nfnl_join;
|
||||
nfnl_process;
|
||||
nfnl_iterator_create;
|
||||
nfnl_iterator_destroy;
|
||||
nfnl_iterator_process;
|
||||
nfnl_iterator_next;
|
||||
nfnl_catch;
|
||||
nfnl_query;
|
||||
nfnl_addattr_l;
|
||||
nfnl_addattr8;
|
||||
nfnl_addattr16;
|
||||
nfnl_addattr32;
|
||||
nfnl_nfa_addattr_l;
|
||||
nfnl_nfa_addattr16;
|
||||
nfnl_nfa_addattr32;
|
||||
nfnl_parse_attr;
|
||||
nfnl_build_nfa_iovec;
|
||||
nfnl_rcvbufsiz;
|
||||
nfnl_dump_packet;
|
||||
nlif_open;
|
||||
nlif_close;
|
||||
nlif_fd;
|
||||
nlif_query;
|
||||
nlif_catch;
|
||||
nlif_index2name;
|
||||
nlif_get_ifflags;
|
||||
|
||||
local:
|
||||
*;
|
||||
};
|
||||
266
deps/libnfnetlink/src/rtnl.c
vendored
Normal file
266
deps/libnfnetlink/src/rtnl.c
vendored
Normal file
@@ -0,0 +1,266 @@
|
||||
/* rtnl - rtnetlink utility functions
|
||||
*
|
||||
* (C) 2004 by Astaro AG, written by Harald Welte <hwelte@astaro.com>
|
||||
*
|
||||
* Adapted to nfnetlink by Eric Leblond <eric@inl.fr>
|
||||
*
|
||||
* This software is free software and licensed under GNU GPLv2+.
|
||||
*
|
||||
*/
|
||||
|
||||
/* rtnetlink - routing table netlink interface */
|
||||
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <linux/netlink.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
#include "rtnl.h"
|
||||
|
||||
#define rtnl_log(x, ...)
|
||||
|
||||
static inline struct rtnl_handler *
|
||||
find_handler(struct rtnl_handle *rtnl_handle, uint16_t type)
|
||||
{
|
||||
struct rtnl_handler *h;
|
||||
for (h = rtnl_handle->handlers; h; h = h->next) {
|
||||
if (h->nlmsg_type == type)
|
||||
return h;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int call_handler(struct rtnl_handle *rtnl_handle,
|
||||
uint16_t type,
|
||||
struct nlmsghdr *hdr)
|
||||
{
|
||||
struct rtnl_handler *h = find_handler(rtnl_handle, type);
|
||||
|
||||
if (!h) {
|
||||
rtnl_log(LOG_DEBUG, "no registered handler for type %u", type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return (h->handlefn)(hdr, h->arg);
|
||||
}
|
||||
|
||||
/* rtnl_handler_register - register handler for given nlmsg type
|
||||
* @hdlr: handler structure
|
||||
*/
|
||||
int rtnl_handler_register(struct rtnl_handle *rtnl_handle,
|
||||
struct rtnl_handler *hdlr)
|
||||
{
|
||||
rtnl_log(LOG_DEBUG, "registering handler for type %u",
|
||||
hdlr->nlmsg_type);
|
||||
hdlr->next = rtnl_handle->handlers;
|
||||
rtnl_handle->handlers = hdlr;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* rtnl_handler_unregister - unregister handler for given nlmst type
|
||||
* @hdlr: handler structure
|
||||
*/
|
||||
int rtnl_handler_unregister(struct rtnl_handle *rtnl_handle,
|
||||
struct rtnl_handler *hdlr)
|
||||
{
|
||||
struct rtnl_handler *h, *prev = NULL;
|
||||
|
||||
rtnl_log(LOG_DEBUG, "unregistering handler for type %u",
|
||||
hdlr->nlmsg_type);
|
||||
|
||||
for (h = rtnl_handle->handlers; h; h = h->next) {
|
||||
if (h == hdlr) {
|
||||
if (prev)
|
||||
prev->next = h->next;
|
||||
else
|
||||
rtnl_handle->handlers = h->next;
|
||||
return 1;
|
||||
}
|
||||
prev = h;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtnl_parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len)
|
||||
{
|
||||
memset(tb, 0, sizeof(struct rtattr *) * max);
|
||||
|
||||
while (RTA_OK(rta, len)) {
|
||||
if (rta->rta_type <= max)
|
||||
tb[rta->rta_type] = rta;
|
||||
rta = RTA_NEXT(rta,len);
|
||||
}
|
||||
if (len)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* rtnl_dump_type - ask rtnetlink to dump a specific table
|
||||
* @type: type of table to be dumped
|
||||
*/
|
||||
int rtnl_dump_type(struct rtnl_handle *rtnl_handle, unsigned int type)
|
||||
{
|
||||
struct {
|
||||
struct nlmsghdr nlh;
|
||||
struct rtgenmsg g;
|
||||
} req;
|
||||
struct sockaddr_nl nladdr;
|
||||
|
||||
memset(&nladdr, 0, sizeof(nladdr));
|
||||
memset(&req, 0, sizeof(req));
|
||||
nladdr.nl_family = AF_NETLINK;
|
||||
|
||||
req.nlh.nlmsg_len = sizeof(req);
|
||||
req.nlh.nlmsg_type = type;
|
||||
req.nlh.nlmsg_flags = NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST;
|
||||
req.nlh.nlmsg_pid = 0;
|
||||
req.nlh.nlmsg_seq = rtnl_handle->rtnl_dump = ++(rtnl_handle->rtnl_seq);
|
||||
req.g.rtgen_family = AF_INET;
|
||||
|
||||
return sendto(rtnl_handle->rtnl_fd, &req, sizeof(req), 0,
|
||||
(struct sockaddr*)&nladdr, sizeof(nladdr));
|
||||
}
|
||||
|
||||
/* rtnl_receive - receive netlink packets from rtnetlink socket */
|
||||
int rtnl_receive(struct rtnl_handle *rtnl_handle)
|
||||
{
|
||||
int status;
|
||||
char buf[8192];
|
||||
struct sockaddr_nl nladdr;
|
||||
struct iovec iov = { buf, sizeof(buf) };
|
||||
struct nlmsghdr *h;
|
||||
|
||||
struct msghdr msg = {
|
||||
.msg_name = &nladdr,
|
||||
.msg_namelen = sizeof(nladdr),
|
||||
.msg_iov = &iov,
|
||||
.msg_iovlen = 1,
|
||||
};
|
||||
|
||||
status = recvmsg(rtnl_handle->rtnl_fd, &msg, 0);
|
||||
if (status < 0) {
|
||||
if (errno == EINTR)
|
||||
return 0;
|
||||
rtnl_log(LOG_NOTICE, "OVERRUN on rtnl socket");
|
||||
return -1;
|
||||
}
|
||||
if (status == 0) {
|
||||
rtnl_log(LOG_ERROR, "EOF on rtnl socket");
|
||||
return -1;
|
||||
}
|
||||
if (msg.msg_namelen != sizeof(nladdr)) {
|
||||
rtnl_log(LOG_ERROR, "invalid address size");
|
||||
return -1;
|
||||
}
|
||||
|
||||
h = (struct nlmsghdr *) buf;
|
||||
while (NLMSG_OK(h, status)) {
|
||||
#if 0
|
||||
if (h->nlmsg_pid != rtnl_local.nl_pid ||
|
||||
h->nlmsg_seq != rtnl_dump) {
|
||||
goto skip;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (h->nlmsg_type == NLMSG_DONE) {
|
||||
rtnl_log(LOG_NOTICE, "NLMSG_DONE");
|
||||
return 0;
|
||||
}
|
||||
if (h->nlmsg_type == NLMSG_ERROR) {
|
||||
struct nlmsgerr *err = NLMSG_DATA(h);
|
||||
if (h->nlmsg_len>=NLMSG_LENGTH(sizeof(struct nlmsgerr)))
|
||||
errno = -err->error;
|
||||
rtnl_log(LOG_ERROR, "NLMSG_ERROR, errnp=%d",
|
||||
errno);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (call_handler(rtnl_handle, h->nlmsg_type, h) == 0)
|
||||
rtnl_log(LOG_NOTICE, "unhandled nlmsg_type %u",
|
||||
h->nlmsg_type);
|
||||
h = NLMSG_NEXT(h, status);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int rtnl_receive_multi(struct rtnl_handle *rtnl_handle)
|
||||
{
|
||||
while (1) {
|
||||
if (rtnl_receive(rtnl_handle) <= 0)
|
||||
break;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* rtnl_open - constructor of rtnetlink module */
|
||||
struct rtnl_handle *rtnl_open(void)
|
||||
{
|
||||
socklen_t addrlen;
|
||||
struct rtnl_handle *h;
|
||||
|
||||
h = calloc(1, sizeof(struct rtnl_handle));
|
||||
if (!h)
|
||||
return NULL;
|
||||
|
||||
addrlen = sizeof(h->rtnl_local);
|
||||
|
||||
h->rtnl_local.nl_pid = getpid();
|
||||
h->rtnl_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
|
||||
if (h->rtnl_fd < 0) {
|
||||
rtnl_log(LOG_ERROR, "unable to create rtnetlink socket");
|
||||
goto err;
|
||||
}
|
||||
|
||||
memset(&h->rtnl_local, 0, sizeof(h->rtnl_local));
|
||||
h->rtnl_local.nl_family = AF_NETLINK;
|
||||
h->rtnl_local.nl_groups = RTMGRP_LINK;
|
||||
if (bind(h->rtnl_fd, (struct sockaddr *) &h->rtnl_local, addrlen) < 0) {
|
||||
rtnl_log(LOG_ERROR, "unable to bind rtnetlink socket");
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
if (getsockname(h->rtnl_fd,
|
||||
(struct sockaddr *) &h->rtnl_local,
|
||||
&addrlen) < 0) {
|
||||
rtnl_log(LOG_ERROR, "cannot gescockname(rtnl_socket)");
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
if (addrlen != sizeof(h->rtnl_local)) {
|
||||
rtnl_log(LOG_ERROR, "invalid address size %u", addr_len);
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
if (h->rtnl_local.nl_family != AF_NETLINK) {
|
||||
rtnl_log(LOG_ERROR, "invalid AF %u", h->rtnl_local.nl_family);
|
||||
goto err_close;
|
||||
}
|
||||
|
||||
h->rtnl_seq = time(NULL);
|
||||
|
||||
return h;
|
||||
|
||||
err_close:
|
||||
close(h->rtnl_fd);
|
||||
err:
|
||||
free(h);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* rtnl_close - destructor of rtnetlink module */
|
||||
void rtnl_close(struct rtnl_handle *rtnl_handle)
|
||||
{
|
||||
close(rtnl_handle->rtnl_fd);
|
||||
free(rtnl_handle);
|
||||
return;
|
||||
}
|
||||
37
deps/libnfnetlink/src/rtnl.h
vendored
Normal file
37
deps/libnfnetlink/src/rtnl.h
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
#ifndef _RTNL_H
|
||||
#define _RTNL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/rtnetlink.h>
|
||||
|
||||
struct rtnl_handler {
|
||||
struct rtnl_handler *next;
|
||||
|
||||
uint16_t nlmsg_type;
|
||||
int (*handlefn)(struct nlmsghdr *h, void *arg);
|
||||
void *arg;
|
||||
};
|
||||
|
||||
struct rtnl_handle {
|
||||
int rtnl_fd;
|
||||
int rtnl_seq;
|
||||
int rtnl_dump;
|
||||
struct sockaddr_nl rtnl_local;
|
||||
struct rtnl_handler *handlers;
|
||||
};
|
||||
|
||||
/* api for handler plugins */
|
||||
int rtnl_handler_register(struct rtnl_handle *rtnl_handle,
|
||||
struct rtnl_handler *hdlr);
|
||||
int rtnl_handler_unregister(struct rtnl_handle *rtnl_handle,
|
||||
struct rtnl_handler *hdlr);
|
||||
int rtnl_parse_rtattr(struct rtattr *tb[], int max, struct rtattr *rta, int len);
|
||||
int rtnl_dump_type(struct rtnl_handle *rtnl_handle, unsigned int type);
|
||||
|
||||
/* api for core program */
|
||||
struct rtnl_handle *rtnl_open(void);
|
||||
void rtnl_close(struct rtnl_handle *rtnl_handle);
|
||||
int rtnl_receive(struct rtnl_handle *rtnl_handle);
|
||||
int rtnl_receive_multi(struct rtnl_handle *rtnl_handle);
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user