Release his_servername and his_servercomment on termination.
[srvx.git] / src / proto-p10.c
index e748474cc474bfd465585d69bbe48695aee29701..ddde78e125fb3001b2dec7d5b8e8dc7cad2cc158 100644 (file)
@@ -479,6 +479,8 @@ irc_user(struct userNode *user)
             modes[modelen++] = 'n';
         if (IsHiddenHost(user))
             modes[modelen++] = 'x';
+        if (IsNoIdle(user))
+            modes[modelen++] = 'I';
         modes[modelen] = 0;
 
         /* we don't need to put the + in modes because it's in the format string. */
@@ -1507,13 +1509,13 @@ static CMD_FUNC(cmd_squit)
 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;
 }
@@ -1521,13 +1523,13 @@ static CMD_FUNC(cmd_privmsg)
 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;
 }
@@ -1601,6 +1603,8 @@ parse_cleanup(void)
     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
@@ -2222,6 +2226,7 @@ void mod_usermode(struct userNode *user, const char *mode_change) {
        case 'k': do_user_mode(FLAGS_SERVICE); break;
        case 'g': do_user_mode(FLAGS_GLOBAL); break;
        case 'n': do_user_mode(FLAGS_NOCHAN); break;
+        case 'I': do_user_mode(FLAGS_NOIDLE); break;
         case 'x': do_user_mode(FLAGS_HIDDEN_HOST); break;
         case 'r':
             if (*word) {
@@ -2499,7 +2504,7 @@ mod_chanmode_announce(struct userNode *who, struct chanNode *channel, struct mod
             mod_chanmode_append(&chbuf, 'k', channel->key);
         if (change->modes_clear & channel->modes & MODE_UPASS)
             mod_chanmode_append(&chbuf, 'U', channel->upass);
-        if (change->modes_clear * channel->modes & MODE_APASS)
+        if (change->modes_clear & channel->modes & MODE_APASS)
             mod_chanmode_append(&chbuf, 'A', channel->apass);
     }
     for (arg = 0; arg < change->argc; ++arg) {