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

SVN commit svn w toxygen.net
Pią, 8 Sie 2008, 14:26:17 CEST


Author: peres
Date: 2008-08-08 14:26:17 +0200 (Fri, 08 Aug 2008)
New Revision: 4233

Modified:
   trunk/ekg/net.c
Log:

Support defining port in 'server' with ekg_resolver3() and ekg_connect().



Modified: trunk/ekg/net.c
===================================================================
--- trunk/ekg/net.c	2008-08-08 10:43:04 UTC (rev 4232)
+++ trunk/ekg/net.c	2008-08-08 12:26:17 UTC (rev 4233)
@@ -159,7 +159,7 @@
 	return watch_add(plugin, fd[0], WATCH_READ, async, data);
 }
 
-static int irc_resolver2(char ***arr, const char *hostname) {
+static int irc_resolver2(char ***arr, const char *hostname, const int port) {
 #ifdef HAVE_GETADDRINFO
 	struct addrinfo	*ai, *aitmp, hint;
 	void		*tm = NULL;
@@ -198,7 +198,7 @@
 			} else
 				ip = inet_ntoa(*(struct in_addr *)tm);
 #endif 
-			array_add(arr, saprintf("%s %s %d\n", hostname, ip, aitmp->ai_family));
+			array_add(arr, saprintf("%s %s %d %d\n", hostname, ip, aitmp->ai_family, port));
 		}
 		freeaddrinfo(ai);
 	}
@@ -206,13 +206,27 @@
 	if ((he4 = gethostbyname(hostname))) {
 		/* copied from http://webcvs.ekg2.org/ekg2/plugins/irc/irc.c.diff?r1=1.79&r2=1.80 OLD RESOLVER VERSION...
 		 * .. huh, it was 8 months ago..*/
-		array_add(arr, saprintf("%s %s %d\n", hostname, inet_ntoa(*(struct in_addr *) he4->h_addr), AF_INET));
+		array_add(arr, saprintf("%s %s %d %d\n", hostname, inet_ntoa(*(struct in_addr *) he4->h_addr), AF_INET, port));
 	} else array_add(arr, saprintf("%s : no_host_get_addrinfo()\n", hostname));
 #endif
 
 	return 0;
 }
 
+/* Removes port from 'hostname' and returns it
+ * WARN: hostname is modified */
+static const int ekg_resolver_split(char *hostname) {
+	char *p = xstrrchr(hostname, ':');
+	int i;
+
+	if (p && (i = atoi(p+1)) > 0 && (i <= 65535) && (xstrspn(p+1, "0123456789") == xstrlen(p+1))) {
+		*p = 0;
+		return i;
+	}
+
+	return 0;
+}
+
 /*
  * ekg_resolver3()
  *
@@ -223,12 +237,14 @@
  *  - data	- watch data handler.
  *
  *  in @a async watch you'll recv lines:
- *  	HOSTNAME IPv4 PF_INET 
- *  	HOSTNAME IPv4 PF_INET
- *  	HOSTNAME IPv6 PF_INET6
+ *  	HOSTNAME IPv4 PF_INET port
+ *  	HOSTNAME IPv4 PF_INET port
+ *  	HOSTNAME IPv6 PF_INET6 port
  *  	....
  *  	EOR means end of resolving, you should return -1 (temporary watch) and in type == 1 close fd.
  *
+ *  	port may be 0 if no port specified
+ *
  *  NOTE, EKG2-RESOLVER-API IS NOT STABLE.
  *  	IT'S JUST COPY-PASTE OF SOME FUNCTION FROM OTHER PLUGINS, TO AVOID DUPLICATION OF CODE (ALSO CLEANUP CODE A LITTLE)
  *  	AND TO AVOID REGRESSION. 
@@ -257,6 +273,7 @@
 
 	if (!res) {
 		char *tmp	= xstrdup(server);
+		const int port	= ekg_resolver_split(tmp);
 
 		/* Child */
 		close(fd[0]);
@@ -271,7 +288,7 @@
 			 */
 			do {
 				if ((tmp2 = xstrchr(tmp1, ','))) *tmp2 = '\0';
-				irc_resolver2(&arr, tmp1);
+				irc_resolver2(&arr, tmp1, port);
 				tmp1 = tmp2+1;
 			} while (tmp2);
 
@@ -371,7 +388,7 @@
 	return 0;
 }
 
-static int ekg_build_sin(const char *data, const int defport, struct sockaddr **address, int *family) {
+static const int ekg_build_sin(const char *data, const int defport, struct sockaddr **address, int *family) {
 	struct sockaddr_in  *ipv4;
 	struct sockaddr_in6 *ipv6;
 



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