gnunet-svn
[Top][All Lists]
Advanced

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

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


From: gnunet
Subject: [GNUnet-SVN] r18303 - libmwmodem/src/main
Date: Thu, 24 Nov 2011 16:13:26 +0100

Author: grothoff
Date: 2011-11-24 16:13:26 +0100 (Thu, 24 Nov 2011)
New Revision: 18303

Modified:
   libmwmodem/src/main/libmwmodem.c
Log:
feedback

Modified: libmwmodem/src/main/libmwmodem.c
===================================================================
--- libmwmodem/src/main/libmwmodem.c    2011-11-24 14:44:07 UTC (rev 18302)
+++ libmwmodem/src/main/libmwmodem.c    2011-11-24 15:13:26 UTC (rev 18303)
@@ -25,37 +25,42 @@
 #include <netinet/in.h>
 #include <string.h>
 
-uint32_t val;
+uint32_t val; // Global, exported symbol!?
 
 struct MWMODEM_Context * MWMODEM_init (uint16_t port, int af_int, 
MWMODEM_InformationCallback *cb, void *cb_cls)
 {
-       static struct MWMODEM_Context *context;
-       struct sockaddr_in *adress4;
+  static struct MWMODEM_Context *context; // NOT STATIC! Not a GLOBAL!!!
+       struct sockaddr_in *adress4; // address!
        struct sockaddr_in6 *adress6;
-       adress4 = malloc(sizeof(struct sockaddr_in));
-       adress6 = malloc(sizeof(struct sockaddr_in6));
 
-       context = malloc(sizeof(struct MWMODEM_Context));
-       (*context).cb = cb;
-
-       if (af_int==AF_INET||af_int==AF_INET6)(*context).socket = 
socket(af_int, SOCK_DGRAM, IPPROTO_UDP);
-       else
+       if ( (af_int!=AF_INET) && (af_int!=AF_INET6) )
        {
-               printf("Error no correct AF_INET or AF_INET6 value!");
+               fprintf(stderr,
+                       "Error no correct AF_INET or AF_INET6 value!"); 
                return;
        }
 
-       if ((*context).socket==-1)
+       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;
+
+       (*context).socket = socket(af_int, SOCK_DGRAM, IPPROTO_UDP);
+
+       if (-1 == context->socket)
        {
-               printf("Error no socket created!");
+               fprintf(stderr, "Error no socket created: %s", strerror(errno));
+               // LEAK!
                return;
        }       
-
+       
        if (af_int==AF_INET)
        {
 
                memset (&adress4, 0, sizeof(adress4));
                (*adress4).sin_family = af_int;
+               // ->sin_len field on FreeBSD not set!
                if (port == 0)
                        {
                                (*adress4).sin_port = htons(MWMODEM_PORT);
@@ -64,7 +69,7 @@
                        {
                                (*adress4).sin_port = htons(port);
                        }
-               bind((*context).socket, adress4, sizeof(adress4));
+               bind((*context).socket, adress4, sizeof(adress4)); // check 
return value!
        }
        else
        {
@@ -79,7 +84,7 @@
                        {
                                (*adress6).sin6_port = htons(port);
                        }
-               bind((*context).socket, adress6, sizeof(adress6));
+               bind((*context).socket, adress6, sizeof(adress6)); // check 
return value!
        }
        
        free(adress4);
@@ -93,7 +98,8 @@
        return (*fc).socket;
 }
 
-uint32_t charArrayToASCIICode (char byte4[4])
+// Document! Exported symbol? -> static
+uint32_t charArrayToASCIICode (const char *byte4)
 {
        val = (uint32_t)byte4[0]
                     |val + (uint32_t)byte4[1] << 8
@@ -102,12 +108,12 @@
        return val;
 }
 
-uint32_t charArrazToInt (char byte4[4])
+uint32_t charArrazToInt (char byte4[4]) // Arraz?
 {
        int i;
        for (i=0; i<=3; i++)
        {
-               if (byte4[i]>=0x30 || byte4[i]<=0x39)
+               if (byte4[i]>='0' || byte4[i]<='9')
                {
                        val=val+(((int)byte4[i])*10^i);
                }
@@ -115,6 +121,25 @@
        return val;
 }
 
+//Kanalinformationen
+struct MWChannel {
+  uint8_t index;
+  uint8_t modcod;
+  uint8_t queue;
+  uint32_t datasent;
+  uint32_t symbolratelimit;
+};
+
+//UDP Paketinhalt
+struct MWHeader
+{
+  uint32_t header;
+  uint32_t time;
+  uint32_t symbolrate;
+  uint8_t channelmax;
+}
+
+
 void MWMODEM_run (struct MWMODEM_Context *fc)
 {
        struct MWMODEM_Package *package;
@@ -124,42 +149,32 @@
        struct sockaddr *from;
        socklen_t *from_length;
        struct MWMODEM_Channel channel;
+       const struct MWHeader *hdr;
 
+
+       // use ioctl with FIONREAD to determine size of inbound UDP packet => 
only allocated what is needed
+       // (and then stack-allocate that)
+
        package = malloc(sizeof(struct MWMODEM_Package));
        buffer = malloc(MWMODEM_MAXMESSLENGTH);
        
        if (recvfrom((*fc).socket, *buffer, sizeof(buffer), 0, from, 
from_length)==-1)
        {
                printf("Error no message received!");
+               // LEAK!
                return;
        }
-       else
-       {
-
-       byte4[0]= buffer[0];
-       byte4[1]= buffer[1];
-       byte4[2]= buffer[2];
-       byte4[3]= buffer[3];
-
        if (1==1)//TODO deklination der Erkennungsmerkmale der Message
        {
-               (*package).header = ntohl(charArrayToASCIICode(byte4));
+         hdr = (const struct MWHeader*) buffer;
 
-               byte4[0]= buffer[4];
-               byte4[1]= buffer[5];
-               byte4[2]= buffer[6];
-        byte4[3]= buffer[7];
-        (*package).time.tv_nsec = MWMODWM_TACT_NANO_SEC;
-        (*package).time.tv_sec = ntohl(charArrayToInt(byte4));
+         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;
 
-               byte4[0]= buffer[8];
-        byte4[1]= buffer[9];
-        byte4[2]= buffer[10];
-        byte4[3]= buffer[11];
-        (*package).symbolrate = ntohl(charArrayToInt(byte4));
-
-        (*package).num_channels = (uint8_t) buffer[12];
-
                struct MWMODEM_Channel list2[(*package).num_channels];
                list = list2;
 
@@ -175,7 +190,7 @@
                                if(buffer[currentBufferZelle]>MWMODEM_MOD_DUMMY
                                                
&&buffer[currentBufferZelle]<MWMODEM_MOD_RESERVED)
                                {
-                                       switch(buffer[currentBufferZelle])
+                                 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;
@@ -204,7 +219,8 @@
                                                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;
+                                       case MWMODEM_MOD_32APSK_9_10 : 
channel.modcode = MWMODEM_MOD_32APSK_9_10; // BREAK!?
+                                         // DEFAULT!?
                                        }
                                }
                                else
@@ -246,7 +262,7 @@
                        printf("No MWModem compatible message received!");
                        return;
                }
-       }
+       
        (*package).channel = list;
 
        (*(*fc).cb)((*fc).cls, package);
@@ -255,7 +271,5 @@
 void MWMODEM_free (struct MWMODEM_Context *fc)
 {
        close((*fc).socket);
-       free((*fc).cb);
-       free((*fc).cls);
        free(fc);
 }




reply via email to

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