loudmouth/lm-socket.c
author Owen Taylor <otaylor@redhat.com>
Mon, 25 Feb 2008 23:13:58 +0100
changeset 343 35a19649d773
parent 338 e89c3874d6eb
child 344 11473296fea5
permissions -rw-r--r--
Fixed reentrancy problem for async connections. Fixes first bit of LM-117. Patch adding reference to sockets in places where otherwise we can run into trouble where the user callback causes the socket to be freed. (Note that we actually double ref the socket in some cases ...both inside lm_socket_fail_with_error() and in the caller. This is, of course, harmless, and needed because the inner ref is necessary to handle the calls to _lm_socket_fail_with_error() from lm-proxy.c, the outer ref necessary because we reference socket after calling _lm_socket_fail_with_error()) committer: Mikael Hallendal <micke@imendio.com>
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
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
     4
 * Copyright (C) 2006 Nokia Corporation. All rights reserved.
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
     5
 * Copyright (C) 2007 Collabora Ltd.
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     6
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     7
 * This program is free software; you can redistribute it and/or
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     8
 * 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
     9
 * published by the Free Software Foundation; either version 2 of the
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    10
 * License, or (at your option) any later version.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    11
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    12
 * This program is distributed in the hope that it will be useful,
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    15
 * Lesser General Public License for more details.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    16
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    17
 * You should have received a copy of the GNU Lesser General Public
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    18
 * License along with this program; if not, write to the
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    19
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    20
 * Boston, MA 02111-1307, USA.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    21
 */
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    22
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    23
#include <config.h>
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    24
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    25
#include <string.h>
257
d2df6b962601 Compile fix for Solaris
Mikael Hallendal <micke@imendio.com>
parents: 256
diff changeset
    26
#include <sys/types.h>
337
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    27
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    28
/* Needed on Mac OS X */
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    29
#if HAVE_NETINET_IN_H
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    30
#include <netinet/in.h>
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    31
#endif
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    32
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    33
/* Needed on Mac OS X */
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    34
#if HAVE_ARPA_NAMESER_COMPAT_H
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    35
#include <arpa/nameser_compat.h>
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    36
#endif
7bc0c6ad11ff Fixes LM-118 so that building on Mac OS X works again.
Richard Hult <richard@imendio.com>
parents: 325
diff changeset
    37
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
    38
#include <arpa/nameser.h>
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
    39
#include <resolv.h>
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    40
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    41
#include "lm-debug.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    42
#include "lm-internals.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    43
#include "lm-misc.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    44
#include "lm-ssl.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    45
#include "lm-ssl-internals.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    46
#include "lm-proxy.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    47
#include "lm-socket.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    48
#include "lm-sock.h"
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    49
#include "lm-error.h"
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    50
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    51
#ifdef HAVE_ASYNCNS
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    52
#include <asyncns.h>
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    53
#define freeaddrinfo(x) asyncns_freeaddrinfo(x)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    54
#endif
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    55
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    56
#define IN_BUFFER_SIZE 1024
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    57
#define MIN_PORT 1
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    58
#define MAX_PORT 65536
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
    59
#define SRV_LEN 8192
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    60
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    61
struct _LmSocket {
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    62
	LmConnection *connection;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    63
	GMainContext *context;
151
hallski <hallski>
parents: 150
diff changeset
    64
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
    65
	gchar        *domain;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    66
	gchar        *server;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    67
	guint         port;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    68
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    69
	gboolean      blocking;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    70
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    71
	LmSSL        *ssl;
298
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
    72
	gboolean      ssl_started;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    73
	LmProxy      *proxy;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    74
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    75
	GIOChannel   *io_channel;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    76
	GSource      *watch_in;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    77
	GSource      *watch_err;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    78
	GSource      *watch_hup;
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    79
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    80
	LmSocketT      fd;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    81
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    82
	GSource      *watch_connect;
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
    83
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    84
	gboolean      cancel_open;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    85
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    86
	GSource      *watch_out;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    87
	GString      *out_buf;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    88
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    89
	LmConnectData *connect_data;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    90
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
    91
	IncomingDataFunc data_func;
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
    92
	SocketClosedFunc closed_func;
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
    93
	ConnectResultFunc connect_func;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    94
	gpointer         user_data;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    95
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
    96
	guint          ref_count;
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    97
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    98
#ifdef HAVE_ASYNCNS
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
    99
	GSource		*watch_resolv;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   100
	asyncns_query_t *resolv_query;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   101
	asyncns_t	*asyncns_ctx;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   102
	GIOChannel	*resolv_channel;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   103
#endif
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   104
}; 
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   105
249
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   106
static void         socket_free               (LmSocket       *socket);
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   107
static gboolean     socket_do_connect         (LmConnectData  *connect_data);
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   108
static gboolean     socket_connect_cb         (GIOChannel     *source, 
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   109
					       GIOCondition    condition,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   110
					       LmConnectData  *connect_data);
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   111
static gboolean     socket_in_event           (GIOChannel     *source,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   112
					       GIOCondition    condition,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   113
					       LmSocket       *socket);
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   114
static gboolean     socket_hup_event          (GIOChannel     *source,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   115
					       GIOCondition    condition,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   116
					       LmSocket       *socket);
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   117
static gboolean     socket_error_event        (GIOChannel     *source,
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   118
					       GIOCondition    condition,
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   119
					       LmSocket       *socket);
249
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   120
static gboolean     socket_buffered_write_cb  (GIOChannel     *source, 
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   121
					       GIOCondition    condition,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   122
					       LmSocket       *socket);
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   123
static gboolean     socket_parse_srv_response (unsigned char  *srv, 
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   124
					       int             srv_len, 
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   125
					       gchar         **out_server, 
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   126
					       guint          *out_port);
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   127
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   128
static void
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   129
socket_free (LmSocket *socket)
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   130
{
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   131
	g_free (socket->server);
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   132
	g_free (socket->domain);
151
hallski <hallski>
parents: 150
diff changeset
   133
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   134
	if (socket->ssl) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   135
		lm_ssl_unref (socket->ssl);
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   136
	}
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   137
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   138
	if (socket->proxy) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   139
		lm_proxy_unref (socket->proxy);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   140
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   141
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   142
	if (socket->out_buf) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   143
		g_string_free (socket->out_buf, TRUE);
151
hallski <hallski>
parents: 150
diff changeset
   144
	}
hallski <hallski>
parents: 150
diff changeset
   145
154
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   146
	g_free (socket);
207483c02cfc bus hacking
hallski <hallski>
parents: 151
diff changeset
   147
}
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   148
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   149
gint
249
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   150
lm_socket_do_write (LmSocket *socket, const gchar *buf, gint len)
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   151
{
151
hallski <hallski>
parents: 150
diff changeset
   152
	gint b_written;
hallski <hallski>
parents: 150
diff changeset
   153
298
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
   154
	if (socket->ssl_started) {
151
hallski <hallski>
parents: 150
diff changeset
   155
		b_written = _lm_ssl_send (socket->ssl, buf, len);
hallski <hallski>
parents: 150
diff changeset
   156
	} else {
hallski <hallski>
parents: 150
diff changeset
   157
		GIOStatus io_status = G_IO_STATUS_AGAIN;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   158
		gsize     bytes_written;
151
hallski <hallski>
parents: 150
diff changeset
   159
hallski <hallski>
parents: 150
diff changeset
   160
		while (io_status == G_IO_STATUS_AGAIN) {
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   161
			io_status = g_io_channel_write_chars (socket->io_channel, 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   162
							      buf, len, 
151
hallski <hallski>
parents: 150
diff changeset
   163
							      &bytes_written,
hallski <hallski>
parents: 150
diff changeset
   164
							      NULL);
hallski <hallski>
parents: 150
diff changeset
   165
		}
hallski <hallski>
parents: 150
diff changeset
   166
hallski <hallski>
parents: 150
diff changeset
   167
		b_written = bytes_written;
hallski <hallski>
parents: 150
diff changeset
   168
hallski <hallski>
parents: 150
diff changeset
   169
		if (io_status != G_IO_STATUS_NORMAL) {
hallski <hallski>
parents: 150
diff changeset
   170
			b_written = -1;
hallski <hallski>
parents: 150
diff changeset
   171
		}
hallski <hallski>
parents: 150
diff changeset
   172
	}
hallski <hallski>
parents: 150
diff changeset
   173
hallski <hallski>
parents: 150
diff changeset
   174
	return b_written;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   175
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   176
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   177
static gboolean
249
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   178
socket_read_incoming (LmSocket *socket,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   179
		      gchar    *buf,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   180
		      gsize     buf_size,
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   181
		      gsize    *bytes_read,
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   182
		      gboolean *hangup,
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   183
		      gint     *reason)
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   184
{
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   185
	GIOStatus status;
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   186
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   187
	*hangup = FALSE;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   188
298
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
   189
	if (socket->ssl_started) {
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   190
		status = _lm_ssl_read (socket->ssl, 
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   191
				       buf, buf_size - 1, bytes_read);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   192
	} else {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   193
		status = g_io_channel_read_chars (socket->io_channel,
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   194
						  buf, buf_size - 1,
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   195
						  bytes_read,
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   196
						  NULL);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   197
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   198
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   199
	if (status != G_IO_STATUS_NORMAL || *bytes_read < 0) {
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   200
		switch (status) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   201
		case G_IO_STATUS_EOF:
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   202
			*reason = LM_DISCONNECT_REASON_HUP;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   203
			break;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   204
		case G_IO_STATUS_AGAIN:
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   205
			/* No data readable but we didn't hangup */
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   206
			return FALSE;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   207
			break;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   208
		case G_IO_STATUS_ERROR:
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   209
			*reason = LM_DISCONNECT_REASON_ERROR;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   210
			break;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   211
		default:
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   212
			*reason = LM_DISCONNECT_REASON_UNKNOWN;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   213
		}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   214
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   215
		/* Notify connection_in_event that we hangup the connection */
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   216
		*hangup = TRUE;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   217
		
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   218
		return FALSE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   219
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   220
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   221
	buf[*bytes_read] = '\0';
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   222
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   223
	/* There is more data to be read */
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   224
	return TRUE;
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   225
}
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   226
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   227
static gboolean
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   228
socket_in_event (GIOChannel   *source,
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   229
		     GIOCondition  condition,
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   230
		     LmSocket     *socket)
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   231
{
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   232
	gchar     buf[IN_BUFFER_SIZE];
322
9d591fb31bc2 Make blocking reads work
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 308
diff changeset
   233
	gsize     bytes_read = 0;
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   234
	gboolean  read_anything = FALSE;
322
9d591fb31bc2 Make blocking reads work
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 308
diff changeset
   235
	gboolean  hangup = 0;
9d591fb31bc2 Make blocking reads work
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 308
diff changeset
   236
	gint      reason = 0;
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   237
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   238
	if (!socket->io_channel) {
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   239
		return FALSE;
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   240
	}
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   241
322
9d591fb31bc2 Make blocking reads work
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 308
diff changeset
   242
	while ((condition & G_IO_IN) && socket_read_incoming (socket, buf, IN_BUFFER_SIZE, 
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   243
				     &bytes_read, &hangup, &reason)) {
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   244
		
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   245
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, "\nRECV [%d]:\n", 
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   246
		       (int)bytes_read);
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   247
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, 
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   248
		       "-----------------------------------\n");
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   249
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, "'%s'\n", buf);
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   250
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, 
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   251
		       "-----------------------------------\n");
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   252
		
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   253
		lm_verbose ("Read: %d chars\n", (int)bytes_read);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   254
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   255
		(socket->data_func) (socket, buf, socket->user_data);
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   256
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   257
		read_anything = TRUE;
322
9d591fb31bc2 Make blocking reads work
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 308
diff changeset
   258
9d591fb31bc2 Make blocking reads work
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 308
diff changeset
   259
		condition = g_io_channel_get_buffer_condition (socket->io_channel);
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   260
	}
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   261
272
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   262
	/* If we have read something, delay the hangup so that the data can be
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   263
	 * processed. */
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   264
	if (hangup && !read_anything) {
00c0890d19c0 If data was read before hangup, delay signalling hangup so that the data can
Dafydd Harries <daf@rhydd.org>
parents: 271
diff changeset
   265
		(socket->closed_func) (socket, reason, socket->user_data);
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   266
		return FALSE;
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   267
	}
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   268
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   269
	return TRUE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   270
}
202
42d0b1ed1b96 Forward port of fix to LM-71.
Mikael Hallendal <micke@imendio.com>
parents: 196
diff changeset
   271
	
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   272
static gboolean
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   273
socket_hup_event (GIOChannel   *source,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   274
		      GIOCondition  condition,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   275
		      LmSocket     *socket)
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   276
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   277
	lm_verbose ("HUP event: %d->'%s'\n", 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   278
		    condition, lm_misc_io_condition_to_str (condition));
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   279
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   280
	if (!socket->io_channel) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   281
		return FALSE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   282
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   283
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   284
	(socket->closed_func) (socket, LM_DISCONNECT_REASON_HUP, 
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   285
			       socket->user_data);
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   286
	
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   287
	return TRUE;
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   288
}
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   289
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   290
static gboolean
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   291
socket_error_event (GIOChannel   *source,
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   292
		    GIOCondition  condition,
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   293
		    LmSocket     *socket)
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   294
{
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   295
	lm_verbose ("ERROR event: %d->'%s'\n", 
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   296
		    condition, lm_misc_io_condition_to_str (condition));
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   297
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   298
	if (!socket->io_channel) {
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   299
		return FALSE;
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   300
	}
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   301
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   302
	(socket->closed_func) (socket, LM_DISCONNECT_REASON_ERROR, 
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   303
			       socket->user_data);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   304
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   305
	return TRUE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   306
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   307
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   308
static gboolean
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   309
_lm_socket_ssl_init (LmSocket *socket, gboolean delayed)
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   310
{
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   311
	GError *error = NULL;
277
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   312
	const gchar *ssl_verify_domain = NULL;
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   313
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   314
	lm_verbose ("Setting up SSL...\n");
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   315
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   316
	_lm_ssl_initialize (socket->ssl);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   317
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   318
#ifdef HAVE_GNUTLS
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   319
	/* GNU TLS requires the socket to be blocking */
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   320
	_lm_sock_set_blocking (socket->fd, TRUE);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   321
#endif
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   322
277
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   323
	/* If we're using StartTLS, the correct thing is to verify against
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   324
	 * the domain. If we're using old SSL, we should verify against the
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   325
	 * hostname. */
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   326
	if (delayed)
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   327
		ssl_verify_domain = socket->domain;
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   328
	else
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   329
		ssl_verify_domain = socket->server;
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   330
	
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   331
	if (!_lm_ssl_begin (socket->ssl, socket->fd, ssl_verify_domain, &error)) {
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   332
		lm_verbose ("Could not begin SSL\n");
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   333
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   334
		if (error) {
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   335
			g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   336
				"%s\n", error->message);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   337
				g_error_free (error);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   338
		}
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   339
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   340
		_lm_sock_shutdown (socket->fd);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   341
		_lm_sock_close (socket->fd);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   342
277
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   343
		if (!delayed)
f3ad3d16c8b5 Fixed SSL verification when old-style SSL connection is used.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 276
diff changeset
   344
			(socket->connect_func) (socket, FALSE, socket->user_data);
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   345
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   346
		return FALSE;
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   347
	}
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   348
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   349
#ifdef HAVE_GNUTLS
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   350
	_lm_sock_set_blocking (socket->fd, FALSE); 
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   351
#endif
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   352
298
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
   353
	socket->ssl_started = TRUE;
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
   354
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   355
  return TRUE;
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   356
}
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   357
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   358
gboolean
291
cebf76f7f0e9 Simplify and fix SSL/StartTLS handling in LmSocket
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 282
diff changeset
   359
lm_socket_starttls (LmSocket *socket)
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   360
{
298
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
   361
	g_return_val_if_fail (lm_ssl_get_use_starttls (socket->ssl) == TRUE, FALSE);
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   362
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   363
	return _lm_socket_ssl_init (socket, TRUE);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   364
}
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   365
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   366
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   367
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   368
void
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   369
_lm_socket_succeeded (LmConnectData *connect_data)
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   370
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   371
	LmSocket     *socket;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   372
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   373
	socket = connect_data->socket;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   374
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   375
	if (socket->watch_connect) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   376
		g_source_destroy (socket->watch_connect);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   377
		socket->watch_connect = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   378
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   379
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   380
	/* Need some way to report error/success */
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   381
	if (socket->cancel_open) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   382
		lm_verbose ("Cancelling connection...\n");
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   383
		(socket->connect_func) (socket, FALSE, socket->user_data);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   384
		return;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   385
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   386
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   387
	socket->fd = connect_data->fd;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   388
	socket->io_channel = connect_data->io_channel;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   389
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   390
	freeaddrinfo (connect_data->resolved_addrs);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   391
	socket->connect_data = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   392
	g_free (connect_data);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   393
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   394
	/* old-style ssl should be started immediately */
