#include "portab.h"
-static char UNUSED id[] = "$Id: conn.c,v 1.127 2003/11/05 23:24:48 alex Exp $";
+static char UNUSED id[] = "$Id: conn.c,v 1.129 2003/12/27 13:01:12 alex Exp $";
#include "imp.h"
#include <assert.h>
#include <stdint.h> /* e.g. for Mac OS X */
#endif
-#ifdef USE_TCPWRAP
+#ifdef TCPWRAP
#include <tcpd.h> /* for TCP Wrappers */
#endif
LOCAL fd_set My_Sockets;
LOCAL fd_set My_Connects;
-#ifdef USE_TCPWRAP
+#ifdef TCPWRAP
INT allow_severity = LOG_INFO;
INT deny_severity = LOG_ERR;
#endif
FD_ZERO( &write_sockets );
for( i = 0; i < Pool_Size; i++ )
{
-#ifdef USE_ZLIB
+#ifdef ZLIB
if(( My_Connections[i].sock > NONE ) && (( My_Connections[i].wdatalen > 0 ) || ( My_Connections[i].zip.wdatalen > 0 )))
#else
if(( My_Connections[i].sock > NONE ) && ( My_Connections[i].wdatalen > 0 ))
}
}
-#ifdef USE_ZLIB
+#ifdef ZLIB
if( My_Connections[Idx].options & CONN_ZIP )
{
/* Daten komprimieren und in Puffer kopieren */
CLIENT *c;
DOUBLE in_k, out_k;
-#ifdef USE_ZLIB
+#ifdef ZLIB
DOUBLE in_z_k, out_z_k;
INT in_p, out_p;
#endif
/* Calculate statistics and log information */
in_k = (DOUBLE)My_Connections[Idx].bytes_in / 1024;
out_k = (DOUBLE)My_Connections[Idx].bytes_out / 1024;
-#ifdef USE_ZLIB
+#ifdef ZLIB
if( My_Connections[Idx].options & CONN_ZIP )
{
in_z_k = (DOUBLE)My_Connections[Idx].zip.bytes_in / 1024;
/* Servers: Modify time of next connect attempt? */
Conf_UnsetServer( Idx );
-#ifdef USE_ZLIB
+#ifdef ZLIB
/* Clean up zlib, if link was compressed */
if( Conn_Options( Idx ) & CONN_ZIP )
{
assert( My_Connections[Idx].sock > NONE );
/* sind ueberhaupt Daten vorhanden? */
-#ifdef USE_ZLIB
+#ifdef ZLIB
if(( ! My_Connections[Idx].wdatalen > 0 ) && ( ! My_Connections[Idx].zip.wdatalen )) return TRUE;
#else
if( ! My_Connections[Idx].wdatalen > 0 ) return TRUE;
return Conn_WriteStr( Idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
}
-#ifdef USE_ZLIB
+#ifdef ZLIB
/* Schreibpuffer leer, aber noch Daten im Kompressionsbuffer?
* Dann muss dieser nun geflushed werden! */
if( My_Connections[Idx].wdatalen == 0 ) Zip_Flush( Idx );
/* Neue Client-Verbindung von Listen-Socket annehmen und
* CLIENT-Struktur anlegen. */
-#ifdef USE_TCPWRAP
+#ifdef TCPWRAP
struct request_info req;
#endif
struct sockaddr_in new_addr;
return;
}
-#ifdef USE_TCPWRAP
+#ifdef TCPWRAP
/* Validate socket using TCP Wrappers */
request_init( &req, RQ_DAEMON, PACKAGE_NAME, RQ_FILE, new_sock, RQ_CLIENT_SIN, &new_addr, NULL );
if( ! hosts_access( &req ))
/* Hostnamen ermitteln */
strlcpy( My_Connections[idx].host, inet_ntoa( new_addr.sin_addr ), sizeof( My_Connections[idx].host ));
Client_SetHostname( c, My_Connections[idx].host );
+#ifdef IDENTAUTH
+ s = Resolve_Addr( &new_addr, My_Connections[idx].sock );
+#else
s = Resolve_Addr( &new_addr );
+#endif
if( s )
{
/* Sub-Prozess wurde asyncron gestartet */
* Tritt ein Fehler auf, so wird der Socket geschlossen. */
INT len, bsize;
-#ifdef USE_ZLIB
+#ifdef ZLIB
CLIENT *c;
#endif
/* wenn noch nicht registriert: maximal mit ZREADBUFFER_LEN arbeiten,
* ansonsten koennen Daten ggf. nicht umkopiert werden. */
bsize = READBUFFER_LEN;
-#ifdef USE_ZLIB
+#ifdef ZLIB
c = Client_GetFromConn( Idx );
if(( Client_Type( c ) != CLIENT_USER ) && ( Client_Type( c ) != CLIENT_SERVER ) && ( Client_Type( c ) != CLIENT_SERVICE ) && ( bsize > ZREADBUFFER_LEN )) bsize = ZREADBUFFER_LEN;
#endif
-#ifdef USE_ZLIB
+#ifdef ZLIB
if(( bsize - My_Connections[Idx].rdatalen - 1 < 1 ) || ( ZREADBUFFER_LEN - My_Connections[Idx].zip.rdatalen < 1 ))
#else
if( bsize - My_Connections[Idx].rdatalen - 1 < 1 )
return;
}
-#ifdef USE_ZLIB
+#ifdef ZLIB
if( My_Connections[Idx].options & CONN_ZIP )
{
len = recv( My_Connections[Idx].sock, My_Connections[Idx].zip.rbuf + My_Connections[Idx].zip.rdatalen, ( ZREADBUFFER_LEN - My_Connections[Idx].zip.rdatalen ), 0 );
CHAR *ptr;
INT len, delta;
BOOLEAN action, result;
-#ifdef USE_ZLIB
+#ifdef ZLIB
BOOLEAN old_z;
#endif
/* Check penalty */
if( My_Connections[Idx].delaytime > time( NULL )) return result;
-#ifdef USE_ZLIB
+#ifdef ZLIB
/* ggf. noch unkomprimiete Daten weiter entpacken */
if( My_Connections[Idx].options & CONN_ZIP )
{
return FALSE;
}
-#ifdef USE_ZLIB
+#ifdef ZLIB
/* merken, ob Stream bereits komprimiert wird */
old_z = My_Connections[Idx].options & CONN_ZIP;
#endif
My_Connections[Idx].rdatalen -= len;
memmove( My_Connections[Idx].rbuf, My_Connections[Idx].rbuf + len, My_Connections[Idx].rdatalen );
-#ifdef USE_ZLIB
+#ifdef ZLIB
if(( ! old_z ) && ( My_Connections[Idx].options & CONN_ZIP ) && ( My_Connections[Idx].rdatalen > 0 ))
{
/* Mit dem letzten Befehl wurde Socket-Kompression aktiviert.
My_Connections[Idx].flag = 0;
My_Connections[Idx].options = 0;
-#ifdef USE_ZLIB
+#ifdef ZLIB
My_Connections[Idx].zip.rbuf[0] = '\0';
My_Connections[Idx].zip.rdatalen = 0;
My_Connections[Idx].zip.wbuf[0] = '\0';
FD_CLR( r_fd, &Resolver_FDs );
- /* Anfrage vom Parent lesen */
+ /* Read result from pipe */
len = read( r_fd, result, HOST_LEN - 1 );
if( len < 0 )
{
- /* Fehler beim Lesen aus der Pipe */
+ /* Error! */
close( r_fd );
Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror( errno ));
return;
}
result[len] = '\0';
- /* zugehoerige Connection suchen */
+ /* Search associated connection ... */
for( i = 0; i < Pool_Size; i++ )
{
if(( My_Connections[i].sock != NONE ) && ( My_Connections[i].res_stat ) && ( My_Connections[i].res_stat->pipe[0] == r_fd )) break;
}
if( i >= Pool_Size )
{
- /* Opsa! Keine passende Connection gefunden!? Vermutlich
- * wurde sie schon wieder geschlossen. */
+ /* Ops, none found? Probably the connection has already
+ * been closed. */
close( r_fd );
#ifdef DEBUG
Log( LOG_DEBUG, "Resolver: Got result for unknown connection!?" );
Log( LOG_DEBUG, "Resolver: %s is \"%s\".", My_Connections[i].host, result );
#endif
- /* Aufraeumen */
+ /* Clean up ... */
close( My_Connections[i].res_stat->pipe[0] );
close( My_Connections[i].res_stat->pipe[1] );
free( My_Connections[i].res_stat );
if( My_Connections[i].sock > NONE )
{
- /* Eingehende Verbindung: Hostnamen setzen */
+#ifdef IDENTAUTH
+ CHAR *ident;
+#endif
+ /* Incoming connection: set hostname */
c = Client_GetFromConn( i );
assert( c != NULL );
strlcpy( My_Connections[i].host, result, sizeof( My_Connections[i].host ));
Client_SetHostname( c, result );
+
+#ifdef IDENTAUTH
+ ident = strchr( result, 0 );
+ ident++;
+
+ /* Do we have a result of the IDENT lookup? */
+ if( *ident )
+ {
+ Log( LOG_INFO, "IDENT lookup on connection %ld: \"%s\".", i, ident );
+ Client_SetUser( c, ident, TRUE );
+ }
+ else Log( LOG_INFO, "IDENT lookup on connection %ld: no result.", i );
+#endif
}
else
{
- /* Ausgehende Verbindung (=Server): IP setzen */
+ /* Outgoing connection (server link!): set IP address */
n = Conf_GetServer( i );
if( n > NONE ) strlcpy( Conf_Server[n].ip, result, sizeof( Conf_Server[n].ip ));
else Log( LOG_ERR, "Got resolver result for non-configured server!?" );
}
- /* Penalty-Zeit zurueck setzen */
+ /* Reset penalty time */
Conn_ResetPenalty( i );
} /* Read_Resolver_Result */