X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-info.c;h=ea0ed4e58e481e5503a99510341648276be9b940;hp=6fb2e31c9470c38703100983821759a5f1e7506c;hb=33c2d5e4e255f314d5d7136d8edeb662128bd79a;hpb=139f5961a078dfd23a469d98c3942f42595854aa diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c index 6fb2e31c..ea0ed4e5 100644 --- a/src/ngircd/irc-info.c +++ b/src/ngircd/irc-info.c @@ -87,14 +87,6 @@ write_whoreply(CLIENT *Client, CLIENT *c, const char *channelname, const char *f flags, Client_Hops(c), Client_Info(c)); } -static const char * -who_flags_status(const char *client_modes) -{ - if (strchr(client_modes, 'a')) - return "G"; /* away */ - return "H"; -} - /** * Return channel user mode prefix(es). * @@ -152,7 +144,6 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps) { bool is_visible, is_member, is_ircop; CL2CHAN *cl2chan; - const char *client_modes; char flags[10]; CLIENT *c; int count = 0; @@ -165,7 +156,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps) is_member = Channel_IsMemberOf(Chan, Client); /* Secret channel? */ - if (!is_member && strchr(Channel_Modes(Chan), 's')) + if (!is_member && Channel_HasMode(Chan, 's')) return IRC_WriteStrClient(Client, RPL_ENDOFWHO_MSG, Client_ID(Client), Channel_Name(Chan)); @@ -173,17 +164,21 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps) for (; cl2chan ; cl2chan = Channel_NextMember(Chan, cl2chan)) { c = Channel_GetClient(cl2chan); - client_modes = Client_Modes(c); - is_ircop = strchr(client_modes, 'o') != NULL; + is_ircop = Client_HasMode(c, 'o'); if (OnlyOps && !is_ircop) continue; - is_visible = strchr(client_modes, 'i') == NULL; + is_visible = Client_HasMode(c, 'i'); if (is_member || is_visible) { - strlcpy(flags, who_flags_status(client_modes), - sizeof(flags)); + memset(flags, 0, sizeof(flags)); + + if (Client_HasMode(c, 'a')) + flags[0] = 'G'; /* away */ + else + flags[0] = 'H'; + if (is_ircop) - strlcat(flags, "*", sizeof(flags)); + flags[1] = '*'; who_flags_qualifier(Client, Channel_UserModes(Chan, c), flags, sizeof(flags)); @@ -218,7 +213,7 @@ IRC_WHO_Mask(CLIENT *Client, char *Mask, bool OnlyOps) CL2CHAN *cl2chan; CHANNEL *chan; bool client_match, is_visible; - char flags[4]; + char flags[3]; int count = 0; assert (Client != NULL); @@ -274,9 +269,15 @@ IRC_WHO_Mask(CLIENT *Client, char *Mask, bool OnlyOps) if (IRC_CheckListTooBig(Client, count, MAX_RPL_WHO, "WHO")) break; - strlcpy(flags, who_flags_status(Client_Modes(c)), sizeof(flags)); - if (strchr(Client_Modes(c), 'o')) - strlcat(flags, "*", sizeof(flags)); + memset(flags, 0, sizeof(flags)); + + if (Client_HasMode(c, 'a')) + flags[0] = 'G'; /* away */ + else + flags[0] = 'H'; + + if (Client_HasMode(c, 'o')) + flags[1] = '*'; if (!write_whoreply(Client, c, "*", flags)) return DISCONNECTED; @@ -330,7 +331,7 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c) cl2chan = Channel_NextChannelOf(c, cl2chan); /* Secret channel? */ - if (strchr(Channel_Modes(chan), 's') + if (Channel_HasMode(chan, 's') && !Channel_IsMemberOf(chan, Client)) continue; @@ -406,8 +407,8 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c) (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) { /* Client hostname */ if (!IRC_WriteStrClient(from, RPL_WHOISHOST_MSG, - Client_ID(from), Client_ID(c), Client_Hostname(c), - Conn_GetIPAInfo(Client_Conn(c)))) + Client_ID(from), Client_ID(c), + Client_Hostname(c), Client_IPAText(c))) return DISCONNECTED; /* Client modes */ if (!IRC_WriteStrClient(from, RPL_WHOISMODES_MSG, @@ -717,11 +718,11 @@ IRC_SERVLIST(CLIENT *Client, REQUEST *Req) { CLIENT *c; - IRC_SetPenalty(Client, 1); - assert(Client != NULL); assert(Req != NULL); + IRC_SetPenalty(Client, 1); + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) if (Req->argc < 2 || strcmp(Req->argv[1], "0") == 0) { @@ -833,7 +834,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req ) while (c) { if (Client_Type(c) == CLIENT_USER && Channel_FirstChannelOf(c) == NULL - && !strchr(Client_Modes(c), 'i')) + && !Client_HasMode(c, 'i')) { /* its a user, concatenate ... */ if (rpl[strlen(rpl) - 1] != ':') @@ -902,7 +903,7 @@ IRC_STATS( CLIENT *Client, REQUEST *Req ) case 'k': /* Server-local bans ("K-Lines") */ case 'K': if (!Client_HasMode(from, 'o')) - return IRC_WriteStrClient(from, ERR_NOPRIVILEGES_MSG, + return IRC_WriteErrClient(from, ERR_NOPRIVILEGES_MSG, Client_ID(from)); if (query == 'g' || query == 'G') list = Class_GetList(CLASS_GLINE); @@ -996,9 +997,7 @@ IRC_SUMMON(CLIENT * Client, UNUSED REQUEST * Req) { assert(Client != NULL); - IRC_SetPenalty(Client, 1); - - return IRC_WriteStrClient(Client, ERR_SUMMONDISABLED_MSG, + return IRC_WriteErrClient(Client, ERR_SUMMONDISABLED_MSG, Client_ID(Client)); } /* IRC_SUMMON */ @@ -1100,9 +1099,7 @@ IRC_USERS(CLIENT * Client, UNUSED REQUEST * Req) { assert(Client != NULL); - IRC_SetPenalty(Client, 1); - - return IRC_WriteStrClient(Client, ERR_USERSDISABLED_MSG, + return IRC_WriteErrClient(Client, ERR_USERSDISABLED_MSG, Client_ID(Client)); } /* IRC_USERS */ @@ -1167,7 +1164,7 @@ IRC_WHO(CLIENT *Client, REQUEST *Req) only_ops = true; #ifdef STRICT_RFC else - return IRC_WriteStrClient(Client, + return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command); @@ -1214,11 +1211,12 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) IRC_SetPenalty(Client, 1); - /* Bad number of parameters? */ - if (Req->argc < 1 || Req->argc > 2) - return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, - Client_ID(Client), Req->command); + /* Wrong number of parameters? */ + if (Req->argc < 1) + return IRC_WriteErrClient(Client, ERR_NONICKNAMEGIVEN_MSG, + Client_ID(Client)); + _IRC_ARGC_LE_OR_RETURN_(Client, Req, 2) _IRC_GET_SENDER_OR_RETURN_(from, Req, Client) /* Get target server for this command */ @@ -1258,7 +1256,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) if (!IRC_WHOIS_SendReply(Client, from, c)) return DISCONNECTED; } else { - if (!IRC_WriteStrClient(Client, + if (!IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), query)) @@ -1268,7 +1266,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) } if (got_wildcard) { /* we already handled one wildcard query */ - if (!IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + if (!IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), query)) return DISCONNECTED; continue; @@ -1292,7 +1290,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req ) } if (match_count == 0) - IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, + IRC_WriteErrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->argv[Req->argc - 1]); } @@ -1325,7 +1323,7 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) /* Wrong number of parameters? */ if (Req->argc < 1) - return IRC_WriteStrClient(Client, ERR_NONICKNAMEGIVEN_MSG, + return IRC_WriteErrClient(Client, ERR_NONICKNAMEGIVEN_MSG, Client_ID(Client)); _IRC_ARGC_LE_OR_RETURN_(Client, Req, 3) @@ -1380,7 +1378,7 @@ IRC_WHOWAS( CLIENT *Client, REQUEST *Req ) break; } while (i != last); - if (nc == 0 && !IRC_WriteStrClient(prefix, ERR_WASNOSUCHNICK_MSG, + if (nc == 0 && !IRC_WriteErrClient(prefix, ERR_WASNOSUCHNICK_MSG, Client_ID(prefix), nick)) return DISCONNECTED; } @@ -1470,7 +1468,7 @@ IRC_Show_MOTD( CLIENT *Client ) len_tot = array_bytes(&Conf_Motd); if (len_tot == 0 && !Conn_UsesSSL(Client_Conn(Client))) - return IRC_WriteStrClient(Client, ERR_NOMOTD_MSG, Client_ID(Client)); + return IRC_WriteErrClient(Client, ERR_NOMOTD_MSG, Client_ID(Client)); if (!IRC_WriteStrClient(Client, RPL_MOTDSTART_MSG, Client_ID(Client), Client_ID(Client_ThisServer()))) @@ -1530,7 +1528,7 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan) return CONNECTED; /* Secret channel? */ - if (!is_member && strchr(Channel_Modes(Chan), 's')) + if (!is_member && Channel_HasMode(Chan, 's')) return CONNECTED; snprintf(str, sizeof(str), RPL_NAMREPLY_MSG, Client_ID(Client), "=", @@ -1539,7 +1537,7 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan) while (cl2chan) { cl = Channel_GetClient(cl2chan); - if (strchr(Client_Modes(cl), 'i')) + if (Client_HasMode(cl, 'i')) is_visible = false; else is_visible = true;