You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*
  2. * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of the
  7. * License, or any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17. * 02110-1301, USA.
  18. */
  19. FILE_LICENCE ( GPL2_OR_LATER );
  20. /** @file
  21. *
  22. * Form parameters
  23. *
  24. */
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <ipxe/params.h>
  28. /** List of all parameter lists */
  29. static LIST_HEAD ( parameters );
  30. /**
  31. * Free form parameter list
  32. *
  33. * @v refcnt Reference count
  34. */
  35. static void free_parameters ( struct refcnt *refcnt ) {
  36. struct parameters *params =
  37. container_of ( refcnt, struct parameters, refcnt );
  38. struct parameter *param;
  39. struct parameter *tmp;
  40. DBGC ( params, "PARAMS \"%s\" destroyed\n", params->name );
  41. /* Free all parameters */
  42. list_for_each_entry_safe ( param, tmp, &params->entries, list ) {
  43. list_del ( &param->list );
  44. free ( param );
  45. }
  46. /* Free parameter list */
  47. free ( params );
  48. }
  49. /**
  50. * Find form parameter list by name
  51. *
  52. * @v name Parameter list name (may be NULL)
  53. * @ret params Parameter list, or NULL if not found
  54. */
  55. struct parameters * find_parameters ( const char *name ) {
  56. struct parameters *params;
  57. list_for_each_entry ( params, &parameters, list ) {
  58. if ( ( params->name == name ) ||
  59. ( strcmp ( params->name, name ) == 0 ) ) {
  60. return params;
  61. }
  62. }
  63. return NULL;
  64. }
  65. /**
  66. * Create form parameter list
  67. *
  68. * @v name Parameter list name (may be NULL)
  69. * @ret params Parameter list, or NULL on failure
  70. */
  71. struct parameters * create_parameters ( const char *name ) {
  72. struct parameters *params;
  73. size_t name_len;
  74. char *name_copy;
  75. /* Destroy any existing parameter list of this name */
  76. params = find_parameters ( name );
  77. if ( params ) {
  78. claim_parameters ( params );
  79. params_put ( params );
  80. }
  81. /* Allocate parameter list */
  82. name_len = ( name ? ( strlen ( name ) + 1 /* NUL */ ) : 0 );
  83. params = zalloc ( sizeof ( *params ) + name_len );
  84. if ( ! params )
  85. return NULL;
  86. ref_init ( &params->refcnt, free_parameters );
  87. name_copy = ( ( void * ) ( params + 1 ) );
  88. /* Populate parameter list */
  89. if ( name ) {
  90. strcpy ( name_copy, name );
  91. params->name = name_copy;
  92. }
  93. INIT_LIST_HEAD ( &params->entries );
  94. /* Add to list of parameter lists */
  95. list_add_tail ( &params->list, &parameters );
  96. DBGC ( params, "PARAMS \"%s\" created\n", params->name );
  97. return params;
  98. }
  99. /**
  100. * Add form parameter
  101. *
  102. * @v params Parameter list
  103. * @v key Parameter key
  104. * @v value Parameter value
  105. * @ret param Parameter, or NULL on failure
  106. */
  107. struct parameter * add_parameter ( struct parameters *params,
  108. const char *key, const char *value ) {
  109. struct parameter *param;
  110. size_t key_len;
  111. size_t value_len;
  112. char *key_copy;
  113. char *value_copy;
  114. /* Allocate parameter */
  115. key_len = ( strlen ( key ) + 1 /* NUL */ );
  116. value_len = ( strlen ( value ) + 1 /* NUL */ );
  117. param = zalloc ( sizeof ( *param ) + key_len + value_len );
  118. if ( ! param )
  119. return NULL;
  120. key_copy = ( ( void * ) ( param + 1 ) );
  121. value_copy = ( key_copy + key_len );
  122. /* Populate parameter */
  123. strcpy ( key_copy, key );
  124. param->key = key_copy;
  125. strcpy ( value_copy, value );
  126. param->value = value_copy;
  127. /* Add to list of parameters */
  128. list_add_tail ( &param->list, &params->entries );
  129. DBGC ( params, "PARAMS \"%s\" added \"%s\"=\"%s\"\n",
  130. params->name, param->key, param->value );
  131. return param;
  132. }