]> jfr.im git - irc/quakenet/newserv.git/blame_incremental - newsearch/ns-host.c
merge
[irc/quakenet/newserv.git] / newsearch / ns-host.c
... / ...
CommitLineData
1/*
2 * HOST functionality
3 */
4
5#include "newsearch.h"
6
7#include <stdio.h>
8#include <stdlib.h>
9
10#include "../irc/irc_config.h"
11#include "../lib/irc_string.h"
12
13void *host_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
14void *host_exe_real(searchCtx *ctx, struct searchNode *thenode, void *theinput);
15void host_free(searchCtx *ctx, struct searchNode *thenode);
16
17struct searchNode *host_parse(searchCtx *ctx, int argc, char **argv) {
18 struct searchNode *thenode, *argsn;
19 char *p;
20
21 if (!(thenode=(struct searchNode *)malloc(sizeof (struct searchNode)))) {
22 parseError = "malloc: could not allocate memory for this search.";
23 return NULL;
24 }
25
26 thenode->returntype = RETURNTYPE_STRING;
27 if (!(thenode->localdata = (void *)malloc(HOSTLEN+1))) {
28 /* couldn't malloc() memory for thenode->localdata, so free thenode to avoid leakage */
29 parseError = "malloc: could not allocate memory for this search.";
30 free(thenode);
31 return NULL;
32 }
33 thenode->exe = host_exe;
34 thenode->free = host_free;
35
36 if (argc>0) {
37 if (!(argsn=argtoconststr("host", ctx, argv[0], &p))) {
38 free(thenode);
39 return NULL;
40 }
41
42 /* Allow "host real" to match realhost */
43 if (!ircd_strcmp(p,"real"))
44 thenode->exe = host_exe_real;
45
46 argsn->free(ctx, argsn);
47 }
48
49 return thenode;
50}
51
52void *host_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput) {
53 nick *np = (nick *)theinput;
54 char *buf = thenode->localdata;
55
56 if (IsSetHost(np)) {
57 return np->sethost->content;
58 } else if (IsHideHost(np)) {
59 sprintf(buf,"%s.%s",np->authname,HIS_HIDDENHOST);
60 return buf;
61 } else {
62 return np->host->name->content;
63 }
64}
65
66void *host_exe_real(searchCtx *ctx, struct searchNode *thenode, void *theinput) {
67 nick *np = (nick *)theinput;
68
69 return np->host->name->content;
70}
71
72void host_free(searchCtx *ctx, struct searchNode *thenode) {
73 free(thenode->localdata);
74 free(thenode);
75}