wip
[oweals/gnunet.git] / src / transport / test_plugin_transport_wlan_dummy.c
index 4afb24ed4315501f666ab199ce8031e2afb21376..79f87584d6ee3a2c888f50acfee5e422ab0118ed 100644 (file)
 /*\r
-        This file is part of GNUnet.
-     (C) 2010 Christian Grothoff (and other contributing authors)
-
-     GNUnet is free software; you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 3, or (at your
-     option) any later version.
-
-     GNUnet is distributed in the hope that it will be useful, but
-     WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-     General Public License for more details.
-
-     You should have received a copy of the GNU General Public License
-     along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
-*/
-/**
- * @file transport/test_transport_wlan_dummy.c
- * @brief helper for the testcase for plugin_transport_wlan.c
- * @author David Brodski
- */
-
-#include "platform.h"
-#include "gnunet_constants.h"
-#include "gnunet_os_lib.h"
-#include "gnunet_transport_plugin.h"
-#include "transport.h"
-#include "plugin_transport_wlan.h"
-#include "gnunet_common.h"
-#include "gnunet-transport-wlan-helper.h"
-#include "plugin_transport_wlan.h"
-
+ This file is part of GNUnet.\r
+ (C) 2010 Christian Grothoff (and other contributing authors)
+\r
+ GNUnet is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published\r
+ by the Free Software Foundation; either version 3, or (at your\r
+ option) any later version.
+\r
+ GNUnet is distributed in the hope that it will be useful, but\r
+ WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ General Public License for more details.
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with GNUnet; see the file COPYING.  If not, write to the\r
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
+ Boston, MA 02111-1307, USA.\r
+ */\r
+/**\r
+ * @file transport/test_transport_wlan_dummy.c\r
+ * @brief helper for the testcase for plugin_transport_wlan.c\r
+ * @author David Brodski\r
+ */\r
+\r
+#include "platform.h"\r
+#include "gnunet_constants.h"\r
+#include "gnunet_os_lib.h"\r
+#include "gnunet_transport_plugin.h"\r
+#include "transport.h"\r
+#include "plugin_transport_wlan.h"\r
+#include "gnunet_common.h"\r
+#include "gnunet-transport-wlan-helper.h"\r
+\r
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <sys/stat.h>\r
 \r
 #define FIFO_FILE1       "MYFIFOin"\r
