nl_pid を読み取るように Hostapd のコードを変更しようとしました。以下の画像のようにコードを修正してコンパイルした後。
wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with AP "
"handle %p", bss->nl_mgmt);
printf("%u", bss->nl_mgmt->s_local->nl_pid);
コンパイラは、「不完全な型構造体 nl_sock へのポインタを逆参照しています」と述べました。
../src/drivers/driver_nl80211.c: In function 'nl80211_mgmt_subscribe_ap':
../src/drivers/driver_nl80211.c:2449:30: error: dereferencing pointer to incomplete type 'struct nl_sock'
2449 | printf("%u", bss->nl_mgmt->s_local->nl_pid);
|
make: *** [Makefile:1293: ../src/drivers/driver_nl80211.o] Error 1
ということで、2449行目にコメントを入れて再コンパイル。次に、gdb
2451 行目でブレークし、'bss->nl_mgmt variable' を出力します。gdb
構造を知り、読むことができました。なぜgdb
構造を知って読むことができたのに、私はできなかったのですか? この問題を解決して、必要な「nl_pid」を読み取るにはどうすればよいですか?
Breakpoint 1, nl80211_mgmt_subscribe_ap (bss=0x4cdf60)
at ../src/drivers/driver_nl80211.c:2451
2451 for (i = 0; i < ARRAY_SIZE(stypes); i++) {
(gdb) print *bss->nl_mgmt
$1 = {s_local = {nl_family = 16, nl_pad = 0, nl_pid = 2810203079, nl_groups = 0}, s_peer = {nl_family = 16, nl_pad = 0, nl_pid = 0, nl_groups = 0}, s_fd = 8, s_proto = 16, s_seq_next = 1578026322, s_seq_expect = 1578026322, s_flags = 0, s_cb = 0x4ce7b0, s_bufsize = 0}