]> mj.ucw.cz Git - libucw.git/blobdiff - lib/conf-section.c
Merge with git+ssh://cvs.ucw.cz/projects/sherlock/GIT/sherlock.git
[libucw.git] / lib / conf-section.c
index 1070409e5812980c90e004bbf247640bb3722805..2e27546abc96fbc5173daaf224ae932d86060f52 100644 (file)
@@ -16,8 +16,6 @@
 
 #include <string.h>
 
-#define TRY(f) do { byte *_msg = f; if (_msg) return _msg; } while (0)
-
 /* Dirty sections */
 
 struct dirty_section {
@@ -140,11 +138,18 @@ cf_init_section(byte *name, struct cf_section *sec, void *ptr, uns 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 + (addr_int_t) ci->ptr, 0);
+    else if (ci->cls == CC_LIST)
+      clist_init(ptr + (addr_int_t) ci->ptr);
+    else if (ci->cls == CC_DYNAMIC) {
+      void **dyn = ptr + (addr_int_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);
     if (msg)
@@ -152,26 +157,11 @@ cf_init_section(byte *name, struct cf_section *sec, void *ptr, uns do_bzero)
   }
 }
 
-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 *
 commit_section(struct cf_section *sec, void *ptr, uns commit_all)
 {
-  struct cf_item *ci;
   byte *err;
-  for (ci=sec->cfg; ci->cls; ci++)
+  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);
@@ -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;
 }