298
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
   395
	if (socket->ssl && (lm_ssl_get_use_starttls (socket->ssl) == FALSE)) {
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
   396
		if (!_lm_socket_ssl_init (socket, FALSE))
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   397
			return;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   398
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   399
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   400
	socket->watch_in = 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   401
		lm_misc_add_io_watch (socket->context,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   402
				      socket->io_channel,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   403
				      G_IO_IN,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   404
				      (GIOFunc) socket_in_event,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   405
				      socket);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   406
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   407
	/* FIXME: if we add these, we don't get ANY
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   408
	 * response from the server, this is to do with the way that
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   409
	 * windows handles watches, see bug #331214.
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   410
	 */
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   411
#ifndef G_OS_WIN32
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   412
	socket->watch_err = 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   413
		lm_misc_add_io_watch (socket->context,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   414
				      socket->io_channel,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   415
				      G_IO_ERR,
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   416
				      (GIOFunc) socket_error_event,
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   417
				      socket);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   418
		
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   419
	socket->watch_hup =
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   420
		lm_misc_add_io_watch (socket->context,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   421
				      socket->io_channel,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   422
				      G_IO_HUP,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   423
				      (GIOFunc) socket_hup_event,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   424
				      socket);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   425
#endif
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   426
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   427
	(socket->connect_func) (socket, TRUE, socket->user_data);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   428
}
151
hallski <hallski>
parents: 150
diff changeset
   429
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   430
gboolean 
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   431
_lm_socket_failed_with_error (LmConnectData *connect_data, int error) 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   432
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   433
	LmSocket *socket;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   434
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   435
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   436
	       "Connection failed: %s (error %d)\n",
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   437
	       _lm_sock_get_error_str (error), error);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   438
	
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   439
	socket = lm_socket_ref (connect_data->socket);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   440
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   441
	connect_data->current_addr = connect_data->current_addr->ai_next;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   442
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   443
	if (socket->watch_connect) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   444
		g_source_destroy (socket->watch_connect);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   445
		socket->watch_connect = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   446
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   447
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   448
	if (connect_data->io_channel != NULL) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   449
		g_io_channel_unref (connect_data->io_channel);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   450
		/* FIXME: need to check for last unref and close the socket */
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   451
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   452
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   453
	if (connect_data->current_addr == NULL) {
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   454
		(socket->connect_func) (socket, FALSE, socket->user_data);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   455
		
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   456
		 /* if the user callback called connection_close(), this is already freed */
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   457
		if (socket->connect_data != NULL) {
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   458
			freeaddrinfo (connect_data->resolved_addrs);
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   459
			socket->connect_data = NULL;
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   460
			g_free (connect_data);
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   461
		}
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   462
	} else {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   463
		/* try to connect to the next host */
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   464
		return socket_do_connect (connect_data);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   465
	}
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   466
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   467
	lm_socket_unref(socket);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   468
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   469
	return FALSE;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   470
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   471
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   472
gboolean 
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   473
_lm_socket_failed (LmConnectData *connect_data)
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   474
{
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   475
	return _lm_socket_failed_with_error (connect_data,
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   476
                                       _lm_sock_get_last_error());
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   477
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   478
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   479
static gboolean 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   480
socket_connect_cb (GIOChannel   *source, 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   481
		       GIOCondition  condition,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   482
		       LmConnectData *connect_data) 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   483
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   484
	LmSocket        *socket;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   485
	struct addrinfo *addr;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   486
	int              err;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   487
	socklen_t        len;
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   488
	LmSocketT        fd;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   489
	gboolean         result = FALSE;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   490
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   491
	socket = lm_socket_ref (connect_data->socket);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   492
	addr = connect_data->current_addr;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   493
	fd = g_io_channel_unix_get_fd (source);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   494
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   495
	if (condition == G_IO_ERR) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   496
		len = sizeof (err);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   497
		_lm_sock_get_error (fd, &err, &len);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   498
		if (!_lm_sock_is_blocking_error (err)) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   499
			g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   500
			       "Connection failed.\n");
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   501
330
f606ce2a849e Properly behave if we manage to connect in the second attempt.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 325
diff changeset
   502
			/* error condition, but might be possible to recover
f606ce2a849e Properly behave if we manage to connect in the second attempt.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 325
diff changeset
   503
			 * from it (by connecting to the next host) */
f606ce2a849e Properly behave if we manage to connect in the second attempt.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 325
diff changeset
   504
			if (!_lm_socket_failed_with_error (connect_data, err)) {
f606ce2a849e Properly behave if we manage to connect in the second attempt.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 325
diff changeset
   505
				socket->watch_connect = NULL;
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   506
				goto out;
330
f606ce2a849e Properly behave if we manage to connect in the second attempt.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 325
diff changeset
   507
			}
151
hallski <hallski>
parents: 150
diff changeset
   508
		}
hallski <hallski>
parents: 150
diff changeset
   509
	}
hallski <hallski>
parents: 150
diff changeset
   510
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   511
	if (_lm_connection_async_connect_waiting (socket->connection)) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   512
		gint res;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   513
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   514
		fd = g_io_channel_unix_get_fd (source);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   515
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   516
		res = _lm_sock_connect (fd, addr->ai_addr, (int)addr->ai_addrlen);  
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   517
		if (res < 0) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   518
			err = _lm_sock_get_last_error ();
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   519
			if (_lm_sock_is_blocking_success (err)) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   520
				_lm_connection_set_async_connect_waiting (socket->connection, FALSE);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   521
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   522
				g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   523
				       "Connection success (1).\n");
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   524
				
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   525
				_lm_socket_succeeded (connect_data);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   526
			}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   527
			
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   528
			if (_lm_connection_async_connect_waiting (socket->connection) &&
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   529
			    !_lm_sock_is_blocking_error (err)) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   530
				g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   531
				       "Connection failed.\n");
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   532
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   533
				_lm_sock_close (connect_data->fd);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   534
				_lm_socket_failed_with_error (connect_data, err);
