2 * ngIRCd -- The Next Generation IRC Daemon
3 * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
5 * Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
6 * der GNU General Public License (GPL), wie von der Free Software Foundation
7 * herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
8 * der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
9 * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
10 * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
12 * $Id: irc-write.c,v 1.6 2002/09/03 23:56:06 alex Exp $
14 * irc-write.c: IRC-Texte und Befehle ueber Netzwerk versenden
32 #include "irc-write.h"
35 LOCAL CHAR *Get_Prefix PARAMS(( CLIENT *Target, CLIENT *Client ));
40 IRC_WriteStrClient( CLIENT *Client, CHAR *Format, ... )
43 IRC_WriteStrClient( Client, Format, va_alist )
50 BOOLEAN ok = CONNECTED;
53 assert( Client != NULL );
54 assert( Format != NULL );
57 va_start( ap, Format );
61 vsnprintf( buffer, 1000, Format, ap );
64 /* an den Client selber */
65 ok = IRC_WriteStrClientPrefix( Client, Client_ThisServer( ), buffer );
68 } /* IRC_WriteStrClient */
73 IRC_WriteStrClientPrefix( CLIENT *Client, CLIENT *Prefix, CHAR *Format, ... )
76 IRC_WriteStrClientPrefix( Client, Prefix, Format, va_alist )
83 /* Text an Clients, lokal bzw. remote, senden. */
88 assert( Client != NULL );
89 assert( Format != NULL );
90 assert( Prefix != NULL );
93 va_start( ap, Format );
97 vsnprintf( buffer, 1000, Format, ap );
100 return Conn_WriteStr( Client_Conn( Client_NextHop( Client )), ":%s %s", Get_Prefix( Client_NextHop( Client ), Prefix ), buffer );
101 } /* IRC_WriteStrClientPrefix */
106 IRC_WriteStrChannel( CLIENT *Client, CHANNEL *Chan, BOOLEAN Remote, CHAR *Format, ... )
109 IRC_WriteStrChannel( Client, Chan, Remote, Format, va_alist )
120 assert( Client != NULL );
121 assert( Format != NULL );
124 va_start( ap, Format );
128 vsnprintf( buffer, 1000, Format, ap );
131 return IRC_WriteStrChannelPrefix( Client, Chan, Client_ThisServer( ), Remote, buffer );
132 } /* IRC_WriteStrChannel */
137 IRC_WriteStrChannelPrefix( CLIENT *Client, CHANNEL *Chan, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
140 IRC_WriteStrChannelPrefix( Client, Chan, Prefix, Remote, Format, va_alist )
149 BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
156 assert( Client != NULL );
157 assert( Chan != NULL );
158 assert( Prefix != NULL );
159 assert( Format != NULL );
162 va_start( ap, Format );
166 vsnprintf( buffer, 1000, Format, ap );
169 for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
171 /* An alle Clients, die in den selben Channels sind.
172 * Dabei aber nur einmal je Remote-Server */
173 cl2chan = Channel_FirstMember( Chan );
176 c = Channel_GetClient( cl2chan );
179 if( Client_Conn( c ) <= NONE ) c = NULL;
180 else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
182 if( c ) c = Client_NextHop( c );
184 if( c && ( c != Client ))
186 /* Ok, anderer Client */
187 s = Client_Conn( c );
189 assert( s < MAX_CONNECTIONS );
191 if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
192 else is_server[s] = FALSE;
194 cl2chan = Channel_NextMember( Chan, cl2chan );
198 for( i = 0; i < MAX_CONNECTIONS; i++ )
202 if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
203 else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
208 } /* IRC_WriteStrChannelPrefix */
213 IRC_WriteStrServers( CLIENT *ExceptOf, CHAR *Format, ... )
216 IRC_WriteStrServers( ExceptOf, Format, va_alist )
225 assert( Format != NULL );
228 va_start( ap, Format );
232 vsnprintf( buffer, 1000, Format, ap );
235 /* an den Client selber */
236 IRC_WriteStrServersPrefix( ExceptOf, Client_ThisServer( ), buffer );
237 } /* IRC_WriteStrServers */
242 IRC_WriteStrServersPrefix( CLIENT *ExceptOf, CLIENT *Prefix, CHAR *Format, ... )
245 IRC_WriteStrServersPrefix( ExceptOf, Prefix, Format, va_alist )
255 assert( Format != NULL );
256 assert( Prefix != NULL );
259 va_start( ap, Format );
263 vsnprintf( buffer, 1000, Format, ap );
266 return IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, '\0', buffer );
267 } /* IRC_WriteStrServersPrefix */
272 IRC_WriteStrServersPrefixFlag( CLIENT *ExceptOf, CLIENT *Prefix, CHAR Flag, CHAR *Format, ... )
275 IRC_WriteStrServersPrefixFlag( ExceptOf, Prefix, Flag, Format, va_alist )
287 assert( Format != NULL );
288 assert( Prefix != NULL );
291 va_start( ap, Format );
295 vsnprintf( buffer, 1000, Format, ap );
301 if(( Client_Type( c ) == CLIENT_SERVER ) && ( Client_Conn( c ) > NONE ) && ( c != Client_ThisServer( )) && ( c != ExceptOf ))
303 /* Ziel-Server gefunden. Nun noch pruefen, ob Flags stimmen */
304 if(( Flag == '\0' ) || ( strchr( Client_Flags( c ), Flag ) != NULL )) IRC_WriteStrClientPrefix( c, Prefix, buffer );
306 c = Client_Next( c );
308 } /* IRC_WriteStrServersPrefixFlag */
313 IRC_WriteStrRelatedPrefix( CLIENT *Client, CLIENT *Prefix, BOOLEAN Remote, CHAR *Format, ... )
316 IRC_WriteStrRelatedPrefix( Client, Prefix, Remote, Format, va_alist )
324 BOOLEAN sock[MAX_CONNECTIONS], is_server[MAX_CONNECTIONS], ok = CONNECTED;
325 CL2CHAN *chan_cl2chan, *cl2chan;
332 assert( Client != NULL );
333 assert( Prefix != NULL );
334 assert( Format != NULL );
337 va_start( ap, Format );
341 vsnprintf( buffer, 1000, Format, ap );
345 for( i = 0; i < MAX_CONNECTIONS; i++ ) sock[i] = FALSE;
347 /* An alle Clients, die in einem Channel mit dem "Ausloeser" sind,
348 * den Text schicken. An Remote-Server aber jeweils nur einmal. */
349 chan_cl2chan = Channel_FirstChannelOf( Client );
350 while( chan_cl2chan )
352 /* Channel des Users durchsuchen */
353 chan = Channel_GetChannel( chan_cl2chan );
354 cl2chan = Channel_FirstMember( chan );
357 c = Channel_GetClient( cl2chan );
360 if( Client_Conn( c ) <= NONE ) c = NULL;
361 else if( Client_Type( c ) == CLIENT_SERVER ) c = NULL;
363 if( c ) c = Client_NextHop( c );
365 if( c && ( c != Client ))
367 /* Ok, anderer Client */
368 s = Client_Conn( c );
370 assert( s < MAX_CONNECTIONS );
372 if( Client_Type( c ) == CLIENT_SERVER ) is_server[s] = TRUE;
373 else is_server[s] = FALSE;
375 cl2chan = Channel_NextMember( chan, cl2chan );
378 /* naechsten Channel */
379 chan_cl2chan = Channel_NextChannelOf( Client, chan_cl2chan );
383 for( i = 0; i < MAX_CONNECTIONS; i++ )
387 if( is_server[i] ) ok = Conn_WriteStr( i, ":%s %s", Client_ID( Prefix ), buffer );
388 else ok = Conn_WriteStr( i, ":%s %s", Client_Mask( Prefix ), buffer );
393 } /* IRC_WriteStrRelatedPrefix */
397 Get_Prefix( CLIENT *Target, CLIENT *Client )
399 assert( Target != NULL );
400 assert( Client != NULL );
402 if( Client_Type( Target ) == CLIENT_SERVER ) return Client_ID( Client );
403 else return Client_Mask( Client );