interactive.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <assert.h>
  4. #include <unistd.h>
  5. #include <faux/faux.h>
  6. #include <faux/eloop.h>
  7. #include <klish/ktp.h>
  8. #include <klish/ktp_session.h>
  9. // Context for main loop
  10. typedef struct ctx_s {
  11. ktp_session_t *ktp;
  12. } ctx_t;
  13. bool_t cmd_ack_cb(ktp_session_t *ktp, const faux_msg_t *msg, void *udata);
  14. static bool_t stdin_cb(faux_eloop_t *eloop, faux_eloop_type_e type,
  15. void *associated_data, void *user_data);
  16. int klish_interactive_shell(ktp_session_t *ktp)
  17. {
  18. ctx_t ctx = {};
  19. faux_eloop_t *eloop = NULL;
  20. assert(ktp);
  21. if (!ktp)
  22. return -1;
  23. // Don't stop interactive loop on each answer
  24. ktp_session_set_stop_on_answer(ktp, BOOL_FALSE);
  25. ctx.ktp = ktp;
  26. ktp_session_set_cb(ktp, KTP_SESSION_CB_CMD_ACK, cmd_ack_cb, &ctx);
  27. eloop = ktp_session_eloop(ktp);
  28. faux_eloop_add_fd(eloop, STDIN_FILENO, POLLIN, stdin_cb, &ctx);
  29. faux_eloop_loop(eloop);
  30. return 0;
  31. }
  32. bool_t cmd_ack_cb(ktp_session_t *ktp, const faux_msg_t *msg, void *udata)
  33. {
  34. printf("CMD ACK CB\n");
  35. // Happy compiler
  36. ktp = ktp;
  37. msg = msg;
  38. udata = udata;
  39. ktp_session_set_done(ktp, BOOL_TRUE);
  40. return BOOL_TRUE;
  41. }
  42. static bool_t stdin_cb(faux_eloop_t *eloop, faux_eloop_type_e type,
  43. void *associated_data, void *udata)
  44. {
  45. ctx_t *ctx = (ctx_t *)udata;
  46. ktp_session_cmd(ctx->ktp, "cmd", NULL, BOOL_FALSE);
  47. return BOOL_TRUE;
  48. }