151
hallski <hallski>
parents: 150
diff changeset
   535
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   536
				socket->watch_connect = NULL;
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   537
				goto out;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   538
			}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   539
		} 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   540
	} else {		
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   541
		/* for blocking sockets, G_IO_OUT means we are connected */
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   542
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   543
		       "Connection success (2).\n");
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   544
		
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   545
		_lm_socket_succeeded (connect_data);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   546
	}
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   547
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   548
	result = TRUE;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   549
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   550
 out:
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   551
	lm_socket_unref(socket);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   552
	
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   553
 	return result; 
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   554
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   555
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   556
static gboolean
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   557
socket_do_connect (LmConnectData *connect_data) 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   558
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   559
	LmSocket        *socket;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   560
	LmSocketT        fd;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   561
	int              res, err;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   562
	int              port;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   563
	char             name[NI_MAXHOST];
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   564
	char             portname[NI_MAXSERV];
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   565
	struct addrinfo *addr;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   566
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   567
	socket = connect_data->socket;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   568
	addr = connect_data->current_addr;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   569
 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   570
	if (socket->proxy) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   571
		port = htons (lm_proxy_get_port (socket->proxy));
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   572
	} else {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   573
		port = htons (socket->port);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   574
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   575
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   576
	((struct sockaddr_in *) addr->ai_addr)->sin_port = port;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   577
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   578
	res = getnameinfo (addr->ai_addr,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   579
			   (socklen_t)addr->ai_addrlen,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   580
			   name,     sizeof (name),
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   581
			   portname, sizeof (portname),
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   582
			   NI_NUMERICHOST | NI_NUMERICSERV);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   583
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   584
	if (res < 0) {
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   585
		return _lm_socket_failed (connect_data);
151
hallski <hallski>
parents: 150
diff changeset
   586
	}
hallski <hallski>
parents: 150
diff changeset
   587
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   588
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   589
	       "Trying %s port %s...\n", name, portname);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   590
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   591
	fd = _lm_sock_makesocket (addr->ai_family,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   592
				  addr->ai_socktype, 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   593
				  addr->ai_protocol);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   594
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   595
	if (!_LM_SOCK_VALID (fd)) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   596
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET, 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   597
		       "Failed making socket, error:%d...\n",
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   598
		       _lm_sock_get_last_error ());
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   599
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   600
		return _lm_socket_failed (connect_data);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   601
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   602
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   603
	/* Even though it says _unix_new(), it is supported by glib on
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   604
	 * win32 because glib does some cool stuff to find out if it
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   605
	 * can treat it as a FD or a windows SOCKET.
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   606
	 */
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   607
	connect_data->fd = fd;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   608
	connect_data->io_channel = g_io_channel_unix_new (fd);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   609
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   610
	g_io_channel_set_encoding (connect_data->io_channel, NULL, NULL);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   611
	g_io_channel_set_buffered (connect_data->io_channel, FALSE);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   612
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   613
	_lm_sock_set_blocking (connect_data->fd, socket->blocking);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   614
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   615
	if (socket->proxy) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   616
		socket->watch_connect =
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   617
			lm_misc_add_io_watch (socket->context,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   618
					      connect_data->io_channel,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   619
					      G_IO_OUT|G_IO_ERR,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   620
					      (GIOFunc) _lm_proxy_connect_cb, 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   621
					      connect_data);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   622
	} else {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   623
		socket->watch_connect =
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   624
			lm_misc_add_io_watch (socket->context,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   625
					      connect_data->io_channel,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   626
					      G_IO_OUT|G_IO_ERR,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   627
					      (GIOFunc) socket_connect_cb,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   628
					      connect_data);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   629
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   630
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   631
	_lm_connection_set_async_connect_waiting (socket->connection, !socket->blocking);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   632
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   633
  	res = _lm_sock_connect (connect_data->fd, 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   634
				addr->ai_addr, (int)addr->ai_addrlen);  
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   635
	if (res < 0) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   636
		err = _lm_sock_get_last_error ();
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   637
		if (!_lm_sock_is_blocking_error (err)) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   638
			_lm_sock_close (connect_data->fd);
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   639
			return _lm_socket_failed_with_error (connect_data, err);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   640
		}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   641
	}
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   642
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
   643
	return TRUE;
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   644
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   645
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   646
gboolean
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   647
lm_socket_output_is_buffered (LmSocket     *socket,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   648
			       const gchar  *buffer,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   649
			       gint          len)
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   650
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   651
	if (socket->out_buf) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   652
		lm_verbose ("Appending %d bytes to output buffer\n", len);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   653
		g_string_append_len (socket->out_buf, buffer, len);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   654
		return TRUE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   655
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   656
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   657
	return FALSE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   658
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   659
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   660
void
249
2cca5ec7b573 Style fixes
Mikael Hallendal <micke@imendio.com>
parents: 245
diff changeset
   661
