From ecbe5220c5d8c7f9f2b26e8810a07198b23ca166 Mon Sep 17 00:00:00 2001 From: Sapan Bhatia Date: Mon, 3 Oct 2011 11:59:52 -0400 Subject: [PATCH] Adding fd_nelink: a script for slices to read the nodes packet headers --- fd_netlink.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 fd_netlink.c diff --git a/fd_netlink.c b/fd_netlink.c new file mode 100644 index 0000000..4dc4ff1 --- /dev/null +++ b/fd_netlink.c @@ -0,0 +1,62 @@ +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "fdpass.h" + + +static void receive_argument(int control_fd, unsigned int *value) +{ + if (recv(control_fd, value, sizeof(unsigned int), 0) != sizeof(unsigned int)) { + fprintf(stderr, "receiving argument failed\n"); + exit(-1); + } +} + +int main(int argc, char *argv[]) +{ + int control_channel_fd, magic_socket; + struct sockaddr_nl addr; + unsigned int pid = 0; + unsigned int gmask = 1; + + if (argc < 3) { + printf("This script is called by vsys.\n"); + exit(1); + } + + control_channel_fd = atoi(argv[2]); + + /* receive pid paramater */ + receive_argument(control_channel_fd, &pid); + + /* receive gmask paramater */ + receive_argument(control_channel_fd, &gmask); + + magic_socket = receive_fd(control_channel_fd); + if (magic_socket == -1) { + fprintf(stderr, "Error creating socket: %d\n", errno); + exit(1); + } + + memset(&addr, 0, sizeof(struct sockaddr_nl)); + addr.nl_family = AF_NETLINK; + addr.nl_pid = pid; + addr.nl_groups = gmask; + if (bind(magic_socket, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + fprintf(stderr, "Error calling bind for AF_NETLINK: %d\n", errno); + exit(1); + } + + send_fd(control_channel_fd, magic_socket); +} -- 2.43.0