gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r18340 - libmwmodem/src/main


From: gnunet
Subject: [GNUnet-SVN] r18340 - libmwmodem/src/main
Date: Sun, 27 Nov 2011 22:22:19 +0100

Author: ruppa
Date: 2011-11-27 22:22:19 +0100 (Sun, 27 Nov 2011)
New Revision: 18340

Modified:
   libmwmodem/src/main/libmwmodem.c
Log:
Leak fixes!

Modified: libmwmodem/src/main/libmwmodem.c
===================================================================
--- libmwmodem/src/main/libmwmodem.c    2011-11-26 19:41:25 UTC (rev 18339)
+++ libmwmodem/src/main/libmwmodem.c    2011-11-27 21:22:19 UTC (rev 18340)
@@ -25,11 +25,18 @@
 #include <netinet/in.h>
 #include <string.h>
 
+static union MWAddress
+{
+       const struct sockaddr_in address4;
+       const struct sockaddr_in6 address6;
+};
+
 struct MWMODEM_Context * MWMODEM_init (uint16_t port, int af_int, 
MWMODEM_InformationCallback *cb, void *cb_cls)
 {
-    struct MWMODEM_Context context;
-       struct sockaddr_in *adress4; // address!
-       struct sockaddr_in6 *adress6;
+    struct MWMODEM_Context *context;
+    struct MWAddress address;
+    struct sockaddr_in address4;
+    struct sockaddr_in6 address6;
 
        if ( (af_int!=AF_INET) && (af_int!=AF_INET6) )
        {
@@ -38,9 +45,6 @@
                return;
        }
 
-       adress4 = malloc(sizeof(struct sockaddr_in)); // stack-allocated!
-       adress6 = malloc(sizeof(struct sockaddr_in6)); // stack-allocated!
-
        context = malloc(sizeof(struct MWMODEM_Context)); // CHECK RETURN VALUE!
        context->cb = cb;
 
@@ -50,6 +54,7 @@
        {
                fprintf(stderr, "Error no socket created: %s", strerror(errno));
                // LEAK!
+               free (context);
                return;
        }       
        
@@ -61,43 +66,52 @@
                // ->sin_len field on FreeBSD not set!
                if (port == 0)
                        {
-                               (*adress4).sin_port = htons(MWMODEM_PORT);
+                               address4->sin_port = htons(MWMODEM_PORT);
                        }
                        else
                        {
-                               (*adress4).sin_port = htons(port);
+                               address4->sin_port = htons(port);
                        }
-               bind(context->socket, adress4, sizeof(adress4)); // check 
return value!
+               address = address4;
        }
        else
        {
 
-               memset( &adress6, 0, sizeof (adress6));
+               memset( &address6, 0, sizeof (address6));
                (*adress6).sin6_family = af_int;
                if (port == 0)
                        {
-                               adress6->sin6_port = htons(MWMODEM_PORT);
+                               address6->sin6_port = htons(MWMODEM_PORT);
                        }
                        else
                        {
-                               adress6->sin6_port = htons(port);
+                               address6->sin6_port = htons(port);
                        }
-               bind(context->socket, adress6, sizeof(adress6)); // check 
return value!
+               adress = address6;
        }
        
-       free(adress4);
-       free(adress6);
+       if (-1==bind(context->socket, adress6, sizeof(address)))// check return 
value!
+       {
+               fprintf(stderr, "The port bind have produced a 
failure!");//Failure messafe TODO
+               //LEAK!
+               free(context);
+               return;
+       }
 
+       free (address);
+       free (address4);
+       free (address6);
+
        return context;
 }
 
 int MWMODEM_get_select_socket(struct MWMODEM_Context *fc)
 {
-       return (*fc).socket;
+       return fc->socket;
 }
 
-// Document! Exported symbol? -> static
-uint32_t charArrayToASCIICode (const char *byte4)
+
+static uint32_t charArrayToASCIICode (const char *byte4)
 {
        uint32_t val;
        val = (uint32_t)byte4[0]
@@ -107,7 +121,7 @@
        return val;
 }
 
-//Kanalinformationen
+//channel information at the udp package
 struct MWChannel {
   uint8_t index;
   uint8_t modcod;
@@ -116,7 +130,7 @@
   uint32_t symbolratelimit;
 };
 
