gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r18452 - in libmwmodem/src: include main


From: gnunet
Subject: [GNUnet-SVN] r18452 - in libmwmodem/src: include main
Date: Tue, 6 Dec 2011 14:39:28 +0100

Author: grothoff
Date: 2011-12-06 14:39:28 +0100 (Tue, 06 Dec 2011)
New Revision: 18452

Modified:
   libmwmodem/src/include/libmwmodem.h
   libmwmodem/src/main/libmwmodem.c
Log:
fixes

Modified: libmwmodem/src/include/libmwmodem.h
===================================================================
--- libmwmodem/src/include/libmwmodem.h 2011-12-06 13:35:10 UTC (rev 18451)
+++ libmwmodem/src/include/libmwmodem.h 2011-12-06 13:39:28 UTC (rev 18452)
@@ -173,12 +173,9 @@
 /**
  * This holds the instance of MWMODEM
  */
-struct MWMODEM_Context{
-       int socket;
-       MWMODEM_InformationCallback *cb;
-       void *cls;
-};
+struct MWMODEM_Context;
 
+
 /**
  * Initialisation of this library. 
  * @param port number of port for use to receive the package. If you want to 
use the default port set this 0.
@@ -190,7 +187,7 @@
 struct MWMODEM_Context *
 MWMODEM_init (uint16_t port,
              int af_int,
-             MWMODEM_InformationCallback *cb,
+             MWMODEM_InformationCallback cb,
              void *cb_cls);
 
 /**

Modified: libmwmodem/src/main/libmwmodem.c
===================================================================
--- libmwmodem/src/main/libmwmodem.c    2011-12-06 13:35:10 UTC (rev 18451)
+++ libmwmodem/src/main/libmwmodem.c    2011-12-06 13:39:28 UTC (rev 18452)
@@ -28,9 +28,19 @@
 #include <errno.h>
 #include <unistd.h>
 
+/**
+ * This holds the instance of MWMODEM
+ */
+struct MWMODEM_Context{
+       int socket;
+  int af_int;
+  MWMODEM_InformationCallback cb;
+       void *cls;
+};
+
 // TESTCASE!???
 
-struct MWMODEM_Context * MWMODEM_init (uint16_t port, int af_int, 
MWMODEM_InformationCallback *cb, void *cb_cls)
+struct MWMODEM_Context * MWMODEM_init (uint16_t port, int af_int, 
MWMODEM_InformationCallback cb, void *cb_cls)
 {
     struct MWMODEM_Context *context;
     const struct sockaddr *address;
@@ -53,7 +63,7 @@
                return NULL;
        }
        context->cb = cb;
-
+       context->af_inet = af_inet;
        context->socket = socket(af_int, SOCK_DGRAM, IPPROTO_UDP);
 
        if (-1 == context->socket)
@@ -69,9 +79,9 @@
                memset (&address4, 0, sizeof(address4));
                address4.sin_family = af_int;
 
-               #if HAVE_SOCKADDR_IN_SIN_LEN
+#if HAVE_SOCKADDR_IN_SIN_LEN
                address4.sin_len = (u_char) sizeof (struct sockaddr_in);
-               #endif
+#endif
 
        if (port == 0)
                        {
@@ -90,9 +100,9 @@
                memset( &address6, 0, sizeof (address6));
                address6.sin6_family = af_int;
 
-               #if HAVE_SOCKADDR_IN_SIN_LEN
+#if HAVE_SOCKADDR_IN_SIN_LEN
                address6.sin_len = (u_char) sizeof (struct sockaddr_in6);
-               #endif
+#endif
 
                if (port == 0)
                        {
@@ -145,14 +155,16 @@
 void MWMODEM_run (struct MWMODEM_Context *fc)
 {
        struct MWMODEM_Package package;
-       char *buffer;
        char *ptr;
        struct MWMODEM_Channel *list;
-       struct sockaddr from;
+       struct sockaddr *from;
+       struct sockaddr_in fromv4;
+       struct sockaddr_in6 fromv6;
        socklen_t from_length;
        struct MWMODEM_Channel channel;
        struct MWHeader *hdr;
        struct MWChannel *chl;
+       ssize_t rret;
        int package_length;
 
        if (-1==ioctl(fc->socket, FIONREAD, &package_length))
@@ -165,28 +177,45 @@
        if (package_length==0)
        {
                fprintf(stderr, "Error: no message to receive!");
+               // FIXME: Denial of service!
                return;
        }
        
-       if (package_length>65.535)
+       if (package_length>65535)
        {
-               fprintf(stderr, "Error: message to long for UDP package!");
+               /* Cannot be.  Message to long for UDP packet! */
+               abort ();
        }
 
-       buffer = malloc(package_length);
+       {
+         char buffer[package_length];
 
-       if (-1==recvfrom(fc->socket, buffer, sizeof(buffer), 0, &from, 
&from_length))
+         if (fc->af_int == AF_INET)
+         {
+           from_length = sizeof (fromv4);
+           from = (struct sockaddr *) &fromv4;
+         }
+         else /* AF_INET6 */
+         {
+           from_length = sizeof (fromv6);
+           from = (struct sockaddr *) &fromv6;
+         }
+         if (-1==(rret = recvfrom(fc->socket, buffer, sizeof(buffer), 0, from, 
&from_length)))
        {
                fprintf(stderr, "Error: no message received!");
                return;
        }
+         if (rret != package_length)
+         {
+           fprintf (stderr, "Received packet of unexpected size!\n");
+           return; /* good luck */
+         }
 
        hdr = (struct MWHeader*) buffer;
 
        if (1!=1)//TODO deklination der Erkennungsmerkmale der Message
        {
          fprintf(stderr, "Error: no MWModem compatible message received!");
-               free(hdr); 
                return;
        }
        else
@@ -220,8 +249,6 @@
                                else
                                {
                                        fprintf(stderr, "Error no correct 
satellite modcode!");
-                                       free(list);
-                                       free(buffer);
                                        return;
                                }
 
@@ -240,7 +267,8 @@
        
        package.channel = list;
 
-       (*fc->cb)(fc->cls, &package);
+       fc->cb(fc->cls, &package);
+       }
 }
 
 void MWMODEM_free (struct MWMODEM_Context *fc)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]