syms.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <syslog.h>
  6. #include <faux/faux.h>
  7. #include <faux/str.h>
  8. #include <faux/argv.h>
  9. #include <faux/list.h>
  10. #include <faux/error.h>
  11. #include <klish/khelper.h>
  12. #include <klish/kplugin.h>
  13. #include <klish/kentry.h>
  14. #include <klish/kscheme.h>
  15. #include <klish/kcontext.h>
  16. #include <klish/kpargv.h>
  17. #include <sysrepo.h>
  18. #include <sysrepo/xpath.h>
  19. #include "pline.h"
  20. static faux_argv_t *pargv2argv(const kpargv_t *pargv)
  21. {
  22. const kentry_t *candidate = NULL;
  23. faux_list_node_t *iter = NULL;
  24. faux_list_t *pargs = NULL;
  25. faux_argv_t *args = NULL;
  26. assert(pargv);
  27. if (!pargv)
  28. return NULL;
  29. pargs = kpargv_pargs(pargv);
  30. candidate = kparg_entry(kpargv_candidate_parg(pargv));
  31. iter = faux_list_tail(pargs);
  32. while (iter) {
  33. faux_list_node_t *prev = faux_list_prev_node(iter);
  34. kparg_t *parg = (kparg_t *)faux_list_data(iter);
  35. if (kparg_entry(parg) != candidate) {
  36. iter = faux_list_next_node(iter);
  37. break;
  38. }
  39. if (!prev)
  40. break;
  41. iter = prev;
  42. }
  43. args = faux_argv_new();
  44. while (iter) {
  45. kparg_t *parg = (kparg_t *)faux_list_data(iter);
  46. faux_argv_add(args, kparg_value(parg));
  47. iter = faux_list_next_node(iter);
  48. }
  49. faux_argv_set_continuable(args, kpargv_continuable(pargv));
  50. return args;
  51. }
  52. static faux_argv_t *param2argv(const kpargv_t *pargv, const char *entry_name)
  53. {
  54. faux_list_node_t *iter = NULL;
  55. faux_list_t *pargs = NULL;
  56. faux_argv_t *args = NULL;
  57. kparg_t *parg = NULL;
  58. assert(pargv);
  59. if (!pargv)
  60. return NULL;
  61. pargs = kpargv_find_multi(pargv, entry_name);
  62. args = faux_argv_new();
  63. iter = faux_list_head(pargs);
  64. while ((parg = (kparg_t *)faux_list_each(&iter))) {
  65. faux_argv_add(args, kparg_value(parg));
  66. }
  67. faux_list_free(pargs);
  68. return args;
  69. }
  70. // Candidate from pargv contains possible begin of current word (that must be
  71. // completed). kpargv's list don't contain candidate but only already parsed
  72. // words.
  73. int srp_compl(kcontext_t *context)
  74. {
  75. faux_argv_t *args = NULL;
  76. pline_t *pline = NULL;
  77. sr_conn_ctx_t *conn = NULL;
  78. sr_session_ctx_t *sess = NULL;
  79. const char *entry_name = NULL;
  80. assert(context);
  81. if (sr_connect(SR_CONN_DEFAULT, &conn))
  82. return -1;
  83. if (sr_session_start(conn, SR_DS_RUNNING, &sess)) {
  84. sr_disconnect(conn);
  85. return -1;
  86. }
  87. entry_name = kentry_name(kcontext_candidate_entry(context));
  88. args = param2argv(kcontext_parent_pargv(context), entry_name);
  89. pline = pline_parse(sess, args, 0);
  90. faux_argv_free(args);
  91. pline_print_completions(pline, BOOL_FALSE);
  92. pline_free(pline);
  93. sr_disconnect(conn);
  94. return 0;
  95. }
  96. int srp_set(kcontext_t *context)
  97. {
  98. faux_argv_t *args = NULL;
  99. pline_t *pline = NULL;
  100. sr_conn_ctx_t *conn = NULL;
  101. sr_session_ctx_t *sess = NULL;
  102. faux_list_node_t *iter = NULL;
  103. pexpr_t *expr = NULL;
  104. size_t err_num = 0;
  105. return 0;
  106. assert(context);
  107. if (sr_connect(SR_CONN_DEFAULT, &conn))
  108. return -1;
  109. if (sr_session_start(conn, SR_DS_RUNNING, &sess)) {
  110. sr_disconnect(conn);
  111. return -1;
  112. }
  113. args = pargv2argv(kcontext_pargv(context));
  114. pline = pline_parse(sess, args, 0);
  115. faux_argv_free(args);
  116. iter = faux_list_head(pline->exprs);
  117. while ((expr = (pexpr_t *)faux_list_each(&iter))) {
  118. if (!expr->active)
  119. break;
  120. if (sr_set_item_str(sess, expr->xpath, expr->value, NULL, 0) !=
  121. SR_ERR_OK) {
  122. err_num++;
  123. fprintf(stderr, "Can't set data");
  124. break;
  125. }
  126. }
  127. if (sr_has_changes(sess)) {
  128. if (err_num > 0)
  129. sr_discard_changes(sess);
  130. else
  131. sr_apply_changes(sess, 0);
  132. }
  133. pline_free(pline);
  134. sr_disconnect(conn);
  135. if (err_num > 0)
  136. return -1;
  137. return 0;
  138. }