-doxygen
[oweals/gnunet.git] / src / transport / plugin_transport_udp_broadcasting.c
index 493b98898b9a47f3dbf58f7a5de811b4819369a0..0503e413a04d163eff6706e6ac0eb0a5f3ddd447 100644 (file)
@@ -42,7 +42,7 @@
 #define LOG(kind,...) GNUNET_log_from (kind, "transport-udp", __VA_ARGS__)
 
 /* *********** Cryogenic ********** */
-
+#if LINUX
 #include <sys/stat.h>
 #include <fcntl.h>
 
@@ -57,7 +57,8 @@ struct pm_times {
        unsigned long delay_msecs;
        unsigned long timeout_msecs;
 };
-/************************************/ 
+#endif
+/************************************/
 
 
 struct UDP_Beacon_Message
@@ -90,13 +91,18 @@ struct BroadcastAddress
   void *addr;
 
   socklen_t addrlen;
-  
-  /*
-   * Cryogenic fields
+
+#if LINUX
+  /**
+   * Cryogenic handle.
    */
-  struct GNUNET_DISK_FileHandle cryogenic_fd;
+  struct GNUNET_DISK_FileHandle *cryogenic_fd;
 
+  /**
+   * Time out for cryogenic.
+   */
   struct pm_times cryogenic_times;
+#endif
 };
 
 
@@ -340,16 +346,17 @@ udp_ipv4_broadcast_send (void *cls,
            GNUNET_a2s (baddr->addr, baddr->addrlen));
     }
   }
-  
+
+#if LINUX
   /*
    * Cryogenic
    */
-  if (baddr->cryogenic_fd.fd > 0)
+  if (NULL != baddr->cryogenic_fd)
   {
-    baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval/1000.0)*0.5;
-    baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval/1000.0)*1.5;
-    
-    if (ioctl(baddr->cryogenic_fd.fd,
+    baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*0.5;
+    baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*1.5;
+
+    if (ioctl(baddr->cryogenic_fd->fd,
                  PM_SET_DELAY_AND_TIMEOUT,
                  &baddr->cryogenic_times) < 0)
     {
@@ -359,11 +366,14 @@ udp_ipv4_broadcast_send (void *cls,
                                        &udp_ipv4_broadcast_send, baddr);
     }
     else
-      GNUNET_SCHEDULER_add_write_file (&baddr->cryogenic_fd,
-                                              &udp_ipv4_broadcast_send, baddr);
-    
+      GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                          baddr->cryogenic_fd,
+                                              &udp_ipv4_broadcast_send,
+                                              baddr);
+
   }
   else
+#endif
     baddr->broadcast_task =
         GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
                                          &udp_ipv4_broadcast_send, baddr);
@@ -421,15 +431,16 @@ udp_ipv6_broadcast_send (void *cls,
          GNUNET_a2s ((const struct sockaddr *) &plugin->ipv6_multicast_address,
                      sizeof (struct sockaddr_in6)));
   }
+#if LINUX
   /*
    * Cryogenic
    */
-  if (baddr->cryogenic_fd.fd > 0)
+  if (NULL != baddr->cryogenic_fd)
   {
-    baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval/1000.0)*0.5;
-    baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval/1000.0)*1.5;
-    
-    if (ioctl(baddr->cryogenic_fd.fd,
+    baddr->cryogenic_times.delay_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*0.5;
+    baddr->cryogenic_times.timeout_msecs = (plugin->broadcast_interval.rel_value_us/1000.0)*1.5;
+
+    if (ioctl(baddr->cryogenic_fd->fd,
                  PM_SET_DELAY_AND_TIMEOUT,
                  &baddr->cryogenic_times) < 0)
     {
@@ -439,10 +450,13 @@ udp_ipv6_broadcast_send (void *cls,
                                         &udp_ipv6_broadcast_send, baddr);
     }
     else
-      GNUNET_SCHEDULER_add_write_file (&baddr->cryogenic_fd,
-                                       &udp_ipv4_broadcast_send, baddr);
+      GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
+                                      baddr->cryogenic_fd,
+                                       &udp_ipv4_broadcast_send,
+                                       baddr);
   }
   else
+#endif
     baddr->broadcast_task =
         GNUNET_SCHEDULER_add_delayed (plugin->broadcast_interval,
                                       &udp_ipv6_broadcast_send, baddr);
@@ -494,20 +508,24 @@ iface_proc (void *cls,
        (NULL != plugin->sockv4) &&
        (addrlen == sizeof (struct sockaddr_in)) )
   {
-    
-       /*
-        * setup Cryogenic FD for ipv4 broadcasting
-        */
+#if LINUX
+    /*
+     * setup Cryogenic FD for ipv4 broadcasting
+     */
     char *filename;
+
     GNUNET_asprintf (&filename,
                      "/dev/power/%s",
                      name);
-    ba->cryogenic_fd =
+    if (0 == ACCESS (name, R_OK))
+    {
+      ba->cryogenic_fd =
         GNUNET_DISK_file_open (filename,
-                                      GNUNET_DISK_OPEN_WRITE,
-                                      GNUNET_DISK_PERM_NONE);
+                               GNUNET_DISK_OPEN_WRITE,
+                               GNUNET_DISK_PERM_NONE);
+    }
     GNUNET_free (filename);
-    
+#endif
     ba->broadcast_task =
         GNUNET_SCHEDULER_add_now (&udp_ipv4_broadcast_send, ba);
   }
@@ -545,23 +563,24 @@ iface_proc (void *cls,
     }
     else
     {
-      LOG (GNUNET_ERROR_TYPE_DEBUG,
-           "IPv6 multicasting running\n");
-      
+#if LINUX
       /*
        * setup Cryogenic FD for ipv6 broadcasting
        */
       char *filename;
+
       GNUNET_asprintf (&filename,
                        "/dev/power/%s",
                        name);
-      ba->cryogenic_fd =
+      if (0 == ACCESS (name, R_OK))
+      {
+        ba->cryogenic_fd =
           GNUNET_DISK_file_open (filename,
-                                        GNUNET_DISK_OPEN_WRITE,
-                                    GNUNET_DISK_PERM_NONE);
+                                 GNUNET_DISK_OPEN_WRITE,
+                                 GNUNET_DISK_PERM_NONE);
+      }
       GNUNET_free (filename);
-
-
+#endif
       ba->broadcast_task =
           GNUNET_SCHEDULER_add_now (&udp_ipv6_broadcast_send, ba);
     }
@@ -660,11 +679,9 @@ stop_broadcast (struct Plugin *plugin)
       }
     }
 
-    /*
-     * Close Cryogenic FD
-     */
-    GNUNET_DISK_file_cose(p->cryogenic_fd);
-
+#if LINUX
+    GNUNET_DISK_file_close(p->cryogenic_fd);
+#endif
     GNUNET_CONTAINER_DLL_remove (plugin->broadcast_head,
                                  plugin->broadcast_tail, p);
     GNUNET_free (p->addr);