- INT sock; /* Socket Handle */
- struct sockaddr_in addr; /* Adresse des Client */
- RES_STAT *res_stat; /* "Resolver-Status", s.o. */
- CHAR host[HOST_LEN]; /* Hostname */
- CHAR rbuf[READBUFFER_LEN]; /* Lesepuffer */
- INT rdatalen; /* Laenge der Daten im Lesepuffer */
- CHAR wbuf[WRITEBUFFER_LEN]; /* Schreibpuffer */
- INT wdatalen; /* Laenge der Daten im Schreibpuffer */
- INT our_server; /* wenn von uns zu connectender Server: ID */
- time_t lastdata; /* Letzte Aktivitaet */
- time_t lastping; /* Letzter PING */
- time_t lastprivmsg; /* Letzte PRIVMSG */
- time_t delaytime; /* Nicht beachten bis ("penalty") */
- LONG bytes_in, bytes_out; /* Counter fuer Statistik */
- INT flag; /* "Markierungs-Flag" (vgl. "irc-write"-Modul) */
- INT options; /* Link-Optionen */
-#ifdef USE_ZLIB
- ZIPDATA zip; /* Kompressionsinformationen */
+ int res, err, server;
+ socklen_t sock_len;
+ CONN_ID idx = Socket2Index( sock );
+
+ if (idx <= NONE) {
+ LogDebug("cb_connserver wants to write on unknown socket?!");
+ io_close(sock);
+ return;
+ }
+
+ assert(what & IO_WANTWRITE);
+
+ /* Make sure that the server is still configured; it could have been
+ * removed in the meantime! */
+ server = Conf_GetServer(idx);
+ if (server < 0) {
+ Log(LOG_ERR, "Connection on socket %d to \"%s\" aborted!",
+ sock, My_Connections[idx].host);
+ Conn_Close(idx, "Connection aborted!", NULL, false);
+ return;
+ }
+
+ /* connect() finished, get result. */
+ sock_len = (socklen_t)sizeof(err);
+ res = getsockopt(My_Connections[idx].sock, SOL_SOCKET, SO_ERROR,
+ &err, &sock_len );
+ assert(sock_len == sizeof(err));
+
+ /* Error while connecting? */
+ if ((res != 0) || (err != 0)) {
+ if (res != 0)
+ Log(LOG_CRIT, "getsockopt (connection %d): %s!",
+ idx, strerror(errno));
+ else
+ Log(LOG_CRIT,
+ "Can't connect socket to \"%s:%d\" (connection %d): %s!",
+ My_Connections[idx].host, Conf_Server[server].port,
+ idx, strerror(err));
+
+ Conn_Close(idx, "Can't connect!", NULL, false);
+
+ if (ng_ipaddr_af(&Conf_Server[server].dst_addr[0])) {
+ /* more addresses to try... */
+ New_Server(server, &Conf_Server[server].dst_addr[0]);
+ /* connection to dst_addr[0] is now in progress, so
+ * remove this address... */
+ Conf_Server[server].dst_addr[0] =
+ Conf_Server[server].dst_addr[1];
+ memset(&Conf_Server[server].dst_addr[1], 0,
+ sizeof(Conf_Server[server].dst_addr[1]));
+ }
+ return;
+ }
+
+ /* connect() succeeded, remove all additional addresses */
+ memset(&Conf_Server[server].dst_addr, 0,
+ sizeof(Conf_Server[server].dst_addr));
+
+ Conn_OPTION_DEL( &My_Connections[idx], CONN_ISCONNECTING );
+#ifdef SSL_SUPPORT
+ if ( Conn_OPTION_ISSET( &My_Connections[idx], CONN_SSL_CONNECT )) {
+ io_event_setcb( sock, cb_connserver_login_ssl );
+ io_event_add( sock, IO_WANTWRITE|IO_WANTREAD );
+ return;
+ }