#include "portab.h"
#include "io.h"
-static char UNUSED id[] = "$Id: conn.c,v 1.198.2.4 2007/05/02 12:22:44 fw Exp $";
+static char UNUSED id[] = "$Id: conn.c,v 1.198.2.5 2007/05/09 13:21:38 fw Exp $";
#include "imp.h"
#include <assert.h>
static bool Handle_Write PARAMS(( CONN_ID Idx ));
+static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
static int New_Connection PARAMS(( int Sock ));
static CONN_ID Socket2Index PARAMS(( int Sock ));
static void Read_Request PARAMS(( CONN_ID Idx ));
} /* Conn_WriteStr */
-GLOBAL bool
+/**
+ * Append Data to outbound write buf.
+ * @param Idx Index fo the connection.
+ * @param Data pointer to data
+ * @param Len length of Data
+ * @return true on success, false otherwise.
+ */
+static bool
Conn_Write( CONN_ID Idx, char *Data, size_t Len )
{
- /* Daten in Socket schreiben. Bei "fatalen" Fehlern wird
- * der Client disconnectiert und false geliefert. */
assert( Idx > NONE );
assert( Data != NULL );
assert( Len > 0 );
- /* Ist der entsprechende Socket ueberhaupt noch offen? In einem
- * "Handler-Durchlauf" kann es passieren, dass dem nicht mehr so
- * ist, wenn einer von mehreren Conn_Write()'s fehlgeschlagen ist.
- * In diesem Fall wird hier einfach ein Fehler geliefert. */
+ /* Is the socket still open? A previous call to Conn_Write()
+ * may have closed the connection due to a fatal error.
+ * In this case it is sufficient to return an error */
if( My_Connections[Idx].sock <= NONE ) {
LogDebug("Skipped write on closed socket (connection %d).", Idx );
return false;
}
- /* Pruefen, ob im Schreibpuffer genuegend Platz ist. Ziel ist es,
- * moeglichts viel im Puffer zu haben und _nicht_ gleich alles auf den
- * Socket zu schreiben (u.a. wg. Komprimierung). */
+ /* check if outbound buffer has enough space for data.
+ * the idea is to keep data buffered before sending, e.g. to improve
+ * compression */
if( array_bytes(&My_Connections[Idx].wbuf) >= WRITEBUFFER_LEN) {
- /* Der Puffer ist dummerweise voll. Jetzt versuchen, den Puffer
- * zu schreiben, wenn das nicht klappt, haben wir ein Problem ... */
+ /* Buffer is full, flush. Handle_Write deals with low-level errors, if any. */
if( ! Handle_Write( Idx )) return false;
/* check again: if our writebuf is twice als large as the initial limit: Kill connection */
if( array_bytes(&My_Connections[Idx].wbuf) >= (WRITEBUFFER_LEN*2)) {
- Log( LOG_NOTICE, "Write buffer overflow (connection %d)!", Idx );
+ Log(LOG_NOTICE, "Write buffer overflow (connection %d, size %lu byte)!", Idx,
+ (unsigned long) array_bytes(&My_Connections[Idx].wbuf));
Conn_Close( Idx, "Write buffer overflow!", NULL, false );
return false;
}
#ifdef ZLIB
if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) {
- /* Daten komprimieren und in Puffer kopieren */
+ /* compress and move data to write buffer */
if( ! Zip_Buffer( Idx, Data, Len )) return false;
}
else
#endif
{
- /* Daten in Puffer kopieren */
+ /* copy data to write buffer */
if (!array_catb( &My_Connections[Idx].wbuf, Data, Len ))
return false;
/* Mark link as "closing" */
Conn_OPTION_ADD( &My_Connections[Idx], CONN_ISCLOSING );
-
+
if (LogMsg)
txt = LogMsg;
else
(double)My_Connections[Idx].bytes_out / 1024);
}
#endif
-
/* Send ERROR to client (see RFC!) */
if (FwdMsg)
Conn_WriteStr(Idx, "ERROR :%s", FwdMsg);
assert( Idx >= 0 );
c = array_get(&My_ConnArray, sizeof (CONNECTION), (size_t)Idx);
-
+
assert(c != NULL);
-
+
return c ? c->client : NULL;
}
* (at your option) any later version.
* Please read the file COPYING, README and AUTHORS for more information.
*
- * $Id: conn.h,v 1.42 2006/05/10 21:24:01 alex Exp $
+ * $Id: conn.h,v 1.42.2.1 2007/05/09 13:21:38 fw Exp $
*
* Connection management (header)
*/
GLOBAL void Conn_Handler PARAMS(( void ));
-GLOBAL bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, char *Format, ... ));
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient ));