grub2中env綁定hook函數(shù)
2019-11-09 17:24:46
供稿:網(wǎng)友
在調(diào)用grub_env_get 獲取環(huán)境變量的時候,可以對這個環(huán)境變量綁定一個處理函數(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 找到這個env的話,會判斷是否綁定read_hook 函數(shù),如果綁定就返回read_hook。這個感覺和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]); }}這個例子會對注冊在grub_datetime_names 中的每一個字符串綁定一個grub_read_hook_datetime 函數(shù),這樣當(dāng)調(diào)用grub_get_env("YEAR")的時候就會調(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的實現(xiàn)也很簡單,就是返回具體對應(yīng)的時間.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 找到這個env,如果沒有找到則不綁定,也就是說在調(diào)用grub_register_variable_hook 之前必須調(diào)用grub_env_set 函數(shù)先設(shè)定環(huán)境變量.