G_DEFINE_TYPE (GSocket, g_socket, G_TYPE_OBJECT);
+enum
+{
+ PROP_0,
+ PROP_FD
+};
+
struct _GSocketPrivate
{
- int fd;
+ gint fd;
+ gboolean blocking;
};
+static void
+g_socket_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+ GSocket *socket = G_SOCKET (object);
+
+ switch (prop_id)
+ {
+ case PROP_FD:
+ g_value_set_int (value, socket->priv->fd);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+g_socket_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+ GSocket *socket = G_SOCKET (object);
+
+ switch (prop_id)
+ {
+ case PROP_FD:
+ socket->priv->fd = g_value_get_int (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
static void
g_socket_finalize (GObject *object)
{
gobject_class->finalize = g_socket_finalize;
gobject_class->dispose = g_socket_dispose;
+ gobject_class->set_property = g_socket_set_property;
+ gobject_class->get_property = g_socket_get_property;
}
static void
-g_socket_init (GSocket *address)
+g_socket_init (GSocket *socket)
{
- address->priv = G_TYPE_INSTANCE_GET_PRIVATE (address, G_TYPE_SOCKET, GSocketPrivate);
+ socket->priv = G_TYPE_INSTANCE_GET_PRIVATE (socket, G_TYPE_SOCKET, GSocketPrivate);
+
+ socket->priv->fd = -1;
+ socket->priv->blocking = TRUE;
}
GSocket *
-g_socket_new ()
+g_socket_new (gint domain, gint type, gint protocol)
{
- return G_SOCKET (g_object_new (G_TYPE_SOCKET, NULL));
+ gint sock;
+
+ sock = socket(domain, type, protocol);
+
+ if (sock < 0)
+ return NULL;
+
+ return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", sock, NULL));
}
GSocket *
g_socket_new_from_fd (gint fd)
{
- return G_SOCKET (g_object_new (G_TYPE_SOCKET, NULL));
+ return G_SOCKET (g_object_new (G_TYPE_SOCKET, "fd", fd, NULL));
}
void
-g_socket_set_blocking (GSocket *socket, gboolean blocking)
+g_socket_set_blocking (GSocket *socket,
+ gboolean blocking)
{
glong arg;
}
void
-g_socket_listen (GSocket *socket, gint backlog)
+g_socket_listen (GSocket *socket,
+ gint backlog)
{
g_return_if_fail (G_IS_SOCKET (socket));
listen (socket->priv->fd, backlog);
}
+gboolean
+g_socket_bind (GSocket *socket,
+ GSocketAddress *address,
+ GError **error)
+{
+ g_return_val_if_fail (G_IS_SOCKET (socket) && G_IS_SOCKET_ADDRESS (address), FALSE);
+
+ {
+ gchar addr[g_socket_address_native_size (address)];
+
+ if (!g_socket_address_to_native (address, addr))
+ return FALSE;
+
+ if (bind (socket->priv->fd, (struct sockaddr *) addr, g_socket_address_native_size (address)) < 0)
+ {
+ // TODO: set error
+ return FALSE;
+ }
+
+ g_object_unref (address);
+
+ return TRUE;
+ }
+}
+
gboolean
g_socket_connect (GSocket *socket,
GSocketAddress *address,
GAsyncResult *result,
GError **error)
{
-
+ return FALSE;
}