You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ntk-console-server.c 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. /* Header files required for the console bindings
  2. * not included outside of this file. */
  3. #include <utmp.h>
  4. #include <stdio.h>
  5. #include <sys/un.h>
  6. #include <unistd.h>
  7. #include "console.h"
  8. #include "netsukuku.h"
  9. /* Variable and structure defintions, serverfd refers to socket file descriptor
  10. * length refers to the required length of the requests that will be sent.
  11. * recv won't wake up until length is received.
  12. * rc is used for error checking in socket operations.
  13. * serveraddr is a structure describing the address of
  14. * an AF_LOCAL (aka AF_UNIX) socket. */
  15. int serverfd = -1;
  16. struct sockaddr_un serveraddr;
  17. int rc, length;
  18. /* Cleans up the console bindings for closing, Closes socket file descriptors,
  19. * unlinks the server path, etc. */
  20. static void
  21. clean_up(void)
  22. {
  23. const int optVal = 1;
  24. const socklen_t optLen = sizeof(optVal);
  25. setsockopt(serverfd, SOL_SOCKET, SO_REUSEADDR, (void *) &optVal,
  26. optLen);
  27. if (serverfd != -1)
  28. close(serverfd);
  29. unlink(CONSOLE_SOCKET_PATH);
  30. }
  31. /* Creates an AF_UNIX socket and binds it to a local address. */
  32. static void
  33. opensocket(void)
  34. {
  35. int stop_trying;
  36. serverfd = socket(AF_UNIX, SOCK_STREAM, 0);
  37. if (serverfd < 0) {
  38. perror("socket creation failed");
  39. exit(-1);
  40. }
  41. memset(&serveraddr, 0, sizeof(serveraddr));
  42. serveraddr.sun_family = AF_UNIX;
  43. strcpy(serveraddr.sun_path, CONSOLE_SOCKET_PATH);
  44. rc = bind(serverfd, (struct sockaddr *) &serveraddr,
  45. SUN_LEN(&serveraddr));
  46. stop_trying = 0;
  47. if (rc < 0) {
  48. perror("bind() failed");
  49. clean_up();
  50. if (stop_trying >= 2) {
  51. perror("bind() failed");
  52. clean_up();
  53. opensocket();
  54. exit(-1);
  55. }
  56. stop_trying++;
  57. opensocket();
  58. }
  59. }
  60. /* Sends a parsed response to the ntk console client. */
  61. static void
  62. send_response(int session_fd, char response[CONSOLE_BUFFER_LENGTH], ...)
  63. {
  64. int response_length = (int) strlen(response);
  65. rc = send(session_fd, response, response_length, 0);
  66. if (rc < 0) {
  67. perror("send() failed");
  68. exit(-1);
  69. }
  70. }
  71. /* Parses the received request from the ntk console client
  72. * to data from ntkd structures such as: me
  73. * into a response for the ntk console client. */
  74. static void
  75. request_processing(int session_fd, cmd_packet_t packet)
  76. {
  77. char buffer[CONSOLE_BUFFER_LENGTH];
  78. int maxBuffer = CONSOLE_BUFFER_LENGTH - 1;
  79. memset(buffer, 0, sizeof(buffer));
  80. switch (packet.command) {
  81. case COMMAND_UPTIME:
  82. {
  83. int uptime = time(0) - me.uptime;
  84. snprintf(buffer, maxBuffer, "node uptime: %d seconds", uptime);
  85. break;
  86. }
  87. case COMMAND_VERSION:
  88. snprintf(buffer, maxBuffer, "ntkd version: %s", VERSION_STR);
  89. break;
  90. case COMMAND_CURIFS:
  91. {
  92. strcat(buffer, "current interfaces: ");
  93. int i;
  94. for (i = 0; i < me.cur_ifs_n; i++) {
  95. strcat(buffer, me.cur_ifs[i].dev_name);
  96. strcat(buffer, " ");
  97. }
  98. break;
  99. }
  100. case COMMAND_CURIFSCT:
  101. snprintf(buffer, maxBuffer, "current interface count: %d",
  102. me.cur_ifs_n);
  103. break;
  104. case COMMAND_INETCONN:
  105. if (me.inet_connected)
  106. snprintf(buffer, maxBuffer, "internet connectivity: true");
  107. else
  108. snprintf(buffer, maxBuffer, "internet connectivity: false");
  109. break;
  110. case COMMAND_CURQSPNID:
  111. //send_response(session_fd, (char)me.cur_qspn_id);
  112. break;
  113. case COMMAND_CURIP:
  114. snprintf(buffer, maxBuffer, "IP: %s", inet_to_str(me.cur_ip));
  115. break;
  116. case COMMAND_CURNODE:
  117. //send_response(session_fd, (char)me.cur_node);
  118. break;
  119. case COMMAND_IFS:
  120. //send_response(session_fd, "IFS: TODO");
  121. break;
  122. case COMMAND_IFSCT:
  123. //send_response(session_fd, "IFS: TODO");
  124. break;
  125. default:
  126. snprintf(buffer, maxBuffer,
  127. "Provided command is invalid or not implemented in this API");
  128. break;
  129. }
  130. send_response(session_fd, buffer);
  131. }
  132. static void
  133. handle_session(int session_fd)
  134. {
  135. cmd_packet_t packetIn;
  136. rc = recv(session_fd, &packetIn, sizeof(packetIn), 0);
  137. if (rc < sizeof(packetIn)) {
  138. perror("recv() failed");
  139. exit(-1);
  140. }
  141. request_processing(session_fd, packetIn);
  142. }
  143. static void
  144. wait_session(int server_fd)
  145. {
  146. rc = listen(serverfd, 10);
  147. if (rc < 0) {
  148. perror("listen() failed");
  149. exit(-1);
  150. }
  151. printf("Ready for client connect().\n");
  152. for (;;) {
  153. int session_fd = accept(server_fd, NULL, NULL);
  154. if (session_fd < 0) {
  155. perror("accept() failed");
  156. exit(-1);
  157. }
  158. pid_t pid = fork();
  159. if (pid == -1) {
  160. perror("Failed to spawn child console process");
  161. exit(-1);
  162. } else if (pid == 0) {
  163. close(server_fd);
  164. handle_session(session_fd);
  165. _exit(0);
  166. } else {
  167. close(session_fd);
  168. }
  169. }
  170. }
  171. void *
  172. console_recv_send(void *arg)
  173. {
  174. char *uargv = NULL;
  175. opensocket();
  176. wait_session(serverfd);
  177. return uargv;
  178. }