lm_socket_setup_output_buffer (LmSocket *socket, const gchar *buffer, gint len)
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   662
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   663
	lm_verbose ("OUTPUT BUFFER ENABLED\n");
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   664
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   665
	socket->out_buf = g_string_new_len (buffer, len);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   666
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   667
	socket->watch_out =
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   668
		lm_misc_add_io_watch (socket->context,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   669
				      socket->io_channel,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   670
				      G_IO_OUT,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   671
				      (GIOFunc) socket_buffered_write_cb,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   672
				      socket);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   673
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   674
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   675
static gboolean
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   676
socket_buffered_write_cb (GIOChannel   *source, 
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   677
			  GIOCondition  condition,
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   678
			  LmSocket     *socket)
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   679
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   680
	gint     b_written;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   681
	GString *out_buf;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   682
	/* FIXME: Do the writing */
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   683
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   684
	out_buf = socket->out_buf;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   685
	if (!out_buf) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   686
		/* Should not be possible */
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   687
		return FALSE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   688
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   689
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   690
	b_written = lm_socket_do_write (socket, out_buf->str, out_buf->len);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   691
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   692
	if (b_written < 0) {
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   693
		(socket->closed_func) (socket, LM_DISCONNECT_REASON_ERROR, 
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   694
				       socket->user_data);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   695
		return FALSE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   696
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   697
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   698
	g_string_erase (out_buf, 0, (gsize) b_written);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   699
	if (out_buf->len == 0) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   700
		lm_verbose ("Output buffer is empty, going back to normal output\n");
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   701
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   702
		if (socket->watch_out) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   703
			g_source_destroy (socket->watch_out);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   704
			socket->watch_out = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   705
		}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   706
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   707
		g_string_free (out_buf, TRUE);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   708
		socket->out_buf = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   709
		return FALSE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   710
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   711
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   712
	return TRUE;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   713
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   714
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   715
static gboolean
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   716
socket_parse_srv_response (unsigned char  *srv, 
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   717
			   int             srv_len, 
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   718
			   gchar         **out_server, 
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   719
			   guint          *out_port)
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   720
{
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   721
	int                  qdcount;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   722
	int                  ancount;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   723
	int                  len;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   724
	const unsigned char *pos;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   725
	unsigned char       *end;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   726
	HEADER              *head;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   727
	char                 name[256];
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   728
	char                 pref_name[256];
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   729
	guint                pref_port = 0;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   730
	guint                pref_prio = 9999;
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   731
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   732
	pref_name[0] = 0;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   733
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   734
	pos = srv + sizeof (HEADER);
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   735
	end = srv + srv_len;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   736
	head = (HEADER *) srv;
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   737
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   738
	qdcount = ntohs (head->qdcount);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   739
	ancount = ntohs (head->ancount);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   740
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   741
	/* Ignore the questions */
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   742
	while (qdcount-- > 0 && (len = dn_expand (srv, end, pos, name, 255)) >= 0) {
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   743
		g_assert (len >= 0);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   744
		pos += len + QFIXEDSZ;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   745
	}
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   746
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   747
	/* Parse the answers */
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   748
	while (ancount-- > 0 && (len = dn_expand (srv, end, pos, name, 255)) >= 0) {
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   749
		/* Ignore the initial string */
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   750
		uint16_t pref, weight, port;
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   751
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   752
		g_assert (len >= 0);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   753
		pos += len;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   754
		/* Ignore type, ttl, class and dlen */
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   755
		pos += 10;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   756
		GETSHORT (pref, pos);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   757
		GETSHORT (weight, pos);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   758
		GETSHORT (port, pos);
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
   759
243
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   760
		len = dn_expand (srv, end, pos, name, 255);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   761
		if (pref < pref_prio) {
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   762
			pref_prio = pref;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   763
			strcpy (pref_name, name);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   764
			pref_port = port;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   765
		}
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   766
		pos += len;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   767
	}
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   768
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   769
	if (pref_name[0]) {
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   770
		*out_server = g_strdup (pref_name);
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   771
		*out_port = pref_port;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   772
		return TRUE;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   773
	} 
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   774
	return FALSE;
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   775
}
fa0794ef3570 Implement SRV lookups, patch from Senko Rasic
Mikael Hallendal <micke@imendio.com>
parents: 212
diff changeset
   776
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   777
static void
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   778
_lm_socket_create_phase1 (LmSocket *socket, unsigned char *srv_ans, int len);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   779
static void
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   780
_lm_socket_create_phase2 (LmSocket *socket, struct addrinfo *ans);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   781
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   782
#ifdef HAVE_ASYNCNS
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   783
#define PHASE_1 0
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   784
#define PHASE_2 1
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   785
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   786
static gboolean
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   787
_lm_socket_resolver_done (GSource *source,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   788
    			  GIOCondition condition,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   789
			  gpointer data);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   790
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   791
280
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   792
static void
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   793
_asyncns_done (LmSocket *socket)
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   794
{
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   795
	if (socket->resolv_channel != NULL) {
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   796
		g_io_channel_unref (socket->resolv_channel);
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   797
		socket->resolv_channel = NULL;
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   798
	}
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   799
 
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   800
	if (socket->watch_resolv) {
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   801
		g_source_destroy(socket->watch_resolv);
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   802
		socket->watch_resolv = NULL;
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   803
	}
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   804
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   805
	if (socket->asyncns_ctx) {
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   806
		asyncns_free (socket->asyncns_ctx);
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   807
		socket->asyncns_ctx = NULL;
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   808
	}
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   809
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   810
 	socket->resolv_query = NULL;
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   811
}
f1bfa3d3ad1c hoist _asyncns_done to above where it is first called
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 279
diff changeset
   812
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   813
void _asyncns_cancel (LmSocket *socket)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   814
{
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   815
	if (socket == NULL)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   816
		return;
276
3b05eae99e1a Fixed (double) asyncns cancellation bug, and made the code more robust.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 275
diff changeset
   817
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   818
	if (socket->asyncns_ctx) {
282
0bd1892a18d3 Fix another crash in asyncns cancel code
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 280
diff changeset
   819
		if (socket->resolv_query)
0bd1892a18d3 Fix another crash in asyncns cancel code
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 280
diff changeset
   820
			asyncns_cancel (socket->asyncns_ctx, socket->resolv_query);
0bd1892a18d3 Fix another crash in asyncns cancel code
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 280
diff changeset
   821
276
3b05eae99e1a Fixed (double) asyncns cancellation bug, and made the code more robust.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 275
diff changeset
   822
		_asyncns_done (socket);
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   823
	}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   824
}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   825
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   826
static gboolean
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   827
_asyncns_prep (LmSocket *socket, GError **error)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   828
{
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   829
	if (socket->asyncns_ctx) {
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   830
		return TRUE;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   831
	}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   832
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   833
	socket->asyncns_ctx = asyncns_new (1);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   834
	if (socket->asyncns_ctx == NULL) {
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   835
		g_set_error (error,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   836
				LM_ERROR,                 
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   837
				LM_ERROR_CONNECTION_FAILED,   
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   838
				"can't initialise libasyncns");
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   839
		return FALSE;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   840
	}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   841
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   842
	socket->resolv_channel =
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   843
		g_io_channel_unix_new (asyncns_fd (socket->asyncns_ctx));
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   844
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   845
	socket->watch_resolv = 
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   846
		lm_misc_add_io_watch (socket->context,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   847
				      socket->resolv_channel,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   848
				      G_IO_IN,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   849
				      (GIOFunc) _lm_socket_resolver_done,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   850
				      socket);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   851
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   852
	return TRUE;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   853
}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   854
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   855
static gboolean
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   856
_lm_socket_resolver_done (GSource *source,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   857
    			  GIOCondition condition,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   858
			  gpointer data)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   859
{
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   860
	LmSocket	*socket = lm_socket_ref ((LmSocket *) data);
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   861
	struct addrinfo	*ans;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   862
	unsigned char   *srv_ans;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   863
	int 		 err;
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   864
	gboolean         result = FALSE;
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   865
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   866
	/* process pending data */
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   867
	asyncns_wait (socket->asyncns_ctx, FALSE);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   868
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   869
	if (!asyncns_isdone (socket->asyncns_ctx, socket->resolv_query)) {
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   870
		result = TRUE;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   871
	} else {
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   872
		switch ((guint) asyncns_getuserdata (socket->asyncns_ctx, socket->resolv_query)) {
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   873
		case PHASE_1:
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   874
			err = asyncns_res_done (socket->asyncns_ctx, socket->resolv_query, &srv_ans);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   875
			socket->resolv_query = NULL;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   876
			_lm_socket_create_phase1 (socket, (err <= 0) ? NULL : srv_ans, err);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   877
			result = TRUE;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   878
			break;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   879
		case PHASE_2:
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   880
			err = asyncns_getaddrinfo_done (socket->asyncns_ctx, socket->resolv_query, &ans);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   881
			socket->resolv_query = NULL;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   882
			_lm_socket_create_phase2 (socket, (err) ? NULL : ans);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   883
			_asyncns_done (socket);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   884
			break;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   885
		default:
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   886
			g_assert_not_reached();
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   887
			break;
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   888
		}
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   889
	}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   890
343
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   891
	lm_socket_unref(socket);
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   892
	
35a19649d773 Fixed reentrancy problem for async connections. Fixes first bit of LM-117.
Owen Taylor <otaylor@redhat.com>
parents: 338
diff changeset
   893
	return result;
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   894
}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   895
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   896
#endif
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   897
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   898
static void
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   899
_lm_socket_create_phase1 (LmSocket *socket,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   900
			  unsigned char *srv_ans,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   901
			  int len)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   902
{
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   903
	const char          *remote_addr;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   904
	LmConnectData       *data;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   905
	struct addrinfo      req;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   906
#ifndef HAVE_ASYNCNS
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   907
	struct addrinfo *ans;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   908
	int              err;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   909
#endif
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   910
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   911
	if (srv_ans != NULL) {
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   912
		gchar    *new_server;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   913
		guint     new_port;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   914
		gboolean  result;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   915
		result = socket_parse_srv_response (srv_ans, len, 
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   916
						    &new_server, 
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   917
						    &new_port);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   918
		if (result == TRUE) {
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   919
			g_free (socket->server);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   920
			socket->server = new_server;
325
6e561a2cc542 Always use the port provided by the SRV lookup.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 322
diff changeset
   921
			socket->port = new_port;
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   922
		}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   923
	}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   924
275
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
   925
	/* If server wasn't specified and SRV failed, use domain */
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
   926
	if (!socket->server) {
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
   927
		lm_verbose ("SRV lookup failed, trying jid domain\n");
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
   928
		socket->server = g_strdup (socket->domain);
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
   929
	}
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
   930
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   931
	if (socket->proxy) {
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   932
		remote_addr = lm_proxy_get_server (socket->proxy);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   933
	} else {
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   934
		remote_addr = socket->server;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   935
	}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   936
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   937
	g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   938
	       "Going to connect to %s%s:%u\n", (socket->proxy) ? "proxy " : "",
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   939
	       remote_addr, socket->port);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   940
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   941
	data = g_new0 (LmConnectData, 1);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   942
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   943
	data->socket        = socket;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   944
	data->connection    = socket->connection;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   945
	data->fd            = -1;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   946
	socket->connect_data = data;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   947
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   948
	memset (&req, 0, sizeof(req));
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   949
	req.ai_family   = AF_UNSPEC;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   950
	req.ai_socktype = SOCK_STREAM;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   951
	req.ai_protocol = IPPROTO_TCP;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   952
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   953
#ifdef HAVE_ASYNCNS
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   954
	if (!_asyncns_prep (socket, NULL))
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   955
		return;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   956
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   957
	socket->resolv_query =
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   958
	  	asyncns_getaddrinfo (socket->asyncns_ctx,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   959
		    		     remote_addr,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   960
				     NULL,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   961
				     &req);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   962
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   963
	asyncns_setuserdata (socket->asyncns_ctx,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   964
			     socket->resolv_query,
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   965
			     (gpointer) PHASE_2);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   966
