irc_numeric(from, RPL_WHOISACCOUNT, "%s %s :is logged in as", who->nick, who->handle_info->handle);
if (IsHiddenHost(who) && who->handle_info && (IsOper(from) || from == who))
irc_numeric(from, RPL_WHOISACTUALLY, "%s %s@%s %s :Actual user@host, Actual IP", who->nick, who->ident, who->hostname, irc_ntoa(&who->ip));
+ if (IsLocal(who) && !IsService(who) && (!IsNoIdle(who) || IsOper(from) || from == who))
+ irc_numeric(from, RPL_WHOISIDLE, "%s %ld %ld :seconds idle, signon time", who->nick, now - who->idle_since, who->timestamp);
irc_numeric(from, RPL_ENDOFWHOIS, "%s :End of /WHOIS list", who->nick);
return 1;
if ((*pos == 'k') || (*pos == 'l') || (*pos == 'A')
|| (*pos == 'U'))
n_modes++;
+ if (next + n_modes > argc)
+ n_modes = argc - next;
unsplit_string(argv+next, n_modes, modes);
next += n_modes;
break;
static CMD_FUNC(cmd_privmsg)
{
struct privmsg_desc pd;
- if (argc != 3)
+ if (argc < 3)
return 0;
pd.user = GetUserH(origin);
if (!pd.user || (IsGagged(pd.user) && !IsOper(pd.user)))
return 1;
pd.is_notice = 0;
- pd.text = argv[2];
+ pd.text = argv[argc - 1];
parse_foreach(argv[1], privmsg_chan_helper, NULL, privmsg_user_helper, privmsg_invalid, &pd);
return 1;
}
static CMD_FUNC(cmd_notice)
{
struct privmsg_desc pd;
- if (argc != 3)
+ if (argc < 3)
return 0;
pd.user = GetUserH(origin);
if (!pd.user || (IsGagged(pd.user) && !IsOper(pd.user)))
return 1;
pd.is_notice = 1;
- pd.text = argv[2];
+ pd.text = argv[argc - 1];
parse_foreach(argv[1], privmsg_chan_helper, NULL, privmsg_user_helper, privmsg_invalid, &pd);
return 1;
}
for (nn=0; nn<dead_users.used; nn++)
free_user(dead_users.list[nn]);
userList_clean(&dead_users);
+ free(his_servername);
+ free(his_servercomment);
}
static void
safestrncpy(uNode->numeric, numeric, sizeof(uNode->numeric));
irc_p10_pton(&uNode->ip, realip);
uNode->timestamp = timestamp;
+ uNode->idle_since = timestamp;
modeList_init(&uNode->channels);
uNode->uplink = uplink;
if (++uNode->uplink->clients > uNode->uplink->max_clients) {
{
unsigned int numeric = user->num_local;
if (numeric >= num_privmsg_funcs) {
- int newnum = numeric + 8;
+ int newnum = numeric + 8, ii;
privmsg_funcs = realloc(privmsg_funcs, newnum*sizeof(privmsg_func_t));
- memset(privmsg_funcs+num_privmsg_funcs, 0, (newnum-num_privmsg_funcs)*sizeof(privmsg_func_t));
+ for (ii = num_privmsg_funcs; ii < newnum; ++ii)
+ privmsg_funcs[ii] = NULL;
num_privmsg_funcs = newnum;
}
if (privmsg_funcs[numeric])
}
void
-unreg_privmsg_func(struct userNode *user, privmsg_func_t handler)
+unreg_privmsg_func(struct userNode *user)
{
- unsigned int x;
-
- if (!user || handler)
- return; /* this really only works with users */
-
- memset(privmsg_funcs+user->num_local, 0, sizeof(privmsg_func_t));
+ if (!IsLocal(user) || user->num_local >= num_privmsg_funcs)
+ return; /* this really only works with users */
- for (x = user->num_local+1; x < num_privmsg_funcs; x++)
- memmove(privmsg_funcs+x-1, privmsg_funcs+x, sizeof(privmsg_func_t));
-
- privmsg_funcs = realloc(privmsg_funcs, num_privmsg_funcs*sizeof(privmsg_func_t));
- num_privmsg_funcs--;
+ privmsg_funcs[user->num_local] = NULL;
}
{
unsigned int numeric = user->num_local;
if (numeric >= num_notice_funcs) {
- int newnum = numeric + 8;
+ int newnum = numeric + 8, ii;
notice_funcs = realloc(notice_funcs, newnum*sizeof(privmsg_func_t));
- memset(notice_funcs+num_notice_funcs, 0, (newnum-num_notice_funcs)*sizeof(privmsg_func_t));
+ for (ii = num_privmsg_funcs; ii < newnum; ++ii)
+ privmsg_funcs[ii] = NULL;
num_notice_funcs = newnum;
}
if (notice_funcs[numeric])
}
void
-unreg_notice_func(struct userNode *user, privmsg_func_t handler)
+unreg_notice_func(struct userNode *user)
{
- unsigned int x;
-
- if (!user || handler)
- return; /* this really only works with users */
-
- memset(notice_funcs+user->num_local, 0, sizeof(privmsg_func_t));
-
- for (x = user->num_local+1; x < num_notice_funcs; x++)
- memmove(notice_funcs+x-1, notice_funcs+x, sizeof(privmsg_func_t));
+ if (!IsLocal(user) || user->num_local >= num_privmsg_funcs)
+ return; /* this really only works with users */
- memset(notice_funcs+user->num_local, 0, sizeof(privmsg_func_t));
- notice_funcs = realloc(notice_funcs, num_notice_funcs*sizeof(privmsg_func_t));
- num_notice_funcs--;
+ notice_funcs[user->num_local] = NULL;
}
void