summaryrefslogtreecommitdiff
path: root/libsoup/soup-socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'libsoup/soup-socket.c')
-rw-r--r--libsoup/soup-socket.c400
1 files changed, 217 insertions, 183 deletions
diff --git a/libsoup/soup-socket.c b/libsoup/soup-socket.c
index d1de93ec..a9770298 100644
--- a/libsoup/soup-socket.c
+++ b/libsoup/soup-socket.c
@@ -26,8 +26,7 @@
#include <netinet/in.h>
#include <netinet/tcp.h>
-#define PARENT_TYPE G_TYPE_OBJECT
-static GObjectClass *parent_class;
+G_DEFINE_TYPE (SoupSocket, soup_socket, G_TYPE_OBJECT)
enum {
CONNECT_RESULT,
@@ -52,7 +51,7 @@ enum {
LAST_PROP
};
-struct SoupSocketPrivate {
+typedef struct {
int sockfd;
SoupAddress *local_addr, *remote_addr;
GIOChannel *iochannel;
@@ -68,7 +67,8 @@ struct SoupSocketPrivate {
GByteArray *read_buf;
GMutex *iolock, *addrlock;
-};
+} SoupSocketPrivate;
+#define SOUP_SOCKET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SOUP_TYPE_SOCKET, SoupSocketPrivate))
#ifdef HAVE_IPV6
#define soup_sockaddr_max sockaddr_in6
@@ -82,67 +82,66 @@ static void get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec);
static void
-init (GObject *object)
+soup_socket_init (SoupSocket *sock)
{
- SoupSocket *sock = SOUP_SOCKET (object);
-
- sock->priv = g_new0 (SoupSocketPrivate, 1);
- sock->priv->sockfd = -1;
- sock->priv->non_blocking = sock->priv->nodelay = TRUE;
- sock->priv->reuseaddr = TRUE;
- sock->priv->addrlock = g_mutex_new ();
- sock->priv->iolock = g_mutex_new ();
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
+
+ priv->sockfd = -1;
+ priv->non_blocking = priv->nodelay = TRUE;
+ priv->reuseaddr = TRUE;
+ priv->addrlock = g_mutex_new ();
+ priv->iolock = g_mutex_new ();
}
static void
-disconnect_internal (SoupSocket *sock)
+disconnect_internal (SoupSocketPrivate *priv)
{
- g_io_channel_unref (sock->priv->iochannel);
- sock->priv->iochannel = NULL;
- sock->priv->sockfd = -1;
+ g_io_channel_unref (priv->iochannel);
+ priv->iochannel = NULL;
+ priv->sockfd = -1;
- if (sock->priv->read_tag) {
- g_source_remove (sock->priv->read_tag);
- sock->priv->read_tag = 0;
+ if (priv->read_tag) {
+ g_source_remove (priv->read_tag);
+ priv->read_tag = 0;
}
- if (sock->priv->write_tag) {
- g_source_remove (sock->priv->write_tag);
- sock->priv->write_tag = 0;
+ if (priv->write_tag) {
+ g_source_remove (priv->write_tag);
+ priv->write_tag = 0;
}
- if (sock->priv->error_tag) {
- g_source_remove (sock->priv->error_tag);
- sock->priv->error_tag = 0;
+ if (priv->error_tag) {
+ g_source_remove (priv->error_tag);
+ priv->error_tag = 0;
}
}
static void
finalize (GObject *object)
{
- SoupSocket *sock = SOUP_SOCKET (object);
-
- if (sock->priv->iochannel)
- disconnect_internal (sock);
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object);
- if (sock->priv->local_addr)
- g_object_unref (sock->priv->local_addr);
- if (sock->priv->remote_addr)
- g_object_unref (sock->priv->remote_addr);
+ if (priv->iochannel)
+ disconnect_internal (priv);
- if (sock->priv->watch)
- g_source_remove (sock->priv->watch);
+ if (priv->local_addr)
+ g_object_unref (priv->local_addr);
+ if (priv->remote_addr)
+ g_object_unref (priv->remote_addr);
- g_mutex_free (sock->priv->addrlock);
- g_mutex_free (sock->priv->iolock);
+ if (priv->watch)
+ g_source_remove (priv->watch);
- g_free (sock->priv);
+ g_mutex_free (priv->addrlock);
+ g_mutex_free (priv->iolock);
- G_OBJECT_CLASS (parent_class)->finalize (object);
+ G_OBJECT_CLASS (soup_socket_parent_class)->finalize (object);
}
static void
-class_init (GObjectClass *object_class)
+soup_socket_class_init (SoupSocketClass *socket_class)
{
- parent_class = g_type_class_ref (PARENT_TYPE);
+ GObjectClass *object_class = G_OBJECT_CLASS (socket_class);
+
+ g_type_class_add_private (socket_class, sizeof (SoupSocketPrivate));
/* virtual method override */
object_class->finalize = finalize;
@@ -230,32 +229,30 @@ class_init (GObjectClass *object_class)
G_PARAM_READWRITE));
}
-SOUP_MAKE_TYPE (soup_socket, SoupSocket, class_init, init, PARENT_TYPE)
-
static void
-update_fdflags (SoupSocket *sock)
+update_fdflags (SoupSocketPrivate *priv)
{
int flags, opt;
- if (sock->priv->sockfd == -1)
+ if (priv->sockfd == -1)
return;
- flags = fcntl (sock->priv->sockfd, F_GETFL, 0);
+ flags = fcntl (priv->sockfd, F_GETFL, 0);
if (flags != -1) {
- if (sock->priv->non_blocking)
+ if (priv->non_blocking)
flags |= O_NONBLOCK;
else
flags &= ~O_NONBLOCK;
- fcntl (sock->priv->sockfd, F_SETFL, flags);
+ fcntl (priv->sockfd, F_SETFL, flags);
}
- opt = (sock->priv->nodelay != 0);
- setsockopt (sock->priv->sockfd, IPPROTO_TCP,
+ opt = (priv->nodelay != 0);
+ setsockopt (priv->sockfd, IPPROTO_TCP,
TCP_NODELAY, &opt, sizeof (opt));
- opt = (sock->priv->reuseaddr != 0);
- setsockopt (sock->priv->sockfd, SOL_SOCKET,
+ opt = (priv->reuseaddr != 0);
+ setsockopt (priv->sockfd, SOL_SOCKET,
SO_REUSEADDR, &opt, sizeof (opt));
}
@@ -263,23 +260,23 @@ static void
set_property (GObject *object, guint prop_id,
const GValue *value, GParamSpec *pspec)
{
- SoupSocket *sock = SOUP_SOCKET (object);
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object);
switch (prop_id) {
case PROP_NON_BLOCKING:
- sock->priv->non_blocking = g_value_get_boolean (value);
- update_fdflags (sock);
+ priv->non_blocking = g_value_get_boolean (value);
+ update_fdflags (priv);
break;
case PROP_NODELAY:
- sock->priv->nodelay = g_value_get_boolean (value);
- update_fdflags (sock);
+ priv->nodelay = g_value_get_boolean (value);
+ update_fdflags (priv);
break;
case PROP_REUSEADDR:
- sock->priv->reuseaddr = g_value_get_boolean (value);
- update_fdflags (sock);
+ priv->reuseaddr = g_value_get_boolean (value);
+ update_fdflags (priv);
break;
case PROP_SSL_CREDENTIALS:
- sock->priv->ssl_creds = g_value_get_pointer (value);
+ priv->ssl_creds = g_value_get_pointer (value);
break;
default:
break;
@@ -290,23 +287,23 @@ static void
get_property (GObject *object, guint prop_id,
GValue *value, GParamSpec *pspec)
{
- SoupSocket *sock = SOUP_SOCKET (object);
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (object);
switch (prop_id) {
case PROP_NON_BLOCKING:
- g_value_set_boolean (value, sock->priv->non_blocking);
+ g_value_set_boolean (value, priv->non_blocking);
break;
case PROP_NODELAY:
- g_value_set_boolean (value, sock->priv->nodelay);
+ g_value_set_boolean (value, priv->nodelay);
break;
case PROP_REUSEADDR:
- g_value_set_boolean (value, sock->priv->reuseaddr);
+ g_value_set_boolean (value, priv->reuseaddr);
break;
case PROP_IS_SERVER:
- g_value_set_boolean (value, sock->priv->is_server);
+ g_value_set_boolean (value, priv->is_server);
break;
case PROP_SSL_CREDENTIALS:
- g_value_set_pointer (value, sock->priv->ssl_creds);
+ g_value_set_pointer (value, priv->ssl_creds);
break;
default:
break;
@@ -338,29 +335,30 @@ soup_socket_new (const char *optname1, ...)
}
static GIOChannel *
-get_iochannel (SoupSocket *sock)
+get_iochannel (SoupSocketPrivate *priv)
{
- g_mutex_lock (sock->priv->iolock);
- if (!sock->priv->iochannel) {
- sock->priv->iochannel =
- g_io_channel_unix_new (sock->priv->sockfd);
- g_io_channel_set_close_on_unref (sock->priv->iochannel, TRUE);
- g_io_channel_set_encoding (sock->priv->iochannel, NULL, NULL);
- g_io_channel_set_buffered (sock->priv->iochannel, FALSE);
+ g_mutex_lock (priv->iolock);
+ if (!priv->iochannel) {
+ priv->iochannel =
+ g_io_channel_unix_new (priv->sockfd);
+ g_io_channel_set_close_on_unref (priv->iochannel, TRUE);
+ g_io_channel_set_encoding (priv->iochannel, NULL, NULL);
+ g_io_channel_set_buffered (priv->iochannel, FALSE);
}
- g_mutex_unlock (sock->priv->iolock);
- return sock->priv->iochannel;
+ g_mutex_unlock (priv->iolock);
+ return priv->iochannel;
}
static gboolean
idle_connect_result (gpointer user_data)
{
SoupSocket *sock = user_data;
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
- sock->priv->watch = 0;
+ priv->watch = 0;
g_signal_emit (sock, signals[CONNECT_RESULT], 0,
- sock->priv->sockfd != -1 ? SOUP_STATUS_OK : SOUP_STATUS_CANT_CONNECT);
+ priv->sockfd != -1 ? SOUP_STATUS_OK : SOUP_STATUS_CANT_CONNECT);
return FALSE;
}
@@ -368,17 +366,18 @@ static gboolean
connect_watch (GIOChannel* iochannel, GIOCondition condition, gpointer data)
{
SoupSocket *sock = data;
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
int error = 0;
int len = sizeof (error);
/* Remove the watch now in case we don't return immediately */
- g_source_remove (sock->priv->watch);
- sock->priv->watch = 0;
+ g_source_remove (priv->watch);
+ priv->watch = 0;
if (condition & ~(G_IO_IN | G_IO_OUT))
goto cant_connect;
- if (getsockopt (sock->priv->sockfd, SOL_SOCKET, SO_ERROR,
+ if (getsockopt (priv->sockfd, SOL_SOCKET, SO_ERROR,
&error, &len) != 0)
goto cant_connect;
if (error)
@@ -395,6 +394,7 @@ static void
got_address (SoupAddress *addr, guint status, gpointer user_data)
{
SoupSocket *sock = user_data;
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
g_signal_emit (sock, signals[CONNECT_RESULT], 0, status);
@@ -402,7 +402,7 @@ got_address (SoupAddress *addr, guint status, gpointer user_data)
return;
}
- soup_socket_connect (sock, sock->priv->remote_addr);
+ soup_socket_connect (sock, priv->remote_addr);
/* soup_socket_connect re-reffed addr */
g_object_unref (addr);
@@ -428,24 +428,26 @@ got_address (SoupAddress *addr, guint status, gpointer user_data)
guint
soup_socket_connect (SoupSocket *sock, SoupAddress *remote_addr)
{
+ SoupSocketPrivate *priv;
struct sockaddr *sa;
int len, status;
g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_STATUS_MALFORMED);
- g_return_val_if_fail (!sock->priv->is_server, SOUP_STATUS_MALFORMED);
- g_return_val_if_fail (sock->priv->sockfd == -1, SOUP_STATUS_MALFORMED);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
+ g_return_val_if_fail (!priv->is_server, SOUP_STATUS_MALFORMED);
+ g_return_val_if_fail (priv->sockfd == -1, SOUP_STATUS_MALFORMED);
g_return_val_if_fail (SOUP_IS_ADDRESS (remote_addr), SOUP_STATUS_MALFORMED);
- sock->priv->remote_addr = g_object_ref (remote_addr);
- if (!sock->priv->non_blocking) {
+ priv->remote_addr = g_object_ref (remote_addr);
+ if (!priv->non_blocking) {
status = soup_address_resolve_sync (remote_addr);
if (!SOUP_STATUS_IS_SUCCESSFUL (status))
return status;
}
- sa = soup_address_get_sockaddr (sock->priv->remote_addr, &len);
+ sa = soup_address_get_sockaddr (priv->remote_addr, &len);
if (!sa) {
- if (!sock->priv->non_blocking)
+ if (!priv->non_blocking)
return SOUP_STATUS_CANT_RESOLVE;
g_object_ref (sock);
@@ -453,38 +455,38 @@ soup_socket_connect (SoupSocket *sock, SoupAddress *remote_addr)
return SOUP_STATUS_CONTINUE;
}
- sock->priv->sockfd = socket (sa->sa_family, SOCK_STREAM, 0);
- if (sock->priv->sockfd == -1) {
+ priv->sockfd = socket (sa->sa_family, SOCK_STREAM, 0);
+ if (priv->sockfd == -1) {
goto done;
}
- update_fdflags (sock);
+ update_fdflags (priv);
- status = connect (sock->priv->sockfd, sa, len);
+ status = connect (priv->sockfd, sa, len);
if (status == -1) {
if (errno == EINPROGRESS) {
/* Wait for connect to succeed or fail */
- sock->priv->watch =
- g_io_add_watch (get_iochannel (sock),
+ priv->watch =
+ g_io_add_watch (get_iochannel (priv),
G_IO_IN | G_IO_OUT |
G_IO_PRI | G_IO_ERR |
G_IO_HUP | G_IO_NVAL,
connect_watch, sock);
return SOUP_STATUS_CONTINUE;
} else {
- close (sock->priv->sockfd);
- sock->priv->sockfd = -1;
+ close (priv->sockfd);
+ priv->sockfd = -1;
}
}
done:
- if (sock->priv->non_blocking) {
- sock->priv->watch = g_idle_add (idle_connect_result, sock);
+ if (priv->non_blocking) {
+ priv->watch = g_idle_add (idle_connect_result, sock);
return SOUP_STATUS_CONTINUE;
- } else if (sock->priv->sockfd == -1)
+ } else if (priv->sockfd == -1)
return SOUP_STATUS_CANT_CONNECT;
else {
- get_iochannel (sock);
+ get_iochannel (priv);
return SOUP_STATUS_OK;
}
}
@@ -493,37 +495,39 @@ static gboolean
listen_watch (GIOChannel* iochannel, GIOCondition condition, gpointer data)
{
SoupSocket *sock = data, *new;
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock), *new_priv;
struct soup_sockaddr_max sa;
int sa_len, sockfd;
if (condition & (G_IO_HUP | G_IO_ERR)) {
- g_source_remove (sock->priv->watch);
- sock->priv->watch = 0;
+ g_source_remove (priv->watch);
+ priv->watch = 0;
return FALSE;
}
sa_len = sizeof (sa);
- sockfd = accept (sock->priv->sockfd, (struct sockaddr *)&sa, &sa_len);
+ sockfd = accept (priv->sockfd, (struct sockaddr *)&sa, &sa_len);
if (sockfd == -1)
return TRUE;
new = g_object_new (SOUP_TYPE_SOCKET, NULL);
- new->priv->sockfd = sockfd;
- new->priv->non_blocking = sock->priv->non_blocking;
- new->priv->nodelay = sock->priv->nodelay;
- new->priv->is_server = TRUE;
- new->priv->ssl_creds = sock->priv->ssl_creds;
- update_fdflags (new);
+ new_priv = SOUP_SOCKET_GET_PRIVATE (new);
+ new_priv->sockfd = sockfd;
+ new_priv->non_blocking = priv->non_blocking;
+ new_priv->nodelay = priv->nodelay;
+ new_priv->is_server = TRUE;
+ new_priv->ssl_creds = priv->ssl_creds;
+ update_fdflags (new_priv);
- new->priv->remote_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&sa, sa_len);
+ new_priv->remote_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&sa, sa_len);
- if (new->priv->ssl_creds) {
+ if (new_priv->ssl_creds) {
if (!soup_socket_start_ssl (new)) {
g_object_unref (new);
return TRUE;
}
} else
- get_iochannel (new);
+ get_iochannel (new_priv);
g_signal_emit (sock, signals[NEW_CONNECTION], 0, new);
g_object_unref (new);
@@ -545,16 +549,18 @@ listen_watch (GIOChannel* iochannel, GIOCondition condition, gpointer data)
gboolean
soup_socket_listen (SoupSocket *sock, SoupAddress *local_addr)
{
+ SoupSocketPrivate *priv;
struct sockaddr *sa;
int sa_len;
g_return_val_if_fail (SOUP_IS_SOCKET (sock), FALSE);
- g_return_val_if_fail (sock->priv->is_server, FALSE);
- g_return_val_if_fail (sock->priv->sockfd == -1, FALSE);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
+ g_return_val_if_fail (priv->is_server, FALSE);
+ g_return_val_if_fail (priv->sockfd == -1, FALSE);
g_return_val_if_fail (SOUP_IS_ADDRESS (local_addr), FALSE);
/* @local_addr may have its port set to 0. So we intentionally
- * don't store it in sock->priv->local_addr, so that if the
+ * don't store it in priv->local_addr, so that if the
* caller calls soup_socket_get_local_address() later, we'll
* have to make a new addr by calling getsockname(), which
* will have the right port number.
@@ -562,28 +568,28 @@ soup_socket_listen (SoupSocket *sock, SoupAddress *local_addr)
sa = soup_address_get_sockaddr (local_addr, &sa_len);
g_return_val_if_fail (sa != NULL, FALSE);
- sock->priv->sockfd = socket (sa->sa_family, SOCK_STREAM, 0);
- if (sock->priv->sockfd < 0)
+ priv->sockfd = socket (sa->sa_family, SOCK_STREAM, 0);
+ if (priv->sockfd < 0)
goto cant_listen;
- update_fdflags (sock);
+ update_fdflags (priv);
/* Bind */
- if (bind (sock->priv->sockfd, sa, sa_len) != 0)
+ if (bind (priv->sockfd, sa, sa_len) != 0)
goto cant_listen;
/* Listen */
- if (listen (sock->priv->sockfd, 10) != 0)
+ if (listen (priv->sockfd, 10) != 0)
goto cant_listen;
- sock->priv->watch = g_io_add_watch (get_iochannel (sock),
- G_IO_IN | G_IO_ERR | G_IO_HUP,
- listen_watch, sock);
+ priv->watch = g_io_add_watch (get_iochannel (priv),
+ G_IO_IN | G_IO_ERR | G_IO_HUP,
+ listen_watch, sock);
return TRUE;
cant_listen:
- if (sock->priv->sockfd != -1) {
- close (sock->priv->sockfd);
- sock->priv->sockfd = -1;
+ if (priv->sockfd != -1) {
+ close (priv->sockfd);
+ priv->sockfd = -1;
}
return FALSE;
@@ -600,7 +606,9 @@ soup_socket_listen (SoupSocket *sock, SoupAddress *local_addr)
gboolean
soup_socket_start_ssl (SoupSocket *sock)
{
- return soup_socket_start_proxy_ssl (sock, soup_address_get_name (sock->priv->remote_addr));
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
+
+ return soup_socket_start_proxy_ssl (sock, soup_address_get_name (priv->remote_addr));
}
/**
@@ -616,18 +624,19 @@ soup_socket_start_ssl (SoupSocket *sock)
gboolean
soup_socket_start_proxy_ssl (SoupSocket *sock, const char *ssl_host)
{
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
GIOChannel *ssl_chan;
- get_iochannel (sock);
+ get_iochannel (priv);
ssl_chan = soup_ssl_wrap_iochannel (
- sock->priv->iochannel, sock->priv->is_server ?
+ priv->iochannel, priv->is_server ?
SOUP_SSL_TYPE_SERVER : SOUP_SSL_TYPE_CLIENT,
- ssl_host, sock->priv->ssl_creds);
+ ssl_host, priv->ssl_creds);
if (!ssl_chan)
return FALSE;
- sock->priv->iochannel = ssl_chan;
+ priv->iochannel = ssl_chan;
return TRUE;
}
@@ -683,6 +692,7 @@ soup_socket_client_new_sync (const char *hostname, guint port,
gpointer ssl_creds, guint *status_ret)
{
SoupSocket *sock;
+ SoupSocketPrivate *priv;
guint status;
g_return_val_if_fail (hostname != NULL, NULL);
@@ -690,7 +700,8 @@ soup_socket_client_new_sync (const char *hostname, guint port,
sock = g_object_new (SOUP_TYPE_SOCKET,
SOUP_SOCKET_SSL_CREDENTIALS, ssl_creds,
NULL);
- sock->priv->non_blocking = FALSE;
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
+ priv->non_blocking = FALSE;
status = soup_socket_connect (sock, soup_address_new (hostname, port));
if (!SOUP_STATUS_IS_SUCCESSFUL (status)) {
@@ -723,13 +734,15 @@ soup_socket_server_new (SoupAddress *local_addr, gpointer ssl_creds,
gpointer user_data)
{
SoupSocket *sock;
+ SoupSocketPrivate *priv;
g_return_val_if_fail (SOUP_IS_ADDRESS (local_addr), NULL);
sock = g_object_new (SOUP_TYPE_SOCKET,
SOUP_SOCKET_SSL_CREDENTIALS, ssl_creds,
NULL);
- sock->priv->is_server = TRUE;
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
+ priv->is_server = TRUE;
if (!soup_socket_listen (sock, local_addr)) {
g_object_unref (sock);
return NULL;
@@ -754,16 +767,18 @@ soup_socket_server_new (SoupAddress *local_addr, gpointer ssl_creds,
void
soup_socket_disconnect (SoupSocket *sock)
{
+ SoupSocketPrivate *priv;
gboolean already_disconnected = FALSE;
g_return_if_fail (SOUP_IS_SOCKET (sock));
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
- if (g_mutex_trylock (sock->priv->iolock)) {
- if (sock->priv->iochannel)
- disconnect_internal (sock);
+ if (g_mutex_trylock (priv->iolock)) {
+ if (priv->iochannel)
+ disconnect_internal (priv);
else
already_disconnected = TRUE;
- g_mutex_unlock (sock->priv->iolock);
+ g_mutex_unlock (priv->iolock);
} else {
int sockfd;
@@ -772,12 +787,12 @@ soup_socket_disconnect (SoupSocket *sock)
* the file descriptor out from under it.
*/
- sockfd = sock->priv->sockfd;
- sock->priv->sockfd = -1;
+ sockfd = priv->sockfd;
+ priv->sockfd = -1;
if (sockfd == -1)
already_disconnected = TRUE;
else {
- g_io_channel_set_close_on_unref (sock->priv->iochannel,
+ g_io_channel_set_close_on_unref (priv->iochannel,
FALSE);
close (sockfd);
}
@@ -806,9 +821,12 @@ soup_socket_disconnect (SoupSocket *sock)
gboolean
soup_socket_is_connected (SoupSocket *sock)
{
+ SoupSocketPrivate *priv;
+
g_return_val_if_fail (SOUP_IS_SOCKET (sock), FALSE);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
- return sock->priv->iochannel != NULL;
+ return priv->iochannel != NULL;
}
/**
@@ -822,20 +840,23 @@ soup_socket_is_connected (SoupSocket *sock)
SoupAddress *
soup_socket_get_local_address (SoupSocket *sock)
{
+ SoupSocketPrivate *priv;
+
g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
- g_mutex_lock (sock->priv->addrlock);
- if (!sock->priv->local_addr) {
+ g_mutex_lock (priv->addrlock);
+ if (!priv->local_addr) {
struct soup_sockaddr_max bound_sa;
int sa_len;
sa_len = sizeof (bound_sa);
- getsockname (sock->priv->sockfd, (struct sockaddr *)&bound_sa, &sa_len);
- sock->priv->local_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&bound_sa, sa_len);
+ getsockname (priv->sockfd, (struct sockaddr *)&bound_sa, &sa_len);
+ priv->local_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&bound_sa, sa_len);
}
- g_mutex_unlock (sock->priv->addrlock);
+ g_mutex_unlock (priv->addrlock);
- return sock->priv->local_addr;
+ return priv->local_addr;
}
/**
@@ -849,20 +870,23 @@ soup_socket_get_local_address (SoupSocket *sock)
SoupAddress *
soup_socket_get_remote_address (SoupSocket *sock)
{
+ SoupSocketPrivate *priv;
+
g_return_val_if_fail (SOUP_IS_SOCKET (sock), NULL);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
- g_mutex_lock (sock->priv->addrlock);
- if (!sock->priv->remote_addr) {
+ g_mutex_lock (priv->addrlock);
+ if (!priv->remote_addr) {
struct soup_sockaddr_max bound_sa;
int sa_len;
sa_len = sizeof (bound_sa);
- getpeername (sock->priv->sockfd, (struct sockaddr *)&bound_sa, &sa_len);
- sock->priv->remote_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&bound_sa, sa_len);
+ getpeername (priv->sockfd, (struct sockaddr *)&bound_sa, &sa_len);
+ priv->remote_addr = soup_address_new_from_sockaddr ((struct sockaddr *)&bound_sa, sa_len);
}
- g_mutex_unlock (sock->priv->addrlock);
+ g_mutex_unlock (priv->addrlock);
- return sock->priv->remote_addr;
+ return priv->remote_addr;
}
@@ -872,8 +896,9 @@ static gboolean
socket_read_watch (GIOChannel *chan, GIOCondition cond, gpointer user_data)
{
SoupSocket *sock = user_data;
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
- sock->priv->read_tag = 0;
+ priv->read_tag = 0;
g_signal_emit (sock, signals[READABLE], 0);
return FALSE;
@@ -882,14 +907,15 @@ socket_read_watch (GIOChannel *chan, GIOCondition cond, gpointer user_data)
static SoupSocketIOStatus
read_from_network (SoupSocket *sock, gpointer buffer, gsize len, gsize *nread)
{
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
GIOStatus status;
GIOCondition cond = G_IO_IN;
GError *err = NULL;
- if (!sock->priv->iochannel)
+ if (!priv->iochannel)
return SOUP_SOCKET_EOF;
- status = g_io_channel_read_chars (sock->priv->iochannel,
+ status = g_io_channel_read_chars (priv->iochannel,
buffer, len, nread, &err);
if (err) {
if (err->domain == SOUP_SSL_ERROR &&
@@ -910,9 +936,9 @@ read_from_network (SoupSocket *sock, gpointer buffer, gsize len, gsize *nread)
if (*nread > 0)
return SOUP_SOCKET_OK;
- if (!sock->priv->read_tag) {
- sock->priv->read_tag =
- g_io_add_watch (sock->priv->iochannel, cond,
+ if (!priv->read_tag) {
+ priv->read_tag =
+ g_io_add_watch (priv->iochannel, cond,
socket_read_watch, sock);
}
return SOUP_SOCKET_WOULD_BLOCK;
@@ -928,14 +954,15 @@ read_from_network (SoupSocket *sock, gpointer buffer, gsize len, gsize *nread)
static SoupSocketIOStatus
read_from_buf (SoupSocket *sock, gpointer buffer, gsize len, gsize *nread)
{
- GByteArray *read_buf = sock->priv->read_buf;
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
+ GByteArray *read_buf = priv->read_buf;
*nread = MIN (read_buf->len, len);
memcpy (buffer, read_buf->data, *nread);
if (*nread == read_buf->len) {
g_byte_array_free (read_buf, TRUE);
- sock->priv->read_buf = NULL;
+ priv->read_buf = NULL;
} else {
memmove (read_buf->data, read_buf->data + *nread,
read_buf->len - *nread);
@@ -971,16 +998,18 @@ read_from_buf (SoupSocket *sock, gpointer buffer, gsize len, gsize *nread)
SoupSocketIOStatus
soup_socket_read (SoupSocket *sock, gpointer buffer, gsize len, gsize *nread)
{
+ SoupSocketPrivate *priv;
SoupSocketIOStatus status;
g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
- g_mutex_lock (sock->priv->iolock);
- if (sock->priv->read_buf)
+ g_mutex_lock (priv->iolock);
+ if (priv->read_buf)
status = read_from_buf (sock, buffer, len, nread);
else
status = read_from_network (sock, buffer, len, nread);
- g_mutex_unlock (sock->priv->iolock);
+ g_mutex_unlock (priv->iolock);
return status;
}
@@ -1008,21 +1037,23 @@ soup_socket_read_until (SoupSocket *sock, gpointer buffer, gsize len,
gconstpointer boundary, gsize boundary_len,
gsize *nread, gboolean *got_boundary)
{
+ SoupSocketPrivate *priv;
SoupSocketIOStatus status;
GByteArray *read_buf;
guint match_len, prev_len;
guint8 *p, *end;
g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
g_return_val_if_fail (len >= boundary_len, SOUP_SOCKET_ERROR);
- g_mutex_lock (sock->priv->iolock);
+ g_mutex_lock (priv->iolock);
*got_boundary = FALSE;
- if (!sock->priv->read_buf)
- sock->priv->read_buf = g_byte_array_new ();
- read_buf = sock->priv->read_buf;
+ if (!priv->read_buf)
+ priv->read_buf = g_byte_array_new ();
+ read_buf = priv->read_buf;
if (read_buf->len < boundary_len) {
prev_len = read_buf->len;
@@ -1033,7 +1064,7 @@ soup_socket_read_until (SoupSocket *sock, gpointer buffer, gsize len,
read_buf->len = prev_len + *nread;
if (status != SOUP_SOCKET_OK) {
- g_mutex_unlock (sock->priv->iolock);
+ g_mutex_unlock (priv->iolock);
return status;
}
}
@@ -1055,7 +1086,7 @@ soup_socket_read_until (SoupSocket *sock, gpointer buffer, gsize len,
match_len = p - read_buf->data;
status = read_from_buf (sock, buffer, MIN (len, match_len), nread);
- g_mutex_unlock (sock->priv->iolock);
+ g_mutex_unlock (priv->iolock);
return status;
}
@@ -1063,8 +1094,9 @@ static gboolean
socket_write_watch (GIOChannel *chan, GIOCondition condition, gpointer user_data)
{
SoupSocket *sock = user_data;
+ SoupSocketPrivate *priv = SOUP_SOCKET_GET_PRIVATE (sock);
- sock->priv->write_tag = 0;
+ priv->write_tag = 0;
g_signal_emit (sock, signals[WRITABLE], 0);
return FALSE;
@@ -1095,26 +1127,28 @@ SoupSocketIOStatus
soup_socket_write (SoupSocket *sock, gconstpointer buffer,
gsize len, gsize *nwrote)
{
+ SoupSocketPrivate *priv;
GIOStatus status;
gpointer pipe_handler;
GIOCondition cond = G_IO_OUT;
GError *err = NULL;
g_return_val_if_fail (SOUP_IS_SOCKET (sock), SOUP_SOCKET_ERROR);
+ priv = SOUP_SOCKET_GET_PRIVATE (sock);
- g_mutex_lock (sock->priv->iolock);
+ g_mutex_lock (priv->iolock);
- if (!sock->priv->iochannel) {
- g_mutex_unlock (sock->priv->iolock);
+ if (!priv->iochannel) {
+ g_mutex_unlock (priv->iolock);
return SOUP_SOCKET_EOF;
}
- if (sock->priv->write_tag) {
- g_mutex_unlock (sock->priv->iolock);
+ if (priv->write_tag) {
+ g_mutex_unlock (priv->iolock);
return SOUP_SOCKET_WOULD_BLOCK;
}
pipe_handler = signal (SIGPIPE, SIG_IGN);
- status = g_io_channel_write_chars (sock->priv->iochannel,
+ status = g_io_channel_write_chars (priv->iochannel,
buffer, len, nwrote, &err);
signal (SIGPIPE, pipe_handler);
if (err) {
@@ -1131,18 +1165,18 @@ soup_socket_write (SoupSocket *sock, gconstpointer buffer,
}
if (status != G_IO_STATUS_NORMAL && status != G_IO_STATUS_AGAIN) {
- g_mutex_unlock (sock->priv->iolock);
+ g_mutex_unlock (priv->iolock);
return SOUP_SOCKET_ERROR;
}
if (*nwrote) {
- g_mutex_unlock (sock->priv->iolock);
+ g_mutex_unlock (priv->iolock);
return SOUP_SOCKET_OK;
}
- sock->priv->write_tag =
- g_io_add_watch (sock->priv->iochannel, cond,
+ priv->write_tag =
+ g_io_add_watch (priv->iochannel, cond,
socket_write_watch, sock);
- g_mutex_unlock (sock->priv->iolock);
+ g_mutex_unlock (priv->iolock);
return SOUP_SOCKET_WOULD_BLOCK;
}