#else
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   967
	err = getaddrinfo (remote_addr, NULL, &req, &ans);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   968
	_lm_socket_create_phase2 (socket, (err) ? NULL : ans);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   969
	if (err != 0)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   970
		return;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   971
#endif
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   972
}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   973
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   974
static void
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   975
_lm_socket_create_phase2 (LmSocket *socket, struct addrinfo *ans)
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   976
{
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   977
	if (ans == NULL) {
275
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
   978
		lm_verbose ("error while resolving, bailing out\n");
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   979
		(socket->connect_func) (socket, FALSE, socket->user_data);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   980
		g_free (socket->connect_data);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   981
		socket->connect_data = NULL;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   982
		return;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   983
	}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   984
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   985
	socket->connect_data->resolved_addrs = ans;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   986
	socket->connect_data->current_addr   = ans;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   987
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   988
	socket_do_connect (socket->connect_data);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   989
}
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
   990
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   991
LmSocket *
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   992
lm_socket_create (GMainContext      *context,
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   993
		  IncomingDataFunc   data_func,
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   994
		  SocketClosedFunc   closed_func,
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
   995
		  ConnectResultFunc  connect_func,
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   996
		  gpointer           user_data,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   997
		  LmConnection      *connection,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   998
		  gboolean           blocking,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
   999
		  const gchar       *server,
275
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
  1000
		  const gchar       *domain,
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1001
		  guint              port, 
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1002
		  LmSSL             *ssl,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1003
		  LmProxy           *proxy,
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1004
		  GError           **error)
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1005
{
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1006
	LmSocket        *socket;
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1007
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1008
#ifndef HAVE_ASYNCNS
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1009
	unsigned char    srv_ans[SRV_LEN];
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
  1010
	int              len;
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1011
#endif
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
  1012
	
275
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
  1013
	g_return_val_if_fail (domain != NULL, NULL);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1014
	g_return_val_if_fail ((port >= MIN_PORT && port <= MAX_PORT), NULL);
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
  1015
	g_return_val_if_fail (data_func != NULL, NULL);
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
  1016
	g_return_val_if_fail (closed_func != NULL, NULL);
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
  1017
	g_return_val_if_fail (connect_func != NULL, NULL);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1018
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1019
	socket = g_new0 (LmSocket, 1);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1020
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1021
	socket->ref_count = 1;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1022
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1023
	socket->connection = connection;
275
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
  1024
	socket->domain = g_strdup (domain);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1025
	socket->server = g_strdup (server);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1026
	socket->port = port;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1027
	socket->cancel_open = FALSE;
291
cebf76f7f0e9 Simplify and fix SSL/StartTLS handling in LmSocket
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 282
diff changeset
  1028
	socket->ssl = ssl;
298
71aaed5a9c34 Properly detect if SSL has been started in case of StartTLS usage.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 292
diff changeset
  1029
	socket->ssl_started = FALSE;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1030
	socket->proxy = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1031
	socket->blocking = blocking;
256
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
  1032
	socket->data_func = data_func;
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
  1033
	socket->closed_func = closed_func;
2266e56746ed Refactoring to clear up interface between LmSocket and LmConnection.
Mikael Hallendal <micke@imendio.com>
parents: 249
diff changeset
  1034
	socket->connect_func = connect_func;
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1035
	socket->user_data = user_data;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1036
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1037
	if (context) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1038
		socket->context = g_main_context_ref (context);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1039
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1040
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1041
	if (proxy) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1042
		socket->proxy = lm_proxy_ref (proxy);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1043
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1044
275
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
  1045
	if (!server) {
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1046
		char          *srv;
275
37937c612f62 Made SRV handling more sane, and implemented fallback using jid domain name.
Senko Rasic <senko@phyrexia.(none)>
parents: 274
diff changeset
  1047
		srv = g_strdup_printf ("_xmpp-client._tcp.%s", socket->domain);
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1048
		lm_verbose ("Performing a SRV lookup for %s\n", srv);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1049
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1050
#ifdef HAVE_ASYNCNS
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1051
		if (!_asyncns_prep (socket, error))
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1052
			return NULL;
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1053
		
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1054
		socket->resolv_query =
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1055
			asyncns_res_query (socket->asyncns_ctx, srv, C_IN, T_SRV);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1056
		asyncns_setuserdata (socket->asyncns_ctx, socket->resolv_query, (gpointer) PHASE_1);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1057
#else
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1058
		res_init ();
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1059
274
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
  1060
		len = res_query (srv, C_IN, T_SRV, srv_ans, SRV_LEN);
c32a7011e435 Adding StartTLS support.
Senko Rasic <senko@phyrexia.(none)>
parents: 272
diff changeset
  1061
		_lm_socket_create_phase1 (socket, (len < 1) ? NULL : srv_ans, len);
271
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1062
		g_free (srv);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1063
#endif
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1064
	} else {
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1065
		lm_verbose ("SRV lookup disabled for %s\n", socket->server);
52ea4e0b897a Perform name resolution asynchronously. Patch by Senko Rašić.
Dafydd Harries <daf@rhydd.org>
parents: 257
diff changeset
  1066
		_lm_socket_create_phase1 (socket, NULL, 0);
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
  1067
	}
244
8a05b79bad24 Make use_srv optional in LmSocket and plugged a leak.
Mikael Hallendal <micke@imendio.com>
parents: 243
diff changeset
  1068
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1069
	return socket;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1070
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1071
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1072
void
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1073
lm_socket_flush (LmSocket *socket)
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1074
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1075
	g_return_if_fail (socket != NULL);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1076
	g_return_if_fail (socket->io_channel != NULL);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1077
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1078
	g_io_channel_flush (socket->io_channel, NULL);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1079
}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1080
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1081
void
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1082
lm_socket_close (LmSocket *socket)
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1083
{
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1084
	LmConnectData *data;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1085
212
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
  1086
	g_return_if_fail (socket != NULL);
87bc6b37a9e9 Improved error checking in LmSocket when connecting.
Mikael Hallendal <micke@imendio.com>
parents: 202
diff changeset
  1087
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1088
	if (socket->watch_connect) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1089
		g_source_destroy (socket->watch_connect);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1090
		socket->watch_connect = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1091
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1092
	
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1093
	data = socket->connect_data;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1094
	if (data) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1095
		freeaddrinfo (data->resolved_addrs);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1096
		socket->connect_data = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1097
		g_free (data);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1098
	}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1099
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1100
	if (socket->io_channel) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1101
		if (socket->watch_in) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1102
			g_source_destroy (socket->watch_in);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1103
			socket->watch_in = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1104
		}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1105
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1106
		if (socket->watch_err) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1107
			g_source_destroy (socket->watch_err);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1108
			socket->watch_err = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1109
		}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1110
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1111
		if (socket->watch_hup) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1112
			g_source_destroy (socket->watch_hup);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1113
			socket->watch_hup = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1114
		}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1115
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1116
		if (socket->watch_out) {
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1117
			g_source_destroy (socket->watch_out);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1118
			socket->watch_out = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1119
		}
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1120
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1121
		g_io_channel_unref (socket->io_channel);
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1122
		socket->io_channel = NULL;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1123
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1124
		socket->fd = -1;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1125
	}
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1126
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1127
308
7e2050a6df75 Added lm_connection_get_client_host (forward-port from LM1.2).
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 299
diff changeset
  1128
