Commit c4201111 authored by Dafydd Harries's avatar Dafydd Harries

give fake UDP sockets individual send/recv queues

darcs-hash:20070120044222-c9803-0b813ca8408257ee58ab65365390a886a9100b0f.gz
parent baf2e73d
...@@ -33,7 +33,7 @@ main (void) ...@@ -33,7 +33,7 @@ main (void)
len = 5; len = 5;
sin.sin_addr.s_addr = htonl (0x01020304); sin.sin_addr.s_addr = htonl (0x01020304);
sin.sin_port = htons (2345); sin.sin_port = htons (2345);
udp_fake_socket_manager_push_recv (&man, &sin, len, buf); udp_fake_socket_push_recv (&sock, &sin, len, buf);
memset (buf, '\0', 5); memset (buf, '\0', 5);
memset (&sin, '\0', sizeof (sin)); memset (&sin, '\0', sizeof (sin));
...@@ -53,13 +53,14 @@ main (void) ...@@ -53,13 +53,14 @@ main (void)
memset (buf, '\0', len); memset (buf, '\0', len);
memset (&sin, '\0', sizeof (sin)); memset (&sin, '\0', sizeof (sin));
len = udp_fake_socket_manager_pop_send (&man, &sin, sizeof (buf), buf); len = udp_fake_socket_pop_send (&sock, &sin, sizeof (buf), buf);
g_assert (len == 4); g_assert (len == 4);
g_assert (strcmp (buf, "lala")); g_assert (strcmp (buf, "lala"));
g_assert (ntohl (sin.sin_addr.s_addr) == 0x01020304); g_assert (ntohl (sin.sin_addr.s_addr) == 0x01020304);
g_assert (ntohs (sin.sin_port) == 2345); g_assert (ntohs (sin.sin_port) == 2345);
man.close (&man); udp_socket_close (&sock);
udp_socket_manager_close (&man);
return 0; return 0;
} }
...@@ -17,9 +17,9 @@ struct _Packet ...@@ -17,9 +17,9 @@ struct _Packet
gchar buf[1024]; gchar buf[1024];
}; };
typedef struct _UDPFakeSocketManagerPriv UDPFakeSocketManagerPriv; typedef struct _UDPFakeSocketPriv UDPFakeSocketPriv;
struct _UDPFakeSocketManagerPriv struct _UDPFakeSocketPriv
{ {
GSList *send_queue; GSList *send_queue;
guint recv_pipe_in; guint recv_pipe_in;
...@@ -50,16 +50,14 @@ fake_send ( ...@@ -50,16 +50,14 @@ fake_send (
gchar *buf) gchar *buf)
{ {
Packet *packet; Packet *packet;
UDPSocketManager *man; UDPFakeSocketPriv *priv;
UDPFakeSocketManagerPriv *priv;
packet = g_slice_new0 (Packet); packet = g_slice_new0 (Packet);
packet->len = len; packet->len = len;
packet->sin = *to; packet->sin = *to;
strncpy (packet->buf, buf, len); strncpy (packet->buf, buf, len);
man = (UDPSocketManager *) sock->priv; priv = (UDPFakeSocketPriv *) sock->priv;
priv = (UDPFakeSocketManagerPriv *) man->priv;
priv->send_queue = g_slist_append (priv->send_queue, packet); priv->send_queue = g_slist_append (priv->send_queue, packet);
return TRUE; return TRUE;
...@@ -72,11 +70,9 @@ fake_recv ( ...@@ -72,11 +70,9 @@ fake_recv (
guint len, guint len,
gchar *buf) gchar *buf)
{ {
UDPSocketManager *man; UDPFakeSocketPriv *priv;
UDPFakeSocketManagerPriv *priv;
man = (UDPSocketManager *) sock->priv; priv = (UDPFakeSocketPriv *) sock->priv;
priv = (UDPFakeSocketManagerPriv *) man->priv;
read (priv->recv_pipe_out, from, sizeof (struct sockaddr_in)); read (priv->recv_pipe_out, from, sizeof (struct sockaddr_in));
read (priv->recv_pipe_out, &len, sizeof (guint)); read (priv->recv_pipe_out, &len, sizeof (guint));
...@@ -85,6 +81,18 @@ fake_recv ( ...@@ -85,6 +81,18 @@ fake_recv (
return len; return len;
} }
static void
fake_close (UDPSocket *sock)
{
UDPFakeSocketPriv *priv;
g_debug ("close");
priv = (UDPFakeSocketPriv *) sock->priv;
close (priv->recv_pipe_out);
close (priv->recv_pipe_in);
g_slice_free (UDPFakeSocketPriv, priv);
}
/* XXX: set a port in sin */ /* XXX: set a port in sin */
static gboolean static gboolean
fake_socket_init ( fake_socket_init (
...@@ -92,75 +100,71 @@ fake_socket_init ( ...@@ -92,75 +100,71 @@ fake_socket_init (
UDPSocket *sock, UDPSocket *sock,
struct sockaddr_in *sin) struct sockaddr_in *sin)
{ {
int fds[2];
UDPFakeSocketPriv *priv;
if (pipe (fds) == -1)
return FALSE;
priv = g_slice_new0 (UDPFakeSocketPriv);
priv->recv_pipe_out = fds[0];
priv->recv_pipe_in = fds[1];
sock->send = fake_send; sock->send = fake_send;
sock->recv = fake_recv; sock->recv = fake_recv;
sock->priv = man; sock->priv = priv;
sock->close = fake_close;
return TRUE; return TRUE;
} }
void void
udp_fake_socket_manager_push_recv ( udp_fake_socket_push_recv (
UDPSocketManager *man, UDPSocket *sock,
struct sockaddr_in *from, struct sockaddr_in *from,
guint len, guint len,
gchar *buf) gchar *buf)
{ {
UDPFakeSocketManagerPriv *priv; UDPFakeSocketPriv *priv;
priv = (UDPFakeSocketManagerPriv *) man->priv; priv = (UDPFakeSocketPriv *) sock->priv;
write (priv->recv_pipe_in, from, sizeof (struct sockaddr_in)); write (priv->recv_pipe_in, from, sizeof (struct sockaddr_in));
write (priv->recv_pipe_in, &len, sizeof (guint)); write (priv->recv_pipe_in, &len, sizeof (guint));
write (priv->recv_pipe_in, buf, len); write (priv->recv_pipe_in, buf, len);
} }
guint guint
udp_fake_socket_manager_pop_send ( udp_fake_socket_pop_send (
UDPSocketManager *man, UDPSocket *sock,
struct sockaddr_in *to, struct sockaddr_in *to,
guint len, guint len,
gchar *buf) gchar *buf)
{ {
UDPFakeSocketManagerPriv *priv; UDPFakeSocketPriv *priv;
Packet *packet; Packet *packet;
priv = (UDPFakeSocketManagerPriv *) man->priv; priv = (UDPFakeSocketPriv *) sock->priv;
packet = (Packet *) _g_slist_pop (&priv->send_queue); packet = (Packet *) _g_slist_pop (&priv->send_queue);
if (!packet) if (!packet)
return 0; return 0;
len = packet->len;
*to = packet->sin; *to = packet->sin;
return packet->len; g_slice_free (Packet, packet);
return len;
} }
static void static void
fake_socket_manager_close (UDPSocketManager *man) fake_socket_manager_close (UDPSocketManager *man)
{ {
UDPFakeSocketManagerPriv *priv;
priv = (UDPFakeSocketManagerPriv *) man->priv;
close (priv->recv_pipe_out);
close (priv->recv_pipe_in);
g_slice_free (UDPFakeSocketManagerPriv, priv);
} }
void void
udp_fake_socket_manager_init (UDPSocketManager *man) udp_fake_socket_manager_init (UDPSocketManager *man)
{ {
int fds[2];
UDPFakeSocketManagerPriv *priv;
if (pipe (fds) == -1)
/* XXX: this function should return boolean */
return;
priv = g_slice_new0 (UDPFakeSocketManagerPriv);
priv->recv_pipe_out = fds[0];
priv->recv_pipe_in = fds[1];
man->init = fake_socket_init; man->init = fake_socket_init;
man->select = NULL; man->select = NULL;
man->close = fake_socket_manager_close; man->close = fake_socket_manager_close;
man->priv = priv; man->priv = NULL;
} }
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
void void
udp_fake_socket_manager_init (UDPSocketManager *man); udp_fake_socket_manager_init (UDPSocketManager *man);
void void
udp_fake_socket_manager_push_recv ( udp_fake_socket_push_recv (
UDPSocketManager *man, UDPSocket *man,
struct sockaddr_in *from, struct sockaddr_in *from,
guint len, guint len,
gchar *buf); gchar *buf);
guint guint
udp_fake_socket_manager_pop_send ( udp_fake_socket_pop_send (
UDPSocketManager *man, UDPSocket *man,
struct sockaddr_in *to, struct sockaddr_in *to,
guint len, guint len,
gchar *buf); gchar *buf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment