loudmouth/lm-socket.c
author hallski <hallski>
Mon, 31 Jul 2006 23:14:32 +0000
changeset 161 05ddf1d0440f
parent 154 207483c02cfc
child 196 209bfa124066
permissions -rw-r--r--
2006-08-01 Mikael Hallendal <micke@imendio.com> * loudmouth/lm-ssl-gnutls.c: (_lm_ssl_read): - EOF on 0 bytes read. - Fixes LM-45.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     2
/*
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     3
 * Copyright (C) 2006 Imendio AB
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     4
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     9
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    14
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    19
 */
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    20
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    21
#include "lm-socket.h"
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    22
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    23
#ifndef G_OS_WIN32
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    24
typedef int LmSock;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    25
#else  /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    26
typedef SOCKET LmSock;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    27
#endif /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    28
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    29
/* FIXME: Integrate with the SSL stuff */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    30
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    31
/* FIXME: IO Buffering both in/out here? */
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    32
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    33
struct _LmSocket {
151
hallski <hallski>
parents: 150
diff changeset
    34
	LmSock          sock;
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    35
	GIOChannel     *io_channel;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    36
	guint           io_watch;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    37
	/* FIXME: Add the rest */
151
hallski <hallski>
parents: 150
diff changeset
    38
hallski <hallski>
parents: 150
diff changeset
    39
	LmSSL          *ssl;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    40
	
151
hallski <hallski>
parents: 150
diff changeset
    41
	LmSocketFuncs   funcs;
hallski <hallski>
parents: 150
diff changeset
    42
	
hallski <hallski>
parents: 150
diff changeset
    43
	LmSocketState   state;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    44
151
hallski <hallski>
parents: 150
diff changeset
    45
	gboolean        is_blocking;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    46
	
151
hallski <hallski>
parents: 150
diff changeset
    47
	gint            ref;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    48
};
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    49
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    50
typedef void   (* SocketDNSCallback)  (LmSocket      *socket,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    51
				       SocketDNSData *data,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    52
				       gboolean       success);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    53
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    54
typedef struct {
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    55
	/* Used when socket tries to connect */
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    56
	struct addrinfo   *resolved_addrs;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    57
	struct addrinfo   *current_addr;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    58
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    59
	/* -- Internal during DNS lookup -- */
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    60
	LmSocket          *socket;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    61
	gchar             *host;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    62
	SocketDNSCallback  callback;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    63
} SocketDNSData;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    64
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    65
static LmSocket *  socket_create            (void);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    66
static void        socket_free              (LmSocket          *socket);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    67
static gboolean    socket_channel_event     (GIOChannel        *source,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    68
					     GIOCondition       condition,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    69
					     LmSocket          *socket);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    70
static void        socket_dns_lookup        (LmSocket          *socket,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    71
					     const gchar       *host,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    72
					     SocketDNSCallback  callback);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    73
static SocketDNSData * socket_dns_data_new  (LmSocket          *socket,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    74
					     const gchar       *host,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    75
					     SocketDNSCallback  callbac);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    76
static void            socket_dns_data_free (SocketDNSData     *data);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    77
static void            socket_start_connect (LmSocket          *socket,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    78
					     SocketDNSData     *data,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    79
					     gboolean           success);
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    80
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    81
static LmSocket *
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    82
socket_create (void)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    83
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    84
	LmSocket *socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    85
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    86
	socket = g_new0 (LmSocket, 1);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    87
	socket->ref_count = 1;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    88
	socket->is_blocking = FALSE;
151
hallski <hallski>
parents: 150
diff changeset
    89
	socket->state = LM_SOCKET_STATE_CLOSED;
