#include "whowas.h"
#include "msg.h"
-#include <arpa/inet.h> /* inet_ntoa */
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int fields, char* qrt)
{
char *p1;
- struct Channel *chptr = repchan;
+ struct Membership *chan = 0;
static char buf1[512];
/* NOTE: with current fields list and sizes this _cannot_ overrun,
unless the listing is for a channel service, we already know
that there are no common channels, thus use PubChannel and not
SeeChannel */
- if (!chptr && (!fields || (fields & (WHO_FIELD_CHA | WHO_FIELD_FLA))) &&
- !IsChannelService(acptr))
+ if (repchan)
{
- struct Membership* chan;
- for (chan = cli_user(acptr)->channel; chan && !chptr; chan = chan->next_channel)
+ chan = find_channel_member(acptr, repchan);
+ }
+ else if ((!fields || (fields & (WHO_FIELD_CHA | WHO_FIELD_FLA)))
+ && !IsChannelService(acptr))
+ {
+ for (chan = cli_user(acptr)->channel; chan; chan = chan->next_channel)
if (PubChannel(chan->channel) &&
(acptr == sptr || !IsZombie(chan)))
- chptr = chan->channel;
+ break;
}
/* Place the fields one by one in the buffer and send it
{
char *p2;
*(p1++) = ' ';
- if ((p2 = (chptr ? chptr->chname : NULL)))
+ if ((p2 = (chan ? chan->channel->chname : NULL)))
while ((*p2) && (*(p1++) = *(p2++)));
else
*(p1++) = '*';
*(p1++) = 'H';
if SeeOper(sptr,acptr)
*(p1++) = '*';
- if (fields) {
+ if (!chan) {
+ /* No flags possible for the channel, so skip them all. */
+ }
+ else if (fields) {
/* If you specified flags then we assume you know how to parse
* multiple channel status flags, as this is currently the only
* way to know if someone has @'s *and* is +'d.
*/
- if (chptr && is_chan_op(acptr, chptr))
+ if (IsChanOp(chan))
*(p1++) = '@';
- if (chptr && has_voice(acptr, chptr))
+ if (HasVoice(chan))
*(p1++) = '+';
- if (chptr && is_zombie(acptr, chptr))
+ if (IsZombie(chan))
*(p1++) = '!';
+ if (IsDelayedJoin(chan))
+ *(p1++) = '<';
}
else {
- if (chptr && is_chan_op(acptr, chptr))
+ if (IsChanOp(chan))
*(p1++) = '@';
- else if (chptr && has_voice(acptr, chptr))
+ else if (HasVoice(chan))
*(p1++) = '+';
- else if (chptr && is_zombie(acptr, chptr))
+ else if (IsZombie(chan))
*(p1++) = '!';
+ else if (IsDelayedJoin(chan))
+ *(p1++) = '<';
}
if (IsDeaf(acptr))
*(p1++) = 'd';
*(p1++) = '0';
}
+ if (fields & WHO_FIELD_OPL)
+ {
+ if (!chan || !IsChanOp(chan))
+ {
+ strcpy(p1, " n/a");
+ p1 += 4;
+ }
+ else
+ {
+ int vis_level = MAXOPLEVEL;
+ if ((IsGlobalChannel(chan->channel->chname) ? IsOper(sptr) : IsAnOper(sptr))
+ || is_chan_op(sptr, chan->channel))
+ vis_level = OpLevel(chan);
+ p1 += ircd_snprintf(0, p1, 5, " %d", vis_level);
+ }
+ }
+
if (!fields || (fields & WHO_FIELD_REN))
{
char *p2 = cli_info(acptr);
p1 = buf1;
send_reply(sptr, fields ? RPL_WHOSPCRPL : RPL_WHOREPLY, ++p1);
}
-
-/** Count number of users who match \a mask.
- * @param[in] mask user\@host or user\@ip mask to check.
- * @return Count of matching users.
- */
-int
-count_users(char *mask)
-{
- struct Client *acptr;
- int count = 0;
- char namebuf[USERLEN + HOSTLEN + 2];
- char ipbuf[USERLEN + 16 + 2];
-
- for (acptr = GlobalClientList; acptr; acptr = cli_next(acptr)) {
- if (!IsUser(acptr))
- continue;
-
- ircd_snprintf(0, namebuf, sizeof(namebuf), "%s@%s",
- cli_user(acptr)->username, cli_user(acptr)->host);
- ircd_snprintf(0, ipbuf, sizeof(ipbuf), "%s@%s", cli_user(acptr)->username,
- ircd_ntoa(&cli_ip(acptr)));
-
- if (!match(mask, namebuf) || !match(mask, ipbuf))
- count++;
- }
-
- return count;
-}