mirror of
https://github.com/osmarks/ngircd.git
synced 2024-12-13 10:20:28 +00:00
internal changes needed for future ssl support
This commit is contained in:
parent
890c3d9d72
commit
51ccb5928a
@ -14,7 +14,7 @@
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: conf.c,v 1.81 2005/07/28 16:23:55 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: conf.c,v 1.82 2005/07/29 09:29:47 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@ -38,6 +38,7 @@ static char UNUSED id[] = "$Id: conf.c,v 1.81 2005/07/28 16:23:55 fw Exp $";
|
||||
# include <ctype.h>
|
||||
#endif
|
||||
|
||||
#include "array.h"
|
||||
#include "ngircd.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
@ -72,6 +73,54 @@ LOCAL void Config_Error_TooLong PARAMS(( const int LINE, const char *Value ));
|
||||
LOCAL void Init_Server_Struct PARAMS(( CONF_SERVER *Server ));
|
||||
|
||||
|
||||
static void
|
||||
ports_puts(array *a)
|
||||
{
|
||||
unsigned int len;
|
||||
UINT16 *ports;
|
||||
len = array_length(a, sizeof(UINT16));
|
||||
if (len--) {
|
||||
ports = (UINT16*) array_start(a);
|
||||
printf("%u", (unsigned int) *ports);
|
||||
while (len--) {
|
||||
ports++;
|
||||
printf(", %u", (unsigned int) *ports);
|
||||
}
|
||||
}
|
||||
putc('\n', stdout);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
ports_parse(array *a, int Line, char *Arg)
|
||||
{
|
||||
char *ptr;
|
||||
int port;
|
||||
UINT16 port16;
|
||||
|
||||
array_trunc(a);
|
||||
|
||||
/* Ports on that the server should listen. More port numbers
|
||||
* must be separated by "," */
|
||||
ptr = strtok( Arg, "," );
|
||||
while (ptr) {
|
||||
ngt_TrimStr( ptr );
|
||||
port = atol( ptr );
|
||||
if (port > 0 && port < 0xFFFF) {
|
||||
port16 = (UINT16) port;
|
||||
if (!array_catb(a, (char*)&port16, sizeof port16))
|
||||
Config_Error(LOG_ERR, "%s, line %d Could not add port number %ld: %s",
|
||||
NGIRCd_ConfFile, Line, port, strerror(errno));
|
||||
} else {
|
||||
Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!",
|
||||
NGIRCd_ConfFile, Line, port );
|
||||
}
|
||||
|
||||
ptr = strtok( NULL, "," );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
GLOBAL void
|
||||
Conf_Init( void )
|
||||
{
|
||||
@ -126,13 +175,10 @@ Conf_Test( void )
|
||||
printf( " MotdPhrase = %s\n", Conf_MotdPhrase );
|
||||
printf( " ChrootDir = %s\n", Conf_Chroot );
|
||||
printf( " PidFile = %s\n", Conf_PidFile);
|
||||
printf( " Ports = " );
|
||||
for( i = 0; i < Conf_ListenPorts_Count; i++ )
|
||||
{
|
||||
if( i != 0 ) printf( ", " );
|
||||
printf( "%u", (unsigned int) Conf_ListenPorts[i] );
|
||||
}
|
||||
puts( "" );
|
||||
fputs(" Ports = ", stdout);
|
||||
|
||||
ports_puts(&Conf_ListenPorts);
|
||||
|
||||
printf( " Listen = %s\n", Conf_ListenAddress );
|
||||
pwd = getpwuid( Conf_UID );
|
||||
if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name );
|
||||
@ -188,6 +234,7 @@ Conf_Test( void )
|
||||
puts( "[CHANNEL]" );
|
||||
printf( " Name = %s\n", Conf_Channel[i].name );
|
||||
printf( " Modes = %s\n", Conf_Channel[i].modes );
|
||||
|
||||
topic = (char*)array_start(&Conf_Channel[i].topic);
|
||||
printf( " Topic = %s\n", topic ? topic : "");
|
||||
puts( "" );
|
||||
@ -364,7 +411,6 @@ Set_Defaults( bool InitServers )
|
||||
|
||||
strlcpy( Conf_PidFile, PID_FILE, sizeof( Conf_PidFile ));
|
||||
|
||||
Conf_ListenPorts_Count = 0;
|
||||
strcpy( Conf_ListenAddress, "" );
|
||||
|
||||
Conf_UID = Conf_GID = 0;
|
||||
@ -395,6 +441,7 @@ Read_Config( void )
|
||||
/* Read configuration file. */
|
||||
|
||||
char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
|
||||
const UINT16 defaultport = 6667;
|
||||
int line, i, n;
|
||||
FILE *fd;
|
||||
|
||||
@ -556,11 +603,12 @@ Read_Config( void )
|
||||
Conf_Server[New_Server_Idx] = New_Server;
|
||||
}
|
||||
|
||||
/* If there are no ports configured use the default: 6667 */
|
||||
if( Conf_ListenPorts_Count < 1 )
|
||||
{
|
||||
Conf_ListenPorts_Count = 1;
|
||||
Conf_ListenPorts[0] = 6667;
|
||||
if (0 == array_length(&Conf_ListenPorts, sizeof(UINT16))) {
|
||||
if (!array_copyb(&Conf_ListenPorts, (char*) &defaultport, sizeof defaultport)) {
|
||||
Config_Error( LOG_ALERT, "Could not add default listening Port %u: %s",
|
||||
(unsigned int) defaultport, strerror(errno));
|
||||
exit( 1 );
|
||||
}
|
||||
}
|
||||
} /* Read_Config */
|
||||
|
||||
@ -581,8 +629,6 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
{
|
||||
struct passwd *pwd;
|
||||
struct group *grp;
|
||||
char *ptr;
|
||||
long port;
|
||||
|
||||
assert( Line > 0 );
|
||||
assert( Var != NULL );
|
||||
@ -630,23 +676,9 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
||||
if( strlcpy( Conf_ServerAdminMail, Arg, sizeof( Conf_ServerAdminMail )) >= sizeof( Conf_ServerAdminMail )) Config_Error_TooLong( Line, Var );
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "Ports" ) == 0 )
|
||||
{
|
||||
/* Ports on that the server should listen. More port numbers
|
||||
* must be separated by "," */
|
||||
ptr = strtok( Arg, "," );
|
||||
while( ptr )
|
||||
{
|
||||
ngt_TrimStr( ptr );
|
||||
port = atol( ptr );
|
||||
if( Conf_ListenPorts_Count + 1 > MAX_LISTEN_PORTS ) Config_Error( LOG_ERR, "Too many listen ports configured. Port %ld ignored.", port );
|
||||
else
|
||||
{
|
||||
if( port > 0 && port < 0xFFFF ) Conf_ListenPorts[Conf_ListenPorts_Count++] = (UINT16)port;
|
||||
else Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Illegal port number %ld!", NGIRCd_ConfFile, Line, port );
|
||||
}
|
||||
ptr = strtok( NULL, "," );
|
||||
}
|
||||
|
||||
if( strcasecmp( Var, "Ports" ) == 0 ) {
|
||||
ports_parse(&Conf_ListenPorts, Line, Arg);
|
||||
return;
|
||||
}
|
||||
if( strcasecmp( Var, "MotdFile" ) == 0 )
|
||||
|
@ -8,7 +8,7 @@
|
||||
* (at your option) any later version.
|
||||
* Please read the file COPYING, README and AUTHORS for more information.
|
||||
*
|
||||
* $Id: conf.h,v 1.36 2005/07/28 16:23:55 fw Exp $
|
||||
* $Id: conf.h,v 1.37 2005/07/29 09:29:47 fw Exp $
|
||||
*
|
||||
* Configuration management (header)
|
||||
*/
|
||||
@ -78,8 +78,7 @@ GLOBAL char Conf_MotdFile[FNAME_LEN];
|
||||
GLOBAL char Conf_MotdPhrase[LINE_LEN];
|
||||
|
||||
/* Ports the server should listen on */
|
||||
GLOBAL UINT16 Conf_ListenPorts[MAX_LISTEN_PORTS];
|
||||
GLOBAL unsigned int Conf_ListenPorts_Count;
|
||||
GLOBAL array Conf_ListenPorts;
|
||||
|
||||
/* Address to which the socket should be bound or empty (=all) */
|
||||
GLOBAL char Conf_ListenAddress[16];
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include "portab.h"
|
||||
#include "io.h"
|
||||
|
||||
static char UNUSED id[] = "$Id: conn.c,v 1.166 2005/07/28 16:13:09 fw Exp $";
|
||||
static char UNUSED id[] = "$Id: conn.c,v 1.167 2005/07/29 09:29:47 fw Exp $";
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
@ -83,7 +83,7 @@ static char UNUSED id[] = "$Id: conn.c,v 1.166 2005/07/28 16:13:09 fw Exp $";
|
||||
|
||||
|
||||
LOCAL bool Handle_Write PARAMS(( CONN_ID Idx ));
|
||||
LOCAL void New_Connection PARAMS(( int Sock ));
|
||||
LOCAL int New_Connection PARAMS(( int Sock ));
|
||||
LOCAL CONN_ID Socket2Index PARAMS(( int Sock ));
|
||||
LOCAL void Read_Request PARAMS(( CONN_ID Idx ));
|
||||
LOCAL bool Handle_Buffer PARAMS(( CONN_ID Idx ));
|
||||
@ -103,6 +103,7 @@ int allow_severity = LOG_INFO;
|
||||
int deny_severity = LOG_ERR;
|
||||
#endif
|
||||
|
||||
static void server_login PARAMS((CONN_ID idx));
|
||||
|
||||
static void cb_clientserver PARAMS((int sock, short what));
|
||||
|
||||
@ -158,7 +159,13 @@ cb_connserver(int sock, UNUSED short what)
|
||||
}
|
||||
|
||||
Conn_OPTION_DEL( &My_Connections[idx], CONN_ISCONNECTING );
|
||||
server_login(idx);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
server_login(CONN_ID idx)
|
||||
{
|
||||
Log( LOG_INFO, "Connection %d with \"%s:%d\" established. Now logging in ...", idx,
|
||||
My_Connections[idx].host, Conf_Server[Conf_GetServer( idx )].port );
|
||||
|
||||
@ -275,34 +282,50 @@ Conn_Exit( void )
|
||||
} /* Conn_Exit */
|
||||
|
||||
|
||||
static unsigned int
|
||||
ports_initlisteners(array *a, void (*func)(int,short))
|
||||
{
|
||||
unsigned int created = 0, len;
|
||||
int fd;
|
||||
UINT16 *port;
|
||||
|
||||
len = array_length(a, sizeof (UINT16));
|
||||
port = array_start(a);
|
||||
while(len--) {
|
||||
fd = NewListener( *port );
|
||||
if (fd < 0) {
|
||||
port++;
|
||||
continue;
|
||||
}
|
||||
if (!io_event_create( fd, IO_WANTREAD, func )) {
|
||||
Log( LOG_ERR, "io_event_create(): Could not add listening fd %d (port %u): %s!",
|
||||
fd, (unsigned int) *port, strerror(errno));
|
||||
close(fd);
|
||||
port++;
|
||||
continue;
|
||||
}
|
||||
created++;
|
||||
port++;
|
||||
}
|
||||
|
||||
return created;
|
||||
}
|
||||
|
||||
|
||||
GLOBAL int
|
||||
Conn_InitListeners( void )
|
||||
{
|
||||
/* Initialize ports on which the server should accept connections */
|
||||
|
||||
int created, fd;
|
||||
unsigned int i;
|
||||
unsigned int created;
|
||||
|
||||
if (!io_library_init(CONNECTION_POOL)) {
|
||||
Log(LOG_EMERG, "Cannot initialize IO routines: %s", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
created = 0;
|
||||
for( i = 0; i < Conf_ListenPorts_Count; i++ ) {
|
||||
fd = NewListener( Conf_ListenPorts[i] );
|
||||
if (fd < 0) {
|
||||
Log( LOG_ERR, "Can't listen on port %u!", (unsigned int) Conf_ListenPorts[i] );
|
||||
continue;
|
||||
}
|
||||
if (!io_event_create( fd, IO_WANTREAD, cb_listen )) {
|
||||
Log( LOG_ERR, "io_event_create(): Could not add listening fd %d (port %u): %s!",
|
||||
fd, (unsigned int) Conf_ListenPorts[i], strerror(errno));
|
||||
close(fd);
|
||||
continue;
|
||||
}
|
||||
created++;
|
||||
}
|
||||
created = ports_initlisteners(&Conf_ListenPorts, cb_listen);
|
||||
|
||||
return created;
|
||||
} /* Conn_InitListeners */
|
||||
|
||||
@ -836,7 +859,6 @@ Handle_Write( CONN_ID Idx )
|
||||
}
|
||||
assert( My_Connections[Idx].sock > NONE );
|
||||
|
||||
|
||||
wdatalen = array_bytes(&My_Connections[Idx].wbuf );
|
||||
#ifdef ZLIB
|
||||
if(( wdatalen == 0 ) && ( ! array_bytes(&My_Connections[Idx].zip.wbuf))) {
|
||||
@ -872,7 +894,7 @@ Handle_Write( CONN_ID Idx )
|
||||
} /* Handle_Write */
|
||||
|
||||
|
||||
LOCAL void
|
||||
LOCAL int
|
||||
New_Connection( int Sock )
|
||||
{
|
||||
/* Neue Client-Verbindung von Listen-Socket annehmen und
|
||||
@ -896,7 +918,7 @@ New_Connection( int Sock )
|
||||
if( new_sock < 0 )
|
||||
{
|
||||
Log( LOG_CRIT, "Can't accept connection: %s!", strerror( errno ));
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef TCPWRAP
|
||||
@ -909,7 +931,7 @@ New_Connection( int Sock )
|
||||
Log( deny_severity, "Refused connection from %s (by TCP Wrappers)!", inet_ntoa( new_addr.sin_addr ));
|
||||
Simple_Message( new_sock, "ERROR :Connection refused" );
|
||||
close( new_sock );
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -924,7 +946,7 @@ New_Connection( int Sock )
|
||||
Log( LOG_ERR, "Refused connection from %s: too may connections (%ld) from this IP address!", inet_ntoa( new_addr.sin_addr ), cnt);
|
||||
Simple_Message( new_sock, "ERROR :Connection refused, too many connections from your IP address!" );
|
||||
close( new_sock );
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Freie Connection-Struktur suchen */
|
||||
@ -945,7 +967,7 @@ New_Connection( int Sock )
|
||||
Log( LOG_ALERT, "Can't accept connection: limit (%d) reached!", Pool_Size );
|
||||
Simple_Message( new_sock, "ERROR :Connection limit reached" );
|
||||
close( new_sock );
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
if( new_size > Conf_MaxConnections ) new_size = Conf_MaxConnections;
|
||||
}
|
||||
@ -954,7 +976,7 @@ New_Connection( int Sock )
|
||||
Log( LOG_ALERT, "Can't accept connection: limit (%d) reached -- overflow!", Pool_Size );
|
||||
Simple_Message( new_sock, "ERROR :Connection limit reached" );
|
||||
close( new_sock );
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
ptr = (POINTER *)realloc( My_Connections, sizeof( CONNECTION ) * new_size );
|
||||
@ -962,7 +984,7 @@ New_Connection( int Sock )
|
||||
Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" );
|
||||
Simple_Message( new_sock, "ERROR: Internal error" );
|
||||
close( new_sock );
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
@ -986,7 +1008,7 @@ New_Connection( int Sock )
|
||||
Log( LOG_ALERT, "Can't accept connection: can't create client structure!" );
|
||||
Simple_Message( new_sock, "ERROR :Internal error" );
|
||||
close( new_sock );
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Verbindung registrieren */
|
||||
@ -998,7 +1020,7 @@ New_Connection( int Sock )
|
||||
if (!io_event_create( new_sock, IO_WANTREAD, cb_clientserver)) {
|
||||
Simple_Message( new_sock, "ERROR :Internal error" );
|
||||
Conn_Close( idx, "io_event_create() failed", NULL, false );
|
||||
return;
|
||||
return -1;
|
||||
}
|
||||
|
||||
Log( LOG_INFO, "Accepted connection %d from %s:%d on socket %d.", idx, inet_ntoa( new_addr.sin_addr ), ntohs( new_addr.sin_port), Sock );
|
||||
@ -1016,6 +1038,7 @@ New_Connection( int Sock )
|
||||
|
||||
/* Penalty-Zeit setzen */
|
||||
Conn_SetPenalty( idx, 4 );
|
||||
return new_sock;
|
||||
} /* New_Connection */
|
||||
|
||||
|
||||
@ -1525,8 +1548,7 @@ void Read_Resolver_Result( int r_fd )
|
||||
|
||||
/* Read result from pipe */
|
||||
bytes_read = read( r_fd, readbuf, sizeof readbuf -1 );
|
||||
if( bytes_read < 0 )
|
||||
{
|
||||
if( bytes_read < 0 ) {
|
||||
/* Error! */
|
||||
Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror( errno ));
|
||||
FreeRes_stat( &My_Connections[i] );
|
||||
|
Loading…
Reference in New Issue
Block a user