[ekg2-commit] r4221 - trunk/ekg: trunk/ekg/net.c
SVN commit
svn w toxygen.net
Czw, 7 Sie 2008, 20:12:26 CEST
Author: peres
Date: 2008-08-07 20:12:25 +0200 (Thu, 07 Aug 2008)
New Revision: 4221
Modified:
trunk/ekg/net.c
Log:
Last piece of code. Now to start testing and fixing.
Modified: trunk/ekg/net.c
===================================================================
--- trunk/ekg/net.c 2008-08-07 17:35:06 UTC (rev 4220)
+++ trunk/ekg/net.c 2008-08-07 18:12:25 UTC (rev 4221)
@@ -405,16 +405,14 @@
#else
#warning "irc: You don't have inet_pton() connecting to ipv4 hosts may not work"
#ifdef HAVE_INET_ATON /* XXX */
- if (!inet_aton(addr, &(ipv4->sin_addr))) {
- debug("inet_aton() failed on addr: %s.\n", addr);
- }
+ if (!inet_aton(addr, &(ipv4->sin_addr)))
+ debug_error("inet_aton() failed on addr: %s.\n", addr);
#else
#warning "irc: You don't have inet_aton() connecting to ipv4 hosts may not work"
#endif
#warning "irc: Yeah, You have inet_addr() connecting to ipv4 hosts may work :)"
- if ((ipv4->sin_addr.s_addr = inet_addr(co->address)) == -1) {
- debug("inet_addr() failed or returns 255.255.255.255? on %s\n", addr);
- }
+ if ((ipv4->sin_addr.s_addr = inet_addr(co->address)) == -1)
+ debug_error("inet_addr() failed or returns 255.255.255.255? on %s\n", addr);
#endif
*address = (struct sockaddr *) ipv4;
@@ -440,10 +438,29 @@
}
static WATCHER(ekg_connect_handler) {
- /* XXX */
+ struct ekg_connect_data *c = (struct ekg_connect_data*) data;
+ int res = 0;
+ socklen_t res_size = sizeof(res);
+
+ if (!c)
+ return -1;
+
+ debug_function("ekg_connect_handler(), type = %d.\n", type);
- debug_function("ekg_connect_handler()\n");
-
+ if (type == 1)
+ return 0;
+ else if (type || getsockopt(fd, SOL_SOCKET, SO_ERROR, &res, &res_size) || res) {
+ if (res)
+ debug_error("ekg_connect_handler(), error: %s\n", strerror(res));
+ ekg_connect_loop(c);
+ close(fd);
+ } else if (c->async(type, fd, WATCH_WRITE, c->session) > 0) {
+ debug_error("ekg_connect_handler(), looks like caller didn't like our job.\n");
+ ekg_connect_loop(c);
+ close(fd);
+ } else
+ ekg_connect_data_free(c);
+
return -1;
}
@@ -464,7 +481,7 @@
watch_t *w;
do {
- const int one = 1;
+ int one = 1;
len = ekg_build_sin(host, c->port, &addr, &family);
debug_function("ekg_connect_loop(), connect: %s, sinlen: %d\n", host, len);
@@ -497,8 +514,8 @@
break;
}
- w = watch_add_session(s, fd, WATCH_WRITE, ekg_connect_handler);
- watch_timeout_set(w, 30 /* XXX */);
+ w = watch_add(s->plugin, fd, WATCH_WRITE, ekg_connect_handler, c);
+ watch_timeout_set(w, 10 /* XXX */);
return 1;
} while (0);
@@ -516,7 +533,7 @@
}
/* 3) fail */
-// c->async(0, 0, 0, c->session); /* XXX: pass error? */
+ c->async(2, 0, WATCH_WRITE, c->session);
ekg_connect_data_free(c);
return 0;
}
Więcej informacji o liście dyskusyjnej ekg2-commit