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...