/* copy the variables to shm mem */ int cfg_shmize(void) { cfg_group_t *group; cfg_block_t *block = NULL; int size; if (!cfg_group) return 0; /* Let us allocate one memory block that will contain all the variables */ for ( size=0, group = cfg_group; group; group=group->next ) { size = ROUND_POINTER(size); group->offset = size; size += group->size; } block = (cfg_block_t*)shm_malloc(sizeof(cfg_block_t)+size-1); if (!block) { LOG(L_ERR, "ERROR: cfg_clone_str(): not enough shm memory\n"); goto error; } memset(block, 0, sizeof(cfg_block_t)+size-1); cfg_block_size = size; /* copy the memory fragments to the single block */ for ( group = cfg_group; group; group=group->next ) { if (group->dynamic == 0) { /* clone the strings to shm mem */ if (cfg_shmize_strings(group)) goto error; /* copy the values to the new block */ memcpy(block->vars+group->offset, group->vars, group->size); } else { /* The group was declared with NULL values, * we have to fix it up. * The fixup function takes care about the values, * it fills up the block */ if (cfg_script_fixup(group, block->vars+group->offset)) goto error; /* Notify the drivers about the new config definition. * Temporary set the group handle so that the drivers have a chance to * overwrite the default values. The handle must be reset after this * because the main process does not have a local configuration. */ *(group->handle) = block->vars+group->offset; cfg_notify_drivers(group->name, group->name_len, group->mapping->def); *(group->handle) = NULL; } } /* try to fixup the selects that failed to be fixed-up previously */ if (cfg_fixup_selects()) goto error; /* install the new config */ cfg_install_global(block, NULL, NULL, NULL); cfg_shmized = 1; return 0; error: if (block) shm_free(block); return -1; }
/* copy the variables to shm mem */ int cfg_shmize(void) { cfg_group_t *group; cfg_block_t *block = NULL; int size; if (!cfg_group) return 0; /* Let us allocate one memory block that * will contain all the variables + meta-data * in the following form: * |-----------| * | meta-data | <- group A: meta_offset * | variables | <- group A: var_offset * |-----------| * | meta-data | <- group B: meta_offset * | variables | <- group B: var_offset * |-----------| * | ... | * |-----------| * * The additional array for the multiple values * of the same variable is linked to the meta-data. */ for ( size=0, group = cfg_group; group; group=group->next ) { size = ROUND_POINTER(size); group->meta_offset = size; size += sizeof(cfg_group_meta_t); size = ROUND_POINTER(size); group->var_offset = size; size += group->size; } block = (cfg_block_t*)shm_malloc(sizeof(cfg_block_t)+size-1); if (!block) { LOG(L_ERR, "ERROR: cfg_shmize(): not enough shm memory\n"); goto error; } memset(block, 0, sizeof(cfg_block_t)+size-1); cfg_block_size = size; /* copy the memory fragments to the single block */ for ( group = cfg_group; group; group=group->next ) { if (group->dynamic == CFG_GROUP_STATIC) { /* clone the strings to shm mem */ if (cfg_shmize_strings(group)) goto error; /* copy the values to the new block */ memcpy(CFG_GROUP_DATA(block, group), group->vars, group->size); } else if (group->dynamic == CFG_GROUP_DYNAMIC) { /* The group was declared with NULL values, * we have to fix it up. * The fixup function takes care about the values, * it fills up the block */ if (cfg_script_fixup(group, CFG_GROUP_DATA(block, group))) goto error; /* Notify the drivers about the new config definition. * Temporary set the group handle so that the drivers have a chance to * overwrite the default values. The handle must be reset after this * because the main process does not have a local configuration. */ *(group->handle) = CFG_GROUP_DATA(block, group); cfg_notify_drivers(group->name, group->name_len, group->mapping->def); *(group->handle) = NULL; } else { LOG(L_ERR, "ERROR: cfg_shmize(): Configuration group is declared " "without any variable: %.*s\n", group->name_len, group->name); goto error; } /* Create the additional group instances with applying the temporary list. */ if (apply_add_var_list(block, group)) goto error; } /* try to fixup the selects that failed to be fixed-up previously */ if (cfg_fixup_selects()) goto error; /* install the new config */ cfg_install_global(block, NULL, NULL, NULL); cfg_shmized = 1; return 0; error: if (block) shm_free(block); return -1; }