#include #include #include #include static int compatible_revision(const char *name, u_int8_t revision, int opt) { struct ipt_get_revision rev; socklen_t s = sizeof(rev); int max_rev, sockfd; sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if (sockfd < 0) { fprintf(stderr, "Could not open socket to kernel: %s\n", strerror(errno)); exit(1); } strcpy(rev.name, name); rev.revision = revision; max_rev = getsockopt(sockfd, IPPROTO_IP, opt, &rev, &s); if (max_rev < 0) { /* Definitely don't support this? */ if (errno == EPROTONOSUPPORT) { close(sockfd); return 0; } else if (errno == ENOPROTOOPT) { close(sockfd); /* Assume only revision 0 support (old kernel) */ return (revision == 0); } else { fprintf(stderr, "getsockopt failed strangely: %s\n", strerror(errno)); exit(1); } } close(sockfd); return 1; } int main(void) { char *name = "multiport"; u_int8_t revision = 0; compatible_revision(name, revision, IPT_SO_GET_REVISION_MATCH); }