歡迎轉載,轉載請注明出處。
下面從main函數開始源代碼的分析,這一篇主要對開始處的for循環介紹,里面的選項和參數的處理方式,主要依賴于命令行或者腳本調用hostapd時,傳進來的參數是什么
~~~
int main(int argc, char *argv[])
{
struct hapd_interfaces interfaces;
int ret = 1, k;
size_t i, j;
int c, debug = 0, daemonize = 0, tnc = 0;
char *pid_file = NULL;
hostapd_logger_register_cb(hostapd_logger_cb);
for (;;) {
c = getopt(argc, argv, "Bde:hKP:tv");
switch (c) {
case 'h':
usage();
break;
case 'd':
debug++;
if (wpa_debug_level > 0)
wpa_debug_level--;
break;
case 'e':
entropy_file = optarg;
break;
?case 'B':
daemonize++;
break;
case 'K':
wpa_debug_show_keys++;
break;
case 'P':
os_free(pid_file);
pid_file = os_rel2abs_path(optarg);
break;
case 't':
wpa_debug_timestamp++;
break;
case 'v':
show_version();
exit(1);
break;
default:
usage();
break;
}
....
~~~
理解這個for循環,首先要很準確的理解getopt函數的使用,以及對argc和argv的把握,可以先參考
<a target=_blank href="http://blog.csdn.net/lee244868149/article/details/42025221">getopt
和getopt_long </a> 和 <a target=_blank href="http://blog.csdn.net/lee244868149/article/details/42002741">getopt解析命令行選項參數 </a>,
特別是理解optarg和optind代表的含義很重要。
-h
如果選項是-h,那么調用usage()函數,打印命令幫助信息
-d
當選擇-d選項時,debug變量加一,wpa_debug_level調試級別變量減一。
在src/utils/wpa_debug.c中有定義:
?????????????????????????????? int wpa_debug_level = MSG_INFO;
?????????????????????????????? int wpa_debug_show_keys = 0;
?????????????????????????????? int wpa_debug_timestamp = 0;
MSG_INFO是一個枚舉成員,enum { MSG_MSGDUMP, MSG_DEBUG, MSG_INFO, MSG_WARNING, MSG_ERROR };它在第三個位置,所以MSG_INFO值為2,這個是默認值,在該級別時正常情況下基本沒有日志輸出。在這種情況下,就能打印MSG_INFO, MSG_WARNING, MSG_ERROR這三個級別的信息,在該級別時正常情況下基本沒有
日志輸出的,因而要想獲得更多執行流程中的輸出就需要增加debug級別,如果想把碼流及各radius屬性均打印出的話就將級別調為MSG_MSGDUMP了。
debug級別越高,那么對應的wpa_debug_level值就越小,輸出的信息就越多
-e
指定entropy文件的路徑
-B
該選項將hostapd進程作為守護進程運行,如果含有該選項則執行os_daemonize(pid_file),在utils/os_win32.c中該函數未實現,
在utils/os_unix.c中定義為int os_daemonize(const char *pid_file),<span style="color:#FF0000;">其中os_daemon即為daemon系統調,如果調用成功則獲取進程id并寫入pid_file指定的文件中</span>。
-K
該選項用于控制在調試時是否輸出密鑰相關key值。如需輸出密鑰還需要設置日志級別為MSG_DEBUG或以上
例如:wpa_hexdump_key(MSG_DEBUG, "EAP-TTLS: Derived implicit challenge", challenge, len);
如果選項中沒有K顯式說明,則即使日志級別為MSG_DEBUG或MSG_MSGDUMP也不會輸出的
-P
設定pid_file的值,os_rel2abs_path 將參數提供的相對路徑轉為絕對路徑。
-t
該項作用為在日志中包含時間戳信息,wpa_debug_timestamp的定義參見選項-d的說明,默認值為0,即不包含。
帶時間戳效果為:
1270995804.000000: EAP: EAP entering state RECEIVED
1270995804.000000: EAP: parseEapResp: rxResp=1 respId=77 respMethod=21 respVendor=0 respVendorMethod=0
-v
打印版本信息并退出
這些選項主要用于hostapd程序被調用時,實現交互和傳入參數的處理,下一篇將介紹hostapd_global_init()函數所完成的初始化工作。