Check that you are not present in trail twice
[oweals/gnunet.git] / src / transport / gnunet-helper-transport-bluetooth.c
index 8ccfe6377308cad1f31fe1c126d34a3285715bc2..b5556c7d682ef34c6b117c4c0815c1cb0e665814 100644 (file)
@@ -965,7 +965,7 @@ check_crc_buf_osdep (const unsigned char *buf, size_t len)
     sdp_list_t *search_list = 0, *attrid_list = 0, *response_list = 0, *it = 0;
     uuid_t svc_uuid;
     uint32_t range = 0x0000ffff;
-    uint8_t channel = -1;
+    int channel = -1;
 
     /* Connect to the local SDP server */
     session = sdp_connect (BDADDR_ANY, &dest, 0);
@@ -1002,9 +1002,12 @@ check_crc_buf_osdep (const unsigned char *buf, size_t len)
 
     sdp_close (session);
 
-    if (channel == -1)
-      fprintf (stderr, "Failed to find the listening channel for interface `%.*s': %s\n",
-              IFNAMSIZ, dev->iface, strerror (errno));
+    if (-1 == channel)
+      fprintf (stderr,
+               "Failed to find the listening channel for interface `%.*s': %s\n",
+               IFNAMSIZ,
+               dev->iface,
+               strerror (errno));
 
     return channel;
   }
@@ -1080,7 +1083,7 @@ read_from_the_socket (void *sock,
  * Open the bluetooth interface for reading/writing
  *
  * @param dev pointer to the device struct
- * @return 0 on success
+ * @return 0 on success, non-zero on error
  */
 static int
 open_device (struct HardwareInfos *dev)
@@ -1140,7 +1143,9 @@ open_device (struct HardwareInfos *dev)
 
     if (fd_hci < 0)
     {
-      fprintf (stderr, "Failed to create HCI socket: %s\n", strerror (errno));
+      fprintf (stderr,
+               "Failed to create HCI socket: %s\n",
+               strerror (errno));
       return -1;
     }
 
@@ -1149,8 +1154,12 @@ open_device (struct HardwareInfos *dev)
 
     if (ioctl (fd_hci, HCIGETDEVLIST, (void *) &request) < 0)
     {
-      fprintf (stderr, "ioctl(HCIGETDEVLIST) on interface `%.*s' failed: %s\n",
-              IFNAMSIZ, dev->iface, strerror (errno));
+      fprintf (stderr,
+               "ioctl(HCIGETDEVLIST) on interface `%.*s' failed: %s\n",
+               IFNAMSIZ,
+               dev->iface,
+               strerror (errno));
+      (void) close (fd_hci);
       return 1;
     }
 
@@ -1165,8 +1174,12 @@ open_device (struct HardwareInfos *dev)
 
       if (ioctl (fd_hci, HCIGETDEVINFO, (void *) &dev_info))
       {
-        fprintf (stderr, "ioctl(HCIGETDEVINFO) on interface `%.*s' failed: %s\n",
-               IFNAMSIZ, dev->iface, strerror (errno));
+        fprintf (stderr,
+                 "ioctl(HCIGETDEVINFO) on interface `%.*s' failed: %s\n",
+                 IFNAMSIZ,
+                 dev->iface,
+                 strerror (errno));
+        (void) close (fd_hci);
         return 1;
       }
 
@@ -1185,8 +1198,12 @@ open_device (struct HardwareInfos *dev)
           /* Bring the interface up */
           if (ioctl (fd_hci, HCIDEVUP, dev_info.dev_id))
           {
-            fprintf (stderr, "ioctl(HCIDEVUP) on interface `%.*s' failed: %s\n",
-               IFNAMSIZ, dev->iface, strerror (errno));
+            fprintf (stderr,
+                     "ioctl(HCIDEVUP) on interface `%.*s' failed: %s\n",
+                     IFNAMSIZ,
+                     dev->iface,
+                     strerror (errno));
+            (void) close (fd_hci);
             return 1;
           }
         }
@@ -1204,8 +1221,12 @@ open_device (struct HardwareInfos *dev)
 
           if (ioctl (fd_hci, HCISETSCAN, (unsigned long) &dev_req))
           {
-            fprintf (stderr, "ioctl(HCISETSCAN) on interface `%.*s' failed: %s\n",
-               IFNAMSIZ, dev->iface, strerror (errno));
+            fprintf (stderr,
+                     "ioctl(HCISETSCAN) on interface `%.*s' failed: %s\n",
+                     IFNAMSIZ,
+                     dev->iface,
+                     strerror (errno));
+            (void) close (fd_hci);
             return 1;
           }
 
