Introduce old redir program
[lcapit-junk-code.git] / linux-kernel / netlink / tiny-to-user / tu-test.c
blob37a06b0938be889909bd27d6b10ccc72e76e072e
1 /*
2 * tu-test: Read a netlink message from the kernel.
3 *
4 * This program requires the netlink-tiny-tu kernel module. It sends a
5 * netlink message to user-space.
6 *
7 * Luiz Fernando N. Capitulino
8 * <lcapitulino@gmail.com>
9 */
10 #include <stdio.h>
11 #include <string.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14 #include <sys/types.h>
15 #include <sys/socket.h>
16 #include <linux/netlink.h>
18 #define MSG_MAX_SIZE 512
19 #define NETLINK_TINY_TU 20 // from netlink-tiny-tu.c
21 /* create_socket(): Create a netlink socket and bind it.
22 * Return a file-descriptor on success, -1 otherwise. */
23 static int create_socket(void)
25 int err, fd;
26 struct sockaddr_nl sa;
28 fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_TINY_TU);
29 if (fd < 0)
30 return -1;
32 memset(&sa, 0, sizeof(sa));
33 sa.nl_family = AF_NETLINK;
34 sa.nl_pid = getpid(); // self pid
35 sa.nl_groups = 1; // group
37 err = bind(fd, (struct sockaddr *) &sa, sizeof(sa));
38 if (err)
39 return -1;
41 return fd;
44 /* read_message(): Read a netlink message from 'sock_fd'
45 * and return it. */
46 static struct nlmsghdr *read_message(int sock_fd, size_t len)
48 ssize_t bytes;
49 struct iovec iov;
50 struct msghdr msg;
51 struct nlmsghdr *nlhdr;
52 struct sockaddr_nl nladdr;
54 len = NLMSG_SPACE(len);
55 nlhdr = malloc(len);
56 if (!nlhdr)
57 return NULL;
59 memset(nlhdr, 0, len);
60 iov.iov_base = (void *) nlhdr;
61 iov.iov_len = len;
63 memset(&nladdr, 0, sizeof(nladdr));
65 memset(&msg, 0, sizeof(msg));
66 msg.msg_name = (void *) &(nladdr);
67 msg.msg_namelen = sizeof(nladdr);
68 msg.msg_iov = &iov;
69 msg.msg_iovlen = 1;
71 bytes = recvmsg(sock_fd, &msg, 0);
72 if (bytes < 0) {
73 free(nlhdr);
74 return NULL;
77 return nlhdr;
80 int main(int argc, char *argv[])
82 int sock_fd;
83 struct nlmsghdr *msg;
85 sock_fd = create_socket();
86 if (sock_fd < 0) {
87 perror("create_socket()");
88 exit(1);
91 msg = read_message(sock_fd, MSG_MAX_SIZE);
92 if (!msg) {
93 perror("read_message()");
94 exit(1);
97 printf("%s\n", (char *) NLMSG_DATA(msg));
99 free(msg);
100 close(sock_fd);
102 return 0;