]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/opserv.c
fixing small memory leak
[irc/evilnet/x3.git] / src / opserv.c
index dce0fd68f3a55ae99ceb5531e3ea31a407d57f3e..7f3e0cc310fb19d1f7de918696f5d5ed8c75fc7f 100644 (file)
@@ -18,6 +18,7 @@
  * Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
  */
 
+#include "config.h"
 #include "chanserv.h"
 #include "conf.h"
 #include "common.h"
@@ -206,6 +207,7 @@ static const struct message_entry msgtab[] = {
     { "OSMSG_WHOIS_CHANNELS",   "Channels     : %s" },
     { "OSMSG_WHOIS_HIDECHANS",  "Channel list omitted for your sanity." },
     { "OSMSG_WHOIS_VERSION",    "Version      : %s" },  
+    { "OSMSG_WHOIS_MARK",       "Mark         : %s" },  
     { "OSMSG_WHOIS_NO_NOTICE",  "No_notices   : %s" },
     { "OSMSG_UNBAN_DONE", "Ban(s) removed from channel %s." },
     { "OSMSG_CHANNEL_VOICED", "All users on %s voiced." },
@@ -524,7 +526,7 @@ opserv_free_waiting_connection(void *data)
 
 typedef struct opservDiscrim {
     struct chanNode *channel;
-    char *mask_nick, *mask_ident, *mask_host, *mask_info, *mask_version, *server, *reason, *accountmask, *chantarget, *mark;
+    char *mask_nick, *mask_ident, *mask_host, *mask_info, *mask_version, *server, *reason, *accountmask, *chantarget, *mark, *mask_mark;
     irc_in_addr_t ip_mask;
     unsigned long limit;
     time_t min_ts, max_ts;
@@ -1398,8 +1400,10 @@ opserv_svsjoin(struct userNode *target, UNUSED_ARG(char *src_handle), UNUSED_ARG
             return; /* channel is invite only */
         }
 
-        if (channel->members.used >= channel->limit) {
-            return; /* channel is invite on */
+        if (channel->limit > 0) {
+            if (channel->members.used >= channel->limit) {
+                return; /* channel is invite on */
+            }
         }
 
         if (*channel->key) {
@@ -2035,6 +2039,9 @@ static MODCMD_FUNC(cmd_whois)
     if(target->version_reply) {
         reply("OSMSG_WHOIS_VERSION", target->version_reply);
     }
+    if(target->mark) {
+        reply("OSMSG_WHOIS_MARK", target->mark);
+    }
     reply("OSMSG_WHOIS_NO_NOTICE", target->no_notice ? "YES":"NO");
   
     if (target->modes) {
@@ -2804,7 +2811,7 @@ opserv_notice_handler(struct userNode *user, struct userNode *bot, char *text, U
         if(text[0] == '\001') {
             text++;
             cmd = mysep(&text, " ");
-            if(!irccasecmp(cmd, "VERSION")) {
+            if(cmd && !irccasecmp(cmd, "VERSION")) {
                 char *version = mysep(&text, "\n");
                 if(!version)
                     version = "";
@@ -5193,6 +5200,8 @@ opserv_discrim_create(struct userNode *user, struct userNode *bot, unsigned int
         }
         discrim->accountmask = argv[++i];
         discrim->authed = 1;
+    } else if (irccasecmp(argv[i], "marked") == 0) {
+        discrim->mask_mark = argv[++i];
     } else if (irccasecmp(argv[i], "chantarget") == 0) {
             if(!IsChannelName(argv[i+1])) {
                 send_message(user, bot, "MSG_NOT_CHANNEL_NAME");
@@ -5488,6 +5497,7 @@ discrim_match(discrim_t discrim, struct userNode *user)
         || (discrim->info_space == 0 && user->info[0] == ' ')
         || (discrim->info_space == 1 && user->info[0] != ' ')
         || (discrim->server && !match_ircglob(user->uplink->name, discrim->server))
+        || (discrim->mask_mark && (!user->mark || !match_ircglob(user->mark, discrim->mask_mark)))
         || (discrim->accountmask && (!user->handle_info || !match_ircglob(user->handle_info->handle, discrim->accountmask)))
         || (discrim->ip_mask_bits && !irc_check_mask(&user->ip, &discrim->ip_mask, discrim->ip_mask_bits))
         )
@@ -5725,20 +5735,22 @@ trace_svsjoin_func(struct userNode *match, void *extra)
     }
 
     if (checkrestrictions) {
-        if (trace_check_bans(target, channel) == 1) {
-            return; /* found on lamer list */
+        if (trace_check_bans(match, channel) == 1) {
+            return 1; /* found on lamer list */
         }
 
         if (channel->modes & MODE_INVITEONLY) {
-            return; /* channel is invite only */
+            return 1; /* channel is invite only */
         }
 
-        if (channel->members.used >= channel->limit) {
-            return; /* channel is invite on */
+        if (channel->limit > 0) {
+            if (channel->members.used >= channel->limit) {
+                return 1; /* channel is invite on */
+            }
         }
 
         if (*channel->key) {
-            return; /* channel is password protected */
+            return 1; /* channel is password protected */
         }
     }