commit - bd1b72718758c7f49aaab31a1bb34018880c10aa
commit + a7b04ce6cff3613a45864a127dde082a1a4c6aec
blob - af34c38c18403370f16f223eac257e429bc6fb3d
blob + 39d1b3c2bc881d0acdc09e2d6a278cba1a91222a
--- src/ngircd/irc-cap.c
+++ src/ngircd/irc-cap.c
/*
* ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2013 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
#include "exp.h"
#include "irc-cap.h"
-bool Handle_CAP_LS PARAMS((CLIENT *Client, char *Arg));
-bool Handle_CAP_LIST PARAMS((CLIENT *Client, char *Arg));
-bool Handle_CAP_REQ PARAMS((CLIENT *Client, char *Arg));
-bool Handle_CAP_ACK PARAMS((CLIENT *Client, char *Arg));
-bool Handle_CAP_CLEAR PARAMS((CLIENT *Client));
-bool Handle_CAP_END PARAMS((CLIENT *Client));
+/* Local functions */
-void Set_CAP_Negotiation PARAMS((CLIENT *Client));
+/**
+ * Set CAP negotiation status and mark client as "supports capabilities".
+ *
+ * @param Client The client to handle.
+ */
+static void
+Set_CAP_Negotiation(CLIENT *Client)
+{
+ assert(Client != NULL);
-int Parse_CAP PARAMS((int Capabilities, char *Args));
-char *Get_CAP_String PARAMS((int Capabilities));
+ if (Client_Type(Client) != CLIENT_USER)
+ Client_CapAdd(Client, CLIENT_CAP_PENDING);
+ Client_CapAdd(Client, CLIENT_CAP_SUPPORTED);
+}
/**
- * Handler for the IRCv3 "CAP" command.
+ * Parse capability string and return numeric flag value.
*
- * @param Client The client from which this command has been received.
- * @param Req Request structure with prefix and all parameters.
- * @returns CONNECTED or DISCONNECTED.
+ * @param Args The string containing space-separated capability names.
+ * @return Changed capability flags or 0 on error.
*/
-GLOBAL bool
-IRC_CAP(CLIENT *Client, REQUEST *Req)
+static int
+Parse_CAP(int Capabilities, char *Args)
{
- assert(Client != NULL);
- assert(Req != NULL);
+ static char tmp[COMMAND_LEN];
+ char *ptr;
- /* Bad number of prameters? */
- if (Req->argc < 1 || Req->argc > 2)
- return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
- Client_ID(Client), Req->command);
+ assert(Args != NULL);
- LogDebug("Got \"%s %s\" command from \"%s\" ...",
- Req->command, Req->argv[0], Client_ID(Client));
+ strlcpy(tmp, Args, sizeof(tmp));
- if (Req->argc == 1) {
- if (strcasecmp(Req->argv[0], "CLEAR") == 0)
- return Handle_CAP_CLEAR(Client);
- if (strcasecmp(Req->argv[0], "END") == 0)
- return Handle_CAP_END(Client);
+ ptr = strtok(tmp, " ");
+ while (ptr) {
+ if (*ptr == '-') {
+ /* drop capabilities */
+ ptr++;
+ if (strcmp(ptr, "multi-prefix") == 0)
+ Capabilities &= ~CLIENT_CAP_MULTI_PREFIX;
+ else
+ return -1;
+ } else {
+ /* request capabilities */
+ if (strcmp(ptr, "multi-prefix") == 0)
+ Capabilities |= CLIENT_CAP_MULTI_PREFIX;
+ else
+ return -1;
+ }
+ ptr = strtok(NULL, " ");
}
- if (Req->argc >= 1 && Req->argc <= 2) {
- if (strcasecmp(Req->argv[0], "LS") == 0)
- return Handle_CAP_LS(Client, Req->argv[1]);
- if (strcasecmp(Req->argv[0], "LIST") == 0)
- return Handle_CAP_LIST(Client, Req->argv[1]);
- }
- if (Req->argc == 2) {
- if (strcasecmp(Req->argv[0], "REQ") == 0)
- return Handle_CAP_REQ(Client, Req->argv[1]);
- if (strcasecmp(Req->argv[0], "ACK") == 0)
- return Handle_CAP_ACK(Client, Req->argv[1]);
- }
- return IRC_WriteStrClient(Client, ERR_INVALIDCAP_MSG,
- Client_ID(Client), Req->argv[0]);
+ return Capabilities;
}
/**
+ * Return textual representation of capability flags.
+ *
+ * Please note: this function returns a pointer to a global buffer and
+ * therefore isn't thread safe!
+ *
+ * @param Capabilities Capability flags (bitmask).
+ * @return Pointer to textual representation.
+ */
+static char *
+Get_CAP_String(int Capabilities)
+{
+ static char txt[COMMAND_LEN];
+
+ txt[0] = '\0';
+
+ if (Capabilities & CLIENT_CAP_MULTI_PREFIX)
+ strlcat(txt, "multi-prefix ", sizeof(txt));
+
+ return txt;
+}
+
+/**
* Handler for the "CAP LS" command.
*
* @param Client The client from which this command has been received.
* @param Arg Command argument or NULL.
* @returns CONNECTED or DISCONNECTED.
*/
-bool
+static bool
Handle_CAP_LS(CLIENT *Client, UNUSED char *Arg)
{
assert(Client != NULL);
* @param Arg Command argument or NULL.
* @returns CONNECTED or DISCONNECTED.
*/
-bool
+static bool
Handle_CAP_LIST(CLIENT *Client, UNUSED char *Arg)
{
assert(Client != NULL);
* @param Arg Command argument.
* @returns CONNECTED or DISCONNECTED.
*/
-bool
+static bool
Handle_CAP_REQ(CLIENT *Client, char *Arg)
{
int new_cap;
* @param Arg Command argument.
* @returns CONNECTED or DISCONNECTED.
*/
-bool
+static bool
Handle_CAP_ACK(UNUSED CLIENT *Client, UNUSED char *Arg)
{
assert(Client != NULL);
* @param Client The client from which this command has been received.
* @returns CONNECTED or DISCONNECTED.
*/
-bool
+static bool
Handle_CAP_CLEAR(CLIENT *Client)
{
int cap_old;
* @param Client The client from which this command has been received.
* @returns CONNECTED or DISCONNECTED.
*/
-bool
+static bool
Handle_CAP_END(CLIENT *Client)
{
assert(Client != NULL);
return CONNECTED;
}
+/* Global functions */
+
/**
- * Set CAP negotiation status and mark client as "supports capabilities".
+ * Handler for the IRCv3 command "CAP".
*
- * @param Client The client to handle.
+ * @param Client The client from which this command has been received.
+ * @param Req Request structure with prefix and all parameters.
+ * @return CONNECTED or DISCONNECTED.
*/
-void
-Set_CAP_Negotiation(CLIENT *Client)
+GLOBAL bool
+IRC_CAP(CLIENT *Client, REQUEST *Req)
{
assert(Client != NULL);
+ assert(Req != NULL);
- if (Client_Type(Client) != CLIENT_USER)
- Client_CapAdd(Client, CLIENT_CAP_PENDING);
- Client_CapAdd(Client, CLIENT_CAP_SUPPORTED);
-}
+ /* Bad number of prameters? */
+ if (Req->argc < 1 || Req->argc > 2)
+ return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+ Client_ID(Client), Req->command);
-/**
- * Parse capability string and return numeric flag value.
- *
- * @param Args The string containing space-separated capability names.
- * @return Changed capability flags or 0 on error.
- */
-int
-Parse_CAP(int Capabilities, char *Args)
-{
- static char tmp[COMMAND_LEN];
- char *ptr;
+ LogDebug("Got \"%s %s\" command from \"%s\" ...",
+ Req->command, Req->argv[0], Client_ID(Client));
- assert(Args != NULL);
-
- strlcpy(tmp, Args, sizeof(tmp));
-
- ptr = strtok(tmp, " ");
- while (ptr) {
- if (*ptr == '-') {
- /* drop capabilities */
- ptr++;
- if (strcmp(ptr, "multi-prefix") == 0)
- Capabilities &= ~CLIENT_CAP_MULTI_PREFIX;
- else
- return -1;
- } else {
- /* request capabilities */
- if (strcmp(ptr, "multi-prefix") == 0)
- Capabilities |= CLIENT_CAP_MULTI_PREFIX;
- else
- return -1;
- }
- ptr = strtok(NULL, " ");
+ if (Req->argc == 1) {
+ if (strcasecmp(Req->argv[0], "CLEAR") == 0)
+ return Handle_CAP_CLEAR(Client);
+ if (strcasecmp(Req->argv[0], "END") == 0)
+ return Handle_CAP_END(Client);
}
+ if (Req->argc >= 1 && Req->argc <= 2) {
+ if (strcasecmp(Req->argv[0], "LS") == 0)
+ return Handle_CAP_LS(Client, Req->argv[1]);
+ if (strcasecmp(Req->argv[0], "LIST") == 0)
+ return Handle_CAP_LIST(Client, Req->argv[1]);
+ }
+ if (Req->argc == 2) {
+ if (strcasecmp(Req->argv[0], "REQ") == 0)
+ return Handle_CAP_REQ(Client, Req->argv[1]);
+ if (strcasecmp(Req->argv[0], "ACK") == 0)
+ return Handle_CAP_ACK(Client, Req->argv[1]);
+ }
- return Capabilities;
+ return IRC_WriteStrClient(Client, ERR_INVALIDCAP_MSG,
+ Client_ID(Client), Req->argv[0]);
}
-/**
- * Return textual representation of capability flags.
- *
- * Please note: this function returns a pointer to a global buffer and
- * therefore isn't thread safe!
- *
- * @param Capabilities Capability flags (bitmask).
- * @return Pointer to textual representation.
- */
-char *
-Get_CAP_String(int Capabilities)
-{
- static char txt[COMMAND_LEN];
-
- txt[0] = '\0';
-
- if (Capabilities & CLIENT_CAP_MULTI_PREFIX)
- strlcat(txt, "multi-prefix ", sizeof(txt));
-
- return txt;
-}
-
/* -eof- */