/openscap-0.8.2/tests/API/CPE/lang/test_api_cpe_lang.c

# · C · 278 lines · 191 code · 55 blank · 32 comment · 81 complexity · 4fa2198d6f3bc3b621a089573f4c4229 MD5 · raw file

  1. /*
  2. * Copyright 2008 Red Hat Inc., Durham, North Carolina.
  3. * All Rights Reserved.
  4. *
  5. * OpenScap CPE Lang Module Test Suite Helper
  6. *
  7. * Authors:
  8. * Ondrej Moris <omoris@redhat.com>
  9. */
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <cpelang.h>
  13. #include <cpeuri.h>
  14. #include <oscap.h>
  15. // Strings representing operators.
  16. const char *CPE_OPER_STRS[] = { "", "AND", "OR", "" };
  17. void print_usage(const char *, FILE *);
  18. int print_expr_prefix_form(const struct cpe_testexpr *);
  19. void print_platform(struct cpe_platform *);
  20. int main (int argc, char *argv[])
  21. {
  22. struct cpe_lang_model *lang_model = NULL;
  23. struct cpe_platform *platform = NULL, *new_platform = NULL;
  24. struct cpe_testexpr *testexpr = NULL;
  25. struct cpe_platform_iterator *platform_it = NULL;
  26. struct oscap_text_iterator *title_it = NULL;
  27. struct oscap_text *title = NULL;
  28. int ret_val = 0, i;
  29. if (argc == 2 && !strcmp(argv[1], "--help")) {
  30. print_usage(argv[0], stdout);
  31. ret_val = 0;
  32. }
  33. // Print complete content.
  34. else if (argc == 4 && !strcmp(argv[1], "--get-all")) {
  35. if ((lang_model = cpe_lang_model_import(argv[2])) == NULL)
  36. return 1;
  37. //printf("%s:", cpe_lang_model_get_ns_href(lang_model));
  38. //printf("%s\n", cpe_lang_model_get_ns_prefix(lang_model));
  39. platform_it = cpe_lang_model_get_platforms(lang_model);
  40. while (cpe_platform_iterator_has_more(platform_it)) {
  41. print_platform(cpe_platform_iterator_next(platform_it));
  42. }
  43. cpe_platform_iterator_free(platform_it);
  44. cpe_lang_model_free(lang_model);
  45. }
  46. // Print platform of given key only.
  47. else if (argc == 5 && !strcmp(argv[1], "--get-key")) {
  48. if ((lang_model = cpe_lang_model_import(argv[2])) == NULL)
  49. return 1;
  50. if ((platform = cpe_lang_model_get_item(lang_model, argv[4])) == NULL)
  51. return 2;
  52. print_platform(platform);
  53. cpe_lang_model_free(lang_model);
  54. }
  55. // Set ns_prefix, ns_href, add new platforms.
  56. else if (argc >= 6 && !strcmp(argv[1], "--set-all")) {
  57. if ((lang_model = cpe_lang_model_import(argv[2])) == NULL)
  58. return 1;
  59. for (i = 6; i < argc; i++) {
  60. if ((new_platform = cpe_platform_new()) == NULL)
  61. return 1;
  62. cpe_platform_set_id(new_platform, argv[i]);
  63. if (!cpe_lang_model_add_platform(lang_model, new_platform))
  64. return 2;
  65. }
  66. cpe_lang_model_export(lang_model, argv[2]);
  67. cpe_lang_model_free(lang_model);
  68. }
  69. // Set id, change titles of platform of given key.
  70. else if (argc >= 6 && !strcmp(argv[1], "--set-key")) {
  71. if ((lang_model = cpe_lang_model_import(argv[2])) == NULL)
  72. return 1;
  73. if ((platform = cpe_lang_model_get_item(lang_model, argv[4])) == NULL)
  74. return 2;
  75. if (strcmp(argv[5], "-"))
  76. cpe_platform_set_id(platform, argv[5]);
  77. i = 6;
  78. title_it = cpe_platform_get_titles(platform);
  79. while (i < argc && oscap_text_iterator_has_more(title_it)) {
  80. title = oscap_text_iterator_next(title_it);
  81. if (strcmp(argv[i], "-"))
  82. oscap_text_set_text(title, argv[i]);
  83. i++;
  84. }
  85. cpe_lang_model_export(lang_model, argv[2]);
  86. cpe_lang_model_free(lang_model);
  87. }
  88. // Create new content with new platforms.
  89. else if (argc >= 6 && !strcmp(argv[1], "--set-new")) {
  90. if ((lang_model = cpe_lang_model_new()) == NULL)
  91. return 1;
  92. for (i = 6; i < argc; i++) {
  93. if ((new_platform = cpe_platform_new()) == NULL)
  94. return 1;
  95. cpe_platform_set_id(new_platform, argv[i]);
  96. /*
  97. struct cpe_testexpr *expr = cpe_testexpr_new();
  98. cpe_testexpr_set_oper(expr, CPE_LANG_OPER_MATCH);
  99. cpe_testexpr_set_name(expr, cpe_name_new("cpe:/a:nevim"));
  100. cpe_platform_set_expr(new_platform, expr);
  101. */
  102. if (!cpe_lang_model_add_platform(lang_model, new_platform))
  103. return 2;
  104. }
  105. cpe_lang_model_export(lang_model, argv[2]);
  106. cpe_lang_model_free(lang_model);
  107. }
  108. // Sanity checks.
  109. else if (argc == 2 && !strcmp(argv[1], "--smoke-test")) {
  110. if ((lang_model = cpe_lang_model_new()) == NULL)
  111. return 1;
  112. else
  113. cpe_lang_model_free(lang_model);
  114. if ((new_platform = cpe_platform_new()) == NULL)
  115. return 1;
  116. else
  117. cpe_platform_free(new_platform);
  118. if ((testexpr = cpe_testexpr_new()) == NULL)
  119. return 1;
  120. else
  121. cpe_testexpr_free(testexpr);
  122. }
  123. else if (argc == 6 && !strcmp(argv[1], "--export-all")) {
  124. if ((lang_model = cpe_lang_model_import(argv[2])) == NULL)
  125. return 1;
  126. cpe_lang_model_export(lang_model, argv[4]);
  127. cpe_lang_model_free(lang_model);
  128. }
  129. else if (argc == 6 && !strcmp(argv[1], "--match-cpe")) {
  130. if ((lang_model = cpe_lang_model_import(argv[2])) == NULL)
  131. return 1;
  132. struct cpe_name *name1 = NULL;
  133. struct cpe_name *name2 = NULL;
  134. char * uri = NULL;
  135. // make cpe_name
  136. name1 = cpe_name_new(argv[4]);
  137. name2 = cpe_name_new(argv[5]);
  138. if ( (uri = cpe_name_get_uri(name1)) == NULL ) return 1;
  139. if ( (uri = cpe_name_get_uri(name2)) == NULL ) return 1;
  140. // actually we need array of cpe_name-s
  141. struct cpe_name ** names = (struct cpe_name **) malloc(2*sizeof(struct cpe_name *)); // <-- just for clear what I'm doing
  142. names[0] = name1;
  143. names[1] = name2;
  144. // let's get platform cpe's to match
  145. platform_it = cpe_lang_model_get_platforms(lang_model);
  146. platform = cpe_platform_iterator_next(platform_it); // we just need first one (no more there)
  147. cpe_platform_iterator_free(platform_it);
  148. ret_val = !cpe_platform_match_cpe(names, 2, platform);
  149. cpe_name_free(name1);
  150. cpe_name_free(name2);
  151. free(names);
  152. cpe_lang_model_free(lang_model);
  153. return ret_val;
  154. }
  155. else {
  156. print_usage(argv[0], stderr);
  157. ret_val = 1;
  158. }
  159. oscap_cleanup();
  160. return ret_val;
  161. }
  162. // Print usage.
  163. void print_usage(const char *program_name, FILE *out)
  164. {
  165. fprintf(out,
  166. "Usage: \n\n"
  167. " %s --export-all CPE_LANG_XML ENCODING CPE_EXPORT_XML ENCODING\n"
  168. " %s --get-all CPE_LANG_XML ENCODING\n"
  169. " %s --get-key CPE_LANG_XML ENCODING KEY\n"
  170. " %s --set-all CPE_LANG_XML ENCODING NS_PREFIX NS_HREF (PLATFORM_ID)*\n"
  171. " %s --set-key CPE_LANG_XML ENCODING KEY ID (TITLE)*\n"
  172. " %s --set-new CPE_LANG_XML ENCODING NS_PREFIX NS_HREF (PLATFORM_ID)*\n"
  173. " %s --match-cpe CPE_LANG_XML ENCODING CPE_NAME1 CPE_NAME2\n"
  174. " %s --smoke-test\n",
  175. program_name, program_name, program_name, program_name, program_name,
  176. program_name, program_name, program_name);
  177. }
  178. // Print expression in prefix form.
  179. int print_expr_prefix_form(const struct cpe_testexpr *expr)
  180. {
  181. //const struct cpe_testexpr *sub;
  182. putchar('(');
  183. if (cpe_testexpr_get_oper(expr) & CPE_LANG_OPER_NOT)
  184. printf("!");
  185. switch (cpe_testexpr_get_oper(expr) & CPE_LANG_OPER_MASK) {
  186. case CPE_LANG_OPER_AND:
  187. case CPE_LANG_OPER_OR:
  188. printf("%s", CPE_OPER_STRS[cpe_testexpr_get_oper(expr) & CPE_LANG_OPER_MASK]);
  189. //for (sub = cpe_testexpr_get_meta_expr(expr); cpe_testexpr_get_oper(sub); sub=cpe_testexpr_get_next(sub))
  190. OSCAP_FOREACH(cpe_testexpr, sub, cpe_testexpr_get_meta_expr(expr), print_expr_prefix_form(sub););
  191. break;
  192. case CPE_LANG_OPER_MATCH:
  193. printf("%s", cpe_name_get_uri(cpe_testexpr_get_meta_cpe(expr)));
  194. break;
  195. default:
  196. return 1;
  197. }
  198. putchar(')');
  199. return 0;
  200. }
  201. // Print platform.
  202. void print_platform(struct cpe_platform *platform)
  203. {
  204. struct oscap_text *title = NULL;
  205. struct oscap_text_iterator *title_it = NULL;
  206. const char *remark, *id, *content, *language;
  207. id = cpe_platform_get_id(platform);
  208. printf("%s:", id == NULL ? "" : id);
  209. remark = cpe_platform_get_remark(platform);
  210. printf("%s:", remark == NULL ? "" : remark);
  211. title_it = cpe_platform_get_titles(platform);
  212. while (oscap_text_iterator_has_more(title_it)) {
  213. title = oscap_text_iterator_next(title_it);
  214. content = oscap_text_get_text(title);
  215. printf("%s.", content == NULL ? "" : content);
  216. language = oscap_text_get_lang(title);
  217. printf("%s,", language == NULL ? "" : language);
  218. }
  219. putchar(':');
  220. oscap_text_iterator_free(title_it);
  221. print_expr_prefix_form(cpe_platform_get_expr(platform));
  222. putchar('\n');
  223. }