envreg.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. * Copyright (C) 2012 by egnite GmbH
  3. *
  4. * All rights reserved.
  5. *
  6. * Redistribution and use in source and binary forms, with or without
  7. * modification, are permitted provided that the following conditions
  8. * are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. Neither the name of the copyright holders nor the names of
  16. * contributors may be used to endorse or promote products derived
  17. * from this software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  22. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  23. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  24. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  25. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
  26. * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
  27. * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  28. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
  29. * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  30. * SUCH DAMAGE.
  31. *
  32. * For additional information see http://www.ethernut.de/
  33. */
  34. /*!
  35. * $Id$
  36. */
  37. #include <pro/uhttp/envvars.h>
  38. #include <stdlib.h>
  39. #include <string.h>
  40. #include <memdebug.h>
  41. extern ISC_LIST(HTTP_ENVVAR_ENTRY) envVarList;
  42. const HTTP_ENVVAR_ENTRY* EnvVarGetEntry(const char *name)
  43. {
  44. HTTP_ENVVAR_ENTRY *env;
  45. int i;
  46. /* Locate the entry with the given name. */
  47. for (env = ISC_LIST_HEAD(envVarList); env; env = ISC_LIST_NEXT(env, env_link)) {
  48. i = strcasecmp(env->env_name, name);
  49. if (i <= 0) {
  50. if (i) {
  51. env = NULL;
  52. }
  53. break;
  54. }
  55. }
  56. return env;
  57. }
  58. int EnvRegisterVariable(char *name, HTTP_ENVVAR_HANDLER handler, int item)
  59. {
  60. int rc = -1;
  61. HTTP_ENVVAR_ENTRY *cur;
  62. HTTP_ENVVAR_ENTRY *env;
  63. int i = -1;
  64. for (cur = ISC_LIST_HEAD(envVarList); cur; cur = ISC_LIST_NEXT(cur, env_link)) {
  65. i = strcasecmp(cur->env_name, name);
  66. if (i <= 0) {
  67. break;
  68. }
  69. }
  70. if (i == 0) {
  71. /* Existing entry. */
  72. if (handler) {
  73. /* Override entry. */
  74. cur->env_handler = handler;
  75. } else {
  76. /* Remove entry. */
  77. ISC_LIST_UNLINK_TYPE(envVarList, cur, env_link, HTTP_ENVVAR_ENTRY);
  78. if (cur->env_index < 0) {
  79. free(cur->env_name);
  80. free(cur);
  81. }
  82. }
  83. rc = 0;
  84. }
  85. if (handler && i) {
  86. /* New entry. */
  87. env = (HTTP_ENVVAR_ENTRY *) calloc(1, sizeof(HTTP_ENVVAR_ENTRY));
  88. if (env) {
  89. env->env_name = strdup(name);
  90. if (env->env_name) {
  91. env->env_handler = handler;
  92. env->env_index = item;
  93. if (cur) {
  94. /* Insert entry, maintaining descending sort order. */
  95. ISC_LIST_INSERTBEFORE(envVarList, cur, env, env_link);
  96. } else {
  97. /* Append entry to the list. */
  98. ISC_LIST_APPEND(envVarList, env, env_link);
  99. }
  100. /* Indicate success and let the internal client handler
  101. use our validator. */
  102. rc = 0;
  103. }
  104. }
  105. }
  106. return rc;
  107. }