* 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 "channel.h"
#include "client.h"
#include "hash.h"
#include "ircd.h"
+#include "ircd_policy.h"
#include "ircd_reply.h"
#include "ircd_string.h"
#include "match.h"
/*
* Send whois information for acptr to sptr
*/
-static void do_whois(struct Client* sptr, struct Client *acptr)
+static void do_whois(struct Client* sptr, struct Client *acptr, int parc)
{
struct Client *a2cptr=0;
struct Channel *chptr=0;
int len;
static char buf[512];
- const struct User* user = acptr->user;
- const char* name = (!*acptr->name) ? "?" : acptr->name;
+ const struct User* user = cli_user(acptr);
+ const char* name = (!*(cli_name(acptr))) ? "?" : cli_name(acptr);
a2cptr = user->server;
assert(user);
send_reply(sptr, RPL_WHOISUSER, name, user->username, user->host,
- acptr->info);
+ cli_info(acptr));
/* Display the channels this user is on. */
if (!IsChannelService(acptr))
{
struct Membership* chan;
- mlen = strlen(me.name) + strlen(sptr->name) + 12 + strlen(name);
+ mlen = strlen(cli_name(&me)) + strlen(cli_name(sptr)) + 12 + strlen(name);
len = 0;
*buf = '\0';
for (chan = user->channel; chan; chan = chan->next_channel)
if (buf[0] != '\0')
send_reply(sptr, RPL_WHOISCHANNELS, name, buf);
}
- send_reply(sptr, RPL_WHOISSERVER, name, a2cptr->name, a2cptr->info);
+
+#ifdef HEAD_IN_SAND_WHOIS_SERVERNAME
+ if (!IsAnOper(sptr) && sptr != acptr)
+ send_reply(sptr, RPL_WHOISSERVER, name, "*.undernet.org",
+ "The Undernet Underworld");
+ else
+#endif
+ send_reply(sptr, RPL_WHOISSERVER, name, cli_name(a2cptr),
+ cli_info(a2cptr));
if (user)
{
if (user->away)
send_reply(sptr, RPL_AWAY, name, user->away);
- if (IsAnOper(acptr))
+ if (IsAnOper(acptr) && (HasPriv(acptr, PRIV_DISPLAY) ||
+ HasPriv(sptr, PRIV_SEE_OPERS)))
send_reply(sptr, RPL_WHOISOPERATOR, name);
/* Hint: if your looking to add more flags to a user, eg +h, here's
* probably a good place to add them :)
*/
- if (MyConnect(acptr))
+ if (MyConnect(acptr)
+#ifdef HEAD_IN_SAND_WHOIS_IDLETIME
+ && (sptr == acptr || IsAnOper(sptr) || parc >= 3)
+#endif
+ )
send_reply(sptr, RPL_WHOISIDLE, name, CurrentTime - user->last,
- acptr->firsttime);
+ cli_firsttime(acptr));
}
}
* returns the number of people found (or, obviously, 0, if none where
* found).
*/
-static int do_wilds(struct Client* sptr,char *nick,int count)
+static int do_wilds(struct Client* sptr, char *nick, int count, int parc)
{
struct Client *acptr; /* Current client we're concidering */
struct User *user; /* the user portion of the client */
/* Ech! This is hidious! */
for (acptr = GlobalClientList; (acptr = next_client(acptr, nick));
- acptr = acptr->next)
+ acptr = cli_next(acptr))
{
if (!IsRegistered(acptr))
continue;
* hack?
*/
if (IsMe(acptr)) {
- assert(!acptr->next);
+ assert(!cli_next(acptr));
break;
}
* - only send replies about common or public channels
* the target user(s) are on;
*/
- user = acptr->user;
- name = (!*acptr->name) ? "?" : acptr->name;
+ user = cli_user(acptr);
+ name = (!*(cli_name(acptr))) ? "?" : cli_name(acptr);
assert(user);
invis = (acptr != sptr) && IsInvisible(acptr);
/* Should we show this person now? */
if (showperson) {
found++;
- do_whois(sptr,acptr);
+ do_whois(sptr, acptr, parc);
if (count+found>MAX_WHOIS_LINES)
return found;
continue;
if (!showperson)
continue;
- do_whois(sptr,acptr);
+ do_whois(sptr, acptr, parc);
found++;
if (count+found>MAX_WHOIS_LINES)
return found;
* it with the correct servername - as is needed by hunt_server().
* This is the secret behind the /whois nick nick trick.
*/
+#if HEAD_IN_SAND_REMOTE
+ /* If remote queries are disabled, then use the *second* parameter of
+ * of whois, so /whois nick nick still works.
+ */
+ acptr = FindUser(parv[2]);
+#else
acptr = FindUser(parv[1]);
+#endif
if (acptr)
- parv[1] = acptr->user->server->name;
+ parv[1] = cli_name(cli_user(acptr)->server);
if (hunt_server_cmd(sptr, CMD_WHOIS, cptr, 0, "%C :%s", 1, parc, parv) !=
HUNTED_ISME)
return 0;
/* No wildcards */
acptr = FindUser(nick);
if (acptr && !IsServer(acptr)) {
- do_whois(sptr,acptr);
+ do_whois(sptr, acptr, parc);
found = 1;
}
}
else /* wilds */
- found=do_wilds(sptr,nick,total);
+ found=do_wilds(sptr, nick, total, parc);
if (!found)
send_reply(sptr, ERR_NOSUCHNICK, nick);
*/
acptr = FindUser(parv[1]);
if (acptr)
- parv[1] = acptr->user->server->name;
+ parv[1] = cli_name(cli_user(acptr)->server);
if (hunt_server_cmd(sptr, CMD_WHOIS, cptr, 0, "%C :%s", 1, parc, parv) !=
HUNTED_ISME)
return 0;
acptr = FindUser(nick);
if (acptr && !IsServer(acptr)) {
found++;
- do_whois(sptr,acptr);
+ do_whois(sptr, acptr, parc);
}
if (!found)
send_reply(sptr, RPL_ENDOFWHOIS, parv[1]);
return 0;
-}
\ No newline at end of file
+}