NCDConfig.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /**
  2. * @file NCDConfig.c
  3. * @author Ambroz Bizjak <ambrop7@gmail.com>
  4. *
  5. * @section LICENSE
  6. *
  7. * This file is part of BadVPN.
  8. *
  9. * BadVPN is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2
  11. * as published by the Free Software Foundation.
  12. *
  13. * BadVPN is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  21. */
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <misc/string_begins_with.h>
  25. #include <misc/expstring.h>
  26. #include <ncdconfig/NCDConfig.h>
  27. void NCDConfig_free_interfaces (struct NCDConfig_interfaces *v)
  28. {
  29. if (!v) {
  30. return;
  31. }
  32. free(v->name);
  33. NCDConfig_free_statements(v->statements);
  34. NCDConfig_free_interfaces(v->next);
  35. free(v);
  36. }
  37. void NCDConfig_free_statements (struct NCDConfig_statements *v)
  38. {
  39. if (!v) {
  40. return;
  41. }
  42. NCDConfig_free_strings(v->objname);
  43. NCDConfig_free_strings(v->names);
  44. NCDConfig_free_arguments(v->args);
  45. free(v->name);
  46. NCDConfig_free_statements(v->next);
  47. free(v);
  48. }
  49. void NCDConfig_free_arguments (struct NCDConfig_arguments *v)
  50. {
  51. if (!v) {
  52. return;
  53. }
  54. switch (v->type) {
  55. case NCDCONFIG_ARG_STRING:
  56. free(v->string);
  57. break;
  58. case NCDCONFIG_ARG_VAR:
  59. NCDConfig_free_strings(v->var);
  60. break;
  61. default:
  62. ASSERT(0);
  63. }
  64. NCDConfig_free_arguments(v->next);
  65. free(v);
  66. }
  67. void NCDConfig_free_strings (struct NCDConfig_strings *v)
  68. {
  69. if (!v) {
  70. return;
  71. }
  72. free(v->value);
  73. NCDConfig_free_strings(v->next);
  74. free(v);
  75. }
  76. struct NCDConfig_interfaces * NCDConfig_make_interfaces (int is_template, char *name, struct NCDConfig_statements *statements, int need_next, struct NCDConfig_interfaces *next)
  77. {
  78. if (!name || !statements || (need_next && !next)) {
  79. goto fail;
  80. }
  81. struct NCDConfig_interfaces *v = malloc(sizeof(*v));
  82. if (!v) {
  83. goto fail;
  84. }
  85. v->is_template = is_template;
  86. v->name = name;
  87. v->statements = statements;
  88. v->next = next;
  89. return v;
  90. fail:
  91. free(name);
  92. NCDConfig_free_statements(statements);
  93. NCDConfig_free_interfaces(next);
  94. return NULL;
  95. }
  96. struct NCDConfig_statements * NCDConfig_make_statements (struct NCDConfig_strings *objname, struct NCDConfig_strings *names, struct NCDConfig_arguments *args, char *name, struct NCDConfig_statements *next)
  97. {
  98. struct NCDConfig_statements *v = malloc(sizeof(*v));
  99. if (!v) {
  100. goto fail;
  101. }
  102. v->objname = objname;
  103. v->names = names;
  104. v->args = args;
  105. v->name = name;
  106. v->next = next;
  107. return v;
  108. fail:
  109. NCDConfig_free_strings(names);
  110. NCDConfig_free_arguments(args);
  111. free(name);
  112. NCDConfig_free_statements(next);
  113. return NULL;
  114. }
  115. struct NCDConfig_arguments * NCDConfig_make_arguments_string (char *str, struct NCDConfig_arguments *next)
  116. {
  117. struct NCDConfig_arguments *v = malloc(sizeof(*v));
  118. if (!v) {
  119. goto fail;
  120. }
  121. v->type = NCDCONFIG_ARG_STRING;
  122. v->string = str;
  123. v->next = next;
  124. return v;
  125. fail:
  126. free(str);
  127. NCDConfig_free_arguments(next);
  128. return NULL;
  129. }
  130. struct NCDConfig_arguments * NCDConfig_make_arguments_var (struct NCDConfig_strings *var, struct NCDConfig_arguments *next)
  131. {
  132. struct NCDConfig_arguments *v = malloc(sizeof(*v));
  133. if (!v) {
  134. goto fail;
  135. }
  136. v->type = NCDCONFIG_ARG_VAR;
  137. v->var = var;
  138. v->next = next;
  139. return v;
  140. fail:
  141. NCDConfig_free_strings(var);
  142. NCDConfig_free_arguments(next);
  143. return NULL;
  144. }
  145. struct NCDConfig_strings * NCDConfig_make_strings (char *value, int need_next, struct NCDConfig_strings *next)
  146. {
  147. if (!value || (need_next && !next)) {
  148. goto fail;
  149. }
  150. struct NCDConfig_strings *v = malloc(sizeof(*v));
  151. if (!v) {
  152. goto fail;
  153. }
  154. v->value = value;
  155. v->next = next;
  156. return v;
  157. fail:
  158. free(value);
  159. NCDConfig_free_strings(next);
  160. return NULL;
  161. }
  162. int NCDConfig_statement_name_is (struct NCDConfig_statements *st, const char *needle)
  163. {
  164. ASSERT(st->names)
  165. size_t l;
  166. struct NCDConfig_strings *name = st->names;
  167. if (!(l = string_begins_with(needle, name->value))) {
  168. return 0;
  169. }
  170. needle += l;
  171. name = name->next;
  172. while (name) {
  173. if (!(l = string_begins_with(needle, "."))) {
  174. return 0;
  175. }
  176. needle += l;
  177. if (!(l = string_begins_with(needle, name->value))) {
  178. return 0;
  179. }
  180. needle += l;
  181. name = name->next;
  182. }
  183. if (*needle) {
  184. return 0;
  185. }
  186. return 1;
  187. }
  188. struct NCDConfig_statements * NCDConfig_find_statement (struct NCDConfig_statements *st, const char *needle)
  189. {
  190. while (st) {
  191. if (NCDConfig_statement_name_is(st, needle)) {
  192. return st;
  193. }
  194. st = st->next;
  195. }
  196. return NULL;
  197. }
  198. char * NCDConfig_concat_strings (struct NCDConfig_strings *s)
  199. {
  200. ExpString str;
  201. if (!ExpString_Init(&str)) {
  202. goto fail0;
  203. }
  204. if (!ExpString_Append(&str, s->value)) {
  205. goto fail1;
  206. }
  207. s = s->next;
  208. while (s) {
  209. if (!ExpString_Append(&str, ".")) {
  210. goto fail1;
  211. }
  212. if (!ExpString_Append(&str, s->value)) {
  213. goto fail1;
  214. }
  215. s = s->next;
  216. }
  217. return ExpString_Get(&str);
  218. fail1:
  219. ExpString_Free(&str);
  220. fail0:
  221. return NULL;
  222. }