X-Git-Url: https://jfr.im/git/irc/quakenet/newserv.git/blobdiff_plain/49072633d024ef21cc75257b7002e301ce2bc227..3e1b768066a16c4b899b9cbdd7911be883151a05:/newsearch/ns-country.c diff --git a/newsearch/ns-country.c b/newsearch/ns-country.c index 62bd256a..3f858827 100644 --- a/newsearch/ns-country.c +++ b/newsearch/ns-country.c @@ -9,18 +9,22 @@ #include "../irc/irc_config.h" #include "../lib/irc_string.h" +#include "../geoip/geoip.h" +#include "../core/modules.h" -void *country_exe(struct searchNode *thenode, int type, void *theinput); -void *country_exe_real(struct searchNode *thenode, int type, void *theinput); -void country_free(struct searchNode *thenode); +void *country_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput); +void country_free(searchCtx *ctx, struct searchNode *thenode); int ext; -struct searchNode *country_parse(int type, int argc, char **argv) { - struct searchNode *thenode; - - if (type != SEARCHTYPE_NICK) { - parseError = "country: this function is only valid for nick searches."; +struct searchNode *country_parse(searchCtx *ctx, int argc, char **argv) { + struct searchNode *thenode, *countrysn; + GeoIP_LookupCode l; + long target; + char *p; + + if (argc<1) { + parseError = "country: usage: country "; return NULL; } @@ -30,29 +34,46 @@ struct searchNode *country_parse(int type, int argc, char **argv) { return NULL; } + l = ndlsym("geoip", "geoip_lookupcode"); + if(!l) { + parseError = "unable to lookup geoip function pointer"; + return NULL; + } + + if (!(countrysn=argtoconststr("country", ctx, argv[0], &p))) + return NULL; + + target = l(p); + countrysn->free(ctx, countrysn); + + if(target == -1) { + parseError = "country: invalid country."; + return NULL; + } if (!(thenode=(struct searchNode *)malloc(sizeof (struct searchNode)))) { parseError = "malloc: could not allocate memory for this search."; return NULL; } - thenode->returntype = RETURNTYPE_INT; - thenode->localdata = NULL; + thenode->returntype = RETURNTYPE_BOOL; + thenode->localdata = (void *)target; thenode->exe = country_exe; thenode->free = country_free; return thenode; } -void *country_exe(struct searchNode *thenode, int type, void *theinput) { +void *country_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput) { nick *np = (nick *)theinput; + long country = (long)thenode->localdata, rc = (long)np->exts[ext]; - if (type != RETURNTYPE_INT) + if(country == rc) return (void *)1; - return (void *)np->exts[ext]; + return (void *)0; } -void country_free(struct searchNode *thenode) { +void country_free(searchCtx *ctx, struct searchNode *thenode) { free(thenode); }