fixed devnull list output
[srvx.git] / src / opserv.c
index 69a21fc9d87dc8cf7b75542e418e5495638b8786..dc50be783788780ac0a96093ade8392854991573 100644 (file)
@@ -79,7 +79,6 @@
 #define KEY_ISSUER "issuer"
 #define KEY_ISSUED "issued"
 #define KEY_DEVNULL_CLASSES "classes"
-#define KEY_DEVNULL_LASTID "lastid"
 #define KEY_DEVNULL_ID "id"
 #define KEY_DEVNULL_NAME "class"
 #define KEY_DEVNULL_MODE "modes"
@@ -2825,9 +2824,11 @@ opserv_add_devnull_class(const char *name, unsigned int id, unsigned long modes,
     th = calloc(1, sizeof(*th));
     if (!th)
         return;
-    if(id)
+    if(id) {
         th->id = id;
-    else
+        if(id >= devnull_last_id)
+            devnull_last_id = id+1;
+    } else
         th->id = (++devnull_last_id);
     th->name = strdup(name);
     th->modes = modes;
@@ -2919,8 +2920,6 @@ opserv_saxdb_read(struct dict *conf_db)
         if ((str = database_get_data(object, KEY_TIME, RECDB_QSTRING)))
             max_clients_time = atoi(str);
     }
-    if ((str = database_get_data(object, KEY_DEVNULL_LASTID, RECDB_QSTRING)))
-        devnull_last_id = atoi(str);
     if ((object = database_get_data(conf_db, KEY_TRUSTED_HOSTS, RECDB_OBJECT)))
         dict_foreach(object, trusted_host_read, opserv_trusted_hosts);
     if ((object = database_get_data(conf_db, KEY_DEVNULL_CLASSES, RECDB_OBJECT)))
@@ -3004,7 +3003,6 @@ opserv_saxdb_write(struct saxdb_context *ctx)
         }
         saxdb_end_record(ctx);
     }
-    saxdb_write_int(ctx, KEY_DEVNULL_LASTID, devnull_last_id);
     /* gags */
     if (gagList) {
         struct gag_entry *gag;
@@ -4312,8 +4310,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]);
@@ -4351,45 +4348,47 @@ static MODCMD_FUNC(cmd_listdevnull)
         } else {
             tbl.contents[ii][5] = off;
         }
-        if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
+        if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
             tbl.contents[ii][6] = on;
         } else {
             tbl.contents[ii][6] = off;
         }
-        if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
+        if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
             tbl.contents[ii][7] = on;
         } else {
             tbl.contents[ii][7] = off;
         }
-        if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
+        if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
             tbl.contents[ii][8] = on;
         } else {
             tbl.contents[ii][8] = off;
         }
-        if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
+        if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
             tbl.contents[ii][9] = on;
         } else {
             tbl.contents[ii][9] = off;
         }
-        if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
+        if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
             tbl.contents[ii][10] = on;
         } else {
             tbl.contents[ii][10] = off;
         }
-        if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
+        if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
             tbl.contents[ii][11] = on;
         } else {
             tbl.contents[ii][11] = off;
         }
-        if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
+        if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
             tbl.contents[ii][12] = on;
         } else {
             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 +4397,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]);
@@ -4444,7 +4443,7 @@ static MODCMD_FUNC(cmd_adddevnull)
         return 0;
     }
     
-    opserv_add_devnull_class(argv[1], (++devnull_last_id), 0, 0, 0);
+    opserv_add_devnull_class(argv[1], 0, 0, 0, 0);
     reply("OSMSG_DEVNULL_ADDED",argv[1]);
     return 1;
 }
@@ -4762,6 +4761,17 @@ struct devnull_class devnull_user_get_class(struct handle_info *hi) {
     struct devnull_class th;
     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_id) {
         struct devnull_class *thp;
         if((thp = devnull_find_id(hi->devnull_id))) {