#include <stdio.h>
#include <stdlib.h>
-#include "../control/control.h" /* controlreply() */
+#include "../control/control.h"
#include "../localuser/localuser.h" /* killuser() */
#include "../lib/irc_string.h" /* IPtostr() */
#include "../lib/strlfunc.h"
struct kill_localdata {
unsigned int marker;
int count;
- int type;
char reason[NSMAX_REASON_LEN];
};
-struct searchNode *kill_parse(searchCtx *ctx, int type, int argc, char **argv) {
+struct searchNode *kill_parse(searchCtx *ctx, int argc, char **argv) {
struct kill_localdata *localdata;
struct searchNode *thenode;
- int len;
if (!(localdata = (struct kill_localdata *) malloc(sizeof(struct kill_localdata)))) {
parseError = "malloc: could not allocate memory for this search.";
return NULL;
}
localdata->count = 0;
- localdata->type = type;
- if (type == SEARCHTYPE_CHANNEL)
+ if (ctx->searchcmd == reg_chansearch)
localdata->marker = nextchanmarker();
- else
+ else if (ctx->searchcmd == reg_nicksearch)
localdata->marker = nextnickmarker();
+ else {
+ free(localdata);
+ parseError = "kill: invalid search type";
+ return NULL;
+ }
if (argc==1) {
- char *p = argv[0];
- if(*p == '\"')
- p++;
- len = strlcpy(localdata->reason, p, sizeof(localdata->reason));
- if(len >= sizeof(localdata->reason)) {
- localdata->reason[sizeof(localdata->reason)-1] = '\0';
- } else {
- localdata->reason[len-1] = '\0';
+ struct searchNode *reasonstr;
+ char *p;
+ if (!(reasonstr=argtoconststr("kill", ctx, argv[0], &p))) {
+ free(localdata);
+ return NULL;
}
- }
- else
+
+ strlcpy(localdata->reason, p, sizeof(localdata->reason));
+ reasonstr->free(ctx, reasonstr);
+ } else {
strlcpy(localdata->reason, defaultreason, sizeof(localdata->reason));
-
+ }
+
if (!(thenode=(struct searchNode *)malloc(sizeof (struct searchNode)))) {
/* couldn't malloc() memory for thenode, so free localdata to avoid leakage */
parseError = "malloc: could not allocate memory for this search.";
localdata = thenode->localdata;
- if (localdata->type == SEARCHTYPE_CHANNEL) {
+ if (ctx->searchcmd == reg_chansearch) {
cip = (chanindex *)theinput;
cip->marker = localdata->marker;
localdata->count += cip->channel->users->totalusers;
- }
- else {
+ } else {
np = (nick *)theinput;
np->marker = localdata->marker;
localdata->count++;
if (localdata->count > NSMAX_KILL_LIMIT) {
/* need to warn the user that they have just tried to twat half the network ... */
- controlreply(senderNSExtern, "Warning: your pattern matches too many users (%d) - nothing done.", localdata->count);
+ ctx->reply(senderNSExtern, "Warning: your pattern matches too many users (%d) - nothing done.", localdata->count);
free(localdata);
free(thenode);
return;
}
/* For channel searches, mark up all the nicks in the relevant channels first */
- if (localdata->type == SEARCHTYPE_CHANNEL) {
+ if (ctx->searchcmd == reg_chansearch) {
nickmarker=nextnickmarker();
for (i=0;i<CHANNELHASHSIZE;i++) {
for (cip=chantable[i];cip;cip=cip->next) {
}
if (safe)
- controlreply(senderNSExtern, "Warning: your pattern matched privileged users (%d in total) - these have not been touched.", safe);
+ ctx->reply(senderNSExtern, "Warning: your pattern matched privileged users (%d in total) - these have not been touched.", safe);
/* notify opers of the action */
- controlwall(NO_OPER, NL_KICKKILLS, "%s/%s killed %d %s via %s [%d untouched].", senderNSExtern->nick, senderNSExtern->authname, (localdata->count - safe),
- (localdata->count - safe) != 1 ? "users" : "user", (localdata->type == SEARCHTYPE_CHANNEL) ? "chansearch" : "nicksearch", safe);
+ ctx->wall(NL_KICKKILLS, "%s/%s killed %d %s via %s [%d untouched].", senderNSExtern->nick, senderNSExtern->authname, (localdata->count - safe),
+ (localdata->count - safe) != 1 ? "users" : "user", (ctx->searchcmd == reg_chansearch) ? "chansearch" : "nicksearch", safe);
free(localdata);
free(thenode);
}