X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-channel.c;h=27414d38b5771666c402dba0a259018e6f6e06df;hp=b557b531192b44074313dff3b74e372be4c96bb9;hb=0e4e22a7a671d1e8efbc44bffd80062191f75c38;hpb=d93030ad27af9cd6a807de8f672ae73ec0e1dff8 diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index b557b531..27414d38 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2008 Alexander Barton (alex@barton.de) * * 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 @@ -14,8 +14,6 @@ #include "portab.h" -static char UNUSED id[] = "$Id: irc-channel.c,v 1.45 2008/02/24 18:57:38 fw Exp $"; - #include "imp.h" #include #include @@ -122,27 +120,60 @@ join_set_channelmodes(CHANNEL *chan, CLIENT *target, const char *flags) } +static void +cb_join_forward(CLIENT *To, CLIENT *Prefix, void *Data) +{ + CONN_ID conn; + char str[COMMAND_LEN], *ptr = NULL; + + strlcpy(str, (char *)Data, sizeof(str)); + conn = Client_Conn(To); + + if (Conn_Options(conn) & CONN_RFC1459) { + /* RFC 1459 compatibility mode, appended modes are NOT + * supported, so strip them off! */ + ptr = strchr(str, 0x7); + if (ptr) + *ptr++ = '\0'; + } + + IRC_WriteStrClientPrefix(To, Prefix, "JOIN %s", str); + if (ptr && *ptr) + IRC_WriteStrClientPrefix(To, Prefix, "MODE %s +%s %s", str, ptr, + Client_ID(Prefix)); +} /* cb_join_forward */ + + static void join_forward(CLIENT *Client, CLIENT *target, CHANNEL *chan, const char *channame) { - char modes[8]; + char modes[CHANNEL_MODE_LEN], str[COMMAND_LEN]; strlcpy(&modes[1], Channel_UserModes(chan, target), sizeof(modes) - 1); - if (modes[1]) modes[0] = 0x7; else modes[0] = '\0'; - /* forward to other servers */ - IRC_WriteStrServersPrefix(Client, target, "JOIN :%s%s", channame, modes); + + /* forward to other servers (if it is not a local channel) */ + if (!Channel_IsLocal(chan)) { + snprintf(str, sizeof(str), "%s%s", channame, modes); + IRC_WriteStrServersPrefixFlag_CB(Client, target, '\0', + cb_join_forward, str); + } /* tell users in this channel about the new client */ - IRC_WriteStrChannelPrefix(Client, chan, target, false, "JOIN :%s", channame); - if (modes[1]) - IRC_WriteStrChannelPrefix(Client, chan, target, false, "MODE %s +%s %s", - channame, &modes[1], Client_ID(target)); -} + IRC_WriteStrChannelPrefix(Client, chan, target, false, + "JOIN :%s", channame); + + /* syncronize channel modes */ + if (modes[1]) { + IRC_WriteStrChannelPrefix(Client, chan, target, false, + "MODE %s +%s %s", channame, + &modes[1], Client_ID(target)); + } +} /* join_forward */ static bool @@ -400,12 +431,18 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) Client_TypeText(from), Client_Mask(from), Channel_Name(chan), Req->argv[1][0] ? Req->argv[1] : ""); - /* im Channel bekannt machen und an Server weiterleiten */ - IRC_WriteStrServersPrefix( Client, from, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); - IRC_WriteStrChannelPrefix( Client, chan, from, false, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); + /* Update channel and forward new topic to other servers */ + if (!Channel_IsLocal(chan)) + IRC_WriteStrServersPrefix(Client, from, "TOPIC %s :%s", + Req->argv[0], Req->argv[1]); + IRC_WriteStrChannelPrefix(Client, chan, from, false, "TOPIC %s :%s", + Req->argv[0], Req->argv[1]); - if( Client_Type( Client ) == CLIENT_USER ) return IRC_WriteStrClientPrefix( Client, Client, "TOPIC %s :%s", Req->argv[0], Req->argv[1] ); - else return CONNECTED; + if (Client_Type(Client) == CLIENT_USER) + return IRC_WriteStrClientPrefix(Client, Client, "TOPIC %s :%s", + Req->argv[0], Req->argv[1]); + else + return CONNECTED; } /* IRC_TOPIC */ @@ -460,7 +497,7 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) Req->argv[1] ); } } - + while( pattern ) { /* Loop through all the channels */ @@ -484,14 +521,14 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) } chan = Channel_Next( chan ); } - + /* Get next name ... */ if( Req->argc > 0 ) pattern = strtok( NULL, "," ); else pattern = NULL; } - + return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from )); } /* IRC_LIST */ @@ -560,7 +597,7 @@ IRC_CHANINFO( CLIENT *Client, REQUEST *Req ) } ptr++; } - + /* Inform members of this channel */ IRC_WriteStrChannelPrefix( Client, chan, from, false, "MODE %s +%s%s", Req->argv[0], Channel_Modes( chan ), modes_add ); }