-#define FIFO_FILE2       "MYFIFOout"
-
-int
-main(int argc, char *argv[])
-{
-       struct stat st;
-       int erg;
-       int first;
-       FILE *fpin;
-       FILE *fpout;
-       //make the fifos if needed
-       if(stat(FIFO_FILE1,&st) != 0){
-               if(stat(FIFO_FILE2,&st) != 0){
-                               perror("FIFO 2 exists, but FIFO 1 not");\r
-                exit(1);
-               }
-               first = 1;
-               umask(0);
-               erg = mknod(FIFO_FILE1, S_IFIFO|0666, 0);
-               erg = mknod(FIFO_FILE2, S_IFIFO|0666, 0);
-
-               if((fpin = fopen(FIFO_FILE1, "r")) == NULL) {\r
-                perror("fopen");\r
-                exit(1);\r
-        }
-               if((fpout = fopen(FIFO_FILE2, "w")) == NULL) {\r
-                perror("fopen");\r
-                exit(1);\r
-        }
-       } else {
-               first = 0;
-               if(stat(FIFO_FILE2,&st) == 0){
-                               perror("FIFO 1 exists, but FIFO 2 not");\r
-                exit(1);
-               }
-               if((fpout = fopen(FIFO_FILE1, "w")) == NULL) {\r
-                perror("fopen");\r
-                exit(1);\r
-        }
-               if((fpin = fopen(FIFO_FILE2, "r")) == NULL) {\r
-                perror("fopen");\r
-                exit(1);\r
-        }
-
-       }
-       // Write the input to the output\r
-\r
-       //clean up\r
-       if (first == 1){\r
-               unlink(FIFO_FILE1);\r
-               unlink(FIFO_FILE2);\r
-       }\r
-\r
-\r
-       fclose(fpin);\r
-       fclose(fpout);\r
-    return(0);\r
+#define FIFO_FILE2       "MYFIFOout"\r
+#define MAXLINE         5000\r
+\r
+int closeprog = 0;\r
+\r
+void sigfunc(int sig)\r
+{\r
+\r
+ if(sig != SIGINT || sig != SIGTERM || sig != SIGKILL)\r
+   return;\r
+ else\r
+  {\r
+   closeprog = 1;\r
+   exit(0);\r
+   }\r
 }\r
-
+\r
+\r
+\r
+\r
+int\r
+main(int argc, char *argv[])\r
+{\r
+  struct stat st;\r
+  struct stat st2;\r
+  int erg;\r
+  int first;\r
+  FILE *fpin;\r
+  FILE *fpout;\r
+  pid_t pid;\r
+\r
+  perror("Test");\r
+\r
+\r
+  //make the fifos if needed\r
+  if (stat(FIFO_FILE1, &st) != 0)\r
+    {\r
+      if (stat(FIFO_FILE2, &st2) == 0)\r
+        {\r
+          perror("FIFO 2 exists, but FIFO 1 not, blub");\r
+          exit(1);\r
+        }\r
+      first = 1;\r
+      perror("First");\r
+      umask(0);\r
+      erg = mknod(FIFO_FILE1, S_IFIFO | 0666, 0);\r
+      erg = mknod(FIFO_FILE2, S_IFIFO | 0666, 0);\r
+\r
+      if ((fpin = fopen(FIFO_FILE1, "r")) == NULL)\r
+        {\r
+          perror("fopen");\r
+          exit(1);\r
+        }\r
+      if ((fpout = fopen(FIFO_FILE2, "w")) == NULL)\r
+        {\r
+          perror("fopen");\r
+          exit(1);\r
+        }\r
+    }\r
+  else\r
+    {\r
+      first = 0;\r
+      perror("Second");\r
+      if (stat(FIFO_FILE2, &st2) != 0)\r
+        {\r
+          perror("FIFO 1 exists, but FIFO 2 not, mäh");\r
+          exit(1);\r
+        }\r
+      if ((fpout = fopen(FIFO_FILE1, "w")) == NULL)\r
+        {\r
+          perror("fopen");\r
+          exit(1);\r
+        }\r
+      if ((fpin = fopen(FIFO_FILE2, "r")) == NULL)\r
+        {\r
+          perror("fopen");\r
+          exit(1);\r
+        }\r
+\r
+    }\r
+\r
+  // fork\r
+\r
+  if ((pid = fork()) < 0)\r
+    {\r
+      perror("FORK ERROR");\r
+\r
+      //clean up\r
+      if (first == 1)\r
+              {\r
+                unlink(FIFO_FILE1);\r
+                unlink(FIFO_FILE2);\r
+              }\r
+      fclose(fpin);\r
+      fclose(fpout);\r
+      return -3;\r
+    }\r
+  else if (pid == 0) // CHILD PROCESS\r
+    {\r
+    perror("Child");\r
+      signal(SIGINT, sigfunc);\r
+      signal(SIGTERM, sigfunc);\r
+      signal(SIGKILL, sigfunc);\r
+      int rv = 0;\r
+      int readc = 0;\r
+      int pos = 0;\r
+      char line[MAXLINE];\r
+\r
+      fd_set rfds;\r
+      fd_set wfds;\r
+      struct timeval tv;\r
+      int retval;\r
+\r
+\r
+      tv.tv_sec = 5;\r
+      tv.tv_usec = 0;\r
+\r
+\r
+      FD_ZERO(&rfds);\r
+      FD_SET(STDIN_FILENO, &rfds);\r
+\r
+      FD_ZERO(&wfds);\r
+      FD_SET(STDOUT_FILENO, &wfds);\r
+\r
+      struct GNUNET_SERVER_MessageStreamTokenizer * stdin_mst;\r
+      struct GNUNET_SERVER_MessageStreamTokenizer * file_in_mst;\r
+\r
+      stdin_mst = GNUNET_SERVER_mst_create(&stdin_send, NULL);\r
+      file_in_mst = GNUNET_SERVER_mst_create(&file_in_send, NULL);\r
+\r
+      while (closeprog == 0)\r
+        {\r
+          readc = 0;\r
+\r
+\r
+          while (readc < sizeof( struct RadiotapHeader) + sizeof(struct GNUNET_MessageHeader)){\r
+            if ((rv = read(STDIN_FILENO, line, MAXLINE)) < 0)\r
+              {\r
+                perror("READ ERROR FROM STDIN");\r
+              }\r
+            readc += rv;\r
+          }\r
+\r
+          pos = 0;\r
+\r
+          //fwrite(&line[pos], 1, sizeof(struct GNUNET_MessageHeader), fpout);\r
+\r
+          //pos += sizeof(struct GNUNET_MessageHeader);\r
+\r
+          //do not send radiotap header\r
+          pos += sizeof( struct RadiotapHeader);\r
+\r
+          while (pos < readc)\r
+            {\r
+              pos += fwrite(&line[pos], 1, readc - pos, fpout);\r
+            }\r
+        }\r
+\r
+\r
+      //clean up\r
+      fclose(fpout);\r
+    }\r
+  else // PARENT PROCESS\r
+    {\r
+    perror("Parent");\r
+      signal(SIGINT, sigfunc);\r
+      signal(SIGTERM, sigfunc);\r
+      signal(SIGKILL, sigfunc);\r
+      int rv = 0;\r
+      ssize_t pos = 0;\r
+      char line[MAXLINE];\r
+      struct Wlan_Helper_Control_Message macmsg;\r
+\r
+\r
+      //Send random mac address\r
+      macmsg.mac.mac[0] = 0x13;\r
+      macmsg.mac.mac[1] = 0x22;\r
+      macmsg.mac.mac[2] = 0x33;\r
+      macmsg.mac.mac[3] = 0x44;\r
+      macmsg.mac.mac[4] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 255);\r
+      macmsg.mac.mac[5] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 255);\r
+      macmsg.hdr.size = sizeof(struct Wlan_Helper_Control_Message);\r
+\r
+      pos = 0;\r
+      /*\r
+      while (pos < sizeof(struct Wlan_Helper_Control_Message))\r
+        {\r
+          pos += write(STDOUT_FILENO, &macmsg + pos, sizeof(struct Wlan_Helper_Control_Message) - pos);\r
+        }\r
+      */\r
+      while (closeprog == 0)\r
+        {\r
+          if ((rv = fread(line, 1, MAXLINE, fpin)) < 0)\r
+            {\r
+              perror("READ ERROR FROM fpin");\r
+            }\r
+\r
+          pos = 0;\r
+          while (pos < rv)\r
+            {\r
+              pos += write(STDOUT_FILENO, &line[pos], rv - pos);\r
+            }\r
+        }\r
+\r
+\r
+      //clean up\r
+      fclose(fpin);\r
+\r
+      if (first == 1)\r
+        {\r
+          unlink(FIFO_FILE1);\r
+          unlink(FIFO_FILE2);\r
+        }\r
+    }\r
+\r
+  // Write the input to the output\r
+\r
+  return (0);\r
+}\r
+\r