struct Client *cptr = GlobalClientList;
while (cptr)
{
- cptr->marker = 0;
- cptr = cptr->next;
+ cli_marker(cptr) = 0;
+ cptr = cli_next(cptr);
}
who_marker++;
}
}
#define CheckMark(x, y) ((x == y) ? 0 : (x = y))
-#define Process(cptr) CheckMark(cptr->marker, who_marker)
+#define Process(cptr) CheckMark(cli_marker(cptr), who_marker)
/*
* m_who - generic message handler
case 'x':
case 'X':
bitsel |= WHOSELECT_EXTRA;
-#ifdef WPATH
- if (IsAnOper(sptr))
- write_log(WPATH, "# " TIME_T_FMT " %s!%s@%s WHO %s %s\n",
- CurrentTime, sptr->name, sptr->user->username, sptr->user->host,
- (BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]);
-#endif /* WPATH */
+ if (HasPriv(sptr, PRIV_WHOX))
+ log_write(LS_WHO, L_INFO, LOG_NOSNOTICE, "%#C WHO %s %s", sptr,
+ (BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]);
continue;
case 'n':
case 'N':
for (member = chptr->members; member; member = member->next_member)
{
acptr = member->user;
- if ((bitsel & WHOSELECT_OPER) && !(IsAnOper(acptr)))
+ if ((bitsel & WHOSELECT_OPER) &&
+ !(IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS))))
continue;
if ((acptr != sptr) && (member->status & CHFL_ZOMBIE))
continue;
else
{
if ((acptr = FindUser(nick)) &&
- ((!(bitsel & WHOSELECT_OPER)) || IsAnOper(acptr)) &&
+ ((!(bitsel & WHOSELECT_OPER)) ||
+ (IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS)))) &&
Process(acptr) && SHOW_MORE(sptr, counter))
{
do_who(sptr, acptr, 0, fields, qrt);
if ((!(counter < 1)) && matchsel) {
struct Membership* member;
struct Membership* chan;
- for (chan = sptr->user->channel; chan; chan = chan->next_channel) {
+ for (chan = cli_user(sptr)->channel; chan; chan = chan->next_channel) {
chptr = chan->channel;
for (member = chptr->members; member; member = member->next_member)
{
if (!(IsUser(acptr) && Process(acptr)))
continue; /* Now Process() is at the beginning, if we fail
we'll never have to show this acptr in this query */
- if ((bitsel & WHOSELECT_OPER) && !IsAnOper(acptr))
- continue;
+ if ((bitsel & WHOSELECT_OPER) &&
+ !(IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS))))
+ continue;
if ((mask) &&
((!(matchsel & WHO_FIELD_NIC))
- || matchexec(acptr->name, mymask, minlen))
+ || matchexec(cli_name(acptr), mymask, minlen))
&& ((!(matchsel & WHO_FIELD_UID))
- || matchexec(acptr->user->username, mymask, minlen))
+ || matchexec(cli_user(acptr)->username, mymask, minlen))
&& ((!(matchsel & WHO_FIELD_SER))
- || (!(acptr->user->server->flags & FLAGS_MAP)))
+ || (!(cli_flags(cli_user(acptr)->server) & FLAGS_MAP)))
&& ((!(matchsel & WHO_FIELD_HOS))
- || matchexec(acptr->user->host, mymask, minlen))
+ || matchexec(cli_user(acptr)->host, mymask, minlen))
&& ((!(matchsel & WHO_FIELD_REN))
- || matchexec(acptr->info, mymask, minlen))
+ || matchexec(cli_info(acptr), mymask, minlen))
&& ((!(matchsel & WHO_FIELD_NIP))
- || ((((acptr->ip.s_addr & imask.mask.s_addr) !=
+ || ((((cli_ip(acptr).s_addr & imask.mask.s_addr) !=
imask.bits.s_addr)) || (imask.fall
- && matchexec(ircd_ntoa((const char*) &acptr->ip), mymask, minlen)))))
+ && matchexec(ircd_ntoa((const char*) &(cli_ip(acptr))), mymask, minlen)))))
continue;
if (!SHOW_MORE(sptr, counter))
break;
/* Loop through all clients :-\, if we still have something to match to
and we can show more clients */
if ((!(counter < 1)) && matchsel)
- for (acptr = me.prev; acptr; acptr = acptr->prev)
+ for (acptr = cli_prev(&me); acptr; acptr = cli_prev(acptr))
{
if (!(IsUser(acptr) && Process(acptr)))
continue;
- if ((bitsel & WHOSELECT_OPER) && !IsAnOper(acptr))
- continue;
+ if ((bitsel & WHOSELECT_OPER) &&
+ !(IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS))))
+ continue;
if (!(SEE_USER(sptr, acptr, bitsel)))
continue;
if ((mask) &&
((!(matchsel & WHO_FIELD_NIC))
- || matchexec(acptr->name, mymask, minlen))
+ || matchexec(cli_name(acptr), mymask, minlen))
&& ((!(matchsel & WHO_FIELD_UID))
- || matchexec(acptr->user->username, mymask, minlen))
+ || matchexec(cli_user(acptr)->username, mymask, minlen))
&& ((!(matchsel & WHO_FIELD_SER))
- || (!(acptr->user->server->flags & FLAGS_MAP)))
+ || (!(cli_flags(cli_user(acptr)->server) & FLAGS_MAP)))
&& ((!(matchsel & WHO_FIELD_HOS))
- || matchexec(acptr->user->host, mymask, minlen))
+ || matchexec(cli_user(acptr)->host, mymask, minlen))
&& ((!(matchsel & WHO_FIELD_REN))
- || matchexec(acptr->info, mymask, minlen))
+ || matchexec(cli_info(acptr), mymask, minlen))
&& ((!(matchsel & WHO_FIELD_NIP))
- || ((((acptr->ip.s_addr & imask.mask.s_addr) != imask.bits.s_addr))
+ || ((((cli_ip(acptr).s_addr & imask.mask.s_addr) != imask.bits.s_addr))
|| (imask.fall
- && matchexec(ircd_ntoa((const char*) &acptr->ip), mymask, minlen)))))
+ && matchexec(ircd_ntoa((const char*) &(cli_ip(acptr))), mymask, minlen)))))
continue;
if (!SHOW_MORE(sptr, counter))
break;
/* Make a clean mask suitable to be sent in the "end of" */
if (mask && (p = strchr(mask, ' ')))
*p = '\0';
- sendto_one(sptr, rpl_str(RPL_ENDOFWHO),
- me.name, parv[0], BadPtr(mask) ? "*" : mask);
+ send_reply(sptr, RPL_ENDOFWHO, BadPtr(mask) ? "*" : mask);
/* Notify the user if we decided that his query was too long */
if (counter < 0)
- sendto_one(sptr, err_str(ERR_QUERYTOOLONG), me.name, parv[0], "WHO");
+ send_reply(sptr, ERR_QUERYTOOLONG, "WHO");
return 0;
}
bitsel |= WHOSELECT_EXTRA;
#ifdef WPATH
if (IsAnOper(sptr))
- write_log(WPATH, "# " TIME_T_FMT " %s!%s@%s WHO %s %s\n",
+ write_log(WPATH, "# " TIME_T_FMT " %s!%s@%s WHO %s %s\n", /* XXX DEAD */
CurrentTime, sptr->name, sptr->user->username, sptr->user->host,
(BadPtr(parv[3]) ? parv[1] : parv[3]), parv[2]);
#endif /* WPATH */
/* Make a clean mask suitable to be sent in the "end of" */
if (mask && (p = strchr(mask, ' ')))
*p = '\0';
- sendto_one(sptr, rpl_str(RPL_ENDOFWHO),
+ sendto_one(sptr, rpl_str(RPL_ENDOFWHO), /* XXX DEAD */
me.name, parv[0], BadPtr(mask) ? "*" : mask);
/* Notify the user if we decided that his query was too long */
if (counter < 0)
- sendto_one(sptr, err_str(ERR_QUERYTOOLONG), me.name, parv[0], "WHO");
+ sendto_one(sptr, err_str(ERR_QUERYTOOLONG), me.name, parv[0], "WHO"); /* XXX DEAD */
return 0;
}