loudmouth/lm-socket.c
author hallski <hallski>
Fri, 02 Jun 2006 23:02:20 +0000
changeset 149 54e67338c784
parent 148 255733936c01
child 150 18a91b086713
permissions -rw-r--r--
Commiting some work in progress
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     2
/*
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     3
 * Copyright (C) 2006 Imendio AB
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     4
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     5
 * This program is free software; you can redistribute it and/or
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     6
 * modify it under the terms of the GNU Lesser General Public License as
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     7
 * published by the Free Software Foundation; either version 2 of the
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     8
 * License, or (at your option) any later version.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
     9
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    10
 * This program is distributed in the hope that it will be useful,
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    13
 * Lesser General Public License for more details.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    14
 *
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    15
 * You should have received a copy of the GNU Lesser General Public
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    16
 * License along with this program; if not, write to the
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    17
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    18
 * Boston, MA 02111-1307, USA.
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    19
 */
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    20
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    21
#include "lm-socket.h"
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    22
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    23
#ifndef G_OS_WIN32
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    24
typedef int LmSock;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    25
#else  /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    26
typedef SOCKET LmSock;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    27
#endif /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    28
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    29
/* FIXME: Integrate with the SSL stuff */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    30
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    31
struct _LmSocket {
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    32
	LmSock sock;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    33
	/* FIXME: Add the rest */
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    34
	
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    35
	LmSocketFuncs funcs;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    36
	
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    37
	LmSocketState state;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    38
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    39
	gboolean is_blocking;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    40
	
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    41
	gint ref;
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    42
};
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    43
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    44
static LmSocket *  socket_create (void);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    45
static void        socket_free   (LmSocket *socket);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    46
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    47
static LmSocket *
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    48
socket_create (void)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    49
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    50
	LmSocket *socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    51
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    52
	socket = g_new0 (LmSocket, 1);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    53
	socket->ref_count = 1;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    54
	socket->is_blocking = FALSE;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    55
	
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    56
	return socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    57
}
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    58
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    59
static void
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    60
socket_free (LmSocket *socket)
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    61
{
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    62
	/* FIXME: Free up the rest of the memory */
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    63
	g_free (socket->host);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    64
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    65
	g_free (socket);
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    66
}
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    67
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    68
LmSocket *
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    69
lm_socket_new (LmSocketFuncs funcs, const gchar *host, guint port)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    70
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    71
	LmSocket *socket;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    72
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    73
	socket = socket_create ();
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    74
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    75
	socket->funcs = funcs;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    76
	socket->host = g_strdup (host);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    77
	socket->port = port;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    78
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    79
	return socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    80
}
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    81
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    82
void
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    83
lm_socket_open (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    84
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    85
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    86
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    87
int
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    88
lm_socket_get_fd (LmSocket *socket)
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    89
{
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    90
	g_return_val_if_fail (socket != NULL, -1);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    91
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    92
	return socket->fd;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    93
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    94
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    95
gboolean
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    96
lm_socket_get_is_blocking (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    97
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
    98
	return socket->is_blocking;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
    99
}
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   100
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   101
void
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   102
lm_socket_set_is_blocking (LmSocket *socket, gboolean is_block)
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   103
{
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   104
	int res;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   105
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   106
	g_return_if_fail (socket != NULL);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   107
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   108
	/* FIXME: Don't unset all flags */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   109
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   110
#ifndef G_OS_WIN32
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   111
	res = fcntl (socket->sock, F_SETFL, is_block ? 0 : O_NONBLOCK);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   112
#else  /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   113
	u_long mode = (is_block ? 0 : 1);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   114
	res = ioctlsocket (socket->sock, FIONBIO, &mode);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   115
#endif /* G_OS_WIN32 */
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   116
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   117
	if (res != 0) {
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   118
		g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_NET,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   119
		       "Could not set socket to be %s\n",
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   120
		       block ? "blocking" : "non-blocking");
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   121
	}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   122
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   123
	socket->is_blocking = is_block;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   124
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   125
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   126
int
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   127
lm_socket_write (LmSocket   *socket,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   128
		 gsize       size,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   129
		 gchar      *buf,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   130
		 GError    **error)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   131
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   132
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   133
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   134
int
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   135
lm_socket_read (LmSocket   *socket,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   136
		gsize       size,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   137
		gchar      *buf,
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   138
		GError    **error)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   139
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   140
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   141
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   142
gboolean
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   143
lm_socket_close (LmSocket *socket, GError **error)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   144
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   145
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   146
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   147
LmSocket *
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   148
lm_socket_ref (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   149
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   150
	g_return_val_if_fail (socket != NULL, NULL);
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   151
	socket->ref++;
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   152
	
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   153
	return socket;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   154
}
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   155
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   156
void
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   157
lm_socket_unref (LmSocket *socket)
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   158
{
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   159
	g_return_if_fail (socket != NULL);
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   160
	
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   161
	socket->ref--;
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   162
	
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   163
	if (socket->ref <= 0) {
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   164
		socket_free (socket);
147
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   165
	}
f4fe28b6c454 added upcoming files lm-socket.[ch]
hallski <hallski>
parents:
diff changeset
   166
}
149
54e67338c784 Commiting some work in progress
hallski <hallski>
parents: 148
diff changeset
   167