- /* Ein Client Socket: entweder ein User oder Server */
-
- idx = Socket2Index( Sock );
- if( idx > NONE ) Read_Request( idx );
- }
-} /* Handle_Read */
-
-
-LOCAL BOOLEAN
-Handle_Write( CONN_ID Idx )
-{
- /* Daten aus Schreibpuffer versenden bzw. Connection aufbauen */
-
- INT len, res, err;
-
- assert( Idx > NONE );
- assert( My_Connections[Idx].sock > NONE );
-
- if( FD_ISSET( My_Connections[Idx].sock, &My_Connects ))
- {
- /* es soll nichts geschrieben werden, sondern ein
- * connect() hat ein Ergebnis geliefert */
-
- FD_CLR( My_Connections[Idx].sock, &My_Connects );
-
- /* Ergebnis des connect() ermitteln */
- len = sizeof( err );
- res = getsockopt( My_Connections[Idx].sock, SOL_SOCKET, SO_ERROR, &err, &len );
- assert( len == sizeof( err ));
-
- /* Fehler aufgetreten? */
- if(( res != 0 ) || ( err != 0 ))
- {
- /* Fehler! */
- 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[Conf_GetServer( Idx )].port, Idx, strerror( err ));
-
- /* Socket etc. pp. aufraeumen */
- FD_CLR( My_Connections[Idx].sock, &My_Sockets );
- close( My_Connections[Idx].sock );
- Init_Conn_Struct( Idx );
-
- /* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */
- Conf_Server[Conf_GetServer( Idx )].lasttry = time( NULL );
- Conf_UnsetServer( Idx );
-
- return FALSE;
- }
- Log( LOG_DEBUG, "Connection %d with \"%s:%d\" established, now sendig PASS and SERVER ...", Idx, My_Connections[Idx].host, Conf_Server[Conf_GetServer( Idx )].port );
-
- /* PASS und SERVER verschicken */
- Conn_WriteStr( Idx, "PASS %s %s", Conf_Server[Conf_GetServer( Idx )].pwd_out, NGIRCd_ProtoID );
- return Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
- }
-
-#ifdef USE_ZLIB
- /* Schreibpuffer leer, aber noch Daten im Kompressionsbuffer?
- * Dann muss dieser nun geflushed werden! */
- if( My_Connections[Idx].wdatalen == 0 ) Zip_Flush( Idx );
-#endif
-
- assert( My_Connections[Idx].wdatalen > 0 );
-
- /* Daten schreiben */
- len = send( My_Connections[Idx].sock, My_Connections[Idx].wbuf, My_Connections[Idx].wdatalen, 0 );
- if( len < 0 )
- {
- /* Operation haette Socket "nur" blockiert ... */
- if( errno == EAGAIN ) return TRUE;
-
- /* Oops, ein Fehler! */
- Log( LOG_ERR, "Write error on connection %d (socket %d): %s!", Idx, My_Connections[Idx].sock, strerror( errno ));
- Conn_Close( Idx, "Write error!", NULL, FALSE );
- return FALSE;
- }
-
- /* Puffer anpassen */
- My_Connections[Idx].wdatalen -= len;
- memmove( My_Connections[Idx].wbuf, My_Connections[Idx].wbuf + len, My_Connections[Idx].wdatalen );
-
- return TRUE;
-} /* Handle_Write */
-
-
-LOCAL VOID
-New_Connection( INT Sock )
-{
- /* Neue Client-Verbindung von Listen-Socket annehmen und
- * CLIENT-Struktur anlegen. */
-
- struct sockaddr_in new_addr;
- INT new_sock, new_sock_len;
- RES_STAT *s;
- CONN_ID idx;
- CLIENT *c;
- POINTER *ptr;
- LONG new_size;
-
- assert( Sock > NONE );
-
- /* Connection auf Listen-Socket annehmen */
- new_sock_len = sizeof( new_addr );
- new_sock = accept( Sock, (struct sockaddr *)&new_addr, (socklen_t *)&new_sock_len );
- if( new_sock < 0 )
- {
- Log( LOG_CRIT, "Can't accept connection: %s!", strerror( errno ));