int init_shvars(void) { script_var_t *lit = 0; sh_var_t *sit = 0; pv_spec_list_t *pvi = 0; pv_spec_list_t *pvi0 = 0; if(shvar_init_locks()!=0) return -1; LM_DBG("moving shvars in share memory\n"); for(lit=sh_local_vars; lit; lit=lit->next) { sit = (sh_var_t*)shm_malloc(sizeof(sh_var_t)); if(sit==0) { LM_ERR("out of sh mem\n"); return -1; } memset(sit, 0, sizeof(sh_var_t)); sit->name.s = (char*)shm_malloc((lit->name.len+1)*sizeof(char)); if(sit->name.s==0) { LM_ERR("out of pkg mem!\n"); shm_free(sit); return -1; } sit->name.len = lit->name.len; strncpy(sit->name.s, lit->name.s, lit->name.len); sit->name.s[sit->name.len] = '\0'; if(sh_vars!=0) sit->n = sh_vars->n + 1; else sit->n = 1; #ifdef GEN_LOCK_T_PREFERED sit->lock = &shvar_locks->locks[sit->n%shvar_locks_no]; #else sit->lockidx = sit->n%shvar_locks_no; #endif if(set_shvar_value(sit, &lit->v.value, lit->v.flags)==NULL) { shm_free(sit->name.s); shm_free(sit); return -1; } pvi0 = 0; pvi = sh_pv_list; while(pvi!=NULL) { if(pvi->spec->pvp.pvn.u.dname == lit) { pvi->spec->pvp.pvn.u.dname = (void*)sit; if(pvi0!=NULL) { pvi0->next = pvi->next; pkg_free(pvi); pvi = pvi0->next; } else { sh_pv_list = pvi->next; pkg_free(pvi); pvi = sh_pv_list; } } else { pvi0 = pvi; pvi = pvi->next; } } sit->next = sh_vars; sh_vars = sit; } destroy_vars_list(sh_local_vars); if(sh_pv_list != NULL) { LM_ERR("sh_pv_list not null!\n"); return -1; } shvar_initialized = 1; return 0; }
sh_var_t* add_shvar(str *name) { sh_var_t *sit; if(name==0 || name->s==0 || name->len<=0) return 0; if(!shm_initialized()) { LM_ERR("shm not initialized - cannot define shm now\n"); return 0; } if(shvar_init_locks()!=0) { LM_ERR("cannot init shv locks\n"); return 0; } for(sit=sh_vars; sit; sit=sit->next) { if(sit->name.len==name->len && strncmp(name->s, sit->name.s, name->len)==0) return sit; } sit = (sh_var_t*)shm_malloc(sizeof(sh_var_t)); if(sit==0) { LM_ERR("out of shm\n"); return 0; } memset(sit, 0, sizeof(sh_var_t)); sit->name.s = (char*)shm_malloc((name->len+1)*sizeof(char)); if(sit->name.s==0) { LM_ERR("out of shm!\n"); shm_free(sit); return 0; } sit->name.len = name->len; strncpy(sit->name.s, name->s, name->len); sit->name.s[sit->name.len] = '\0'; if(sh_vars!=0) sit->n = sh_vars->n + 1; else sit->n = 1; #ifdef GEN_LOCK_T_PREFERED sit->lock = &shvar_locks->locks[sit->n%shvar_locks_no]; #else sit->lockidx = sit->n%shvar_locks_no; #endif sit->next = sh_vars; sh_vars = sit; return sit; }