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