diff options
-rw-r--r-- | src/transport/gnunet-helper-transport-bluetooth.c | 261 |
1 files changed, 135 insertions, 126 deletions
diff --git a/src/transport/gnunet-helper-transport-bluetooth.c b/src/transport/gnunet-helper-transport-bluetooth.c index 27ba06b2c..a8819c8d6 100644 --- a/src/transport/gnunet-helper-transport-bluetooth.c +++ b/src/transport/gnunet-helper-transport-bluetooth.c | |||
@@ -539,7 +539,7 @@ register_service (struct HardwareInfos *dev, int rc_channel) | |||
539 | /** | 539 | /** |
540 | * 1. initializations | 540 | * 1. initializations |
541 | * 2. set the service ID, class, profile information | 541 | * 2. set the service ID, class, profile information |
542 | * 3. make the service record publicly nrowsable | 542 | * 3. make the service record publicly browsable |
543 | * 4. register the RFCOMM channel | 543 | * 4. register the RFCOMM channel |
544 | * 5. set the name, provider and description | 544 | * 5. set the name, provider and description |
545 | * 6. register the service record to the local SDP server | 545 | * 6. register the service record to the local SDP server |
@@ -1157,49 +1157,48 @@ main (int argc, char *argv[]) | |||
1157 | 1157 | ||
1158 | stdin_mst = mst_create (&stdin_send_hw, &dev); | 1158 | stdin_mst = mst_create (&stdin_send_hw, &dev); |
1159 | stdin_open = 1; | 1159 | stdin_open = 1; |
1160 | 1160 | int ok = 0; | |
1161 | fprintf (stderr, "Check if the program exits\n"); | ||
1161 | while (1) | 1162 | while (1) |
1162 | { | 1163 | { |
1163 | maxfd = -1; | 1164 | maxfd = -1; |
1164 | FD_ZERO (&rfds); | 1165 | FD_ZERO (&rfds); |
1165 | if ((0 == write_pout.size) && (1 == stdin_open)) | 1166 | if ((0 == write_pout.size) && (1 == stdin_open)) |
1166 | { | 1167 | { |
1167 | fprintf(stderr, "LOG : %s adds STDIN to rfds\n", dev.iface); //FIXME: debugging message | 1168 | // fprintf(stderr, "LOG : %s adds STDIN to rfds\n", dev.iface); //FIXME: debugging message |
1168 | FD_SET (STDIN_FILENO, &rfds); | 1169 | FD_SET (STDIN_FILENO, &rfds); |
1169 | maxfd = MAX (maxfd, STDIN_FILENO); | 1170 | maxfd = MAX (maxfd, STDIN_FILENO); |
1170 | } | 1171 | } |
1171 | if (0 == write_std.size) | 1172 | if (0 == write_std.size) |
1172 | { | 1173 | { |
1173 | fprintf(stderr, "LOG : %s adds fd_rfcomm to rfds\n", dev.iface); //FIXME: debugging message | 1174 | // fprintf(stderr, "LOG : %s adds fd_rfcomm to rfds\n", dev.iface); //FIXME: debugging message |
1174 | FD_SET (dev.fd_rfcomm, &rfds); | 1175 | FD_SET (dev.fd_rfcomm, &rfds); |
1175 | maxfd = MAX (maxfd, dev.fd_rfcomm); | 1176 | maxfd = MAX (maxfd, dev.fd_rfcomm); |
1176 | } | 1177 | } |
1177 | FD_ZERO (&wfds); | 1178 | FD_ZERO (&wfds); |
1178 | if (0 < write_std.size) | 1179 | if (0 < write_std.size) |
1179 | { | 1180 | { |
1180 | fprintf(stderr, "LOG : %s adds STDOUT to wfds\n", dev.iface); //FIXME: debugging message | 1181 | // fprintf(stderr, "LOG : %s adds STDOUT to wfds\n", dev.iface); //FIXME: debugging message |
1181 | FD_SET (STDOUT_FILENO, &wfds); | 1182 | FD_SET (STDOUT_FILENO, &wfds); |
1182 | maxfd = MAX (maxfd, STDOUT_FILENO); | 1183 | maxfd = MAX (maxfd, STDOUT_FILENO); |
1183 | } | 1184 | } |
1184 | 1185 | ||
1185 | for (i = 0; i < crt_rfds; i++) | 1186 | for (i = 0; i < crt_rfds; i++) |
1186 | { | 1187 | { |
1187 | fprintf(stderr, "LOG : %s adds extra fds to rfds\n", dev.iface); //FIXME: debugging message | 1188 | // fprintf(stderr, "LOG : %s adds extra fds to rfds\n", dev.iface); //FIXME: debugging message |
1188 | FD_SET (rfds_list[i], &rfds); | 1189 | FD_SET (rfds_list[i], &rfds); |
1189 | maxfd = MAX (maxfd, rfds_list[i]); | 1190 | maxfd = MAX (maxfd, rfds_list[i]); |
1190 | } | 1191 | } |
1191 | 1192 | ||
1192 | for (i = 0; i < crt_wfds; i++) | 1193 | for (i = 0; i < crt_wfds; i++) |
1193 | { | 1194 | { |
1194 | fprintf(stderr, "LOG : %s adds extra fds to wfds\n", dev.iface); //FIXME: debugging message | 1195 | // fprintf(stderr, "LOG : %s adds extra fds to wfds\n", dev.iface); //FIXME: debugging message |
1195 | FD_SET (wfds_list[i], &wfds); | 1196 | FD_SET (wfds_list[i], &wfds); |
1196 | maxfd = MAX (maxfd, wfds_list[i]); | 1197 | maxfd = MAX (maxfd, wfds_list[i]); |
1197 | } | 1198 | } |
1198 | 1199 | ||
1199 | if (0 < write_pout.size) | 1200 | if (0 < write_pout.size) |
1200 | { | 1201 | { |
1201 | int sendsocket, status; | ||
1202 | struct sockaddr_rc addr = { 0 }; | ||
1203 | struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *frame; | 1202 | struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame *frame; |
1204 | 1203 | ||
1205 | /* Get the destination address */ | 1204 | /* Get the destination address */ |
@@ -1209,19 +1208,23 @@ main (int argc, char *argv[]) | |||
1209 | if (memcmp (&frame->addr1, &dev.pl_mac, | 1208 | if (memcmp (&frame->addr1, &dev.pl_mac, |
1210 | sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) | 1209 | sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) |
1211 | { | 1210 | { |
1212 | fprintf (stderr, "LOG : %s has a message for him:)\n", dev.iface); //FIXME: debugging message | 1211 | // fprintf (stderr, "LOG : %s has a message for him:)\n", dev.iface); //FIXME: debugging message |
1213 | memset (&write_pout, 0, sizeof (write_pout)); // clear the buffer | 1212 | memset (&write_pout, 0, sizeof (write_pout)); // clear the buffer |
1214 | } | 1213 | } |
1215 | else if (memcmp (&frame->addr1, &broadcast, | 1214 | else if (memcmp (&frame->addr1, &broadcast, |
1216 | sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) | 1215 | sizeof (struct GNUNET_TRANSPORT_WLAN_MacAddress)) == 0) |
1217 | { | 1216 | { |
1218 | fprintf (stderr, "LOG : %s has a broadcast message\n", dev.iface); //FIXME: debugging message | 1217 | // fprintf (stderr, "LOG : %s has a broadcast message\n", dev.iface); //FIXME: debugging message |
1219 | memset (&write_pout, 0, sizeof (write_pout)); //FIXME for now just clear the buffer | 1218 | memset (&write_pout, 0, sizeof (write_pout)); //FIXME for now just clear the buffer |
1220 | send_broadcast(); | 1219 | send_broadcast(); |
1220 | ok = 1; | ||
1221 | } | 1221 | } |
1222 | else | 1222 | else |
1223 | { | 1223 | { |
1224 | fprintf (stderr, "LOG : %s has a new message for %x:%x:%x:%x:%x:%x\n", dev.iface, | 1224 | int sendsocket, status; |
1225 | struct sockaddr_rc addr = { 0 }; | ||
1226 | |||
1227 | fprintf (stderr, "LOG : %s has a new message for %.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n", dev.iface, | ||
1225 | frame->addr1.mac[5], frame->addr1.mac[4], frame->addr1.mac[3], | 1228 | frame->addr1.mac[5], frame->addr1.mac[4], frame->addr1.mac[3], |
1226 | frame->addr1.mac[2], frame->addr1.mac[1], frame->addr1.mac[0]); //FIXME: debugging message | 1229 | frame->addr1.mac[2], frame->addr1.mac[1], frame->addr1.mac[0]); //FIXME: debugging message |
1227 | 1230 | ||
@@ -1247,7 +1250,7 @@ main (int argc, char *argv[]) | |||
1247 | status = connect (sendsocket, (struct sockaddr *) &addr, sizeof (addr)); | 1250 | status = connect (sendsocket, (struct sockaddr *) &addr, sizeof (addr)); |
1248 | if (0 != status && errno != EAGAIN) | 1251 | if (0 != status && errno != EAGAIN) |
1249 | { | 1252 | { |
1250 | fprintf (stderr, "%s failed to connect\n", dev.iface); | 1253 | fprintf (stderr, "%s failed to connect : %s\n", dev.iface, strerror (errno)); |
1251 | return -1; | 1254 | return -1; |
1252 | } | 1255 | } |
1253 | 1256 | ||
@@ -1264,6 +1267,8 @@ main (int argc, char *argv[]) | |||
1264 | } | 1267 | } |
1265 | } | 1268 | } |
1266 | } | 1269 | } |
1270 | //fprintf (stderr, "inainte de select\n"); | ||
1271 | if (ok == 0) | ||
1267 | { | 1272 | { |
1268 | int retval = select (maxfd + 1, &rfds, &wfds, NULL, NULL); | 1273 | int retval = select (maxfd + 1, &rfds, &wfds, NULL, NULL); |
1269 | if ((-1 == retval) && (EINTR == errno)) | 1274 | if ((-1 == retval) && (EINTR == errno)) |
@@ -1273,135 +1278,139 @@ main (int argc, char *argv[]) | |||
1273 | fprintf (stderr, "select failed: %s\n", strerror (errno)); | 1278 | fprintf (stderr, "select failed: %s\n", strerror (errno)); |
1274 | break; | 1279 | break; |
1275 | } | 1280 | } |
1276 | } | 1281 | |
1277 | for (i = maxfd; i >= 0; i--) | 1282 | // fprintf (stderr, "dupa select\n"); |
1278 | { | 1283 | for (i = 0; i <= maxfd; i++) //FIXME it should be incremented |
1279 | if (FD_ISSET (i , &wfds)) | ||
1280 | { | 1284 | { |
1281 | if (i == STDOUT_FILENO) | 1285 | if (FD_ISSET (i , &wfds)) |
1282 | { | ||
1283 | ssize_t ret = | ||
1284 | write (STDOUT_FILENO, write_std.buf + write_std.pos, | ||
1285 | write_std.size - write_std.pos); | ||
1286 | if (0 > ret) | ||
1287 | { | ||
1288 | fprintf (stderr, "Failed to write to STDOUT: %s\n", strerror (errno)); | ||
1289 | break; | ||
1290 | } | ||
1291 | write_std.pos += ret; | ||
1292 | if (write_std.pos == write_std.size) | ||
1293 | { | ||
1294 | write_std.pos = 0; | ||
1295 | write_std.size = 0; | ||
1296 | } | ||
1297 | fprintf(stderr, "LOG : %s sends a message to STDOUT\n", dev.iface); //FIXME: debugging message | ||
1298 | } | ||
1299 | else | ||
1300 | { | 1286 | { |
1301 | ssize_t ret = | 1287 | if (i == STDOUT_FILENO) |
1302 | write (i, write_pout.buf + write_std.pos, | ||
1303 | write_pout.size - write_pout.pos); | ||
1304 | if (0 > ret) | ||
1305 | { | 1288 | { |
1306 | fprintf (stderr, "Failed to write to bluetooth device: %s\n", | 1289 | ssize_t ret = |
1307 | strerror (errno)); | 1290 | write (STDOUT_FILENO, write_std.buf + write_std.pos, |
1308 | break; | 1291 | write_std.size - write_std.pos); |
1309 | } | 1292 | if (0 > ret) |
1310 | write_pout.pos += ret; | 1293 | { |
1311 | if ((write_pout.pos != write_pout.size) && (0 != ret)) | 1294 | fprintf (stderr, "Failed to write to STDOUT: %s\n", strerror (errno)); |
1312 | { | 1295 | break; |
1313 | /* we should not get partial sends with packet-oriented devices... */ | 1296 | } |
1314 | fprintf (stderr, "Write error, partial send: %u/%u\n", | 1297 | write_std.pos += ret; |
1315 | (unsigned int) write_pout.pos, | 1298 | if (write_std.pos == write_std.size) |
1316 | (unsigned int) write_pout.size); | 1299 | { |
1317 | break; | 1300 | write_std.pos = 0; |
1318 | } | 1301 | write_std.size = 0; |
1319 | if (write_pout.pos == write_pout.size) | 1302 | } |
1303 | // fprintf(stderr, "LOG : %s sends a message to STDOUT\n", dev.iface); //FIXME: debugging message | ||
1304 | } | ||
1305 | else | ||
1320 | { | 1306 | { |
1321 | write_pout.pos = 0; | 1307 | ssize_t ret = |
1322 | write_pout.size = 0; | 1308 | write (i, write_pout.buf + write_std.pos, |
1323 | (void) close (i); | 1309 | write_pout.size - write_pout.pos); |
1310 | if (0 > ret) | ||
1311 | { | ||
1312 | fprintf (stderr, "Failed to write to bluetooth device: %s\n", | ||
1313 | strerror (errno)); | ||
1314 | break; | ||
1315 | } | ||
1316 | write_pout.pos += ret; | ||
1317 | if ((write_pout.pos != write_pout.size) && (0 != ret)) | ||
1318 | { | ||
1319 | /* we should not get partial sends with packet-oriented devices... */ | ||
1320 | fprintf (stderr, "Write error, partial send: %u/%u\n", | ||
1321 | (unsigned int) write_pout.pos, | ||
1322 | (unsigned int) write_pout.size); | ||
1323 | break; | ||
1324 | } | ||
1325 | if (write_pout.pos == write_pout.size) | ||
1326 | { | ||
1327 | write_pout.pos = 0; | ||
1328 | write_pout.size = 0; | ||
1329 | //(void) close (i); | ||
1330 | } | ||
1331 | // fprintf(stderr, "LOG : %s sends a message to a DEVICE\n", dev.iface); //FIXME: debugging message | ||
1324 | } | 1332 | } |
1325 | fprintf(stderr, "LOG : %s sends a message to a DEVICE\n", dev.iface); //FIXME: debugging message | 1333 | |
1326 | } | 1334 | } |
1327 | |||
1328 | } | ||
1329 | 1335 | ||
1330 | if (FD_ISSET (i, &rfds)) | 1336 | if (FD_ISSET (i, &rfds)) |
1331 | { | ||
1332 | if (i == STDIN_FILENO) | ||
1333 | { | ||
1334 | ssize_t ret = | ||
1335 | read (i, readbuf, sizeof (readbuf)); | ||
1336 | if (0 > ret) | ||
1337 | { | ||
1338 | fprintf (stderr, "Read error from STDIN: %s\n", strerror (errno)); | ||
1339 | break; | ||
1340 | } | ||
1341 | if (0 == ret) | ||
1342 | { | ||
1343 | /* stop reading... */ | ||
1344 | stdin_open = 0; | ||
1345 | } | ||
1346 | fprintf(stderr, "LOG : %s receives a message from STDIN\n", dev.iface); //FIXME: debugging message | ||
1347 | mst_receive (stdin_mst, readbuf, ret); | ||
1348 | } | ||
1349 | else if (i == dev.fd_rfcomm) | ||
1350 | { | 1337 | { |
1351 | int readsocket; | 1338 | if (i == STDIN_FILENO) |
1352 | struct sockaddr_rc addr = { 0 }; | ||
1353 | unsigned int opt = sizeof (addr); | ||
1354 | |||
1355 | readsocket = accept (dev.fd_rfcomm, (struct sockaddr *) &addr, &opt); | ||
1356 | fprintf(stderr, "LOG : %s accepts a message\n", dev.iface); //FIXME: debugging message | ||
1357 | if (readsocket == -1) | ||
1358 | { | 1339 | { |
1359 | fprintf (stderr, "Failed to accept a connection on interface: %s\n", | 1340 | ssize_t ret = |
1360 | strerror (errno)); | 1341 | read (i, readbuf, sizeof (readbuf)); |
1361 | return -1; | 1342 | if (0 > ret) |
1362 | } else { | ||
1363 | FD_SET (readsocket, &rfds); | ||
1364 | maxfd = MAX (maxfd, readsocket); | ||
1365 | |||
1366 | if (crt_rfds < MAX_PORTS) | ||
1367 | rfds_list[crt_rfds++] = readsocket; | ||
1368 | else | ||
1369 | { | 1343 | { |
1370 | fprintf (stderr, "The limit for the read file descriptors list was \ | 1344 | fprintf (stderr, "Read error from STDIN: %s\n", strerror (errno)); |
1371 | reached\n"); | ||
1372 | break; | 1345 | break; |
1373 | } | 1346 | } |
1374 | } | 1347 | if (0 == ret) |
1375 | 1348 | { | |
1376 | } | 1349 | /* stop reading... */ |
1377 | else | 1350 | stdin_open = 0; |
1378 | { | 1351 | } |
1379 | struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rrm; | 1352 | // fprintf(stderr, "LOG : %s receives a message from STDIN\n", dev.iface); //FIXME: debugging message |
1380 | ssize_t ret; | 1353 | mst_receive (stdin_mst, readbuf, ret); |
1381 | 1354 | } | |
1382 | rrm = (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *) write_std.buf; | 1355 | else if (i == dev.fd_rfcomm) |
1383 | ret = | ||
1384 | read_from_the_socket (i, (unsigned char *) &rrm->frame, | ||
1385 | sizeof (write_std.buf) | ||
1386 | - sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage) | ||
1387 | + sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame), | ||
1388 | rrm); | ||
1389 | fprintf (stderr, "LOG: %s reads something from the socket\n", dev.iface);//FIXME : debugging message | ||
1390 | if (0 > ret) | ||
1391 | { | 1356 | { |
1392 | fprintf (stderr, "Read error from rfcomm socket: %s\n", strerror (errno)); | 1357 | int readsocket; |
1393 | break; | 1358 | struct sockaddr_rc addr = { 0 }; |
1394 | } | 1359 | unsigned int opt = sizeof (addr); |
1395 | if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev))) | 1360 | |
1361 | readsocket = accept (dev.fd_rfcomm, (struct sockaddr *) &addr, &opt); | ||
1362 | fprintf(stderr, "LOG : %s accepts a message\n", dev.iface); //FIXME: debugging message | ||
1363 | if (readsocket == -1) | ||
1364 | { | ||
1365 | fprintf (stderr, "Failed to accept a connection on interface: %s\n", | ||
1366 | strerror (errno)); | ||
1367 | return -1; | ||
1368 | } else { | ||
1369 | FD_SET (readsocket, &rfds); | ||
1370 | maxfd = MAX (maxfd, readsocket); | ||
1371 | |||
1372 | if (crt_rfds < MAX_PORTS) | ||
1373 | rfds_list[crt_rfds++] = readsocket; | ||
1374 | else | ||
1375 | { | ||
1376 | fprintf (stderr, "The limit for the read file descriptors list was \ | ||
1377 | reached\n"); | ||
1378 | break; | ||
1379 | } | ||
1380 | } | ||
1381 | |||
1382 | } | ||
1383 | else | ||
1396 | { | 1384 | { |
1397 | write_std.size = ret | 1385 | struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *rrm; |
1398 | + sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage) | 1386 | ssize_t ret; |
1399 | - sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame); | 1387 | |
1400 | rrm->header.size = htons (write_std.size); | 1388 | rrm = (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage *) write_std.buf; |
1401 | rrm->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER); | 1389 | ret = |
1390 | read_from_the_socket (i, (unsigned char *) &rrm->frame, | ||
1391 | sizeof (write_std.buf) | ||
1392 | - sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage) | ||
1393 | + sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame), | ||
1394 | rrm); | ||
1395 | fprintf (stderr, "LOG: %s reads something from the socket\n", dev.iface);//FIXME : debugging message | ||
1396 | if (0 > ret) | ||
1397 | { | ||
1398 | fprintf (stderr, "Read error from rfcomm socket: %s\n", strerror (errno)); | ||
1399 | break; | ||
1400 | } | ||
1401 | if ((0 < ret) && (0 == mac_test (&rrm->frame, &dev))) | ||
1402 | { | ||
1403 | write_std.size = ret | ||
1404 | + sizeof (struct GNUNET_TRANSPORT_WLAN_RadiotapReceiveMessage) | ||
1405 | - sizeof (struct GNUNET_TRANSPORT_WLAN_Ieee80211Frame); | ||
1406 | rrm->header.size = htons (write_std.size); | ||
1407 | rrm->header.type = htons (GNUNET_MESSAGE_TYPE_WLAN_DATA_FROM_HELPER); | ||
1408 | } | ||
1402 | } | 1409 | } |
1403 | } | 1410 | } |
1404 | } | 1411 | } |
1412 | } else { | ||
1413 | ok = 0; | ||
1405 | } | 1414 | } |
1406 | } | 1415 | } |
1407 | /* Error handling, try to clean up a bit at least */ | 1416 | /* Error handling, try to clean up a bit at least */ |