Skip to content

Commit

Permalink
pv: added $shvinc(name) - return incremented value of $shv(inc)
Browse files Browse the repository at this point in the history
- leverage internal mutex to avoid config locks
  • Loading branch information
miconda committed May 11, 2022
1 parent 85d1881 commit eebdabe
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/modules/pv/pv.c
Expand Up @@ -526,6 +526,8 @@ static pv_export_t mod_pvs[] = {

{ {"shv", (sizeof("shv")-1)}, PVT_OTHER, pv_get_shvar,
pv_set_shvar, pv_parse_shvar_name, 0, 0, 0},
{ {"shvinc", (sizeof("shvinc")-1)}, PVT_OTHER, pv_get_shvinc,
0, pv_parse_shvar_name, 0, 0, 0},
{ {"time", (sizeof("time")-1)}, PVT_CONTEXT, pv_get_local_time,
0, pv_parse_time_name, 0, 0, 0},
{ {"timef", (sizeof("timef")-1)}, PVT_CONTEXT, pv_get_local_strftime,
Expand Down
32 changes: 32 additions & 0 deletions src/modules/pv/pv_shv.c
Expand Up @@ -387,6 +387,38 @@ int pv_get_shvar(struct sip_msg *msg, pv_param_t *param,
return 0;
}

int pv_get_shvinc(struct sip_msg *msg, pv_param_t *param,
pv_value_t *res)
{
int len = 0;
char *sval = NULL;
sh_var_t *shv=NULL;

if(msg==NULL || res==NULL)
return -1;

if(param==NULL || param->pvn.u.dname==0)
return pv_get_null(msg, param, res);

shv= (sh_var_t*)param->pvn.u.dname;

lock_shvar(shv);
if(shv->v.flags&VAR_VAL_STR)
{
res->ri = 0;
} else {
shv->v.value.n++;
res->ri = shv->v.value.n;
}
unlock_shvar(shv);

sval = sint2str(res->ri, &len);
res->rs.s = sval;
res->rs.len = len;
res->flags = PV_VAL_STR|PV_VAL_INT|PV_TYPE_INT;
return 0;
}

int pv_set_shvar(struct sip_msg* msg, pv_param_t *param,
int op, pv_value_t *val)
{
Expand Down
1 change: 1 addition & 0 deletions src/modules/pv/pv_shv.h
Expand Up @@ -57,6 +57,7 @@ int pv_parse_shvar_name(pv_spec_p sp, str *in);
int pv_get_shvar(struct sip_msg *msg, pv_param_t *param, pv_value_t *res);
int pv_set_shvar(struct sip_msg* msg, pv_param_t *param, int op,
pv_value_t *val);
int pv_get_shvinc(struct sip_msg *msg, pv_param_t *param, pv_value_t *res);

int shvar_init_locks(void);
void shvar_destroy_locks(void);
Expand Down

0 comments on commit eebdabe

Please sign in to comment.