Skip to content

Commit

Permalink
dialog: api function get pkg-allocated duplicate of dlg var value
Browse files Browse the repository at this point in the history
  • Loading branch information
miconda committed Sep 26, 2022
1 parent a757123 commit 13512f4
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 1 deletion.
5 changes: 4 additions & 1 deletion src/modules/dialog/dlg_cb.h
Expand Up @@ -42,7 +42,7 @@ struct dlg_cb_params {
};

/* callback function prototype */
typedef void (dialog_cb) (struct dlg_cell* dlg, int type,
typedef void (dialog_cb) (struct dlg_cell* dlg, int type,
struct dlg_cb_params * params);
/* function to free the callback param */
typedef void (param_free_cb) (void *param);
Expand All @@ -60,6 +60,9 @@ typedef str* (*get_dlg_varref_f)( struct dlg_cell* dlg,
/* method to get a variable from a dialog */
typedef int (*get_dlg_varval_f)( struct dlg_cell* dlg,
str* key, str* val);
/* method to get a variable value duplicate from a dialog */
typedef int (*get_dlg_vardup_f)( struct dlg_cell* dlg,
str* key, str* val);

#define CONFIRMED_DIALOG_STATE 1

Expand Down
1 change: 1 addition & 0 deletions src/modules/dialog/dlg_load.h
Expand Up @@ -48,6 +48,7 @@ struct dlg_binds {
set_dlg_variable_f set_dlg_var;
get_dlg_varref_f get_dlg_varref;
get_dlg_varval_f get_dlg_varval;
get_dlg_vardup_f get_dlg_vardup;
get_dlg_f get_dlg;
release_dlg_f release_dlg;
};
Expand Down
34 changes: 34 additions & 0 deletions src/modules/dialog/dlg_var.c
Expand Up @@ -342,6 +342,40 @@ int get_dlg_varval(struct dlg_cell *dlg, str *key, str *val)
return -2;
}

/**
* set *val to a pkg-allocated buffer where the dlg value is cloned
* - val->s has to be pkg-freed after use
*/
int get_dlg_vardup(struct dlg_cell *dlg, str *key, str *val)
{
str *var = NULL;

val->s = NULL;
val->len = 0;

if( !dlg || !key || key->len<=0) {
LM_ERR("BUG - bad parameters\n");
return -1;
}

dlg_lock(d_table, &(d_table->entries[dlg->h_entry]));
var = get_dlg_variable_unsafe(dlg, key);
if(var && var->s) {
val->s = (char*)pkg_malloc(var->len + 1);
if(val->s!=NULL) {
memcpy(val->s, var->s, var->len);
val->len = var->len;
val->s[val->len] = '\0';
}
}
dlg_unlock(d_table, &(d_table->entries[dlg->h_entry]));

if(val->s) {
return 0;
}
return -2;
}

int get_dlg_variable_uintval(struct dlg_cell *dlg, str *key, unsigned int *uval)
{
str* var = NULL;
Expand Down
1 change: 1 addition & 0 deletions src/modules/dialog/dlg_var.h
Expand Up @@ -61,6 +61,7 @@ typedef struct dlg_var {

str* get_dlg_varref(dlg_cell_t *dlg, str *key);
int get_dlg_varval(dlg_cell_t *dlg, str *key, str *val);
int get_dlg_vardup(dlg_cell_t *dlg, str *key, str *val);
int set_dlg_variable(dlg_cell_t *dlg, str *key, str *val);

int get_dlg_variable_uintval(struct dlg_cell *dlg, str *key, unsigned int *uval);
Expand Down

0 comments on commit 13512f4

Please sign in to comment.