[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