+ case 'S':
+ case 's':
+ if (!IsAnOper(sptr) || !HasPriv(sptr, PRIV_LIST_CHAN))
+ return show_usage(sptr);
+
+ args->flags |= LISTARG_SHOWSECRET;
+ param++;
+
+ if (*param != ',' && *param != ' ' && *param != '\0') /* check syntax */
+ return show_usage(sptr);
+ break;
+
+ case 'M':
+ case 'm':
+ if (!IsAnOper(sptr) || !HasPriv(sptr, PRIV_LIST_CHAN))
+ return show_usage(sptr);
+
+ args->flags |= LISTARG_SHOWMODES;
+ param++;
+
+ if (*param != ',' && *param != ' ' && *param != '\0') /* check syntax */
+ return show_usage(sptr);
+ break;
+
+ default:
+ /* It might be a wildcard... */
+ if (strchr(param, '*') ||
+ strchr(param, '?'))
+ {
+ if (param[0] == '!')
+ {
+ param++;
+ args->flags |= LISTARG_NEGATEWILDCARD;
+ }
+
+ /* Only one wildcard allowed... */
+ if (args->wildcard[0] != 0)
+ return show_usage(sptr);
+
+ /* If its not going to match anything, don't bother. */
+ if (param[0] != '*' &&
+ param[0] != '?' &&
+ param[0] != '#' &&
+ param[0] != '&')
+ return show_usage(sptr);
+
+ tmp1 = strchr(param, ',');
+ tmp2 = strchr(param, ' ');
+ if (tmp2 && (!tmp1 || (tmp2 < tmp1)))
+ tmp1 = tmp2;
+
+ if (tmp1)
+ *tmp1++ = 0;
+
+ ircd_strncpy(args->wildcard, param, CHANNELLEN-1);
+ args->wildcard[CHANNELLEN-1] = 0;
+
+ if (tmp1 == NULL)
+ return LPARAM_SUCCESS;
+
+ param = tmp1;
+ continue;
+ }
+
+ /* channel name? */