Linux Kernel Version checking

For compatibility between new and old distributions of linux.
This commit is contained in:
Valeska 2014-02-14 16:12:55 -08:00
parent 9b8df0cd35
commit cf72a5ec59

View File

@ -27,6 +27,8 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <linux/version.h>
#include "linux_list.h" #include "linux_list.h"
//#define IPTC_DEBUG2 1 //#define IPTC_DEBUG2 1
@ -44,6 +46,7 @@
#define IPT_LIB_DIR "/usr/local/lib/iptables" #define IPT_LIB_DIR "/usr/local/lib/iptables"
#endif #endif
static int sockfd = -1; static int sockfd = -1;
static int sockfd_use = 0; static int sockfd_use = 0;
static void *iptc_fn = NULL; static void *iptc_fn = NULL;
@ -634,6 +637,25 @@ static int iptcc_compile_chain(TC_HANDLE_T h, STRUCT_REPLACE *repl, struct chain
struct iptcb_chain_start *head; struct iptcb_chain_start *head;
struct iptcb_chain_foot *foot; struct iptcb_chain_foot *foot;
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 7, 0)
/* only user-defined chains have heaer */
if (!iptcc_is_builtin(c)) {
/* put chain header in place */
head = (void *)repl->entries + c->head_offset;
head->e.target_offset = sizeof(STRUCT_ENTRY);
head->e.next_offset = IPTCB_CHAIN_START_SIZE;
strcpy(head->name.t.u.user.name, ERROR_TARGET);
head->name.t.u.target_size =
ALIGN(sizeof(struct ipt_error_target));
strcpy(head->name.error, c->name);
} else {
repl->hook_entry[c->hooknum-1] = c->head_offset;
repl->underflow[c->hooknum-1] = c->foot_offset;
}
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
/* only user-defined chains have heaer */ /* only user-defined chains have heaer */
if (!iptcc_is_builtin(c)) { if (!iptcc_is_builtin(c)) {
/* put chain header in place */ /* put chain header in place */
@ -641,13 +663,14 @@ static int iptcc_compile_chain(TC_HANDLE_T h, STRUCT_REPLACE *repl, struct chain
head->e.target_offset = sizeof(STRUCT_ENTRY); head->e.target_offset = sizeof(STRUCT_ENTRY);
head->e.next_offset = IPTCB_CHAIN_START_SIZE; head->e.next_offset = IPTCB_CHAIN_START_SIZE;
strcpy(head->name.target.u.user.name, ERROR_TARGET); strcpy(head->name.target.u.user.name, ERROR_TARGET);
head->name.target.u.target_size = head->name.target.u.target_size =
ALIGN(sizeof(struct ipt_error_target)); ALIGN(sizeof(struct ipt_error_target));
strcpy(head->name.errorname, c->name); strcpy(head->name.error, c->name);
} else { } else {
repl->hook_entry[c->hooknum-1] = c->head_offset; repl->hook_entry[c->hooknum-1] = c->head_offset;
repl->underflow[c->hooknum-1] = c->foot_offset; repl->underflow[c->hooknum-1] = c->foot_offset;
} }
#endif
/* iterate over rules */ /* iterate over rules */
list_for_each_entry(r, &c->rules, list) { list_for_each_entry(r, &c->rules, list) {
@ -744,16 +767,27 @@ static int iptcc_compile_table(TC_HANDLE_T h, STRUCT_REPLACE *repl)
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 7, 0)
/* Append error rule at end of chain */ /* Append error rule at end of chain */
error = (void *)repl->entries + repl->size - IPTCB_CHAIN_ERROR_SIZE; error = (void *)repl->entries + repl->size - IPTCB_CHAIN_ERROR_SIZE;
error->entry.target_offset = sizeof(STRUCT_ENTRY); error->entry.target_offset = sizeof(STRUCT_ENTRY);
error->entry.next_offset = IPTCB_CHAIN_ERROR_SIZE; error->entry.next_offset = IPTCB_CHAIN_ERROR_SIZE;
error->target.t.u.user.target_size =
ALIGN(sizeof(struct ipt_error_target));
strcpy((char *)&error->target.t.u.user.name, ERROR_TARGET);
strcpy((char *)&error->target.error, "ERROR");
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
/* Append error rule at end of chain */
error = (void *)repl->entries + repl->size - IPTCB_CHAIN_ERROR_SIZE;
error->entry.target_offset = sizeof(STRUCT_ENTRY);
error->entry.next_offset = IPTCB_CHAIN_ERROR_SIZE;
error->target.target.u.user.target_size = error->target.target.u.user.target_size =
ALIGN(sizeof(struct ipt_error_target)); ALIGN(sizeof(struct ipt_error_target));
strcpy((char *)&error->target.target.u.user.name, ERROR_TARGET); strcpy((char *)&error->target.target.u.user.name, ERROR_TARGET);
strcpy((char *)&error->target.errorname, "ERROR"); strcpy((char *)&error->target.errorname, "ERROR");
#endif
return 1; return 1;
} }