X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fm_away.c;h=ef440c19ab37a54009864dd76bdbbcf0cc5c897c;hb=refs%2Fheads%2Fupstream-ssl;hp=db726ffce8c45998e0546db758ab8df2dc24ebcb;hpb=36ab1bb01f9a0f5f630f3098b1afdc5ccc937fa6;p=ircu2.10.12-pk.git diff --git a/ircd/m_away.c b/ircd/m_away.c index db726ff..ef440c1 100644 --- a/ircd/m_away.c +++ b/ircd/m_away.c @@ -79,16 +79,12 @@ * note: it is guaranteed that parv[0]..parv[parc-1] are all * non-NULL pointers. */ -#if 0 -/* - * No need to include handlers.h here the signatures must match - * and we don't need to force a rebuild of all the handlers everytime - * we add a new one to the list. --Bleep - */ -#include "handlers.h" -#endif /* 0 */ +#include "config.h" + #include "client.h" #include "ircd.h" +#include "ircd_alloc.h" +#include "ircd_log.h" #include "ircd_reply.h" #include "ircd_string.h" #include "msg.h" @@ -97,24 +93,76 @@ #include "s_user.h" #include "send.h" -#include +/* #include -- Now using assert in ircd_log.h */ +#include + +/* + * user_set_away - set user away state + * returns 1 if client is away or changed away message, 0 if + * client is removing away status. + * NOTE: this function may modify user and message, so they + * must be mutable. + */ +static int user_set_away(struct User* user, char* message) +{ + char* away; + assert(0 != user); + + away = user->away; + + if (EmptyString(message)) { + /* + * Marking as not away + */ + if (away) { + MyFree(away); + user->away = 0; + } + } + else { + /* + * Marking as away + */ + unsigned int len = strlen(message); + + if (len > AWAYLEN) { + message[AWAYLEN] = '\0'; + len = AWAYLEN; + } + if (away) + MyFree(away); + away = (char*) MyMalloc(len + 1); + assert(0 != away); + + user->away = away; + strcpy(away, message); + } + return (user->away != 0); +} + /* - * m_away - generic message handler template + * m_away - generic message handler * - Added 14 Dec 1988 by jto. * * parv[0] = sender prefix * parv[1] = away message + * + * TODO: Throttle aways - many people have a script which resets the away + * message every 10 seconds which really chews the bandwidth. */ int m_away(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) { char* away_message = parv[1]; + int was_away = cli_user(sptr)->away != 0; assert(0 != cptr); assert(cptr == sptr); - if (user_set_away(sptr->user, away_message)) { - sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ":%s", away_message); + if (user_set_away(cli_user(sptr), away_message)) + { + if (!was_away) + sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ":%s", away_message); send_reply(sptr, RPL_NOWAWAY); } else { @@ -125,7 +173,7 @@ int m_away(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) } /* - * ms_away - server message handler template + * ms_away - server message handler * - Added 14 Dec 1988 by jto. * * parv[0] = sender prefix @@ -141,9 +189,9 @@ int ms_away(struct Client* cptr, struct Client* sptr, int parc, char* parv[]) * servers can't set away */ if (IsServer(sptr)) - return 0; + return protocol_violation(sptr,"Server trying to set itself away"); - if (user_set_away(sptr->user, away_message)) + if (user_set_away(cli_user(sptr), away_message)) sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, ":%s", away_message); else sendcmdto_serv_butone(sptr, CMD_AWAY, cptr, "");