]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-info.c
ngircd: discard supplementary group ids on startup
[ngircd-alex.git] / src / ngircd / irc-info.c
index 5d2ae36ddda7afc217f504368ca143e7f415d6c9..3d77237f4e08f95928d826462734dafc3f19e759 100644 (file)
@@ -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;
@@ -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 = Client_HasMode(c, 'o');
                if (OnlyOps && !is_ircop)
                        continue;
 
                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));
+               memset(flags, 0, sizeof(flags));
+
+               if (Client_HasMode(c, 'a'))
+                       flags[0] = 'G'; /* away */
+               else
+                       flags[0] = 'H';
+
                if (Client_HasMode(c, 'o'))
-                       strlcat(flags, "*", sizeof(flags));
+                       flags[1] = '*';
 
                if (!write_whoreply(Client, c, "*", flags))
                        return DISCONNECTED;
@@ -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,
@@ -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);
@@ -1216,7 +1213,7 @@ IRC_WHOIS( CLIENT *Client, REQUEST *Req )
 
        /* Bad number of parameters? */
        if (Req->argc < 1 || Req->argc > 2)
-               return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
+               return IRC_WriteErrClient(Client, ERR_NEEDMOREPARAMS_MSG,
                                          Client_ID(Client), Req->command);
 
        _IRC_GET_SENDER_OR_RETURN_(from, Req, Client)
@@ -1258,7 +1255,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 +1265,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 +1289,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 +1322,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 +1377,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 +1467,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())))