[Top][All Lists]
[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)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18340 - libmwmodem/src/main,
gnunet <=