[Telepathy-commits] [telepathy-salut/master] GibberListening: do not allow to listen several times
Alban Crequy
alban.crequy at collabora.co.uk
Thu Nov 6 10:29:03 PST 2008
---
lib/gibber/gibber-listener.c | 36 ++++++++++++++++++++++++++++++++++--
1 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/lib/gibber/gibber-listener.c b/lib/gibber/gibber-listener.c
index 09ea07e..000a105 100644
--- a/lib/gibber/gibber-listener.c
+++ b/lib/gibber/gibber-listener.c
@@ -63,6 +63,9 @@ struct _GibberListenerPrivate
{
GSList *listeners;
+ /* Don't allow to listen again if it is already listening */
+ gboolean listening;
+
gboolean dispose_has_run;
};
@@ -109,6 +112,7 @@ gibber_listeners_clean_listeners (GibberListener *self)
}
priv->listeners = NULL;
+ priv->listening = FALSE;
}
static void
@@ -197,7 +201,7 @@ add_listener (GibberListener *self, int family, int type, int protocol,
#define BACKLOG 5
int fd = -1, ret, yes = 1;
Listener *l;
- GibberListenerPrivate *priv = self->priv;
+ GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (self);
char name [NI_MAXHOST], portname[NI_MAXSERV];
union {
struct sockaddr addr;
@@ -312,11 +316,19 @@ static gboolean
listen_tcp_af (GibberListener *listener, int port, GibberAddressFamily family,
gboolean loopback, int *new_port, GError **error)
{
+ GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (listener);
struct addrinfo req, *ans = NULL, *a;
- GibberListenerPrivate *priv = listener->priv;
int ret;
gchar sport[6];
+ if (priv->listening)
+ {
+ g_set_error (error, GIBBER_LISTENER_ERROR,
+ GIBBER_LISTENER_ERROR_ALREADY_LISTENING,
+ "GibberListener is already listening");
+ return FALSE;
+ }
+
memset (&req, 0, sizeof (req));
if (!loopback)
req.ai_flags = AI_PASSIVE;
@@ -388,6 +400,11 @@ listen_tcp_af (GibberListener *listener, int port, GibberAddressFamily family,
if (fatal)
goto error;
}
+ else
+ {
+ /* add_listener succeeded: don't allow to listen again */
+ priv->listening = TRUE;
+ }
}
/* If all listeners failed, report the last error */
@@ -453,9 +470,18 @@ gboolean
gibber_listener_listen_socket (GibberListener *listener,
gchar *path, gboolean abstract, GError **error)
{
+ GibberListenerPrivate *priv = GIBBER_LISTENER_GET_PRIVATE (listener);
struct sockaddr_un addr;
int ret;
+ if (priv->listening)
+ {
+ g_set_error (error, GIBBER_LISTENER_ERROR,
+ GIBBER_LISTENER_ERROR_ALREADY_LISTENING,
+ "GibberListener is already listening");
+ return FALSE;
+ }
+
memset (&addr, 0, sizeof (addr));
addr.sun_family = PF_UNIX;
snprintf (addr.sun_path, sizeof (addr.sun_path) - 1, "%s", path);
@@ -463,5 +489,11 @@ gibber_listener_listen_socket (GibberListener *listener,
ret = add_listener (listener, AF_UNIX, SOCK_STREAM, 0,
(struct sockaddr *) &addr, sizeof (addr), NULL, error);
+ if (ret == TRUE)
+ {
+ /* add_listener succeeded: don't allow to listen again */
+ priv->listening = TRUE;
+ }
+
return ret;
}
--
1.5.6.5
More information about the Telepathy-commits
mailing list