Inca o eroare ( de linking ... ??? ) la care ma dau cu capul de peretzi ...
compilez modulele pentru kernel 2.4.28 ... patch cu ipt_ACCOUNT ... si
imi da minunatzie :
gcc -D__KERNEL__ -I/usr/src/linux-2.4.28/include -Wall
-Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing
-fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2
-march=i686 -DMODULE -DMODVERSIONS -include
/usr/src/linux-2.4.28/include/linux/modversions.h -nostdinc
-iwithprefix include -DKBUILD_BASENAME=ipt_ACCOUNT -c -o
ipt_ACCOUNT.o ipt_ACCOUNT.c
ipt_ACCOUNT.c: In function `ipt_acc_handle_prepare_read':
ipt_ACCOUNT.c:621: parse error before `struct'
ipt_ACCOUNT.c:625: `b' undeclared (first use in this function)
ipt_ACCOUNT.c:625: (Each undeclared identifier is reported only once
ipt_ACCOUNT.c:625: for each function it appears in.)
ipt_ACCOUNT.c:626: `src_16' undeclared (first use in this function)
ipt_ACCOUNT.c:627: `network_16' undeclared (first use in this function)
make[2]: *** [ipt_ACCOUNT.o] Error 1
make[2]: Leaving directory `/usr/src/linux-2.4.28/net/ipv4/netfilter'
make[1]: *** [_modsubdir_ipv4/netfilter] Error 2
make[1]: Leaving directory `/usr/src/linux-2.4.28/net'
make: *** [_mod_net] Error 2
Buuuuun .. ma uit in /usr/src/linux/net/ipv4/netfilter/ipt_ACCOUNT.c :
static int ipt_acc_handle_prepare_read(char *tablename, u_int32_t *count)
{
int handle, i, table_nr=-1;
unsigned char depth;
for (i = 0; i < ACCOUNT_MAX_TABLES; i++)
if (strncmp(ipt_acc_tables[i].name, tablename,
ACCOUNT_TABLE_NAME_LEN) == 0) {
table_nr = i;
break;
}
if (table_nr == -1) {
printk("ACCOUNT: ipt_acc_handle_prepare_read(): "
"Table %s not found\n", tablename);
return -1;
}
/* Can't find a free handle slot? */
if ((handle = ipt_acc_handle_find_slot()) == -1)
return -1;
/* Fill up handle structure */
ipt_acc_handles[handle].ip = ipt_acc_tables[table_nr].ip;
ipt_acc_handles[handle].depth = ipt_acc_tables[table_nr].depth;
ipt_acc_handles[handle].itemcount = ipt_acc_tables[table_nr].itemcount;
/* allocate "root" table */
if ((ipt_acc_handles[handle].data =
(void*)get_zeroed_page(GFP_ATOMIC)) == NULL) {
printk("ACCOUNT: out of memory for root table "
"in ipt_acc_handle_prepare_read()\n");
memset (&ipt_acc_handles[handle], 0,
sizeof(struct ipt_acc_handle));
return -1;
/* Recursive copy of complete data structure */
depth = ipt_acc_handles[handle].depth;
if (depth == 0) {
memcpy(ipt_acc_handles[handle].data,
ipt_acc_tables[table_nr].data,
sizeof(struct ipt_acc_mask_24));
} else if (depth == 1) {
struct ipt_acc_mask_16 *src_16 =
(struct ipt_acc_mask_16 *)ipt_acc_tables[table_nr].data;
struct ipt_acc_mask_16 *network_16 =
(struct ipt_acc_mask_16 *)ipt_acc_handles[handle].data;
u_int32_t b;
for (b = 0; b <= 255; b++) {
if (src_16->mask_24[b]) {
if ((network_16->mask_24[b] =
(void*)get_zeroed_page(GFP_ATOMIC)) == NULL) {
printk("ACCOUNT: out of memory during copy of 16 bit "
"network in ipt_acc_handle_prepare_read()\n");
ipt_acc_data_free(ipt_acc_handles[handle].data, depth);
memset (&ipt_acc_handles[handle], 0,
sizeof(struct ipt_acc_handle));
return -1;
}
memcpy(network_16->mask_24[b], src_16->mask_24[b],
sizeof(struct ipt_acc_mask_24));
}
}
} else if(depth == 2) {
struct ipt_acc_mask_8 *src_8 =
(struct ipt_acc_mask_8 *)ipt_acc_tables[table_nr].data;
struct ipt_acc_mask_8 *network_8 =
(struct ipt_acc_mask_8 *)ipt_acc_handles[handle].data;
u_int32_t a;
for (a = 0; a <= 255; a++) {
if (src_8->mask_16[a]) {
if ((network_8->mask_16[a] =
(void*)get_zeroed_page(GFP_ATOMIC)) == NULL) {
printk("ACCOUNT: out of memory during copy of 24
bit network"
" in ipt_acc_handle_prepare_read()\n");
ipt_acc_data_free(ipt_acc_handles[handle].data, depth);
memset (&ipt_acc_handles[handle], 0,
sizeof(struct ipt_acc_handle));
return -1;
}
memcpy(network_8->mask_16[a], src_8->mask_16[a],
sizeof(struct ipt_acc_mask_16));
621: struct ipt_acc_mask_16 *src_16 = src_8->mask_16[a];
622: struct ipt_acc_mask_16 *network_16 = network_8->mask_16[a];
623: u_int32_t b;
625: for (b = 0; b <= 255; b++) {
626: if (src_16->mask_24[b]) {
if ((network_16->mask_24[b] =
(void*)get_zeroed_page(GFP_ATOMIC)) == NULL) {
printk("ACCOUNT: out of memory during copy
of 16 bit"
" network in
ipt_acc_handle_prepare_read()\n");
ipt_acc_data_free(ipt_acc_handles[handle].data,
depth);
memset (&ipt_acc_handles[handle], 0,
sizeof(struct ipt_acc_handle));
return -1;
}
memcpy(network_16->mask_24[b], src_16->mask_24[b],
sizeof(struct ipt_acc_mask_24));
}
}
}
}
}
*count = ipt_acc_tables[table_nr].itemcount;
return handle;
}
Ce naiba vrea ? Ma uit sa vad daca am heeaderul inclus, si in linia 29 am :
#include <linux/netfilter_ipv4/ipt_ACCOUNT.h>
daca ma uit in ipt_ACCOUNT.h ... totul e ok ! :
92: struct ipt_acc_mask_16 {
93: struct ipt_acc_mask_24 *mask_24[256];
94: };
Care e faza ? Am eu senzatia ca gccul nu face linkarea corecta cu
/usr/src/linux/include ?
De ce mai sus cand face :
struct ipt_acc_mask_8 *src_8 =
(struct ipt_acc_mask_8 *)ipt_acc_tables[table_nr].data;
struct ipt_acc_mask_8 *network_8 =
(struct ipt_acc_mask_8 *)ipt_acc_handles[handle].data;
u_int32_t a;
nu imi da eroare ? Sunt eu nebun ? Sa ma apuc de altceva ?
---
Detalii despre listele noastre de mail: http://www.lug.ro/