unix.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /* NOTE: Under Graphene, this test must be run only in fork mode.
  2. * This is due to Graphene restricting communication via Unix
  3. * domain sockets only for processes in same Graphene instance
  4. * (i.e. only between parent and its child in this test).
  5. */
  6. #include <unistd.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10. #include <fcntl.h>
  11. #include <sys/types.h>
  12. #include <sys/socket.h>
  13. #include <sys/un.h>
  14. #include <sys/stat.h>
  15. #include <sys/wait.h>
  16. enum { SINGLE, PARALLEL } mode = PARALLEL;
  17. int do_fork = 0;
  18. int pipefds[2];
  19. int server_dummy_socket(void)
  20. {
  21. int create_socket;
  22. struct sockaddr_un address;
  23. if ((create_socket = socket(AF_UNIX,SOCK_STREAM,
  24. 0)) > 0)
  25. printf("Dummy socket was created\n");
  26. address.sun_family = AF_UNIX;
  27. strncpy(address.sun_path, "dummy", sizeof(address.sun_path));
  28. if (bind(create_socket,(struct sockaddr *)&address,
  29. sizeof(address)) < 0) {
  30. perror("bind");
  31. close(create_socket);
  32. exit(-1);
  33. }
  34. if (listen(create_socket,3) < 0) {
  35. perror("listen");
  36. close(create_socket);
  37. exit(-1);
  38. }
  39. /* do not close this socket to test two sockets in parallel */
  40. return 0;
  41. }
  42. int server(void)
  43. {
  44. int create_socket,new_socket;
  45. socklen_t addrlen;
  46. int bufsize = 1024;
  47. char *buffer = malloc(bufsize);
  48. struct sockaddr_un address;
  49. if ((create_socket = socket(AF_UNIX,SOCK_STREAM,
  50. 0)) > 0)
  51. printf("The socket was created\n");
  52. address.sun_family = AF_UNIX;
  53. strncpy(address.sun_path, "u", sizeof(address.sun_path));
  54. if (bind(create_socket,(struct sockaddr *)&address,
  55. sizeof(address)) < 0) {
  56. perror("bind");
  57. close(create_socket);
  58. exit(-1);
  59. }
  60. if (listen(create_socket,3) < 0) {
  61. perror("listen");
  62. close(create_socket);
  63. exit(-1);
  64. }
  65. if (mode == PARALLEL) {
  66. close(pipefds[0]);
  67. char byte = 0;
  68. write(pipefds[1], &byte, 1);
  69. }
  70. addrlen = sizeof(address);
  71. new_socket = accept(create_socket,(struct sockaddr *)&address,
  72. &addrlen);
  73. if (new_socket < 0) {
  74. perror("accept");
  75. close(create_socket);
  76. exit(-1);
  77. }
  78. close(create_socket);
  79. printf("The client is connected...\n");
  80. if (do_fork) {
  81. if (fork() > 0) {
  82. asm volatile ("int $3");
  83. close(new_socket);
  84. wait(NULL);
  85. return 0;
  86. }
  87. }
  88. for (int i = 0; i < 10; i++) {
  89. sprintf(buffer, "Data: This is packet %d\n", i);
  90. if (sendto(new_socket, buffer, strlen(buffer), 0, 0, 0) == -1) {
  91. fprintf(stderr, "sendto() failed\n");
  92. exit(-1);
  93. }
  94. }
  95. close(new_socket);
  96. if (do_fork)
  97. exit(0);
  98. return 0;
  99. }
  100. int client(void)
  101. {
  102. int count,create_socket;
  103. int bufsize = 1024;
  104. char *buffer = malloc(bufsize);
  105. struct sockaddr_un address;
  106. if (mode == PARALLEL) {
  107. close(pipefds[1]);
  108. char byte = 0;
  109. read(pipefds[0], &byte, 1);
  110. }
  111. if ((create_socket = socket(AF_UNIX,SOCK_STREAM,0)) >= 0)
  112. printf("The socket was created\n");
  113. address.sun_family = AF_UNIX;
  114. strncpy(address.sun_path, "u", sizeof(address.sun_path));
  115. if (connect(create_socket,(struct sockaddr *)&address,
  116. sizeof(address)) == 0)
  117. printf("The connection was accepted with the server\n");
  118. else {
  119. printf("The connection was not accepted with the server\n");
  120. exit(0);
  121. }
  122. if (do_fork) {
  123. if (fork() > 0) {
  124. close(create_socket);
  125. wait(NULL);
  126. return 0;
  127. }
  128. }
  129. puts("Receiving:");
  130. while ((count = recv(create_socket,buffer,bufsize,0)) > 0) {
  131. fwrite(buffer, count, 1, stdout);
  132. }
  133. puts("Done");
  134. close(create_socket);
  135. if (do_fork)
  136. exit(0);
  137. return 0;
  138. }
  139. int main(int argc, char ** argv)
  140. {
  141. if (argc > 1) {
  142. if (strcmp(argv[1], "client") == 0) {
  143. mode = SINGLE;
  144. client();
  145. return 0;
  146. }
  147. if (strcmp(argv[1], "server") == 0) {
  148. mode = SINGLE;
  149. server_dummy_socket();
  150. server();
  151. return 0;
  152. }
  153. if (strcmp(argv[1], "fork") == 0) {
  154. do_fork = 1;
  155. goto old;
  156. }
  157. }
  158. else {
  159. old:
  160. pipe(pipefds);
  161. int pid = fork();
  162. if (pid == 0) {
  163. client();
  164. } else {
  165. server_dummy_socket();
  166. server();
  167. }
  168. }
  169. return 0;
  170. }