ktp_session.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. #include <unistd.h>
  6. #include <errno.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. #include <sys/socket.h>
  11. #include <sys/un.h>
  12. #include <faux/str.h>
  13. #include <klish/ktp_session.h>
  14. typedef enum {
  15. KTP_SESSION_STATE_DISCONNECTED = 'd',
  16. KTP_SESSION_STATE_UNAUTHORIZED = 'a',
  17. KTP_SESSION_STATE_IDLE = 'i',
  18. KTP_SESSION_STATE_WAIT_FOR_COMPLETION = 'v',
  19. KTP_SESSION_STATE_WAIT_FOR_HELP = 'h',
  20. KTP_SESSION_STATE_WAIT_FOR_CMD = 'c',
  21. } ktp_session_state_e;
  22. struct ktp_session_s {
  23. ktp_session_state_e state;
  24. faux_async_t *async;
  25. faux_hdr_t *hdr; // Service var: engine will receive header and then msg
  26. bool_t done;
  27. faux_eloop_t *eloop;
  28. };
  29. static bool_t stop_loop_ev(faux_eloop_t *eloop, faux_eloop_type_e type,
  30. void *associated_data, void *user_data);
  31. ktp_session_t *ktp_session_new(int sock)
  32. {
  33. ktp_session_t *ktp = NULL;
  34. if (sock < 0)
  35. return NULL;
  36. ktp = faux_zmalloc(sizeof(*ktp));
  37. assert(ktp);
  38. if (!ktp)
  39. return NULL;
  40. // Init
  41. ktp->state = KTP_SESSION_STATE_UNAUTHORIZED;
  42. ktp->done = BOOL_FALSE;
  43. // Event loop
  44. ktp->eloop = faux_eloop_new(NULL);
  45. // Async object
  46. ktp->async = faux_async_new(sock);
  47. assert(ktp->async);
  48. // Receive message header first
  49. faux_async_set_read_limits(ktp->async,
  50. sizeof(faux_hdr_t), sizeof(faux_hdr_t));
  51. // faux_async_set_read_cb(ktp->async, ktpd_session_read_cb, ktpd);
  52. ktp->hdr = NULL;
  53. faux_async_set_stall_cb(ktp->async, ktp_stall_cb, ktp->eloop);
  54. // Event loop handlers
  55. faux_eloop_add_signal(ktp->eloop, SIGINT, stop_loop_ev, ktp);
  56. faux_eloop_add_signal(ktp->eloop, SIGTERM, stop_loop_ev, ktp);
  57. faux_eloop_add_signal(ktp->eloop, SIGQUIT, stop_loop_ev, ktp);
  58. faux_eloop_add_fd(ktp->eloop, ktp_session_fd(ktp), POLLIN,
  59. ktp_peer_ev, ktp);
  60. return ktp;
  61. }
  62. void ktp_session_free(ktp_session_t *ktp)
  63. {
  64. if (!ktp)
  65. return;
  66. faux_free(ktp->hdr);
  67. close(ktp_session_fd(ktp));
  68. faux_async_free(ktp->async);
  69. faux_eloop_free(ktp->eloop);
  70. faux_free(ktp);
  71. }
  72. bool_t ktp_session_done(const ktp_session_t *ktp)
  73. {
  74. assert(ktp);
  75. if (!ktp)
  76. return BOOL_TRUE; // Done flag
  77. return ktp->done;
  78. }
  79. bool_t ktp_session_set_done(ktp_session_t *ktp, bool_t done)
  80. {
  81. assert(ktp);
  82. if (!ktp)
  83. return BOOL_FALSE;
  84. ktp->done = done;
  85. return BOOL_TRUE;
  86. }
  87. bool_t ktp_session_connected(ktp_session_t *ktp)
  88. {
  89. assert(ktp);
  90. if (!ktp)
  91. return BOOL_FALSE;
  92. if (KTP_SESSION_STATE_DISCONNECTED == ktp->state)
  93. return BOOL_FALSE;
  94. return BOOL_TRUE;
  95. }
  96. int ktp_session_fd(const ktp_session_t *ktp)
  97. {
  98. assert(ktp);
  99. if (!ktp)
  100. return BOOL_FALSE;
  101. return faux_async_fd(ktp->async);
  102. }
  103. #if 0
  104. static void ktp_session_bad_socket(ktp_session_t *ktp)
  105. {
  106. assert(ktp);
  107. if (!ktp)
  108. return;
  109. ktp->state = KTP_SESSION_STATE_DISCONNECTED;
  110. }
  111. #endif
  112. static bool_t stop_loop_ev(faux_eloop_t *eloop, faux_eloop_type_e type,
  113. void *associated_data, void *user_data)
  114. {
  115. ktp_session_t *ktp = (ktp_session_t *)user_data;
  116. if (!ktp)
  117. return BOOL_FALSE;
  118. ktp_session_set_done(ktp, BOOL_TRUE);
  119. // Happy compiler
  120. eloop = eloop;
  121. type = type;
  122. associated_data = associated_data;
  123. return BOOL_FALSE; // Stop Event Loop
  124. }
  125. bool_t ktp_session_req_cmd(ktp_session_t *ktp, const char *line, int *retcode)
  126. {
  127. faux_eloop_t *eloop = NULL;
  128. assert(ktp);
  129. if (!ktp)
  130. return BOOL_FALSE;
  131. faux_eloop_loop(eloop);
  132. line = line;
  133. retcode = retcode;
  134. return BOOL_TRUE;
  135. }