show MAXSENDQ value in cmd_listdevnull
[srvx.git] / src / opserv.c
index c4844b7604a67c8b53cd0767445bb72a1d3db4c2..6c6ac33d6046cde0ca855c06e5836219779454a5 100644 (file)
@@ -79,7 +79,7 @@
 #define KEY_ISSUER "issuer"
 #define KEY_ISSUED "issued"
 #define KEY_DEVNULL_CLASSES "classes"
-#define KEY_DEVNULL_LASTID "lastid"
+#define KEY_DEVNULL_LASTID "devnull_id"
 #define KEY_DEVNULL_ID "id"
 #define KEY_DEVNULL_NAME "class"
 #define KEY_DEVNULL_MODE "modes"
@@ -2848,7 +2848,7 @@ static int
 devnull_class_read(const char *name, void *data, UNUSED_ARG(void *extra))
 {
     struct record_data *rd = data;
-    const char *nameb = name, *str;
+    const char *str;
     unsigned long modes, maxchan, maxsendq;
     unsigned int id, ii;
 
@@ -4312,8 +4312,7 @@ static MODCMD_FUNC(cmd_listdevnull)
     tbl.contents[0][12] = "+X";
     tbl.contents[0][13] = "MaxQ";
     tbl.contents[0][14] = "OpMe";
-    if(!count)
-    {
+    if(!count) {
         table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
         reply("MSG_NONE");
         free(tbl.contents[0]);
@@ -4387,9 +4386,11 @@ static MODCMD_FUNC(cmd_listdevnull)
             tbl.contents[ii][12] = off;
         }
         if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) {
-            tbl.contents[ii][13] = on;
+            char maxsenqbuf[MAXLEN];
+            sprintf(maxsenqbuf, "%lu", th->maxsendq);
+            tbl.contents[ii][13] = strdup(maxsenqbuf);
         } else {
-            tbl.contents[ii][13] = off;
+            tbl.contents[ii][13] = strdup(off);
         }
         if(DEVNULL_HAS_PRIV(th, OPME)) {
             tbl.contents[ii][14] = on;
@@ -4398,8 +4399,8 @@ static MODCMD_FUNC(cmd_listdevnull)
         }
     }
     table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
-    for(ii = 1; ii < tbl.length; ++ii)
-    {
+    for(ii = 1; ii < tbl.length; ++ii) {
+        free(tbl.contents[ii][13]);
         free(tbl.contents[ii]);
     }
     free(tbl.contents[0]);
@@ -4745,28 +4746,37 @@ struct devnull_class *devnull_find_name(const char *name) {
 
 int devnull_user_has_priv(struct handle_info *hi, int devnull_priv) {
     if(devnull_check_priv_func) {
-        int ext_privs = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi, devnull_priv);
-        if((ext_privs & devnull_priv))
-            return (ext_privs & devnull_priv);
+        struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi);
+        if((ext_class.modes & devnull_priv))
+            return (ext_class.modes & devnull_priv);
     }
     
-    if(!hi->devnull)
+    if(!hi->devnull_id)
         return 0;
-    struct devnull_class *th;
-    if(!(th = dict_find(opserv_devnull_classes, hi->devnull, NULL)))
+    struct devnull_class *th = devnull_find_id(hi->devnull_id);
+    if(!th)
         return 0;
-    
     return (th->modes & devnull_priv);
 }
 
 struct devnull_class devnull_user_get_class(struct handle_info *hi) {
     struct devnull_class th;
-    th.name = NULL;
-    th.modes = 0;
+    memset(&th, 0, sizeof(th));
+    
+    if(devnull_check_priv_func) {
+        struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi);
+        th.modes |= ext_class.modes;
+        if(ext_class.name)
+            th.name = ext_class.name;
+        if(DEVNULL_HAS_PRIV(&th, CHANLIMIT))
+            th.maxchan = ext_class.maxchan;
+        if(DEVNULL_HAS_PRIV(&th, MAXSENDQ))
+            th.maxsendq = ext_class.maxsendq;
+    }
     
-    if(hi->devnull) {
+    if(hi->devnull_id) {
         struct devnull_class *thp;
-        if((thp = dict_find(opserv_devnull_classes, hi->devnull, NULL))) {
+        if((thp = devnull_find_id(hi->devnull_id))) {
             if(DEVNULL_HAS_PRIV(thp, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < thp->maxchan))
                 th.maxchan = thp->maxchan;
             if(DEVNULL_HAS_PRIV(thp, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < thp->maxsendq))