iptables原始碼分析(2)

2021-05-18 02:34:10 字數 2726 閱讀 2168

1.1 表的查詢

再回到iptc_init 函式上來,它根據表名,從核心獲取對應的表的相關資訊,handle是乙個iptc_handle_t型別的指標,在libiptc.c中,有如下定義:

/* transparent handle type. */

typedef struct iptc_handle *iptc_handle_t;

在libip4tc中:

#define struct_tc_handle struct iptc_handle

在libiptc.c中,可以找到struct_tc_handle的定義:

struct_tc_handle

; 再來看看iptc_init函式,同樣在在libip4tc中,有如下定義:

#define tc_init iptc_init

在libiptc.c中,可以看到函式的實現,基本上iptables與核心的互動,都是使用setsockopt函式來實現的,對於獲取取規是資訊來說,標誌位是so_get_info,而從核心返回回來的規則資訊是乙個struct_getinfo結構:

tc_handle_t tc_init(const char *tablename)

strcpy(info.name, tablename);

/*獲取規則資訊*/

if (getsockopt(sockfd, tc_ipproto, so_get_info, &info, &s) < 0)

return null;

if ((h = alloc_handle(info.name, info.size, info.num_entries))

== null)

return null;

/* too hard --rr */

#if 0

sprintf(pathname, "%s/%s", ipt_lib_dir, info.name);

dynlib = dlopen(pathname, rtld_now);

if (!dynlib)

h->hooknames = dlsym(dynlib, "hooknames");

if (!h->hooknames)

#else

h->hooknames = hooknames;

#endif

/* initialize current state */

h->info = info;

h->new_number = h->info.num_entries;

for (i = 0; i < h->info.num_entries; i++)

h->counter_map[i]

= ((struct counter_map));

h->entries.size = h->info.size;

tmp = sizeof(struct_get_entries) + h->info.size;

if (getsockopt(sockfd, tc_ipproto, so_get_entries, &h->entries,

&tmp) < 0)

check(h);

return h;

} 函式為h分配空間,然後賦予相應的值。要理解這個函式,還需要了解struct_getinfo結構和分配記憶體空間的函式alloc_handle。

#define struct_getinfo struct ipt_getinfo

/* the argument to ipt_so_get_info */

struct ipt_getinfo

; /* allocate handle of given size */

static tc_handle_t

alloc_handle(const char *tablename, unsigned int size, unsigned int num_rules)

h->changed = 0;

h->cache_num_chains = 0;

h->cache_chain_heads = null;

h->counter_map = (void *)h

+ sizeof(struct_tc_handle)

+ size;

strcpy(h->info.name, tablename);

strcpy(h->entries.name, tablename);

return h;

} 函式list_entries用於顯示表下邊的鏈:

/*顯示某table下的chain*/

static int

list_entries(const ipt_chainlabel chain, int verbose, int numeric,

int expanded, int linenumbers, iptc_handle_t *handle)

found = 1;

} errno = enoent;

return found;

} 可見,在函式中,由iptc_first_chain和 iptc_next_chain實現了遍歷,iptc_first_rule和iptc_next_rule實現了鏈中規是的遍 歷,print_firewall函式在遍歷到規則的時候,向終端輸出防火牆規則,其第二個引數iptc_get_target又用於獲取規則的 target。

Leveldb原始碼分析 2

輕鬆一刻,前面約定中講過leveldb使用了很多varint型編碼,典型的如後面將涉及到的各種key。其中的編碼 解碼函式分為varint和fixedint兩種。int32和int64操作都是類似的。首先是fixedint編碼,直接上 很簡單明瞭。void encodefixed32 char bu...

jquery原始碼分析2

jquery原始碼分析系列2 results is for internal usage only 只是為了內部使用 makearray function arr,results else return ret 很多地方都使用了這個函式 判斷是否是陣列或者是類陣列 返回值是boolean funct...

android adb原始碼分析 2

本篇分析usb linux client.c中的usb init 它的 如下 void usb init else 呼叫usb adb init static void usb adb init else d usb init starting thread n if adb thread crea...