#include "portab.h"
-static char UNUSED id[] = "$Id: channel.c,v 1.52 2005/07/28 16:23:55 fw Exp $";
+static char UNUSED id[] = "$Id: channel.c,v 1.54 2005/09/02 12:50:25 alex Exp $";
#include "imp.h"
#include <assert.h>
#define REMOVE_KICK 2
-LOCAL CHANNEL *My_Channels;
-LOCAL CL2CHAN *My_Cl2Chan;
+static CHANNEL *My_Channels;
+static CL2CHAN *My_Cl2Chan;
-LOCAL CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
-LOCAL CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
-LOCAL bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
-LOCAL CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
-LOCAL CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
-LOCAL bool Delete_Channel PARAMS(( CHANNEL *Chan ));
+static CL2CHAN *Get_Cl2Chan PARAMS(( CHANNEL *Chan, CLIENT *Client ));
+static CL2CHAN *Add_Client PARAMS(( CHANNEL *Chan, CLIENT *Client ));
+static bool Remove_Client PARAMS(( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer ));
+static CL2CHAN *Get_First_Cl2Chan PARAMS(( CLIENT *Client, CHANNEL *Chan ));
+static CL2CHAN *Get_Next_Cl2Chan PARAMS(( CL2CHAN *Start, CLIENT *Client, CHANNEL *Chan ));
+static bool Delete_Channel PARAMS(( CHANNEL *Chan ));
GLOBAL void
array_free(&Conf_Channel[i].topic);
continue;
}
-
- /* Channel anlegen */
- chan = Channel_Create( Conf_Channel[i].name );
- if( chan )
- {
- Channel_ModeAdd( chan, 'P' );
- if (!array_copy(&chan->topic, &Conf_Channel[i].topic)) {
- Log( LOG_WARNING, "Could not set topic for new pre-defined channel: %s",
- strerror(errno));
- }
+
+ /* Create channel */
+ chan = Channel_Create(Conf_Channel[i].name);
+ if (chan) {
+ Channel_ModeAdd(chan, 'P');
+
+ Channel_SetTopic(chan, NULL,
+ array_start(&Conf_Channel[i].topic));
array_free(&Conf_Channel[i].topic);
+
c = Conf_Channel[i].modes;
- while( *c ) Channel_ModeAdd( chan, *c++ );
- Log( LOG_INFO, "Created pre-defined channel \"%s\".", Conf_Channel[i].name );
+ while (*c)
+ Channel_ModeAdd(chan, *c++);
+
+ Log(LOG_INFO, "Created pre-defined channel \"%s\".",
+ Conf_Channel[i].name );
}
- else Log( LOG_ERR, "Can't create pre-defined channel \"%s\"!", Conf_Channel[i].name );
+ else Log(LOG_ERR, "Can't create pre-defined channel \"%s\"!",
+ Conf_Channel[i].name );
}
} /* Channel_InitPredefined */
return ret ? ret : "";
} /* Channel_Topic */
+
+#ifndef STRICT_RFC
+
+GLOBAL unsigned int
+Channel_TopicTime(CHANNEL *Chan)
+{
+ assert(Chan != NULL);
+ return (unsigned int) Chan->topic_time;
+} /* Channel_TopicTime */
+
+
+GLOBAL char *
+Channel_TopicWho(CHANNEL *Chan)
+{
+ assert(Chan != NULL);
+ return Chan->topic_who;
+} /* Channel_TopicWho */
+
+#endif
+
GLOBAL void
-Channel_SetTopic( CHANNEL *Chan, char *Topic )
+Channel_SetTopic(CHANNEL *Chan, CLIENT *Client, char *Topic)
{
size_t len;
assert( Chan != NULL );
array_free(&Chan->topic);
if (!array_copyb(&Chan->topic, Topic, len))
- Log(LOG_WARNING, "could not set new Topic %s: %s", Topic, strerror(errno));
+ Log(LOG_WARNING, "could not set new Topic \"%s\" on %s: %s",
+ Topic, Chan->name, strerror(errno));
array_cat0(&Chan->topic);
+
+#ifndef STRICT_RFC
+ Chan->topic_time = time(NULL);
+ if (Client != NULL && Client_Type(Client) != CLIENT_SERVER)
+ strlcpy(Chan->topic_who, Client_ID(Client),
+ sizeof Chan->topic_who);
+ else
+ strlcpy(Chan->topic_who, DEFAULT_TOPIC_ID,
+ sizeof Chan->topic_who);
+#else
+ (void) Client;
+#endif
} /* Channel_SetTopic */
} /* Channel_Create */
-LOCAL CL2CHAN *
+static CL2CHAN *
Get_Cl2Chan( CHANNEL *Chan, CLIENT *Client )
{
CL2CHAN *cl2chan;
} /* Get_Cl2Chan */
-LOCAL CL2CHAN *
+static CL2CHAN *
Add_Client( CHANNEL *Chan, CLIENT *Client )
{
CL2CHAN *cl2chan;
} /* Add_Client */
-LOCAL bool
+static bool
Remove_Client( int Type, CHANNEL *Chan, CLIENT *Client, CLIENT *Origin, char *Reason, bool InformServer )
{
CL2CHAN *cl2chan, *last_cl2chan;
} /* Remove_Client */
-LOCAL CL2CHAN *
+static CL2CHAN *
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
{
return Get_Next_Cl2Chan( My_Cl2Chan, Client, Chan );
} /* Get_First_Cl2Chan */
-LOCAL CL2CHAN *
+static CL2CHAN *
Get_Next_Cl2Chan( CL2CHAN *Start, CLIENT *Client, CHANNEL *Channel )
{
CL2CHAN *cl2chan;
} /* Get_Next_Cl2Chan */
-LOCAL bool
+static bool
Delete_Channel( CHANNEL *Chan )
{
/* Channel-Struktur loeschen */