diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/params.c | 68 | ||||
| -rw-r--r-- | src/core/uri.c | 10 |
2 files changed, 33 insertions, 45 deletions
diff --git a/src/core/params.c b/src/core/params.c index 21361c1f8..93b834419 100644 --- a/src/core/params.c +++ b/src/core/params.c @@ -33,6 +33,29 @@ FILE_LICENCE ( GPL2_OR_LATER ); static LIST_HEAD ( parameters ); /** + * Free form parameter list + * + * @v refcnt Reference count + */ +static void free_parameters ( struct refcnt *refcnt ) { + struct parameters *params = + container_of ( refcnt, struct parameters, refcnt ); + struct parameter *param; + struct parameter *tmp; + + DBGC ( params, "PARAMS \"%s\" destroyed\n", params->name ); + + /* Free all parameters */ + list_for_each_entry_safe ( param, tmp, ¶ms->entries, list ) { + list_del ( ¶m->list ); + free ( param ); + } + + /* Free parameter list */ + free ( params ); +} + +/** * Find form parameter list by name * * @v name Parameter list name (may be NULL) @@ -63,14 +86,17 @@ struct parameters * create_parameters ( const char *name ) { /* Destroy any existing parameter list of this name */ params = find_parameters ( name ); - if ( params ) - destroy_parameters ( params ); + if ( params ) { + claim_parameters ( params ); + params_put ( params ); + } /* Allocate parameter list */ name_len = ( name ? ( strlen ( name ) + 1 /* NUL */ ) : 0 ); params = zalloc ( sizeof ( *params ) + name_len ); if ( ! params ) return NULL; + ref_init ( ¶ms->refcnt, free_parameters ); name_copy = ( ( void * ) ( params + 1 ) ); /* Populate parameter list */ @@ -125,41 +151,3 @@ struct parameter * add_parameter ( struct parameters *params, params->name, param->key, param->value ); return param; } - -/** - * Destroy form parameter list - * - * @v params Parameter list - */ -void destroy_parameters ( struct parameters *params ) { - struct parameter *param; - struct parameter *tmp; - - DBGC ( params, "PARAMS \"%s\" destroyed\n", params->name ); - - /* Free all parameters */ - list_for_each_entry_safe ( param, tmp, ¶ms->entries, list ) { - list_del ( ¶m->list ); - free ( param ); - } - - /* Free parameter list */ - list_del ( ¶ms->list ); - free ( params ); -} - -/** - * Claim ownership of form parameter list - * - * @v params Parameter list - */ -void claim_parameters ( struct parameters *params ) { - - DBGC ( params, "PARAMS \"%s\" claimed\n", params->name ); - - /* Remove from list of parameter lists */ - list_del ( ¶ms->list ); - - /* Reinitialise list to allow for subsequent destroy_parameters() */ - INIT_LIST_HEAD ( ¶ms->list ); -} diff --git a/src/core/uri.c b/src/core/uri.c index bc55e4d8c..499fb9750 100644 --- a/src/core/uri.c +++ b/src/core/uri.c @@ -72,8 +72,7 @@ static void dump_uri ( struct uri *uri ) { static void free_uri ( struct refcnt *refcnt ) { struct uri *uri = container_of ( refcnt, struct uri, refcnt ); - if ( uri->params ) - destroy_parameters ( uri->params ); + params_put ( uri->params ); free ( uri ); } @@ -89,6 +88,7 @@ static void free_uri ( struct refcnt *refcnt ) { */ struct uri * parse_uri ( const char *uri_string ) { struct uri *uri; + struct parameters *params; char *raw; char *tmp; char *path; @@ -111,9 +111,9 @@ struct uri * parse_uri ( const char *uri_string ) { if ( ( tmp = strstr ( raw, "##params" ) ) ) { *tmp = '\0'; tmp += 8 /* "##params" */; - uri->params = find_parameters ( *tmp ? ( tmp + 1 ) : NULL ); - if ( uri->params ) { - claim_parameters ( uri->params ); + params = find_parameters ( *tmp ? ( tmp + 1 ) : NULL ); + if ( params ) { + uri->params = claim_parameters ( params ); } else { /* Ignore non-existent submission blocks */ } |
