- 论坛徽章:
- 0
|
parse 是最重要的一个函数,因为这里要检查参数的正确性,并写入我们将共享给核心态程序的信息。它在每次参数被发现的时候被调用,也就是说,如果用户输入了两个参数,这个函数就将被以不同的参数代码 c 调用两次。
static int parse(int c, char **argv, int invert, unsigned int *flags,
const struct ipt_entry *entry,
unsigned int *nfcache,
struct ipt_entry_match **match)
{
我们使用特殊结构来保存我们要传递给核心态程序的信息。'match' 指针被传递给多个函数,我们可以每次使用同样的数据结构。一旦规则被加载了,这个指针就被复制到了核心态程序里。通过这个方式,内核模块可以知道用户想要分析什么(这正是问题的关键,不是么?)。
struct ipt_ipaddr_info *info = (struct ipt_ipaddr_info *)(*match)->data;
每个参数对应着一个单独的值,于是我们能根据进入的参数决定采取何种行动。下文中我们将看到我们如何把参数变成数值。
switch(c) {
首先,我们检查参数是否被使用了多次。如果使用了多次的话,调用 <iptables/iptables.c> 中定义的 'exit_error()' 函数,这样程序会立刻带着 <iptables/include/iptables_common.h> 中定义的 'PARAMETER_PROBLEM' 的错误状态推出。否则,我们在我们的头文件中定义的 'IPADDR_SRC' 中设置 'flags' 和 'info->flags'。稍后我们将介绍这个头文件。
虽然这两个标志看起来差不多,但是是完全不同的。'flag' 的作用域就是这个函数,而 'info->flags' 是我们用于和核心态程序共享信息的结构的一部分。
case '1':
if (*flags & IPADDR_SRC)
exit_error(PARAMETER_PROBLEM, "ipt_ipaddr: Only use --ipsrc once!");
*flags |= IPADDR_SRC;
info->flags |= IPADDR_SRC;
检查如果取反标志 '!' 是否存在,如果有的话,在 'info->flags' 中写相应的值。
之后调用为这个骨架程序所写的内部函数 'parse_ipaddr' 来把 IP 地址从字符串转化为 32 位值。
if (invert)
info->flags |= IPADDR_SRC_INV;
parse_ipaddr(argv[optind-1], &info->ipaddr.src);
break;
同样考虑,我们检查是否存在多次设置,置恰当的标志。
case '2':
if (*flags & IPADDR_DST)
exit_error(PARAMETER_PROBLEM, "ipt_ipaddr: Only use --ipdst once!");
*flags |= IPADDR_DST;
info->flags |= IPADDR_DST;
if (invert)
info->flags |= IPADDR_DST_INV;
parse_ipaddr(argv[optind-1], &info->ipaddr.dst);
break;
default:
return 0;
}
return 1;
}
我想这应该是你想的吧,以前看过,这个是同内核打交道的函数。
[ 本帖最后由 zw2002 于 2006-12-14 10:12 编辑 ] |
|