/*
* 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
* Sending IRC commands over the network
*/
-#include "imp.h"
#include <assert.h>
#ifdef PROTOTYPES
# include <stdarg.h>
# include <varargs.h>
#endif
#include <stdio.h>
-#include <string.h>
-#include "defines.h"
#include "conn-func.h"
#include "channel.h"
-#include "exp.h"
#include "irc-write.h"
#define SEND_TO_USER 1
CLIENT *Prefix, void *Buffer));
static void Send_Marked_Connections PARAMS((CLIENT *Prefix, const char *Buffer));
+/**
+ * Send an error message to a client and enforce a penalty time.
+ *
+ * @param Client The target client.
+ * @param Format Format string.
+ * @return CONNECTED or DISCONNECTED.
+ */
+#ifdef PROTOTYPES
+GLOBAL bool
+IRC_WriteErrClient( CLIENT *Client, const char *Format, ... )
+#else
+GLOBAL bool
+IRC_WriteErrClient( Client, Format, va_alist )
+CLIENT *Client;
+const char *Format;
+va_dcl
+#endif
+{
+ char buffer[1000];
+ va_list ap;
+
+ assert(Client != NULL);
+ assert(Format != NULL);
+
+#ifdef PROTOTYPES
+ va_start(ap, Format);
+#else
+ va_start(ap);
+#endif
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
+ va_end(ap);
+
+ IRC_SetPenalty(Client, 2);
+ return IRC_WriteStrClientPrefix(Client, Client_ThisServer(),
+ "%s", buffer);
+}
+
/**
* Send a message to a client.
*
#else
va_start(ap);
#endif
- vsnprintf(buffer, 1000, Format, ap);
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end(ap);
return IRC_WriteStrClientPrefix(Client, Client_ThisServer(),
#else
va_start( ap );
#endif
- vsnprintf( buffer, 1000, Format, ap );
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end( ap );
return Conn_WriteStr(Client_Conn(Client_NextHop(Client)), ":%s %s",
#else
va_start( ap );
#endif
- vsnprintf( buffer, 1000, Format, ap );
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end( ap );
IRC_WriteStrChannelPrefix(Client, Chan, Client_ThisServer(),
#else
va_start( ap );
#endif
- vsnprintf( buffer, 1000, Format, ap );
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end( ap );
Conn_ClearFlags( );
#else
va_start( ap );
#endif
- vsnprintf( buffer, 1000, Format, ap );
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end( ap );
IRC_WriteStrServersPrefix(ExceptOf, Client_ThisServer(), "%s", buffer);
#else
va_start( ap );
#endif
- vsnprintf( buffer, 1000, Format, ap );
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end( ap );
IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', "%s", buffer );
#else
va_start( ap );
#endif
- vsnprintf( buffer, 1000, Format, ap );
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end( ap );
IRC_WriteStrServersPrefixFlag_CB(ExceptOf, Prefix, Flag,
#else
va_start( ap );
#endif
- vsnprintf( buffer, 1000, Format, ap );
+ vsnprintf(buffer, sizeof(buffer), Format, ap);
va_end( ap );
Conn_ClearFlags( );
#else
va_start(ap);
#endif
- vsnprintf(msg, 1000, Format, ap);
+ vsnprintf(msg, sizeof(msg), Format, ap);
va_end(ap);
for (to=Client_First(); to != NULL; to=Client_Next(to)) {
/**
* Set a "penalty time" for an IRC client.
*
- * Note: penalty times are never set for server links!
+ * Note: penalty times are never set for server links or remote clients!
*
* @param Client The client.
* @param Seconds The additional "penalty time" to enforce.
*/
GLOBAL void
-IRC_SetPenalty( CLIENT *Client, time_t Seconds )
+IRC_SetPenalty(CLIENT *Client, time_t Seconds)
{
CONN_ID c;
- assert( Client != NULL );
- assert( Seconds > 0 );
+ assert(Client != NULL);
+ assert(Seconds > 0);
+
+ if (Client_Type(Client) == CLIENT_SERVER)
+ return;
- if( Client_Type( Client ) == CLIENT_SERVER ) return;
+ c = Client_Conn(Client);
+ if (c <= NONE)
+ return;
- c = Client_Conn( Client );
- if (c > NONE)
- Conn_SetPenalty(c, Seconds);
+ Conn_SetPenalty(c, Seconds);
} /* IRC_SetPenalty */
static const char *