-//UDP Paketinhalt
+//UDP Package content
 struct MWHeader
 {
   uint32_t header;
@@ -136,6 +150,7 @@
        socklen_t *from_length;
        struct MWMODEM_Channel channel;
        const struct MWHeader *hdr;
+       struct MWChannel *chl;
 
 
        // use ioctl with FIONREAD to determine size of inbound UDP packet => 
only allocated what is needed
@@ -146,21 +161,33 @@
        
        if (recvfrom(fc->socket, *buffer, sizeof(buffer), 0, from, 
from_length)==-1)
        {
-               printf("Error no message received!");
-               // LEAK!
+               fprintf(stderr, "Error no message received!");
+               free (package);
+               free (buffer);
                return;
        }
-       if (1==1)//TODO deklination der Erkennungsmerkmale der Message
-       {
-         hdr = (const struct MWHeader*) buffer;
+       free(from);
+       free(from_length);
 
-         package->header = ntohl(hdr->header);
-         unsigned long long nstime = ntohl(hdr->time) * MWMODWM_TACT_NANO_SEC;
-         package->time.tv_nsec = nstime % (1000 * 1000 * 1000);
-         package->time.tv_sec = nstime / (1000 * 1000 * 1000);
-         package->symbolrate = ntohl(hdr->symbolrate);
-         package->num_channels = (uint8_t) hdr->channelmax;
+       hdr = (const struct MWHeader*) buffer;
 
+       if (1!=1)//TODO deklination der Erkennungsmerkmale der Message
+       {
+               printf("No MWModem compatible message received!");
+               free(hdr);
+               free(package);
+               free(buffer);
+               return;
+       }
+       else
+       {
+           package->header = ntohl(hdr->header);
+           unsigned long long nstime = ntohl(hdr->time) * 
MWMODWM_TACT_NANO_SEC;
+           package->time.tv_nsec = nstime % (1000 * 1000 * 1000);
+           package->time.tv_sec = nstime / (1000 * 1000 * 1000);
+           package->symbolrate = ntohl(hdr->symbolrate);
+           package->num_channels = (uint8_t) hdr->channelmax;
+
                struct MWMODEM_Channel list2[package->num_channels];
                list = list2;
 
@@ -169,89 +196,42 @@
                for(i=0;i<=package->num_channels; i++)
                {
 
+                       chl = (const struct MWChannel*) 
buffer[currentBufferZelle];
+
                        if(buffer[currentBufferZelle]==i)
                        {
-                               currentBufferZelle+=1;
 
                                if(buffer[currentBufferZelle]>MWMODEM_MOD_DUMMY
                                                
&&buffer[currentBufferZelle]<MWMODEM_MOD_RESERVED)
                                {
-                                 switch(buffer[currentBufferZelle]) // Zelle!? 
English!
-                                       {
-                                               case MWMODEM_MOD_QPSK_1_4 : 
channel.modcode = MWMODEM_MOD_QPSK_1_4;
-                                               case MWMODEM_MOD_QPSK_1_3 : 
channel.modcode = MWMODEM_MOD_QPSK_1_3;
-                                               case MWMODEM_MOD_QPSK_2_5 : 
channel.modcode = MWMODEM_MOD_QPSK_2_5;
-                                               case MWMODEM_MOD_QPSK_1_2 : 
channel.modcode = MWMODEM_MOD_QPSK_1_2;
-                                               case MWMODEM_MOD_QPSK_3_5 : 
channel.modcode = MWMODEM_MOD_QPSK_3_5;
-                                               case MWMODEM_MOD_QPSK_2_3 : 
channel.modcode = MWMODEM_MOD_QPSK_2_3;
-                                               case MWMODEM_MOD_QPSK_3_4 : 
channel.modcode = MWMODEM_MOD_QPSK_3_4;
-                                               case MWMODEM_MOD_QPSK_4_5 : 
channel.modcode = MWMODEM_MOD_QPSK_4_5;
-                                               case MWMODEM_MOD_QPSK_5_6 : 
channel.modcode = MWMODEM_MOD_QPSK_5_6;
-                                               case MWMODEM_MOD_QPSK_8_9 : 
channel.modcode = MWMODEM_MOD_QPSK_8_9;
-                                               case MWMODEM_MOD_QPSK_9_10 : 
channel.modcode = MWMODEM_MOD_QPSK_9_10;
-                                               case MWMODEM_MOD_8PSK_3_5 : 
channel.modcode = MWMODEM_MOD_8PSK_3_5;
-                                               case MWMODEM_MOD_8PSK_2_3 : 
channel.modcode = MWMODEM_MOD_8PSK_2_3;
-                                               case MWMODEM_MOD_8PSK_3_4 : 
channel.modcode = MWMODEM_MOD_8PSK_3_4;
-                                               case MWMODEM_MOD_8PSK_5_6 : 
channel.modcode = MWMODEM_MOD_8PSK_5_6;
-                                               case MWMODEM_MOD_8PSK_8_9 : 
channel.modcode = MWMODEM_MOD_8PSK_8_9;
-                                               case MWMODEM_MOD_8PSK_9_10 : 
channel.modcode = MWMODEM_MOD_8PSK_9_10;
-                                               case MWMODEM_MOD_16APSK_2_3 : 
channel.modcode = MWMODEM_MOD_16APSK_2_3;
-                                               case MWMODEM_MOD_16APSK_3_4 : 
channel.modcode = MWMODEM_MOD_16APSK_3_4;
-                                               case MWMODEM_MOD_16APSK_4_5 : 
channel.modcode = MWMODEM_MOD_16APSK_4_5;
-                                               case MWMODEM_MOD_16APSK_5_6 : 
channel.modcode = MWMODEM_MOD_16APSK_5_6;
-                                               case MWMODEM_MOD_16APSK_8_9 : 
channel.modcode = MWMODEM_MOD_16APSK_8_9;
-                                               case MWMODEM_MOD_16APSK_9_10 : 
channel.modcode = MWMODEM_MOD_16APSK_9_10;
-                                               case MWMODEM_MOD_32APSK_3_4 : 
channel.modcode = MWMODEM_MOD_32APSK_3_4;
-                                               case MWMODEM_MOD_32APSK_4_5 : 
channel.modcode = MWMODEM_MOD_32APSK_4_5;
-                                               case MWMODEM_MOD_32APSK_5_6 : 
channel.modcode = MWMODEM_MOD_32APSK_5_6;
-                                               case MWMODEM_MOD_32APSK_8_9 : 
channel.modcode = MWMODEM_MOD_32APSK_8_9;
-                                       case MWMODEM_MOD_32APSK_9_10 : 
channel.modcode = MWMODEM_MOD_32APSK_9_10; // BREAK!?
-                                         // DEFAULT!?
-                                       }
+                                       channel.modcode = (uint8_t) chl->modcod;
                                }
                                else
                                {
-                                       printf("Error no correct satellite 
modcode!");
+                                       fprintf(stderr, "Error no correct 
satellite modcode!");
+                                       free(list);
+                                       free(buffer);
+                                       free(hdr);
+                                       free(chl);
                                        return;
                                }
-                               currentBufferZelle+=1;
 
-                               channel.queue = (uint8_t) 
buffer[currentBufferZelle];
+                               channel.queue = (uint8_t) chl->queue;
 
-                               currentBufferZelle+=1;
+                               channel.datasent = ntohl(chl->datasent);
 
-                               byte4[0] = buffer[currentBufferZelle];
-                               currentBufferZelle+=1;
-                               byte4[1] = buffer[currentBufferZelle];
-                               currentBufferZelle+=1;
-                               byte4[2] = buffer[currentBufferZelle];
-                               currentBufferZelle+=1;
-                               byte4[3] = buffer[currentBufferZelle];
-                               channel.datasent = ntohl(charArrayToInt(byte4));
-                               currentBufferZelle+=1;
+                               channel.symbolratelimit = 
ntohl(chl->symbolratelimit);
 
-                               byte4[0] = buffer[currentBufferZelle];
-                               currentBufferZelle+=1;
-                               byte4[1] = buffer[currentBufferZelle];
-                               currentBufferZelle+=1;
-                               byte4[2] = buffer[currentBufferZelle];
-                               currentBufferZelle+=1;
-                               byte4[3] = buffer[currentBufferZelle];
-                               channel.symbolratelimit = 
ntohl(charArrayToInt(byte4));
                                list[i] = channel;
-                               currentBufferZelle+=1;
+
+                               currentBufferZelle+=11;
                        }
                }
        }
-       else
-               {
-                       printf("No MWModem compatible message received!");
-                       return;
-               }
        
        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]