]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/chanservgrep.c
3 #include "../core/events.h"
13 #define CSG_BUFSIZE 512
15 pcre
*csg_curpat
; /* Compiled pattern from pcre */
16 int csg_curfile
; /* Which logfile is being searched */
17 unsigned long csg_curnum
; /* What numeric is doing a search */
18 int csg_matches
; /* How many lines have been returned so far */
19 int csg_maxmatches
=0; /* How many matches are allowed */
21 char csg_readbuf
[CSG_BUFSIZE
]; /* Buffer */
22 int csg_bytesleft
; /* How much valid data there is in the buffer */
24 void csg_handleevents(int fd
, short revents
);
25 int csg_dogrep(void *source
, int cargc
, char **cargv
);
28 chanservaddcommand("grep", QCMD_OPER
, 1, csg_dogrep
, "Searches the logs.");
32 chanservremovecommand("grep", csg_dogrep
);
35 int csg_dogrep(void *source
, int cargc
, char **cargv
) {
42 chanservstdmessage(sender
, QM_NOTENOUGHPARAMS
, "grep");
46 if (csg_maxmatches
>0) {
47 chanservsendmessage(sender
, "Sorry, grep is currently busy - try later.");
51 if (!(csg_curpat
=pcre_compile(cargv
[0], 0, &errptr
, &erroffset
, NULL
))) {
52 chanservsendmessage(sender
, "Error in pattern at character %d: %s",erroffset
,errptr
);
56 if ((fd
=open("chanservlog.0",O_RDONLY
))<0) {
57 chanservsendmessage(sender
, "Unable to open logfile.");
62 /* Initialise stuff for the match */
65 csg_curnum
=sender
->numeric
;
69 registerhandler(fd
, POLLIN
, csg_handleevents
);
70 chanservsendmessage(sender
, "Started grep for %s...",cargv
[0]);
75 void csg_handleevents(int fd
, short revents
) {
77 nick
*np
=getnickbynumeric(csg_curnum
);
78 char *chp
, *linestart
;
82 /* If the target user has vanished, drop everything */
84 deregisterhandler(fd
, 1);
91 res
=read(fd
, csg_readbuf
+csg_bytesleft
, CSG_BUFSIZE
-csg_bytesleft
);
94 /* End of file (or error) */
95 deregisterhandler(fd
, 1);
96 sprintf(filename
,"chanservlog.%d",++csg_curfile
);
97 if ((fd
=open(filename
,O_RDONLY
))>=0) {
98 /* Found the next file */
99 registerhandler(fd
, POLLIN
, csg_handleevents
);
101 chanservstdmessage(np
, QM_ENDOFLIST
);
109 linestart
=chp
=csg_readbuf
;
112 while (csg_bytesleft
) {
114 if (*chp
=='\r' || *chp
=='\n' || *chp
=='\0') {
115 if (linestart
==chp
) {
119 if (!pcre_exec(csg_curpat
, NULL
, linestart
, strlen(linestart
), 0, 0, NULL
, 0)) {
120 chanservsendmessage(np
, "%s", linestart
);
121 if (++csg_matches
>= csg_maxmatches
) {
122 chanservstdmessage(np
, QM_ENDOFLIST
);
124 deregisterhandler(fd
, 1);
135 csg_bytesleft
=(chp
-linestart
);
136 memmove(csg_readbuf
, linestart
, csg_bytesleft
);
139 pos
=lseek(fd
, 0, SEEK_CUR
);
140 if (!pread(fd
, csg_readbuf
+csg_bytesleft
, 1, pos
)) {