[ekg2-commit] r4214 - trunk/ekg: trunk/ekg/net.c trunk/ekg/net.h

SVN commit svn w toxygen.net
Czw, 7 Sie 2008, 15:53:43 CEST


Author: peres
Date: 2008-08-07 15:53:42 +0200 (Thu, 07 Aug 2008)
New Revision: 4214

Modified:
   trunk/ekg/net.c
   trunk/ekg/net.h
Log:
Fixes, updates, and now ekg_connect() can even resolve!



Modified: trunk/ekg/net.c
===================================================================
--- trunk/ekg/net.c	2008-08-07 13:48:06 UTC (rev 4213)
+++ trunk/ekg/net.c	2008-08-07 13:53:42 UTC (rev 4214)
@@ -303,11 +303,21 @@
 	char	**connect_queue;	/* here we keep list of IPs to try to connect	*/
 
 		/* data provided by user */
-	session_t *session;
+	char	*session;
 	watcher_handler_func_t *async;
-	int (*prefer_comparison)(void *, void *);
+	int (*prefer_comparison)(const char *, const char *);
 };
 
+static void ekg_connect_data_free(struct ekg_connect_data *c) {
+	/* XXX: call async with type==1? */
+
+	array_free(c->resolver_queue);
+	array_free(c->connect_queue);
+	xfree(c->session);
+
+	xfree(c);
+}
+
 	/* XXX: would we use it anywhere else? if yes, then move to dynstuff */
 static char *array_shift(char ***array) {
 	char *out	= NULL;
@@ -320,7 +330,7 @@
 			out = *array[0];
 			for (; i < count; i++)
 				*array[i-1] = *array[i];
-			*array[i] = NULL;
+			*array[i-1] = NULL;
 		}
 
 		if (i == 1) { /* last element, free array */
@@ -332,12 +342,47 @@
 	return out;
 }
 
+static int ekg_connect_loop(struct ekg_connect_data *c);
+
+static WATCHER_LINE(ekg_connect_resolver_handler) {
+	struct ekg_connect_data *c = (struct ekg_connect_data*) data;
+
+	if (!data)
+		return -1;
+
+	if (type) {
+		debug_function("ekg_connect_resolver_handler(), resolving done.\n");
+		if (c->prefer_comparison)
+			qsort(c->connect_queue, array_count(c->connect_queue), sizeof(char*),
+					(void*) c->prefer_comparison);
+		ekg_connect_loop(c);
+		close(fd);
+		return -1;
+	}
+
+	debug_function("ekg_connect_resolver_handler() = %s\n", watch);
+
+	if (!xstrcmp(watch, "EOR"))
+		return -1;
+	
+	array_add(&(c->connect_queue), xstrdup(watch));
+
+	return 0;
+}
+
 static int ekg_connect_loop(struct ekg_connect_data *c) {
 	char *host;
+	session_t *s = session_find(c->session);
 
+	if (!s) { /* session vanished! */
+		debug_error("ekg_connect_loop(), looks like session '%s' vanished!\n", c->session);
+		ekg_connect_data_free(c);
+		return 0;
+	}
+
 	/* 1) if anything is in connect_queue, try to connect */
 	if ((host = array_shift(&(c->connect_queue)))) {
-		debug_function("ekg_connect_loop(), connect: %s", host);
+		debug_function("ekg_connect_loop(), connect: %s\n", host);
 		/* XXX */
 		xfree(host);
 
@@ -346,28 +391,29 @@
 
 	/* 2) if anything is in resolver_queue, try to resolve */
 	if ((host = array_shift(&(c->resolver_queue)))) {
-		debug_function("ekg_connect_loop(), resolve: %s", host);
-		/* XXX */
+		debug_function("ekg_connect_loop(), resolve: %s\n", host);
+		ekg_resolver3(s->plugin, host, (void*) ekg_connect_resolver_handler, c);
 		xfree(host);
 
 		return 1;
 	}
 
 	/* 3) fail */
-	c->async(0, 0, 0, c->session); /* XXX: pass error? */
-	xfree(c); /* arrays should be already freed */
+//	c->async(0, 0, 0, c->session); /* XXX: pass error? */
+	ekg_connect_data_free(c);
 	return 0;
 }
 
-int ekg_connect(session_t *session, const char *server, int (*prefer_comparison)(void *, void *), watcher_handler_func_t async) {
-	struct ekg_connect_data	*c = xmalloc(sizeof(struct ekg_connect_data));
+int ekg_connect(session_t *session, const char *server, int (*prefer_comparison)(const char *, const char *), watcher_handler_func_t async) {
+	struct ekg_connect_data	*c;
 
 	if (!session || !server || !async)
 		return 0;
+	c = xmalloc(sizeof(struct ekg_connect_data));
 
 	/* 1) fill struct */
 	c->resolver_queue	= array_make(server, ",", 0, 1, 1);
-	c->session		= session;
+	c->session		= xstrdup(session_uid_get(session));
 	c->async		= async;
 	c->prefer_comparison	= prefer_comparison;
 

Modified: trunk/ekg/net.h
===================================================================
--- trunk/ekg/net.h	2008-08-07 13:48:06 UTC (rev 4213)
+++ trunk/ekg/net.h	2008-08-07 13:53:42 UTC (rev 4214)
@@ -31,7 +31,7 @@
 watch_t *ekg_resolver2(plugin_t *plugin, const char *server, watcher_handler_func_t async, void *data);
 watch_t *ekg_resolver3(plugin_t *plugin, const char *server, watcher_handler_func_t async, void *data);
 
-int ekg_connect(session_t *session, const char *server, int (*prefer_comparison)(void *, void *), watcher_handler_func_t async);
+int ekg_connect(session_t *session, const char *server, int (*prefer_comparison)(const char *, const char *), watcher_handler_func_t async);
 
 #endif /* EKG2_WIN32_NOFUNCTION */
 #endif /* __EKG_NET_H */



Więcej informacji o liście dyskusyjnej ekg2-commit