]> jfr.im git - irc/quakenet/newserv.git/blob - newsearch/ns-host.c
merge
[irc/quakenet/newserv.git] / newsearch / ns-host.c
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
13 void *host_exe(searchCtx *ctx, struct searchNode *thenode, void *theinput);
14 void *host_exe_real(searchCtx *ctx, struct searchNode *thenode, void *theinput);
15 void host_free(searchCtx *ctx, struct searchNode *thenode);
16
17 struct 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
52 void *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
66 void *host_exe_real(searchCtx *ctx, struct searchNode *thenode, void *theinput) {
67 nick *np = (nick *)theinput;
68
69 return np->host->name->content;
70 }
71
72 void host_free(searchCtx *ctx, struct searchNode *thenode) {
73 free(thenode->localdata);
74 free(thenode);
75 }