/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#define CONN_MODULE
#include "portab.h"
-#include "conf-ssl.h"
-#include "io.h"
/**
* @file
* Connection management
*/
-#include "imp.h"
#include <assert.h>
#ifdef PROTOTYPES
# include <stdarg.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
+#include <strings.h>
#include <sys/socket.h>
-#include <sys/time.h>
+#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <netinet/in.h>
# include <tcpd.h> /* for TCP Wrappers */
#endif
-#include "array.h"
-#include "defines.h"
-
-#include "exp.h"
#include "conn.h"
-#include "imp.h"
#include "ngircd.h"
-#include "array.h"
-#include "client.h"
#include "class.h"
-#include "conf.h"
-#include "conn-encoding.h"
+#ifdef ICONV
+# include "conn-encoding.h"
+#endif
#include "conn-ssl.h"
#include "conn-zip.h"
#include "conn-func.h"
+#include "io.h"
#include "log.h"
#include "ng_ipaddr.h"
#include "parse.h"
#include "resolve.h"
-#include "tool.h"
-
-#include "exp.h"
-
#define SERVER_WAIT (NONE - 1)
#define SD_LISTEN_FDS_START 3
-
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, bool IsSSL ));
static int NewListener PARAMS(( const char *listen_addr, UINT16 Port ));
static void Account_Connection PARAMS((void));
-
static array My_Listeners;
static array My_ConnArray;
static size_t NumConnections, NumConnectionsMax, NumConnectionsAccepted;
return false;
}
-#else
-
-static inline bool
-SSL_WantRead(UNUSED const CONNECTION *c)
-{ return false; }
-
-static inline bool
-SSL_WantWrite(UNUSED const CONNECTION *c)
-{ return false; }
-
#endif
if (wdatalen > 0)
#endif
{
+#ifdef SSL_SUPPORT
if (SSL_WantRead(&My_Connections[i]))
continue;
+#endif
io_event_add(My_Connections[i].sock,
IO_WANTWRITE);
}
size_t len;
bool ok;
va_list ap;
+ int r;
assert( Idx > NONE );
assert( Format != NULL );
#else
va_start( ap );
#endif
- if (vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) >= COMMAND_LEN - 2 ) {
+ r = vsnprintf(buffer, COMMAND_LEN - 2, Format, ap);
+ if (r >= COMMAND_LEN - 2 || r == -1) {
/*
* The string that should be written to the socket is longer
* than the allowed size of COMMAND_LEN bytes (including both
* an other server only routing the message!), so the only
* option left is to shorten the string and to hope that the
* result is still somewhat useful ...
+ *
+ * Note:
+ * C99 states that vsnprintf() "returns the number of characters
+ * that would have been printed if the n were unlimited"; but
+ * according to the Linux manual page "glibc until 2.0.6 would
+ * return -1 when the output was truncated" -- so we have to
+ * handle both cases ...
* -alex-
*/