+/**
+ * Introduce a new user or service client to a remote server.
+ *
+ * This function differentiates between RFC1459 and RFC2813 server links and
+ * generates the appropriate commands to register the new user or service.
+ *
+ * @param To The remote server to inform.
+ * @param Prefix Prefix for the generated commands.
+ * @param data CLIENT structure of the new client.
+ */
+static void
+cb_introduceClient(CLIENT *To, CLIENT *Prefix, void *data)
+{
+ CLIENT *c = (CLIENT *)data;
+ CONN_ID conn;
+ char *modes, *user, *host;
+
+ modes = Client_Modes(c);
+ user = Client_User(c) ? Client_User(c) : "-";
+ host = Client_Hostname(c) ? Client_Hostname(c) : "-";
+
+ conn = Client_Conn(To);
+ if (Conn_Options(conn) & CONN_RFC1459) {
+ /* RFC 1459 mode: separate NICK and USER commands */
+ Conn_WriteStr(conn, "NICK %s :%d", Client_ID(c),
+ Client_Hops(c) + 1);
+ Conn_WriteStr(conn, ":%s USER %s %s %s :%s",
+ Client_ID(c), user, host,
+ Client_ID(Client_Introducer(c)), Client_Info(c));
+ if (modes[0])
+ Conn_WriteStr(conn, ":%s MODE %s +%s",
+ Client_ID(c), Client_ID(c), modes);
+ } else {
+ /* RFC 2813 mode: one combined NICK or SERVICE command */
+ if (Client_Type(c) == CLIENT_SERVICE
+ && strchr(Client_Flags(To), 'S'))
+ IRC_WriteStrClientPrefix(To, Prefix,
+ "SERVICE %s %d * +%s %d :%s",
+ Client_Mask(c),
+ Client_MyToken(Client_Introducer(c)),
+ Client_Modes(c), Client_Hops(c) + 1,
+ Client_Info(c));
+ else
+ IRC_WriteStrClientPrefix(To, Prefix,
+ "NICK %s %d %s %s %d +%s :%s",
+ Client_ID(c), Client_Hops(c) + 1,
+ user, host,
+ Client_MyToken(Client_Introducer(c)),
+ modes, Client_Info(c));
+ }
+} /* cb_introduceClient */
+
+