+ Log(LOG_ERR,
+ "Got KILL for invalid client type: %d, \"%s\"!",
+ Client_Type(c), Nick);
+ }
+
+ /* Save ID of this connection */
+ if (Client)
+ my_conn = Client_Conn(Client);
+
+ /* Kill the client NOW:
+ * - Close the local connection (if there is one),
+ * - Destroy the CLIENT structure for remote clients.
+ * Note: Conn_Close() removes the CLIENT structure as well. */
+ conn = Client_Conn(c);
+ if(conn > NONE)
+ Conn_Close(conn, NULL, Reason, true);
+ else
+ Client_Destroy(c, NULL, Reason, false);
+
+ /* Are we still connected or were we killed, too? */
+ if (my_conn > NONE && Conn_GetClient(my_conn))
+ return CONNECTED;
+ else
+ return DISCONNECTED;
+}
+
+/**
+ * Send help for a given topic to the client.
+ *
+ * @param Client The client requesting help.
+ * @param Topoc The help topic requested.
+ * @return CONNECTED or DISCONNECTED.
+ */
+static bool
+Help(CLIENT *Client, const char *Topic)
+{
+ char *line;
+ size_t helptext_len, len_str, idx_start, lines = 0;
+ bool in_article = false;
+
+ assert(Client != NULL);
+ assert(Topic != NULL);
+
+ helptext_len = array_bytes(&Conf_Helptext);
+ line = array_start(&Conf_Helptext);
+ while (helptext_len > 0) {
+ len_str = strlen(line) + 1;
+ assert(helptext_len >= len_str);
+ helptext_len -= len_str;
+
+ if (in_article) {
+ /* The first character in each article text line must
+ * be a TAB (ASCII 9) character which will be stripped
+ * in the output. If it is not a TAB, the end of the
+ * article has been reached. */
+ if (line[0] != '\t') {
+ if (lines > 0)
+ return CONNECTED;
+ else
+ break;
+ }
+
+ /* A single '.' character indicates an empty line */
+ if (line[1] == '.' && line[2] == '\0')
+ idx_start = 2;
+ else
+ idx_start = 1;
+
+ if (!IRC_WriteStrClient(Client, "NOTICE %s :%s",
+ Client_ID(Client),
+ &line[idx_start]))
+ return DISCONNECTED;
+ lines++;
+
+ } else {
+ if (line[0] == '-' && line[1] == ' '
+ && strcasecmp(&line[2], Topic) == 0)
+ in_article = true;
+ }
+
+ line += len_str;
+ }
+
+ /* Help topic not found (or empty)! */
+ if (!IRC_WriteStrClient(Client, "NOTICE %s :No help for \"%s\" found!",
+ Client_ID(Client), Topic))
+ return DISCONNECTED;
+
+ return CONNECTED;
+}
+
+/**
+ * Get pointer to a static string representing the connection "options".
+ *
+ * @param Idx Connection index.
+ * @return Pointer to static (global) string buffer.
+ */