grub2中env綁定hook函數(shù)
2019-11-09 16:20:04
供稿:網(wǎng)友
在調(diào)用grub_env_get 獲取環(huán)境變量的時(shí)候,可以對(duì)這個(gè)環(huán)境變量綁定一個(gè)處理函數(shù)。grub_env_get (const char *name){ struct grub_env_var *var; var = grub_env_find (name); if (! var) return 0; if (var->read_hook) return var->read_hook (var, var->value); return var->value;}例如grub_env_get 中如果通過grub_env_find 找到這個(gè)env的話,會(huì)判斷是否綁定read_hook 函數(shù),如果綁定就返回read_hook。這個(gè)感覺和grub_register_command 有一曲通過的效果。static const char *grub_datetime_names[] ={ "YEAR", "MONTH", "DAY", "HOUR", "MINUTE", "SECOND", "WEEKDAY",};GRUB_MOD_INIT(datehook){ unsigned i; for (i = 0; i < ARRAY_SIZE (grub_datetime_names); i++) { grub_register_variable_hook (grub_datetime_names[i], grub_read_hook_datetime, 0); grub_env_export (grub_datetime_names[i]); }}這個(gè)例子會(huì)對(duì)注冊(cè)在grub_datetime_names 中的每一個(gè)字符串綁定一個(gè)grub_read_hook_datetime 函數(shù),這樣當(dāng)調(diào)用grub_get_env("YEAR")的時(shí)候就會(huì)調(diào)用grub_read_hook_datetime函數(shù)grub_read_hook_datetime (struct grub_env_var *var, const char *val __attribute__ ((unused))){ struct grub_datetime datetime; static char buf[6]; buf[0] = 0; if (! grub_get_datetime (&datetime)) { int i; for (i = 0; i < 7; i++) if (grub_strcmp (var->name, grub_datetime_names[i]) == 0) { int n; switch (i) { case 0: n = datetime.year; break; } return buf;}grub_read_hook_datetime的實(shí)現(xiàn)也很簡(jiǎn)單,就是返回具體對(duì)應(yīng)的時(shí)間.grub_register_variable_hook (const char *name, grub_env_read_hook_t read_hook, grub_env_write_hook_t write_hook){ struct grub_env_var *var = grub_env_find (name); if (! var) { if (grub_env_set (name, "") != GRUB_ERR_NONE) return grub_errno; var = grub_env_find (name); /* XXX Insert an assertion? */ } var->read_hook = read_hook; var->write_hook = write_hook; return GRUB_ERR_NONE;}而grub_register_variable_hook 則首先通過grub_env_find 找到這個(gè)env,如果沒有找到則不綁定,也就是說在調(diào)用grub_register_variable_hook 之前必須調(diào)用grub_env_set 函數(shù)先設(shè)定環(huán)境變量.