X-Git-Url: http://git.pk910.de/?p=srvx.git;a=blobdiff_plain;f=src%2Fopserv.c;fp=src%2Fopserv.c;h=92abb8dc0a4af58f542720ba8af1c63763e5875f;hp=0ce488403e0aea6300dee479518a57841e31f92e;hb=093f707afd62edb079b5f64d165ee128f912e71f;hpb=455b2a8b15ea97be4bffe3a8ac8b5a3ac8ce39c5 diff --git a/src/opserv.c b/src/opserv.c index 0ce4884..92abb8d 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -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)