sr_load.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <faux/faux.h>
  4. #include <faux/str.h>
  5. #include <faux/file.h>
  6. #include <faux/argv.h>
  7. #include <sysrepo.h>
  8. #include <sysrepo/xpath.h>
  9. #include "pline.h"
  10. int main(int argc, char **argv)
  11. {
  12. int ret = -1;
  13. int err = SR_ERR_OK;
  14. sr_conn_ctx_t *conn = NULL;
  15. sr_session_ctx_t *sess = NULL;
  16. faux_file_t *file = NULL;
  17. char *line = NULL;
  18. pline_opts_t opts;
  19. size_t err_num = 0;
  20. bool_t stop_on_error = BOOL_TRUE;
  21. err = sr_connect(SR_CONN_DEFAULT, &conn);
  22. if (err) {
  23. fprintf(stderr, "Error: Can't connect to sysrepo\n");
  24. goto out;
  25. }
  26. err = sr_session_start(conn, SR_DS_CANDIDATE, &sess);
  27. if (err) {
  28. fprintf(stderr, "Error: Can't start session\n");
  29. goto out;
  30. }
  31. file = faux_file_fdopen(STDIN_FILENO);
  32. if (!file) {
  33. fprintf(stderr, "Error: Can't open stdin\n");
  34. goto out;
  35. }
  36. pline_opts_init(&opts);
  37. while ((line = faux_file_getline(file))) {
  38. pline_t *pline = NULL;
  39. faux_argv_t *args = NULL;
  40. args = faux_argv_new();
  41. faux_argv_parse(args, line);
  42. pline = pline_parse(sess, args, &opts);
  43. faux_argv_free(args);
  44. if (!pline || pline->invalid) {
  45. err_num++;
  46. fprintf(stderr, "Error: Illegal: %s\n", line);
  47. } else {
  48. faux_list_node_t *iter = NULL;
  49. pexpr_t *expr = NULL;
  50. iter = faux_list_head(pline->exprs);
  51. while ((expr = (pexpr_t *)faux_list_each(&iter))) {
  52. if (!(expr->pat & PT_SET)) {
  53. err_num++;
  54. fprintf(stderr, "Error: Illegal expression for set operation\n");
  55. break;
  56. }
  57. if (sr_set_item_str(sess, expr->xpath, expr->value, NULL, 0) !=
  58. SR_ERR_OK) {
  59. err_num++;
  60. fprintf(stderr, "Error: Can't set data\n");
  61. break;
  62. }
  63. }
  64. }
  65. if (stop_on_error && (err_num > 0)) {
  66. sr_discard_changes(sess);
  67. goto out;
  68. }
  69. pline_free(pline);
  70. faux_str_free(line);
  71. }
  72. if (sr_has_changes(sess)) {
  73. if (sr_apply_changes(sess, 0) != SR_ERR_OK) {
  74. sr_discard_changes(sess);
  75. fprintf(stderr, "Error: Can't apply changes\n");
  76. goto out;
  77. }
  78. }
  79. ret = 0;
  80. out:
  81. faux_file_close(file);
  82. sr_disconnect(conn);
  83. argc = argc;
  84. argv = argv;
  85. return ret;
  86. }