X-Git-Url: https://jfr.im/git/irc/rqf/shadowircd.git/blobdiff_plain/57d299acbd62db43d9229333c3c6908607b3d474..1229514e6d1cee2b6ef5a50b3b15ff7745026b53:/src/chmode.c diff --git a/src/chmode.c b/src/chmode.c index b6ece72..5cbcde3 100644 --- a/src/chmode.c +++ b/src/chmode.c @@ -65,13 +65,22 @@ static int mode_limit; static int mode_limit_simple; static int mask_pos; +char cflagsbuf[256]; +char cflagsmyinfo[256]; + int chmode_flags[256]; + /* OPTIMIZE ME! -- dwr */ void construct_noparam_modes(void) { int i; + char *ptr = cflagsbuf; + char *ptr2 = cflagsmyinfo; static int prev_chmode_flags[256]; + + *ptr = '\0'; + *ptr2 = '\0'; for(i = 0; i < 256; i++) { @@ -105,7 +114,40 @@ construct_noparam_modes(void) } else prev_chmode_flags[i] = chmode_flags[i]; + + switch (chmode_flags[i]) + { + case MODE_EXLIMIT: + case MODE_DISFORWARD: + if(ConfigChannel.use_forward) + { + *ptr++ = (char) i; + } + + break; + case MODE_REGONLY: + if(rb_dlink_list_length(&service_list)) + { + *ptr++ = (char) i; + } + + break; + default: + if(chmode_flags[i] != 0) + { + *ptr++ = (char) i; + } + } + + /* Should we leave orphaned check here? -- dwr */ + if(!(chmode_table[i].set_func == chm_nosuch) && !(chmode_table[i].set_func == chm_orphaned)) + { + *ptr2++ = (char) i; + } } + + *ptr++ = '\0'; + *ptr2++ = '\0'; } /* @@ -339,7 +381,7 @@ pretty_mask(const char *idmask) if(*t != '\0') user = t; } - else if(strchr(mask, '.') != NULL || strchr(mask, ':') != NULL) + else if(strchr(mask, '.') != NULL || strchr(mask, ':') != NULL || strchr(mask, '/') != NULL) { if(*mask != '\0') host = mask; @@ -459,7 +501,6 @@ chm_simple(struct Client *source_p, struct Channel *chptr, return; } - /* flags (possibly upto 32) + 4 with param */ if(MyClient(source_p) && (++mode_limit_simple > MAXMODES_SIMPLE)) return;