/** * @attention 本注释得到了"核高基"科技重大专项2012年课题“开源操作系统内核分析和安全性评估 *(课题编号:2012ZX01039-004)”的资助。 * * @copyright 注释添加单位:清华大学——03任务(Linux内核相关通用基础软件包分析)承担单位 * * @author 注释添加人员:谢文学 * * @date 注释添加日期:2013年6月8日 * * @brief 导出一个环境变量。 * * @note 注释详细内容: * * 本函数实现导出一个环境变量的功能。首先使用grub_env_find()找到该环境变量;如果没找到,则 * 使用grub_env_set()将其设置为“”,并重新使用grub_env_find()找到该环境变量;最后设置改环境 * 变量的global标志位1。 **/ grub_err_t grub_env_export (const char *name) { struct grub_env_var *var; var = grub_env_find (name); if (! var) { grub_err_t err; err = grub_env_set (name, ""); if (err) return err; var = grub_env_find (name); } var->global = 1; return GRUB_ERR_NONE; }
grub_err_t grub_env_set (const char *name, const char *val) { struct grub_env_var *var; /* If the variable does already exist, just update the variable. */ var = grub_env_find (name); if (var) { char *old = var->value; if (var->write_hook) var->value = var->write_hook (var, val); else var->value = grub_strdup (val); if (! var->value) { var->value = old; return grub_errno; } grub_free (old); return GRUB_ERR_NONE; } /* The variable does not exist, so create a new one. */ var = grub_zalloc (sizeof (*var)); if (! var) return grub_errno; /* This is not necessary. But leave this for readability. */ var->global = 0; var->name = grub_strdup (name); if (! var->name) goto fail; var->value = grub_strdup (val); if (! var->value) goto fail; grub_env_insert (grub_current_context, var); return GRUB_ERR_NONE; fail: grub_free (var->name); grub_free (var->value); grub_free (var); return grub_errno; }
grub_err_t 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; }
char * 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; }
void grub_env_unset (const char *name) { struct grub_env_var *var; var = grub_env_find (name); if (! var) return; if (var->read_hook || var->write_hook) { grub_env_set (name, ""); return; } grub_env_remove (var); grub_free (var->name); grub_free (var->value); grub_free (var); }