- 论坛徽章:
- 0
|
本帖最后由 niko_zju 于 2010-04-30 10:52 编辑
给个实用点的例子,摘自 iscsi-scst
配置文件格式如下:
Target iqn.2005-01.com.test:32b7d2b2acda
函数如下:- static int config_main_init(char *filename)
- {
- FILE *config;
- char buf[BUFSIZE];
- char *p, *q;
- int idx;
- u32 tid, val;
- int res = 0;
- if (!(config = fopen(filename, "r"))) {
- return errno == ENOENT ? 0 : -errno;
- }
- tid = 0;
- while (fgets(buf, BUFSIZE, config)) {
- q = buf;
- p = target_sep_string(&q);
- if (!p || *p == '#')
- continue;
- if (!strcasecmp(p, "Target")) {
- tid = 0;
- if (!(p = target_sep_string(&q)))
- continue;
- if (__config_target_create(&tid, p, 0))
- log_debug(1, "creating target %s", p);
- } else if (!strcasecmp(p, "Alias") && tid) {
- ;
- } else if (!((idx = param_index_by_name(p, target_keys)) < 0) && tid) {
- val = strtol(q, &q, 0);
- if (param_check_val(target_keys, idx, &val) < 0) {
- log_error("Wrong value %u for parameter %s\n",
- val, target_keys[idx].name);
- res = -1;
- break;
- }
- iscsi_param_partial_set(tid, 0, key_target, idx, val);
- } else if (!((idx = param_index_by_name(p, session_keys)) < 0) && tid) {
- char *str = target_sep_string(&q);
- if (param_str_to_val(session_keys, idx, str, &val) < 0) {
- log_error("Wrong value %s for parameter %s\n",
- str, session_keys[idx].name);
- res = -1;
- break;
- }
- if (param_check_val(session_keys, idx, &val) < 0) {
- log_error("Wrong value %u for parameter %s\n",
- val, session_keys[idx].name);
- res = -1;
- break;
- }
- iscsi_param_partial_set(tid, 0, key_session, idx, val);
- } else if (param_index_by_name(p, user_keys) < 0) {
- log_warning("Unknown osniscst.conf param: %s\n", p);
- res = -1;
- break;
- }
- }
- fclose(config);
- return res;
- }
复制代码
- static char *target_sep_string(char **pp)
- {
- char *p = *pp;
- char *q;
- for (p = *pp; isspace(*p); p++)
- ;
- for (q = p; *q && !isspace(*q); q++)
- ;
- if (*q)
- *q++ = 0;
- else
- p = NULL;
- *pp = q;
- return p;
- }
复制代码 |
|