wip
[oweals/gnunet.git] / src / transport / test_plugin_transport_wlan_dummy.c
1 /*\r
2  This file is part of GNUnet.\r
3  (C) 2010 Christian Grothoff (and other contributing authors)
4 \r
5  GNUnet is free software; you can redistribute it and/or modify\r
6  it under the terms of the GNU General Public License as published\r
7  by the Free Software Foundation; either version 3, or (at your\r
8  option) any later version.
9 \r
10  GNUnet is distributed in the hope that it will be useful, but\r
11  WITHOUT ANY WARRANTY; without even the implied warranty of\r
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
13  General Public License for more details.
14 \r
15  You should have received a copy of the GNU General Public License\r
16  along with GNUnet; see the file COPYING.  If not, write to the\r
17  Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
18  Boston, MA 02111-1307, USA.\r
19  */\r
20 /**\r
21  * @file transport/test_transport_wlan_dummy.c\r
22  * @brief helper for the testcase for plugin_transport_wlan.c\r
23  * @author David Brodski\r
24  */\r
25 \r
26 #include "platform.h"\r
27 #include "gnunet_constants.h"\r
28 #include "gnunet_os_lib.h"\r
29 #include "gnunet_transport_plugin.h"\r
30 #include "transport.h"\r
31 #include "plugin_transport_wlan.h"\r
32 #include "gnunet_common.h"\r
33 #include "gnunet-transport-wlan-helper.h"\r
34 \r
35 #include <stdio.h>\r
36 #include <stdlib.h>\r
37 #include <sys/stat.h>\r
38 \r
39 #define FIFO_FILE1       "MYFIFOin"\r
40 #define FIFO_FILE2       "MYFIFOout"\r
41 #define MAXLINE         5000\r
42 \r
43 int closeprog = 0;\r
44 \r
45 void sigfunc(int sig)\r
46 {\r
47 \r
48  if(sig != SIGINT || sig != SIGTERM || sig != SIGKILL)\r
49    return;\r
50  else\r
51   {\r
52    closeprog = 1;\r
53    exit(0);\r
54    }\r
55 }\r
56 \r
57 \r
58 \r
59 \r
60 int\r
61 main(int argc, char *argv[])\r
62 {\r
63   struct stat st;\r
64   struct stat st2;\r
65   int erg;\r
66   int first;\r
67   FILE *fpin;\r
68   FILE *fpout;\r
69   pid_t pid;\r
70 \r
71   perror("Test");\r
72 \r
73 \r
74   //make the fifos if needed\r
75   if (stat(FIFO_FILE1, &st) != 0)\r
76     {\r
77       if (stat(FIFO_FILE2, &st2) == 0)\r
78         {\r
79           perror("FIFO 2 exists, but FIFO 1 not, blub");\r
80           exit(1);\r
81         }\r
82       first = 1;\r
83       perror("First");\r
84       umask(0);\r
85       erg = mknod(FIFO_FILE1, S_IFIFO | 0666, 0);\r
86       erg = mknod(FIFO_FILE2, S_IFIFO | 0666, 0);\r
87 \r
88       if ((fpin = fopen(FIFO_FILE1, "r")) == NULL)\r
89         {\r
90           perror("fopen");\r
91           exit(1);\r
92         }\r
93       if ((fpout = fopen(FIFO_FILE2, "w")) == NULL)\r
94         {\r
95           perror("fopen");\r
96           exit(1);\r
97         }\r
98     }\r
99   else\r
100     {\r
101       first = 0;\r
102       perror("Second");\r
103       if (stat(FIFO_FILE2, &st2) != 0)\r
104         {\r
105           perror("FIFO 1 exists, but FIFO 2 not, mäh");\r
106           exit(1);\r
107         }\r
108       if ((fpout = fopen(FIFO_FILE1, "w")) == NULL)\r
109         {\r
110           perror("fopen");\r
111           exit(1);\r
112         }\r
113       if ((fpin = fopen(FIFO_FILE2, "r")) == NULL)\r
114         {\r
115           perror("fopen");\r
116           exit(1);\r
117         }\r
118 \r
119     }\r
120 \r
121   // fork\r
122 \r
123   if ((pid = fork()) < 0)\r
124     {\r
125       perror("FORK ERROR");\r
126 \r
127       //clean up\r
128       if (first == 1)\r
129               {\r
130                 unlink(FIFO_FILE1);\r
131                 unlink(FIFO_FILE2);\r
132               }\r
133       fclose(fpin);\r
134       fclose(fpout);\r
135       return -3;\r
136     }\r
137   else if (pid == 0) // CHILD PROCESS\r
138     {\r
139     perror("Child");\r
140       signal(SIGINT, sigfunc);\r
141       signal(SIGTERM, sigfunc);\r
142       signal(SIGKILL, sigfunc);\r
143       int rv = 0;\r
144       int readc = 0;\r
145       int pos = 0;\r
146       char line[MAXLINE];\r
147 \r
148       fd_set rfds;\r
149       fd_set wfds;\r
150       struct timeval tv;\r
151       int retval;\r
152 \r
153 \r
154       tv.tv_sec = 5;\r
155       tv.tv_usec = 0;\r
156 \r
157 \r
158       FD_ZERO(&rfds);\r
159       FD_SET(STDIN_FILENO, &rfds);\r
160 \r
161       FD_ZERO(&wfds);\r
162       FD_SET(STDOUT_FILENO, &wfds);\r
163 \r
164       struct GNUNET_SERVER_MessageStreamTokenizer * stdin_mst;\r
165       struct GNUNET_SERVER_MessageStreamTokenizer * file_in_mst;\r
166 \r
167       stdin_mst = GNUNET_SERVER_mst_create(&stdin_send, NULL);\r
168       file_in_mst = GNUNET_SERVER_mst_create(&file_in_send, NULL);\r
169 \r
170       while (closeprog == 0)\r
171         {\r
172           readc = 0;\r
173 \r
174 \r
175           while (readc < sizeof( struct RadiotapHeader) + sizeof(struct GNUNET_MessageHeader)){\r
176             if ((rv = read(STDIN_FILENO, line, MAXLINE)) < 0)\r
177               {\r
178                 perror("READ ERROR FROM STDIN");\r
179               }\r
180             readc += rv;\r
181           }\r
182 \r
183           pos = 0;\r
184 \r
185           //fwrite(&line[pos], 1, sizeof(struct GNUNET_MessageHeader), fpout);\r
186 \r
187           //pos += sizeof(struct GNUNET_MessageHeader);\r
188 \r
189           //do not send radiotap header\r
190           pos += sizeof( struct RadiotapHeader);\r
191 \r
192           while (pos < readc)\r
193             {\r
194               pos += fwrite(&line[pos], 1, readc - pos, fpout);\r
195             }\r
196         }\r
197 \r
198 \r
199       //clean up\r
200       fclose(fpout);\r
201     }\r
202   else // PARENT PROCESS\r
203     {\r
204     perror("Parent");\r
205       signal(SIGINT, sigfunc);\r
206       signal(SIGTERM, sigfunc);\r
207       signal(SIGKILL, sigfunc);\r
208       int rv = 0;\r
209       ssize_t pos = 0;\r
210       char line[MAXLINE];\r
211       struct Wlan_Helper_Control_Message macmsg;\r
212 \r
213 \r
214       //Send random mac address\r
215       macmsg.mac.mac[0] = 0x13;\r
216       macmsg.mac.mac[1] = 0x22;\r
217       macmsg.mac.mac[2] = 0x33;\r
218       macmsg.mac.mac[3] = 0x44;\r
219       macmsg.mac.mac[4] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 255);\r
220       macmsg.mac.mac[5] = GNUNET_CRYPTO_random_u32(GNUNET_CRYPTO_QUALITY_WEAK, 255);\r
221       macmsg.hdr.size = sizeof(struct Wlan_Helper_Control_Message);\r
222 \r
223       pos = 0;\r
224       /*\r
225       while (pos < sizeof(struct Wlan_Helper_Control_Message))\r
226         {\r
227           pos += write(STDOUT_FILENO, &macmsg + pos, sizeof(struct Wlan_Helper_Control_Message) - pos);\r
228         }\r
229       */\r
230       while (closeprog == 0)\r
231         {\r
232           if ((rv = fread(line, 1, MAXLINE, fpin)) < 0)\r
233             {\r
234               perror("READ ERROR FROM fpin");\r
235             }\r
236 \r
237           pos = 0;\r
238           while (pos < rv)\r
239             {\r
240               pos += write(STDOUT_FILENO, &line[pos], rv - pos);\r
241             }\r
242         }\r
243 \r
244 \r
245       //clean up\r
246       fclose(fpin);\r
247 \r
248       if (first == 1)\r
249         {\r
250           unlink(FIFO_FILE1);\r
251           unlink(FIFO_FILE2);\r
252         }\r
253     }\r
254 \r
255   // Write the input to the output\r
256 \r
257   return (0);\r
258 }\r
259 \r