static void do_list(struct Client *source_p, char *arg) { struct ListTask *lt = NULL; int no_masked_channels = 1; if (source_p->connection->list_task) { free_list_task(source_p); sendto_one_numeric(source_p, &me, RPL_LISTEND); return; } lt = MyCalloc(sizeof(struct ListTask)); lt->users_max = UINT_MAX; lt->created_max = UINT_MAX; lt->topicts_max = UINT_MAX; source_p->connection->list_task = lt; if (!EmptyString(arg)) { char *opt, *save = NULL; dlink_list *list = NULL; int i = 0, errors = 0; for (opt = strtoken(&save, arg, ","); opt; opt = strtoken(&save, NULL, ",")) { switch (*opt) { case '<': if ((i = atoi(opt + 1)) > 0) lt->users_max = (unsigned int)i - 1; else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->users_min = (unsigned int)i + 1; else errors = 1; break; case 'C': case 'c': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->created_max = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->created_min = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; case 'T': case 't': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->topicts_min = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->topicts_max = (unsigned int)(CurrentTime - 60 * i); else errors = 1; break; case ':': if (strlcpy(lt->topic, opt + 1, sizeof(lt->topic)) == 0) errors = 1; break; default: errors = 1; } break; default: if (*opt == '!') { list = <->hide_mask; opt++; } else list = <->show_mask; if (has_wildcards(opt + !!IsChanPrefix(*opt))) { if (list == <->show_mask) no_masked_channels = 0; } else if (!IsChanPrefix(*opt)) errors = 1; if (!errors) dlinkAdd(xstrdup(opt), make_dlink_node(), list); } } if (errors) { free_list_task(source_p); sendto_one_numeric(source_p, &me, ERR_LISTSYNTAX); return; } } dlinkAdd(source_p, <->node, &listing_client_list); sendto_one_numeric(source_p, &me, RPL_LISTSTART); safe_list_channels(source_p, no_masked_channels && lt->show_mask.head != NULL); }
static void do_list(struct Client *source_p, int parc, char *parv[]) { struct ListTask *lt; int no_masked_channels; if (MyConnect(source_p)) { if (source_p->localClient->list_task != NULL) { free_list_task(source_p->localClient->list_task, source_p); sendto_one(source_p, form_str(RPL_LISTEND), me.name, source_p->name); return; } } lt = (struct ListTask *) MyMalloc(sizeof(struct ListTask)); lt->users_max = UINT_MAX; lt->created_max = UINT_MAX; lt->topicts_max = UINT_MAX; if (MyConnect(source_p)) source_p->localClient->list_task = lt; no_masked_channels = 1; if (parc > 1) { char *opt, *save; dlink_list *list; int i, errors = 0; for (opt = strtoken(&save, parv[1], ","); opt != NULL; opt = strtoken(&save, NULL, ",")) switch (*opt) { case '<': if ((i = atoi(opt + 1)) > 0) lt->users_max = (unsigned int) i - 1; else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->users_min = (unsigned int) i + 1; else errors = 1; break; case '-': break; case 'C': case 'c': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->created_max = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->created_min = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; case 'T': case 't': switch (*++opt) { case '<': if ((i = atoi(opt + 1)) >= 0) lt->topicts_min = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; case '>': if ((i = atoi(opt + 1)) >= 0) lt->topicts_max = (unsigned int) (CurrentTime - 60 * i); else errors = 1; break; default: errors = 1; } break; default: if (*opt == '!') { list = <->hide_mask; opt++; } else list = <->show_mask; if (has_wildcards(opt + !!IsChanPrefix(*opt))) { if (list == <->show_mask) no_masked_channels = 0; } else if (!IsChanPrefix(*opt)) errors = 1; if (!errors) { char *s; DupString(s, opt); dlinkAdd(s, make_dlink_node(), list); } } if (errors) { free_list_task(lt, source_p); sendto_one(source_p, form_str(ERR_LISTSYNTAX), MyConnect(source_p) ? me.name : ID(&me), MyConnect(source_p) ? source_p->name : ID(source_p)); return; } } if (MyConnect(source_p)) dlinkAdd(source_p, make_dlink_node(), &listing_client_list); sendto_one(source_p, form_str(RPL_LISTSTART), MyConnect(source_p) ? me.name : ID(&me), MyConnect(source_p) ? source_p->name : ID(source_p)); safe_list_channels(source_p, lt, no_masked_channels && lt->show_mask.head != NULL, !MyConnect(source_p)); }