int mq_param(modparam_t type, void *val) { str mqs; param_t* params_list = NULL; param_hooks_t phooks; param_t *pit=NULL; str qname = {0, 0}; int msize = 0; if(val==NULL) return -1; if(!shm_initialized()) { LM_ERR("shm not initialized - cannot define mqueue now\n"); return 0; } mqs.s = (char*)val; mqs.len = strlen(mqs.s); if(mqs.s[mqs.len-1]==';') mqs.len--; if (parse_params(&mqs, CLASS_ANY, &phooks, ¶ms_list)<0) return -1; for (pit = params_list; pit; pit=pit->next) { if (pit->name.len==4 && strncasecmp(pit->name.s, "name", 4)==0) { qname = pit->body; } else if(pit->name.len==4 && strncasecmp(pit->name.s, "size", 4)==0) { str2sint(&pit->body, &msize); } else { LM_ERR("unknown param: %.*s\n", pit->name.len, pit->name.s); free_params(params_list); return -1; } } if(qname.len<=0) { LM_ERR("mqueue name not defined: %.*s\n", mqs.len, mqs.s); free_params(params_list); return -1; } if(mq_head_add(&qname, msize)<0) { LM_ERR("cannot add mqueue: %.*s\n", mqs.len, mqs.s); free_params(params_list); return -1; } free_params(params_list); return 0; }
int mod_register(char *path, int *dlflags, void *p1, void *p2) { if(!shm_initialized() && init_shm()<0) return -1; #ifdef USE_SCTP /* shm is used, be sure it is initialized */ if(sctp_mod_pre_init()<0) return -1; return 0; #else LOG(L_CRIT, "sctp core support not enabled\n"); return -1; #endif }
int mod_register(char *path, int *dlflags, void *p1, void *p2) { if (tls_disable) { LOG(L_WARN, "tls support is disabled " "(set enable_tls=1 in the config to enable it)\n"); return 0; } /* shm is used, be sure it is initialized */ if(!shm_initialized() && init_shm()<0) return -1; if(tls_pre_init()<0) return -1; register_tls_hooks(&tls_h); return 0; }
int ht_table_spec(char *spec) { keyvalue_t kval; str name; str dbtable = {0, 0}; unsigned int autoexpire = 0; unsigned int size = 4; unsigned int dbmode = 0; unsigned int updateexpire = 1; unsigned int dmqreplicate = 0; str in; str tok; param_t *pit=NULL; int_str ival; int itype; if(!shm_initialized()) { LM_ERR("shared memory was not initialized\n"); return -1; } /* parse: name=>dbtable=abc;autoexpire=123;size=123 */ in.s = spec; in.len = strlen(in.s); if(keyvalue_parse_str(&in, KEYVALUE_TYPE_PARAMS, &kval)<0) { LM_ERR("failed parsing: %.*s\n", in.len, in.s); return -1; } name = kval.key; itype = PV_VAL_NONE; memset(&ival, 0, sizeof(int_str)); for (pit = kval.u.params; pit; pit=pit->next) { tok = pit->body; if(pit->name.len==7 && strncmp(pit->name.s, "dbtable", 7)==0) { dbtable = tok; LM_DBG("htable [%.*s] - dbtable [%.*s]\n", name.len, name.s, dbtable.len, dbtable.s); } else if(pit->name.len==10 && strncmp(pit->name.s, "autoexpire", 10)==0) { if(str2int(&tok, &autoexpire)!=0) goto error; LM_DBG("htable [%.*s] - expire [%u]\n", name.len, name.s, autoexpire); } else if(pit->name.len==4 && strncmp(pit->name.s, "size", 4)==0) { if(str2int(&tok, &size)!=0) goto error; LM_DBG("htable [%.*s] - size [%u]\n", name.len, name.s, size); } else if(pit->name.len==6 && strncmp(pit->name.s, "dbmode", 6)==0) { if(str2int(&tok, &dbmode)!=0) goto error; LM_DBG("htable [%.*s] - dbmode [%u]\n", name.len, name.s, dbmode); } else if(pit->name.len==7 && strncmp(pit->name.s, "initval", 7)==0) { if(str2sint(&tok, &ival.n)!=0) goto error; itype = PV_VAL_INT; LM_DBG("htable [%.*s] - initval [%d]\n", name.len, name.s, ival.n); } else if(pit->name.len == 12 && strncmp(pit->name.s, "updateexpire", 12) == 0) { if(str2int(&tok, &updateexpire) != 0) goto error; LM_DBG("htable [%.*s] - updateexpire [%u]\n", name.len, name.s, updateexpire); } else if(pit->name.len == 12 && strncmp(pit->name.s, "dmqreplicate", 12) == 0) { if(str2int(&tok, &dmqreplicate) != 0) goto error; LM_DBG("htable [%.*s] - dmqreplicate [%u]\n", name.len, name.s, dmqreplicate); } else { goto error; } } return ht_add_table(&name, autoexpire, &dbtable, size, dbmode, itype, &ival, updateexpire, dmqreplicate); error: LM_ERR("invalid htable parameter [%.*s]\n", in.len, in.s); return -1; }
int param_set_xvar( modparam_t type, void* val, int mode) { str s; char *p; int_str isv; int flags; int ival; script_var_t *pkv; sh_var_t *shv; if(!shm_initialized()) { LM_ERR("shm not initialized - cannot set value for PVs\n"); return -1; } s.s = (char*)val; if(s.s == NULL || s.s[0] == '\0') goto error; p = s.s; while(*p && *p!='=') p++; if(*p!='=') goto error; s.len = p - s.s; if(s.len == 0) goto error; p++; flags = 0; if(*p!='s' && *p!='S' && *p!='i' && *p!='I') goto error; if(*p=='s' || *p=='S') flags = VAR_VAL_STR; p++; if(*p!=':') goto error; p++; isv.s.s = p; isv.s.len = strlen(p); if(flags != VAR_VAL_STR) { if(str2sint(&isv.s, &ival)<0) goto error; isv.n = ival; } if(mode==0) { pkv = add_var(&s, VAR_TYPE_ZERO); if(pkv==NULL) goto error; if(set_var_value(pkv, &isv, flags)==NULL) goto error; } else { shv = add_shvar(&s); if(shv==NULL) goto error; if(set_shvar_value(shv, &isv, flags)==NULL) goto error; } return 0; error: LM_ERR("unable to set shv parame [%s]\n", s.s); return -1; }
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; }
int mq_head_add(str *name, int msize) { mq_head_t *mh = NULL; mq_pv_t *mp = NULL; int len; if(!shm_initialized()) { LM_ERR("shm not initialized - cannot define mqueue now\n"); return 0; } mh = _mq_head_list; while(mh!=NULL) { if(name->len == mh->name.len && strncmp(mh->name.s, name->s, name->len)==0) { LM_ERR("mqueue redefined: %.*s\n", name->len, name->s); return -1; } mh = mh->next; } mp = (mq_pv_t*)pkg_malloc(sizeof(mq_pv_t)); if(mp==NULL) { LM_ERR("no more pkg for: %.*s\n", name->len, name->s); return -1; } memset(mp, 0, sizeof(mq_pv_t)); len = sizeof(mq_head_t) + name->len + 1; mh = (mq_head_t*)shm_malloc(len); if(mh==NULL) { LM_ERR("no more shm for: %.*s\n", name->len, name->s); pkg_free(mp); return -1; } memset(mh, 0, len); if (lock_init(&mh->lock)==0 ) { LM_CRIT("failed to init lock\n"); pkg_free(mp); shm_free(mh); return -1; } mh->name.s = (char*)mh + sizeof(mq_head_t); memcpy(mh->name.s, name->s, name->len); mh->name.len = name->len; mh->name.s[name->len] = '\0'; mh->msize = msize; mh->next = _mq_head_list; _mq_head_list = mh; mp->name = &mh->name; mp->next = _mq_pv_list; _mq_pv_list = mp; return 0; }
int mt_table_spec(char* val) { param_t* params_list = NULL; param_hooks_t phooks; param_t *pit=NULL; m_tree_t tmp; m_tree_t *it, *prev, *ndl; str s; if(val==NULL) return -1; if(!shm_initialized()) { LM_ERR("shm not intialized - cannot define mtree now\n"); return 0; } s.s = val; s.len = strlen(s.s); if(s.s[s.len-1]==';') s.len--; if (parse_params(&s, CLASS_ANY, &phooks, ¶ms_list)<0) return -1; memset(&tmp, 0, sizeof(m_tree_t)); for (pit = params_list; pit; pit=pit->next) { if (pit->name.len==4 && strncasecmp(pit->name.s, "name", 4)==0) { tmp.tname = pit->body; } else if(pit->name.len==4 && strncasecmp(pit->name.s, "type", 4)==0) { str2sint(&pit->body, &tmp.type); } else if(pit->name.len==7 && strncasecmp(pit->name.s, "dbtable", 7)==0) { tmp.dbtable = pit->body; } } if(tmp.tname.s==NULL) { LM_ERR("invalid mtree name\n"); goto error; } if(tmp.dbtable.s==NULL) { LM_INFO("no table name - default mtree\n"); tmp.dbtable.s = "mtree"; tmp.dbtable.len = 5; } if ((tmp.type != 0) && (tmp.type != 1) && (tmp.type != 2)) { LM_ERR("unknown tree type <%d>\n", tmp.type); goto error; } /* check for same tree */ if(_ptree == 0) { /* tree list head in shm */ _ptree = (m_tree_t**)shm_malloc( sizeof(m_tree_t*) ); if (_ptree==0) { LM_ERR("out of shm mem for ptree\n"); goto error; } *_ptree=0; } it = *_ptree; prev = NULL; /* search the it position before which to insert new tvalue */ while(it!=NULL && str_strcmp(&it->tname, &tmp.tname)<0) { prev = it; it = it->next; } /* found */ if(it!=NULL && str_strcmp(&it->tname, &tmp.tname)==0) { LM_ERR("duplicate tree with name [%s]\n", tmp.tname.s); goto error; } /* add new tname*/ if(it==NULL || str_strcmp(&it->tname, &tmp.tname)>0) { LM_DBG("adding new tname [%s]\n", tmp.tname.s); ndl = mt_init_tree(&tmp.tname, &tmp.dbtable, tmp.type); if(ndl==NULL) { LM_ERR("no more shm memory\n"); goto error; } ndl->next = it; /* new tvalue must be added as first element */ if(prev==NULL) *_ptree = ndl; else prev->next=ndl; } free_params(params_list); return 0; error: free_params(params_list); return -1; }