gchar *
7e2050a6df75 Added lm_connection_get_client_host (forward-port from LM1.2).
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 299
diff changeset
  1129
lm_socket_get_local_host (LmSocket *socket)
7e2050a6df75 Added lm_connection_get_client_host (forward-port from LM1.2).
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 299
diff changeset
  1130
{
7e2050a6df75 Added lm_connection_get_client_host (forward-port from LM1.2).
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 299
diff changeset
  1131
	return _lm_sock_get_local_host (socket->fd);
7e2050a6df75 Added lm_connection_get_client_host (forward-port from LM1.2).
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 299
diff changeset
  1132
}
7e2050a6df75 Added lm_connection_get_client_host (forward-port from LM1.2).
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 299
diff changeset
  1133
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1134
LmSocket *
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1135
lm_socket_ref (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1136
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1137
	g_return_val_if_fail (socket != NULL, NULL);
151
hallski <hallski>
parents: 150
diff changeset
  1138
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1139
	socket->ref_count++;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1140
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1141
	return socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1142
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1143
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1144
void
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1145
lm_socket_unref (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1146
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1147
	g_return_if_fail (socket != NULL);
196
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1148
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1149
	socket->ref_count--;
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1150
209bfa124066 Imported LmConnection refactor from old repository.
Mikael Hallendal <micke@imendio.com>
parents: 161
diff changeset
  1151
	if (socket->ref_count <= 0) {
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1152
		socket_free (socket);
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
  1153
	}
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
  1154
}
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
  1155
292
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1156
gboolean
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1157
lm_socket_set_keepalive (LmSocket *socket, int delay)
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1158
{
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1159
#ifdef USE_TCP_KEEPALIVES
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1160
	return _lm_sock_set_keepalive (socket->fd, delay);
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1161
#else
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1162
	return FALSE;
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1163
#endif /* USE_TCP_KEEPALIVES */
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1164
}
bb7269466be2 Use TCP keepalives on Linux if available; if not, fallback to manual keepalives.
Senko Rasic <senko.rasic@collabora.co.uk>
parents: 291
diff changeset
  1165