@@ -1216,9 +1237,12 @@ open_device (struct HardwareInfos *dev)
     }
 
     /* Check if the interface was not found */
-    if (dev_id == -1)
+    if (-1 == dev_id)
     {
-      fprintf (stderr, "The interface %s was not found\n", dev->iface);
+      fprintf (stderr,
+               "The interface %s was not found\n",
+               dev->iface);
+      (void) close (fd_hci);
       return 1;
     }
 
@@ -1234,15 +1258,20 @@ open_device (struct HardwareInfos *dev)
 
     if (bind_socket (dev->fd_rfcomm, &rc_addr) != 0)
     {
-      fprintf (stderr, "Failed to bind interface `%.*s': %s\n", IFNAMSIZ,
-               dev->iface, strerror (errno));
+      fprintf (stderr,
+               "Failed to bind interface `%.*s': %s\n",
+               IFNAMSIZ,
+               dev->iface,
+               strerror (errno));
       return 1;
     }
 
     /* Register a SDP service */
     if (register_service (dev, rc_addr.rc_channel) != 0)
     {
-      fprintf (stderr, "Failed to register a service on interface `%.*s': %s\n", IFNAMSIZ,
+      fprintf (stderr,
+               "Failed to register a service on interface `%.*s': %s\n",
+               IFNAMSIZ,
                dev->iface, strerror (errno));
       return 1;
     }
@@ -1512,22 +1541,33 @@ stdin_send_hw (void *cls, const struct GNUNET_MessageHeader *hdr)
         addr_rc.rc_channel = get_channel (dev, addr_rc.rc_bdaddr);
 
         *sendsocket = socket (AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
-        if (connect (*sendsocket, (struct sockaddr *)&addr_rc, sizeof (addr_rc)) == 0)
+        if ( (-1 < *sendsocket) &&
+             (0 == connect (*sendsocket,
+                            (struct sockaddr *) &addr_rc,
+                            sizeof (addr_rc))) )
         {
           neighbours.fds[neighbours.pos++] = *sendsocket;
           connection_successful = 1;
           char addr[19] = { 0 };
           ba2str (&(neighbours.devices[neighbours.pos - 1]), addr);
           fprintf (stderr, "LOG : Connected to %s\n", addr);
-
           break;
         }
         else
         {
           char addr[19] = { 0 };
           errno_copy = errno;  //Save a copy for later
+
+          if (-1 != *sendsocket)
+          {
+            (void) close (*sendsocket);
+            *sendsocket = -1;
+          }
           ba2str (&(neighbours.devices[neighbours.pos]), addr);
-          fprintf (stderr, "LOG : Couldn't connect on device %s, error : %s\n", addr, strerror(errno));
+          fprintf (stderr,
+                   "LOG : Couldn't connect on device %s, error : %s\n",
+                   addr,
+                   strerror (errno));
           if (errno != ECONNREFUSED) //FIXME be sure that this works
           {
             fprintf (stderr, "LOG : Removes %d device from the list\n", neighbours.pos);
@@ -1911,13 +1951,13 @@ main (int argc, char *argv[])
           fprintf (stderr, "LOG : %s sends a message to STDOUT\n", dev.iface); //FIXME: debugging message
 
         }
-        if (sendsocket != -1)
+        if (-1 != sendsocket)
         {
           if (FD_ISSET (sendsocket , &wfds))
           {
-            ssize_t ret =
-        write (sendsocket, write_pout.buf + write_std.pos,
-               write_pout.size - write_pout.pos);
+            ssize_t ret = write (sendsocket,
+                                 write_pout.buf + write_std.pos,
+                                 write_pout.size - write_pout.pos);
             if (0 > ret) //FIXME should I first check the error type?
             {
               fprintf (stderr, "Failed to write to bluetooth device: %s. Closing the socket!\n",
@@ -2064,7 +2104,8 @@ main (int argc, char *argv[])
     stdin_mst = NULL;
     sdp_close (dev.session);
     (void) close (dev.fd_rfcomm);
-    (void) close (sendsocket);
+    if (-1 != sendsocket)
+      (void) close (sendsocket);
 
     for (i = 0; i < crt_rfds; i++)
       (void) close (rfds_list[i]);