/* nl_create_socket(), nl_bind_socket() and nl_read_msg() * for Interactive Firewall * sbellabes@mandriva.com */ #include #include #include #include #include #include #include "libnl_ifw.h" int nl_ifw_bind_socket(int s) { struct sockaddr_nl saddr_nl; int res; memset(&saddr_nl, 0, sizeof(struct sockaddr_nl)); saddr_nl.nl_family = AF_NETLINK; saddr_nl.nl_pid = getpid(); saddr_nl.nl_groups = 1; res = bind(s, (struct sockaddr *)&saddr_nl, sizeof(saddr_nl)); if (res == -1) { perror("nl_bind_socket"); return -1; } return 1; } int nl_ifw_create_socket(void) { int s; s = socket(PF_NETLINK, SOCK_RAW, NETLINK_IFWLOG); if (s < 0) { perror("nl_create_socket"); return -1; } if (nl_ifw_bind_socket(s) < 0) { close(s); fprintf(stderr, "bind failed\n"); return -1; } return s; } int nl_ifw_read_msg(int s, struct nlmsghdr *nlh, struct nl_msg *msg) { char buf[sizeof(struct nlmsghdr) + sizeof(struct nl_msg)]; int ret; ret = recv(s, &buf, sizeof(buf), 0); if (ret > 0) { if (nlh) memcpy(nlh, buf, sizeof(struct nlmsghdr)); if (msg) memcpy(msg, NLMSG_DATA(buf), sizeof(struct nl_msg)); } return ret; }