tidied up devnull management and prepared functions for coming "dynamic devnull"...
authorpk910 <philipp@zoelle1.de>
Mon, 15 Jul 2013 16:50:19 +0000 (18:50 +0200)
committerpk910 <philipp@zoelle1.de>
Mon, 15 Jul 2013 16:50:19 +0000 (18:50 +0200)
src/chanserv.c
src/nickserv.c
src/opserv.c
src/opserv.h
src/proto-p10.c

index ec4a485d4df29a13ac7a7ffaeb3b47ac476be544..771b6169f462c676c2ae0d1dd3fed6408c001c00 100644 (file)
@@ -3287,8 +3287,7 @@ static CHANSERV_FUNC(cmd_opme)
         return 0;
     }
 
-    struct devnull_class *devnull;
-    if(user->handle_info->devnull && (devnull = devnull_get(user->handle_info->devnull)) && (devnull->modes & DEVNULL_MODE_OPME))
+    if(devnull_user_has_priv(user->handle_info, DEVNULL_MODE_OPME))
     {
         change.args[0].mode = MODE_CHANOP;
         errmsg = "CSMSG_ALREADY_OPPED";
index 25c2a43cfa9dc427b1adead6d1e66e0e02632d6d..17f9a15c8dc3a0e9d9ffab109791919adad633af 100644 (file)
@@ -2661,7 +2661,7 @@ static OPTION_FUNC(opt_devnull)
             hi->devnull = NULL;
         } else {
             devnull = unsplit_string(argv+1, argc-1, NULL);
-            if(devnull_check(devnull) == 1) { 
+            if(devnull_check_name(devnull)) { 
                 if(hi->devnull)
                     free(hi->devnull);
                 hi->devnull = strdup(devnull);
index 0ce488403e0aea6300dee479518a57841e31f92e..92abb8dc0a4af58f542720ba8af1c63763e5875f 100644 (file)
@@ -330,6 +330,8 @@ const char *devnull_modes = DEVNULL_MODES;
 static char *level_strings[1001];
 static char devnull_inverse_modes[256];
 
+void *devnull_check_priv_func = NULL;
+
 static struct {
     struct chanNode *debug_channel;
     struct chanNode *alert_channel;
@@ -4308,74 +4310,74 @@ static MODCMD_FUNC(cmd_listdevnull)
         struct devnull_class *th = iter_data(it);
         tbl.contents[++ii] = malloc(tbl.width * sizeof(tbl.contents[0][0]));
         tbl.contents[ii][0] = th->name;
-        if(DEVNULL_FLAGGED(th, MODE_A)) {
+        if(DEVNULL_HAS_PRIV(th, CHANLIMIT)) {
             tbl.contents[ii][1] = strtab(th->maxchan);
         } else {
             tbl.contents[ii][1] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_B)) {
+        if(DEVNULL_HAS_PRIV(th, UNLIMITTARGET)) {
             tbl.contents[ii][2] = on;
         } else {
             tbl.contents[ii][2] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_D)) {
+        if(DEVNULL_HAS_PRIV(th, NOFLOOD)) {
             tbl.contents[ii][3] = on;
-        } else if(DEVNULL_FLAGGED(th, MODE_C)) {
+        } else if(DEVNULL_HAS_PRIV(th, HALFFLOOD)) {
             tbl.contents[ii][3] = half;
         } else {
             tbl.contents[ii][3] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_E)) {
+        if(DEVNULL_HAS_PRIV(th, CHANHIDE)) {
             tbl.contents[ii][4] = on;
         } else {
             tbl.contents[ii][4] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_F)) {
+        if(DEVNULL_HAS_PRIV(th, IDLEHIDE)) {
             tbl.contents[ii][5] = on;
         } else {
             tbl.contents[ii][5] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_J)) {
+        if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
             tbl.contents[ii][6] = on;
         } else {
             tbl.contents[ii][6] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_K)) {
+        if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
             tbl.contents[ii][7] = on;
         } else {
             tbl.contents[ii][7] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_L)) {
+        if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
             tbl.contents[ii][8] = on;
         } else {
             tbl.contents[ii][8] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_M)) {
+        if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
             tbl.contents[ii][9] = on;
         } else {
             tbl.contents[ii][9] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_G)) {
+        if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
             tbl.contents[ii][10] = on;
         } else {
             tbl.contents[ii][10] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_I)) {
+        if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
             tbl.contents[ii][11] = on;
         } else {
             tbl.contents[ii][11] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_H)) {
+        if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
             tbl.contents[ii][12] = on;
         } else {
             tbl.contents[ii][12] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_N)) {
+        if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) {
             tbl.contents[ii][13] = on;
         } else {
             tbl.contents[ii][13] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_OPME)) {
+        if(DEVNULL_HAS_PRIV(th, OPME)) {
             tbl.contents[ii][14] = on;
         } else {
             tbl.contents[ii][14] = off;
@@ -4479,236 +4481,225 @@ static MODCMD_FUNC(cmd_setdevnull)
                 argv[offset+2][ ii ] = toupper( argv[offset+2][ ii ] );
             for( ii = 0; argv[offset+3][ ii ]; ii++)
                 argv[offset+3][ ii ] = toupper( argv[offset+3][ ii ] );
+            
             if(!strcmp("CHANLIMIT",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_A);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  DEVNULL_SET_FLAG(th, MODE_A);
-                  th->maxchan = strtoul(argv[offset+3], NULL, 0);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 }
-            }
-            else if(!strcmp("UNLIMITTARGET",argv[offset+2]) || !strcmp("UNLIMITEDTARGET",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_B);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_B);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("FLOOD",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_C);
-                  DEVNULL_CLEAR_FLAG(th, MODE_D);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_D);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("HALF",argv[offset+3]) || !strcmp("2",argv[offset+3]) || !strcmp("1/2",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_C);
-                  DEVNULL_CLEAR_FLAG(th, MODE_D);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("CHANHIDE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_E);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_E);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("IDLEHIDE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_F);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_F);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("CHSERVMODE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_G);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_G);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("XTRAOPMODE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_H);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_H);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("NETSERVMODE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_I);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_I);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("SEEIDLE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_J);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_J);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("FORCEIDLEHIDE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_K);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_K);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("OVERRIDECC",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_L);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_L);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("OVERRIDENOAMSG",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_M);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_M);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("MAXSENDQ",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_N);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  DEVNULL_SET_FLAG(th, MODE_N);
-                  th->maxsendq = strtoul(argv[offset+3], NULL, 0);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 }
+                if (!strcmp("OFF",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, CHANLIMIT);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    DEVNULL_SET_PRIV(th, CHANLIMIT);
+                    th->maxchan = strtoul(argv[offset+3], NULL, 0);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                }
+            } else if(!strcmp("UNLIMITTARGET",argv[offset+2]) || !strcmp("UNLIMITEDTARGET",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, UNLIMITTARGET);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, UNLIMITTARGET);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("FLOOD",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, HALFFLOOD);
+                    DEVNULL_CLEAR_PRIV(th, NOFLOOD);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, NOFLOOD);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("HALF",argv[offset+3]) || !strcmp("2",argv[offset+3]) || !strcmp("1/2",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, HALFFLOOD);
+                    DEVNULL_CLEAR_PRIV(th, NOFLOOD);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("CHANHIDE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, CHANHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, CHANHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("IDLEHIDE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, IDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, IDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("CHSERVMODE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, CHSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, CHSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("XTRAOPMODE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, XTRAOPMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, XTRAOPMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("NETSERVMODE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, NETSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, NETSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("SEEIDLE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, SEEIDLE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, SEEIDLE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("FORCEIDLEHIDE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, FORCEIDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, FORCEIDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("OVERRIDECC",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, OVERRIDECC);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, OVERRIDECC);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("OVERRIDENOAMSG",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, OVERRIDENOAMSG);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, OVERRIDENOAMSG);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("MAXSENDQ",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, MAXSENDQ);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    DEVNULL_SET_PRIV(th, MAXSENDQ);
+                    th->maxsendq = strtoul(argv[offset+3], NULL, 0);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                }
             } 
             else if(!strcmp("OPME",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_OPME);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_OPME);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, OPME);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, OPME);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
             } else {
-                 reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+2]);
+                reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+2]);
             }
             
         } else {
             reply("OSMSG_DEVNULL_SET", th->name);
-            if(DEVNULL_FLAGGED(th, MODE_A)) {
+            if(DEVNULL_HAS_PRIV(th, CHANLIMIT)) {
                 reply("OSMSG_DEVNULL_SET_A_i", th->maxchan);
             } else {
                 reply("OSMSG_DEVNULL_SET_A", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_B)) {
+            if(DEVNULL_HAS_PRIV(th, UNLIMITTARGET)) {
                 reply("OSMSG_DEVNULL_SET_B", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_B", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_D)) {
+            if(DEVNULL_HAS_PRIV(th, NOFLOOD)) {
                 reply("OSMSG_DEVNULL_SET_C", "on");
-            } else if(DEVNULL_FLAGGED(th, MODE_C)) {
+            } else if(DEVNULL_HAS_PRIV(th, HALFFLOOD)) {
                 reply("OSMSG_DEVNULL_SET_C", "half");
             } else {
                 reply("OSMSG_DEVNULL_SET_C", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_E)) {
+            if(DEVNULL_HAS_PRIV(th, CHANHIDE)) {
                 reply("OSMSG_DEVNULL_SET_E", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_E", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_F)) {
+            if(DEVNULL_HAS_PRIV(th, IDLEHIDE)) {
                 reply("OSMSG_DEVNULL_SET_F", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_F", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_G)) {
+            if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
                 reply("OSMSG_DEVNULL_SET_G", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_G", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_H)) {
+            if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
                 reply("OSMSG_DEVNULL_SET_H", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_H", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_I)) {
+            if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
                 reply("OSMSG_DEVNULL_SET_I", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_I", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_J)) {
+            if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
                 reply("OSMSG_DEVNULL_SET_J", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_J", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_K)) {
+            if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
                 reply("OSMSG_DEVNULL_SET_K", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_K", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_L)) {
+            if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
                 reply("OSMSG_DEVNULL_SET_L", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_L", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_M)) {
+            if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
                 reply("OSMSG_DEVNULL_SET_M", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_M", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_N)) {
+            if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) {
                 reply("OSMSG_DEVNULL_SET_N_i", th->maxsendq);
             } else {
                 reply("OSMSG_DEVNULL_SET_N", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_OPME)) {
+            if(DEVNULL_HAS_PRIV(th, OPME)) {
                 reply("OSMSG_DEVNULL_SET_OPME", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_OPME", "off");
@@ -4721,16 +4712,46 @@ static MODCMD_FUNC(cmd_setdevnull)
     return 1;
 }
 
-int devnull_check(const char *name) { 
+int devnull_check_name(const char *name) { 
     if (dict_find(opserv_devnull_classes, name, NULL)) {
         return 1;
     }
     return 0;
 }
 
-struct devnull_class* 
-    devnull_get(const char *name) {
-    return dict_find(opserv_devnull_classes, name, NULL);
+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);
+    }
+    
+    if(!hi->devnull)
+        return 0;
+    struct devnull_class *th;
+    if(!(th = dict_find(opserv_devnull_classes, hi->devnull, NULL)))
+        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;
+    
+    if(hi->devnull) {
+        struct devnull_class *thp;
+        if((thp = dict_find(opserv_devnull_classes, hi->devnull, NULL))) {
+            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))
+                th.maxsendq = thp->maxsendq;
+            th.modes |= thp->maxsendq;
+            th.name = thp->name;
+        }
+    }
+    return th;
 }
 
 void operpart(struct chanNode *chan, struct userNode *user)
index 92b35ecf0d4c4a644153cf2768f7172689e1efe6..0ff315e0f3b40c67cf04296adfc78a83c0a277f1 100644 (file)
 #ifndef _opserv_h
 #define _opserv_h
 
-/* DEVNULL_MODE_* go into devnull_class.modes */
-#define DEVNULL_MODE_A 0x00000001
-#define DEVNULL_MODE_B 0x00000002
-#define DEVNULL_MODE_C 0x00000004
-#define DEVNULL_MODE_D 0x00000008
-#define DEVNULL_MODE_E 0x00000010
-#define DEVNULL_MODE_F 0x00000020
-#define DEVNULL_MODE_G 0x00000040
-#define DEVNULL_MODE_H 0x00000080
-#define DEVNULL_MODE_I 0x00000100
-#define DEVNULL_MODE_J 0x00000200
-#define DEVNULL_MODE_K 0x00000400
-#define DEVNULL_MODE_L 0x00000800
-#define DEVNULL_MODE_M 0x00001000
-#define DEVNULL_MODE_N 0x00002000
-#define DEVNULL_MODE_OPME 0x00004000
+/* DEVNULL_PRIV_* go into devnull_class.modes */
+#define DEVNULL_PRIV_CHANLIMIT      0x0001
+#define DEVNULL_PRIV_UNLIMITTARGET  0x0002
+#define DEVNULL_PRIV_HALFFLOOD      0x0004
+#define DEVNULL_PRIV_NOFLOOD        0x0008
+#define DEVNULL_PRIV_CHANHIDE       0x0010
+#define DEVNULL_PRIV_IDLEHIDE       0x0020
+#define DEVNULL_PRIV_CHSERVMODE     0x0040
+#define DEVNULL_PRIV_XTRAOPMODE     0x0080
+#define DEVNULL_PRIV_NETSERVMODE    0x0100
+#define DEVNULL_PRIV_SEEIDLE        0x0200
+#define DEVNULL_PRIV_FORCEIDLEHIDE  0x0400
+#define DEVNULL_PRIV_OVERRIDECC     0x0800
+#define DEVNULL_PRIV_OVERRIDENOAMSG 0x1000
+#define DEVNULL_PRIV_MAXSENDQ       0x2000
+#define DEVNULL_PRIV_OPME           0x4000
 
-#define DEVNULL_MODES "abcdefghijklmno"
+#define DEVNULL_MODES               "abcdefghijklmno"
 
-#define DEVNULL_FLAGGED(hi, tok) ((hi)->modes & DEVNULL_##tok)
-#define DEVNULL_SET_FLAG(hi, tok) ((hi)->modes |= DEVNULL_##tok)
-#define DEVNULL_CLEAR_FLAG(hi, tok) ((hi)->modes &= ~DEVNULL_##tok)
+#define DEVNULL_HAS_PRIV(cl, tok) ((cl)->modes & DEVNULL_##tok)
+#define DEVNULL_SET_PRIV(cl, tok) ((cl)->modes |= DEVNULL_##tok)
+#define DEVNULL_CLEAR_PRIV(cl, tok) ((cl)->modes &= ~DEVNULL_##tok)
 
 struct devnull_class {
     char *name;
@@ -51,13 +51,14 @@ struct devnull_class {
     unsigned long maxsendq;
 };
 
+extern void *devnull_check_priv_func;
+
 void init_opserv(const char *nick);
 unsigned int gag_create(const char *mask, const char *owner, const char *reason, unsigned long expires);
 int opserv_bad_channel(const char *name);
-void devnull_delete(const char *auth);
-void devnull_rename(const char *oldauth, const char *newauth);
-int devnull_check(const char *name);
-struct devnull_class* devnull_get(const char *name);
+int devnull_check_name(const char *name);
+int devnull_user_has_priv(struct handle_info *hi, int devnull_priv);
+struct devnull_class devnull_user_get_class(struct handle_info *hi);
 struct userNode* GetOpServ(void);
 void operpart(struct chanNode *chan, struct userNode *user);
 void operadd(struct userNode *user);
index dc0829d07e9ca6dc8776bf924441e38e0c979fed..91247e251606f974d96be9bbb3755d4de2ed645b 100644 (file)
@@ -1786,41 +1786,41 @@ static CMD_FUNC(cmd_relay)
         //ok  someone relayed something to us!
         if(strcmp("LQ", argv[2]) == 0) {
             //oooh thats exciting - we've got a LOC Query! :D
-            //LQ !ABADE pk910 80.153.5.212 server.zoelle1.de ~watchcat :test
             //ok  let's check the login datas
             struct handle_info *hi;
             char tmp[MAXLEN], tmp2[MAXLEN];
             sprintf(tmp, "%s@%s",argv[7],argv[6]);
             sprintf(tmp2, "%s@%s",argv[7],argv[5]);
             if((hi = checklogin(argv[4],argv[argc-1],&argv[3][1],tmp,tmp2))) {
-             //login ok
-             struct devnull_class *th;
-             char devnull[512];
-             if(hi->devnull && (th = devnull_get(hi->devnull))) {
-                const char *devnull_modes = DEVNULL_MODES;
-                int ii, flen;
-                char flags[50];
-                for (ii=flen=0; devnull_modes[ii]; ++ii)
-                    if (th->modes & (1 << ii))
-                        flags[flen++] = devnull_modes[ii];
-                flags[flen] = 0;
-                sprintf(devnull, "+%s %s %lu %lu",flags,th->name,th->maxchan,th->maxsendq);
-             } else {
-                devnull[0] = 0;
-             }
-             if(!HANDLE_FLAGGED(hi, AUTOHIDE)) {
-                sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull);
-             } else if(getfakehost(argv[4])) {
-                sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull);
-             } else {
-                extern const char *hidden_host_suffix;
-                sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull);
-             }
-             irc_relay(tmp);
+                //login ok
+                struct devnull_class th = devnull_user_get_class(hi);
+                char devnull[MAXLEN];
+                
+                if(th.modes) {
+                    const char *devnull_modes = DEVNULL_MODES;
+                    int ii, flen = 0;
+                    char flags[50];
+                    for (ii = 0; devnull_modes[ii]; ++ii)
+                        if(th.modes & (1 << ii))
+                            flags[flen++] = devnull_modes[ii];
+                    flags[flen] = 0;
+                    sprintf(devnull, "+%s %s %lu %lu", flags, (th.name ? th.name : "custom"), (DEVNULL_HAS_PRIV(&th, CHANLIMIT) ? th.maxchan : 0), (DEVNULL_HAS_PRIV(&th, MAXSENDQ) ? th.maxsendq : 0));
+                } else
+                    devnull[0] = 0;
+                
+                if(!HANDLE_FLAGGED(hi, AUTOHIDE))
+                    sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull);
+                else if(getfakehost(argv[4]))
+                    sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull);
+                else {
+                    extern const char *hidden_host_suffix;
+                    sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull);
+                }
+                irc_relay(tmp);
             } else {
-             //login rejected
-             sprintf(tmp,"%s LR\n",argv[3]);
-             irc_relay(tmp);
+                //login rejected
+                sprintf(tmp,"%s LR\n",argv[3]);
+                irc_relay(tmp);
             }
         } else if(strcmp("UC", argv[2]) == 0) {
             char tmp[MAXLEN];