mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-12 15:36:17 +01:00
GSocket: set protocol when using g_socket_new_from_fd()
Otherwise, attempting to create a GSocketConnection from the socket will likely return the wrong type, since the protocol won't match any of the registered subtypes. Also add the start of a GSocket test program (from davidz). https://bugzilla.gnome.org/show_bug.cgi?id=627171
This commit is contained in:
parent
a62b43fd9c
commit
87d06109ab
@ -377,13 +377,34 @@ g_socket_details_from_fd (GSocket *socket)
|
||||
{
|
||||
case G_SOCKET_FAMILY_IPV4:
|
||||
case G_SOCKET_FAMILY_IPV6:
|
||||
socket->priv->family = address.ss_family;
|
||||
switch (socket->priv->type)
|
||||
{
|
||||
case G_SOCKET_TYPE_STREAM:
|
||||
socket->priv->protocol = G_SOCKET_PROTOCOL_TCP;
|
||||
break;
|
||||
|
||||
case G_SOCKET_TYPE_DATAGRAM:
|
||||
socket->priv->protocol = G_SOCKET_PROTOCOL_UDP;
|
||||
break;
|
||||
|
||||
case G_SOCKET_TYPE_SEQPACKET:
|
||||
socket->priv->protocol = G_SOCKET_PROTOCOL_SCTP;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case G_SOCKET_FAMILY_UNIX:
|
||||
socket->priv->family = address.ss_family;
|
||||
break;
|
||||
socket->priv->family = G_SOCKET_FAMILY_UNIX;
|
||||
socket->priv->protocol = G_SOCKET_PROTOCOL_DEFAULT;
|
||||
break;
|
||||
|
||||
default:
|
||||
socket->priv->family = G_SOCKET_FAMILY_INVALID;
|
||||
break;
|
||||
socket->priv->family = G_SOCKET_FAMILY_INVALID;
|
||||
break;
|
||||
}
|
||||
|
||||
if (socket->priv->family != G_SOCKET_FAMILY_INVALID)
|
||||
|
1
gio/tests/.gitignore
vendored
1
gio/tests/.gitignore
vendored
@ -62,6 +62,7 @@ resolver
|
||||
send-data
|
||||
simple-async-result
|
||||
sleepy-stream
|
||||
socket
|
||||
socket-client
|
||||
socket-server
|
||||
srvtarget
|
||||
|
@ -42,6 +42,7 @@ TEST_PROGS += \
|
||||
gdbus-addresses \
|
||||
network-address \
|
||||
gdbus-message \
|
||||
socket \
|
||||
$(NULL)
|
||||
|
||||
if OS_UNIX
|
||||
@ -196,6 +197,9 @@ srvtarget_LDADD = $(progs_ldadd)
|
||||
network_address_SOURCE = network-address.c
|
||||
network_address_LDADD = $(progs_ldadd)
|
||||
|
||||
socket_SOURCE = socket.c
|
||||
socket_LDADD = $(progs_ldadd)
|
||||
|
||||
contexts_SOURCES = contexts.c
|
||||
contexts_LDADD = $(progs_ldadd) \
|
||||
$(top_builddir)/gthread/libgthread-2.0.la
|
||||
@ -392,7 +396,7 @@ EXTRA_DIST += \
|
||||
appinfo-test-gnome.desktop \
|
||||
appinfo-test-notgnome.desktop \
|
||||
gdbus-testserver.py
|
||||
|
||||
|
||||
MISC_STUFF = test.mo
|
||||
|
||||
test.mo: de.po
|
||||
|
86
gio/tests/socket.c
Normal file
86
gio/tests/socket.c
Normal file
@ -0,0 +1,86 @@
|
||||
/* GLib testing framework examples and tests
|
||||
*
|
||||
* Copyright (C) 2008-2010 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General
|
||||
* Public License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* Author: David Zeuthen <davidz@redhat.com>
|
||||
*/
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
#ifdef G_OS_UNIX
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <gio/gunixconnection.h>
|
||||
#endif
|
||||
|
||||
#ifdef G_OS_UNIX
|
||||
static void
|
||||
test_unix_from_fd (void)
|
||||
{
|
||||
gint fd;
|
||||
GError *error;
|
||||
GSocket *s;
|
||||
|
||||
fd = socket (AF_UNIX, SOCK_STREAM, 0);
|
||||
g_assert_cmpint (fd, !=, -1);
|
||||
|
||||
error = NULL;
|
||||
s = g_socket_new_from_fd (fd, &error);
|
||||
g_assert_no_error (error);
|
||||
g_assert_cmpint (g_socket_get_family (s), ==, G_SOCKET_FAMILY_UNIX);
|
||||
g_assert_cmpint (g_socket_get_socket_type (s), ==, G_SOCKET_TYPE_STREAM);
|
||||
g_assert_cmpint (g_socket_get_protocol (s), ==, G_SOCKET_PROTOCOL_DEFAULT);
|
||||
g_object_unref (s);
|
||||
}
|
||||
|
||||
static void
|
||||
test_unix_connection (void)
|
||||
{
|
||||
gint fd;
|
||||
GError *error;
|
||||
GSocket *s;
|
||||
GSocketConnection *c;
|
||||
|
||||
fd = socket (AF_UNIX, SOCK_STREAM, 0);
|
||||
g_assert_cmpint (fd, !=, -1);
|
||||
|
||||
error = NULL;
|
||||
s = g_socket_new_from_fd (fd, &error);
|
||||
g_assert_no_error (error);
|
||||
c = g_socket_connection_factory_create_connection (s);
|
||||
g_assert (G_IS_UNIX_CONNECTION (c));
|
||||
g_object_unref (c);
|
||||
g_object_unref (s);
|
||||
}
|
||||
#endif /* G_OS_UNIX */
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char *argv[])
|
||||
{
|
||||
g_type_init ();
|
||||
g_test_init (&argc, &argv, NULL);
|
||||
|
||||
#ifdef G_OS_UNIX
|
||||
g_test_add_func ("/socket/unix-from-fd", test_unix_from_fd);
|
||||
g_test_add_func ("/socket/unix-connection", test_unix_connection);
|
||||
#endif
|
||||
|
||||
return g_test_run();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user