X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fconf-section.c;h=1a9ae171e01443411390be56a9ea9ca467d49c54;hb=534019614dd611e7df29a0c8c59f2a869a2c0c39;hp=1070409e5812980c90e004bbf247640bb3722805;hpb=5d4c3f3f01730c49b82f9212749ce28f6f808658;p=libucw.git diff --git a/lib/conf-section.c b/lib/conf-section.c index 1070409e..1a9ae171 100644 --- a/lib/conf-section.c +++ b/lib/conf-section.c @@ -16,8 +16,6 @@ #include -#define TRY(f) do { byte *_msg = f; if (_msg) return _msg; } while (0) - /* Dirty sections */ struct dirty_section { @@ -72,7 +70,7 @@ sort_dirty(void) struct cf_section cf_sections; // root section struct cf_item * -cf_find_subitem(struct cf_section *sec, byte *name) +cf_find_subitem(struct cf_section *sec, const char *name) { struct cf_item *ci = sec->cfg; for (; ci->cls; ci++) @@ -93,7 +91,7 @@ inspect_section(struct cf_section *sec) } else if (ci->cls == CC_LIST) { inspect_section(ci->u.sec); sec->flags |= SEC_FLAG_DYNAMIC | SEC_FLAG_CANT_COPY; - } else if (ci->cls == CC_DYNAMIC) + } else if (ci->cls == CC_DYNAMIC || ci->cls == CC_BITMAP) sec->flags |= SEC_FLAG_DYNAMIC; else if (ci->cls == CC_PARSER) { sec->flags |= SEC_FLAG_CANT_COPY; @@ -106,7 +104,7 @@ inspect_section(struct cf_section *sec) } void -cf_declare_section(byte *name, struct cf_section *sec, uns allow_unknown) +cf_declare_section(const char *name, struct cf_section *sec, uns allow_unknown) { if (!cf_sections.cfg) { @@ -134,54 +132,46 @@ cf_declare_section(byte *name, struct cf_section *sec, uns allow_unknown) } void -cf_init_section(byte *name, struct cf_section *sec, void *ptr, uns do_bzero) +cf_init_section(const char *name, struct cf_section *sec, void *ptr, uns do_bzero) { if (do_bzero) { ASSERT(sec->size); bzero(ptr, sec->size); } - for (uns i=0; sec->cfg[i].cls; i++) - if (sec->cfg[i].cls == CC_SECTION) - cf_init_section(sec->cfg[i].name, sec->cfg[i].u.sec, ptr + (addr_int_t) sec->cfg[i].ptr, 0); - else if (sec->cfg[i].cls == CC_LIST) - clist_init(ptr + (addr_int_t) sec->cfg[i].ptr); + for (struct cf_item *ci=sec->cfg; ci->cls; ci++) + if (ci->cls == CC_SECTION) + cf_init_section(ci->name, ci->u.sec, ptr + (uintptr_t) ci->ptr, 0); + else if (ci->cls == CC_LIST) + clist_init(ptr + (uintptr_t) ci->ptr); + else if (ci->cls == CC_DYNAMIC) { + void **dyn = ptr + (uintptr_t) ci->ptr; + if (!*dyn) { // replace NULL by an empty array + static uns zero = 0; + *dyn = (&zero) + 1; + } + } if (sec->init) { - byte *msg = sec->init(ptr); + char *msg = sec->init(ptr); if (msg) die("Cannot initialize section %s: %s", name, msg); } } -static void -replace_null_dary(struct cf_item *item, void **ptr) -{ - static u64 zero = 0; - if (*ptr) - return; - uns size = cf_type_size(item->type, item->u.utype); - cf_journal_block(ptr, size); - if (size <= sizeof(zero)) - *ptr = (&zero) + 1; - else - *ptr = cf_malloc_zero(size) + size; -} - -static byte * +static char * commit_section(struct cf_section *sec, void *ptr, uns commit_all) { - struct cf_item *ci; - byte *err; - for (ci=sec->cfg; ci->cls; ci++) + char *err; + for (struct cf_item *ci=sec->cfg; ci->cls; ci++) if (ci->cls == CC_SECTION) { - if ((err = commit_section(ci->u.sec, ptr + (addr_int_t) ci->ptr, commit_all))) { - log(L_ERROR, "Cannot commit section %s: %s", ci->name, err); + if ((err = commit_section(ci->u.sec, ptr + (uintptr_t) ci->ptr, commit_all))) { + msg(L_ERROR, "Cannot commit section %s: %s", ci->name, err); return "commit of a subsection failed"; } } else if (ci->cls == CC_LIST) { uns idx = 0; - CLIST_FOR_EACH(cnode *, n, * (clist*) (ptr + (addr_int_t) ci->ptr)) + CLIST_FOR_EACH(cnode *, n, * (clist*) (ptr + (uintptr_t) ci->ptr)) if (idx++, err = commit_section(ci->u.sec, n, commit_all)) { - log(L_ERROR, "Cannot commit node #%d of list %s: %s", idx, ci->name, err); + msg(L_ERROR, "Cannot commit node #%d of list %s: %s", idx, ci->name, err); return "commit of a list failed"; } } @@ -195,11 +185,8 @@ commit_section(struct cf_section *sec, void *ptr, uns commit_all) if (commit_all || (pos < dirties && dirty.ptr[pos].sec == sec && dirty.ptr[pos].ptr == ptr)) - TRY( sec->commit(ptr) ); + return sec->commit(ptr); } - for (ci=sec->cfg; ci->cls; ci++) - if (ci->cls == CC_DYNAMIC) - replace_null_dary(ci, ptr + (addr_int_t) ci->ptr); return 0; }