hallski <hallski>
parents: 150
diff changeset
    90
	socket->ssl = NULL;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    91
	
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    92
	return socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    93
}
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    94
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    95
static void
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    96
socket_free (LmSocket *socket)
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    97
{
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    98
	/* FIXME: Free up the rest of the memory */
151
hallski <hallski>
parents: 150
diff changeset
    99
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   100
	if (socket->io_channel) {
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   101
		if (socket->io_watch != 0) {
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   102
			g_source_destroy (g_main_context_find_source_by_id (socket->context),
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   103
					  socket->io_watch);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   104
			socket->io_watch = 0;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   105
		}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   106
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   107
		g_io_channel_unref (socket->io_channel);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   108
		socket->io_channel = NULL;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   109
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   110
		socket->fd = -1;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   111
	}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   112
151
hallski <hallski>
parents: 150
diff changeset
   113
	if (socket->ssl) {
hallski <hallski>
parents: 150
diff changeset
   114
		_lm_ssl_unref (socket->ssl);
hallski <hallski>
parents: 150
diff changeset
   115
	}
hallski <hallski>
parents: 150
diff changeset
   116
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   117
	g_free (socket->host);
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   118
	g_free (socket);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   119
}
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   120
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   121
static gboolean
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   122
socket_channel_event (GIOChannel   *source,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   123
		      GIOCondition  condition,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   124
		      LmSocket     *socket)
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   125
{
161
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   126
	if (condition & G_IO_IN)  {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   127
		socket_signal_read_available ();
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   128
	}
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   129
	if (condition & G_IO_OUT) {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   130
		socket_attempt_write ();
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   131
	}
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   132
	if (condition & G_IO_ERR ||
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   133
	    condition & G_IO_HUP) {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   134
		socket_disconnected ();
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   135
	}
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   136
}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   137
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   138
static void
161
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   139
socket_dns_lookup (LmSocket          *socket,
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   140
		   const gchar       *host,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   141
		   SocketDNSCallback  callback);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   142
{
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   143
	SocketDNSData   *data;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   144
	struct addrinfo  req;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   145
	struct addrinfo  ans;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   146
	int              err;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   147
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   148
	/* FIXME: This should not be synchronous */
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   149
	data = socket_dns_data_new (socket, host, callback);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   150
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   151
	memset (&req, 0, sizeof (req));
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   152
	req.ai_family   = AF_UNSPEC;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   153
	req.ai_socktype = SOCK_STREAM;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   154
	req.ai_protocol = IPPROTO_TCP;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   155
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   156
	err = getaddrinfo (data->host, NULL, &req, &ans);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   157
	if (err != 0) {
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   158
		/* FIXME: Handle error */
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   159
		data->callback (data->socket, data, FALSE);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   160
	}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   161
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   162
	data->resolved_addrs = ans;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   163
	data->current_addr   = ans;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   164
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   165
	data->callback (data->socket, data, TRUE);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   166
}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   167
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   168
static SocketDNSData *
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   169
socket_dns_data_new (LmSocket          *socket,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   170
		     const gchar       *host,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   171
		     SocketDNSCallback  callbac)
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   172
{
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   173
	SocketDNSData *data;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   174
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   175
	data = g_new0 (SocketDNSData, 1);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   176
	
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   177
	data->socket   = lm_socket_ref (socket);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   178
	data->host     = g_strdup (host);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   179
	data->callback = callback;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   180
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   181
	data->resolved_addrs = data->current_addr = NULL;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   182
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   183
	return data;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   184
}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   185
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   186
static void
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   187
socket_dns_data_free (SocketDNSData *data)
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   188
{
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   189
	lm_socket_unref (data->socket);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   190
	g_free (data->host);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   191
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   192
	if (data->resolved_addrs) {
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   193
		freeaddrinfo (data->resolved_addrs);;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   194
		deta->resolved_addrs = NULL;
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   195
	}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   196
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   197
	g_free (data);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   198
}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   199
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   200
static void
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   201
socket_start_connect (LmSocket      *socket,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   202
		      SocketDNSData *data,
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   203
		      gboolean       success)
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   204
{
161
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   205
	struct addrinfo *addr;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   206
	int              port;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   207
	char             name[NI_MAXHOST];
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   208
	char             portname[NI_MAXSERV];
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   209
	gint             fd;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   210
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   211
	if (!success) {
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   212
		socket_dns_data_free (data);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   213
		/* FIXME: Report error */
161
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   214
		return;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   215
	}
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   216
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   217
	addr = data->current_addr;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   218
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   219
	if (socket->proxy) {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   220
		port = htons (lm_proxy_get_port (socket->proxy));
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   221
	} else {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   222
		port = htons (socket->port);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   223
	}
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   224
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   225
	((struct sockaddr_in *) addr->ai_addr)->sin_port = port;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   226
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   227
	res = getnameinfo (addr->ai_addr,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   228
			   (socklen_t) addr->ai_addrlen,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   229
			   name, sizeof (name),
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   230
			   portname, sizeof (portname),
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   231
			   NI_NUMERICHOST | NI_NUMERICSERV);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   232
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   233
	if (res < 0) {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   234
		/* FIXME: Report failure */
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   235
		return;
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   236
	}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   237
161
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   238
	fd = _lm_sock_makesocket (addr->ai_family,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   239
				  addr->ai_socktype,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   240
				  addr->ai_protocol);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   241
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   242
	if (!_LM_SOCK_VALID (fd)) {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   243
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, 
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   244
		       "Failed making socket, error:%d...\n",
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   245
		       _lm_sock_get_last_error ());
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   246
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   247
		/* FIXME: Report failure */
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   248
		return;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   249
	}
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   250
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   251
	/* Even though it says _unix_new(), it is supported by glib on
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   252
	 * win32 because glib does some cool stuff to find out if it
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   253
	 * can treat it as a FD or a windows SOCKET.
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   254
	 */
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   255
	socket->fd = fd;
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   256
	socket->io_channel = g_io_channel_unix_new (fd);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   257
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   258
	g_io_channel_set_encoding (connect_data->io_channel, NULL, NULL);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   259
	g_io_channel_set_buffered (connect_data->io_channel, FALSE);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   260
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   261
	_lm_sock_set_blocking (socket->fd, FALSE);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   262
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   263
	if (socket->proxy) {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   264
		socket->io_watch_connect =
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   265
			socket_add_watch (socket,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   266
					  socket->io_channel,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   267
					  G_IO_IN|G_IO_OUT|G_IO_ERR|G_IO_HUP,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   268
					  (GIOFunc) _lm_proxy_connect_cb, 
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   269
					  socket);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   270
	} else {
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   271
		socket->io_watch_connect =
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   272
			socket_add_watch (socket,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   273
					  socket->io_channel,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   274
					  G_IO_IN|G_IO_OUT|G_IO_ERR|G_IO_HUP, 
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   275
					  (GIOFunc) socket_connect_cb,
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   276
					  socket);
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   277
	}
