+/*
+ * Handler for the IRC "TRACE" command.
+ *
+ * @param Client The client from which this command has been received.
+ * @param Req Request structure with prefix and all parameters.
+ * @return CONNECTED or DISCONNECTED.
+ */
+ GLOBAL bool
+IRC_TRACE(CLIENT *Client, REQUEST *Req)
+{
+ CLIENT *from, *target, *c;
+ CONN_ID idx, idx2;
+ char user[CLIENT_USER_LEN];
+
+ assert(Client != NULL);
+ assert(Req != NULL);
+
+ IRC_SetPenalty(Client, 3);
+
+ /* Bad number of arguments? */
+ if (Req->argc > 1)
+ return IRC_WriteStrClient(Client, ERR_NORECIPIENT_MSG,
+ Client_ID(Client), Req->command);
+
+ _IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
+ _IRC_GET_TARGET_SERVER_OR_RETURN_(target, Req, 0, from)
+
+ /* Forward command to other server? */
+ if (target != Client_ThisServer()) {
+ /* Send RPL_TRACELINK back to initiator */
+ idx = Client_Conn(Client);
+ assert(idx > NONE);
+ idx2 = Client_Conn(Client_NextHop(target));
+ assert(idx2 > NONE);
+
+ if (!IRC_WriteStrClient(from, RPL_TRACELINK_MSG,
+ Client_ID(from), PACKAGE_NAME,
+ PACKAGE_VERSION, Client_ID(target),
+ Client_ID(Client_NextHop(target)),
+ Option_String(idx2),
+ time(NULL) - Conn_StartTime(idx2),
+ Conn_SendQ(idx), Conn_SendQ(idx2)))
+ return DISCONNECTED;
+
+ /* Forward command */
+ IRC_WriteStrClientPrefix(target, from, "TRACE %s", Req->argv[0]);
+ return CONNECTED;
+ }