05ddf1d0440f 2006-08-01 Mikael Hallendal <micke@imendio.com>
hallski <hallski>
parents: 154
diff changeset
   278
	
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   279
	/* FIXME: Continue and connect */
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   280
}
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   281
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   282
LmSocket *
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   283
lm_socket_new (LmSocketFuncs funcs, const gchar *host, guint port)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   284
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   285
	LmSocket *socket;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   286
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   287
	socket = socket_create ();
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   288
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   289
	socket->funcs = funcs;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   290
	socket->host = g_strdup (host);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   291
	socket->port = port;
151
hallski <hallski>
parents: 150
diff changeset
   292
	socket->is_blocking = FALSE;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   293
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   294
	return socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   295
}
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   296
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   297
void
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   298
lm_socket_open (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   299
{
151
hallski <hallski>
parents: 150
diff changeset
   300
	g_return_if_fail (socket != NULL);
hallski <hallski>
parents: 150
diff changeset
   301
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   302
	socket_dns_lookup (socket, socket->host, socket_start_connect);
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   303
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   304
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   305
int
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   306
lm_socket_get_fd (LmSocket *socket)
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   307
{
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   308
	g_return_val_if_fail (socket != NULL, -1);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   309
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   310
	return socket->fd;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   311
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   312
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   313
gboolean
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   314
lm_socket_get_is_blocking (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   315
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   316
	return socket->is_blocking;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   317
}
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   318
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   319
void
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   320
lm_socket_set_is_blocking (LmSocket *socket, gboolean is_block)
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   321
{
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   322
	int res;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   323
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   324
	g_return_if_fail (socket != NULL);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   325
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   326
	/* FIXME: Don't unset all flags */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   327
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   328
#ifndef G_OS_WIN32
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   329
	res = fcntl (socket->sock, F_SETFL, is_block ? 0 : O_NONBLOCK);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   330
#else  /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   331
	u_long mode = (is_block ? 0 : 1);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   332
	res = ioctlsocket (socket->sock, FIONBIO, &mode);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   333
#endif /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   334
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   335
	if (res != 0) {
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   336
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   337
		       "Could not set socket to be %s\n",
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   338
		       block ? "blocking" : "non-blocking");
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   339
	}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   340
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   341
	socket->is_blocking = is_block;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   342
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   343
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   344
int
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   345
lm_socket_write (LmSocket   *socket,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   346
		 gsize       size,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   347
		 gchar      *buf,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   348
		 GError    **error)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   349
{
151
hallski <hallski>
parents: 150
diff changeset
   350
	gint b_written;
hallski <hallski>
parents: 150
diff changeset
   351
	
hallski <hallski>
parents: 150
diff changeset
   352
	g_return_val_if_fail (socket != NULL, -1);
hallski <hallski>
parents: 150
diff changeset
   353
hallski <hallski>
parents: 150
diff changeset
   354
	if (socket->ssl) {
hallski <hallski>
parents: 150
diff changeset
   355
		b_written = _lm_ssl_send (socket->ssl, buf, len);
hallski <hallski>
parents: 150
diff changeset
   356
	} else {
hallski <hallski>
parents: 150
diff changeset
   357
		GIOStatus io_status = G_IO_STATUS_AGAIN;
hallski <hallski>
parents: 150
diff changeset
   358
		gsize     bytes_written = 0;
hallski <hallski>
parents: 150
diff changeset
   359
hallski <hallski>
parents: 150
diff changeset
   360
		while (io_status == G_IO_STATUS_AGAIN) {
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   361
			io_status = g_io_channel_write_chars (socket->io_channel,
151
hallski <hallski>
parents: 150
diff changeset
   362
							      buf, size,
hallski <hallski>
parents: 150
diff changeset
   363
							      &bytes_written,
hallski <hallski>
parents: 150
diff changeset
   364
							      NULL);
hallski <hallski>
parents: 150
diff changeset
   365
		}
hallski <hallski>
parents: 150
diff changeset
   366
hallski <hallski>
parents: 150
diff changeset
   367
		b_written = bytes_written;
hallski <hallski>
parents: 150
diff changeset
   368
hallski <hallski>
parents: 150
diff changeset
   369
		if (io_status != G_IO_STATUS_NORMAL) {
hallski <hallski>
parents: 150
diff changeset
   370
			b_written = -1;
hallski <hallski>
parents: 150
diff changeset
   371
		}
hallski <hallski>
parents: 150
diff changeset
   372
	}
hallski <hallski>
parents: 150
diff changeset
   373
hallski <hallski>
parents: 150
diff changeset
   374
	return b_written;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   375
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   376
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   377
int
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   378
lm_socket_read (LmSocket   *socket,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   379
		gsize       size,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   380
		gchar      *buf,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   381
		GError    **error)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   382
{
151
hallski <hallski>
parents: 150
diff changeset
   383
	gsize     bytes_read = 0;
hallski <hallski>
parents: 150
diff changeset
   384
	GIOStatus status =  G_IO_STATUS_AGAIN;
hallski <hallski>
parents: 150
diff changeset
   385
hallski <hallski>
parents: 150
diff changeset
   386
	g_return_val_if_fail (socket != NULL, -1);
hallski <hallski>
parents: 150
diff changeset
   387
hallski <hallski>
parents: 150
diff changeset
   388
	while (status == G_IO_STATUS_AGAIN) {
hallski <hallski>
parents: 150
diff changeset
   389
		if (socket->ssl) {
hallski <hallski>
parents: 150
diff changeset
   390
			status = _lm_ssl_read (socket->ssl, 
hallski <hallski>
parents: 150
diff changeset
   391
					       buf, size, &bytes_read);
hallski <hallski>
parents: 150
diff changeset
   392
		} else {
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   393
			status = g_io_channel_read_chars (socket->io_channel, 
151
hallski <hallski>
parents: 150
diff changeset
   394
							  buf, size, 
hallski <hallski>
parents: 150
diff changeset
   395
							  &bytes_read,
hallski <hallski>
parents: 150
diff changeset
   396
							  NULL);
hallski <hallski>
parents: 150
diff changeset
   397
		}
hallski <hallski>
parents: 150
diff changeset
   398
	}
hallski <hallski>
parents: 150
diff changeset
   399
hallski <hallski>
parents: 150
diff changeset
   400
	if (status != G_IO_STATUS_NORMAL || bytes_read < 0) {
hallski <hallski>
parents: 150
diff changeset
   401
		/* FIXME: Set error */
hallski <hallski>
parents: 150
diff changeset
   402
hallski <hallski>
parents: 150
diff changeset
   403
		return -1;
hallski <hallski>
parents: 150
diff changeset
   404
	}
hallski <hallski>
parents: 150
diff changeset
   405
hallski <hallski>
parents: 150
diff changeset
   406
	return bytes_read;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   407
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   408
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   409
gboolean
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   410
lm_socket_close (LmSocket *socket, GError **error)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   411
{
150
18a91b086713 some more
hallski <hallski>
parents: 149
diff changeset
   412
#ifndef G_OS_WIN32
18a91b086713 some more
hallski <hallski>
parents: 149
diff changeset
   413
	close (socket->sock);
18a91b086713 some more
hallski <hallski>
parents: 149
diff changeset
   414
#else /* G_OS_WIN32 */
18a91b086713 some more
hallski <hallski>
parents: 149
diff changeset
   415
	closesocket (socket->sock);
18a91b086713 some more
hallski <hallski>
parents: 149
diff changeset
   416
#endif /* G_OS_WIN32 */
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   417
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   418
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   419
LmSocket *
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   420
lm_socket_ref (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   421
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   422
	g_return_val_if_fail (socket != NULL, NULL);
151
hallski <hallski>
parents: 150
diff changeset
   423
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   424
	socket->ref++;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   425
	
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   426
	return socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   427
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   428
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   429
void
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   430
lm_socket_unref (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   431
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   432
	g_return_if_fail (socket != NULL);
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   433
	
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   434
	socket->ref--;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   435
	
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   436
	if (socket->ref <= 0) {
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   437
		socket_free (socket);
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   438
	}
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   439
}
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   440