summaryrefslogtreecommitdiff
path: root/libirc
diff options
context:
space:
mode:
Diffstat (limited to 'libirc')
-rw-r--r--libirc/Makefile2
-rw-r--r--libirc/libirc.c110
2 files changed, 111 insertions, 1 deletions
diff --git a/libirc/Makefile b/libirc/Makefile
index c35ed4d..e6c38fb 100644
--- a/libirc/Makefile
+++ b/libirc/Makefile
@@ -12,4 +12,4 @@ clean:
install:
cp $(TARGET) /usr/local/lib/$(TARGET)
- cp irc.h /usr/local/lib/irc.h
+ cp irc.h /usr/local/include/irc.h
diff --git a/libirc/libirc.c b/libirc/libirc.c
index 91ff357..0f6c837 100644
--- a/libirc/libirc.c
+++ b/libirc/libirc.c
@@ -137,6 +137,116 @@ int runit(int fd,void (*line_handler)(),void (*extra_handler)()) {
return 0;
}
+//yeah. this is a copy of the previous function.
+//with a bit of different stuff. didn't want to break anything yet.
+int runem(int *fd,void (*line_handler)(),void (*extra_handler)()) {
+ FILE *fp;
+ fd_set master;
+ fd_set readfs;
+ struct timeval timeout;
+ int fdmax=0,n,s,i;
+ char *backlog=malloc(CHUNK+1);
+ char *t,*line=0;
+ int blsize=CHUNK;
+ int bllen=0;
+ char buffer[CHUNK];//THIS IS *NOT* NULL TERMINATED.
+ if(!backlog) return 252;
+ FD_ZERO(&master);
+ FD_ZERO(&readfs);
+ for(i=0;fd[i] != -1;i++) {
+ FD_SET(fd,&master);
+ fdmax=fd>fdmax?fd:fdmax;
+ }
+ fp=fdopen(fd,"rw");
+ memset(backlog,0,CHUNK);
+ memset(buffer,0,CHUNK);
+ if(fd) {
+ int done=0;
+ while(!done) {
+ for(fd=0;fd<=fdmax;fd++) {
+ if(FD_ISSET(fd,&master)) {
+ extra_handler(fd);
+ }
+ }
+ readfs=master;
+ timeout.tv_sec=0;
+ timeout.tv_usec=1000;
+ if( select(fdmax+1,&readfs,0,0,&timeout) == -1 ) {
+ printf("\n!!!It is crashing here!!!\n\n");
+ perror("select");
+ return 1;
+ }
+ for(fd=0;fd<=fdmax;fd++) {
+ if(FD_ISSET(fd,&readfs)) {
+ if((n=recv(fd,buffer,CHUNK,0)) <= 0) {//read CHUNK bytes
+ fprintf(stderr,"recv: %d\n",n);
+ perror("recv");
+ return 2;
+ } else {
+ buffer[n]=0;//deff right.
+ if(bllen+n >= blsize) {//this is probably off...
+ blsize+=n;
+ t=malloc(blsize);
+ if(!t) {
+ printf("OH FUCK! MALLOC FAILED!\n");
+ exit(253);
+ }
+ memset(t,0,blsize);//optional?
+ memcpy(t,backlog,blsize-n+1);//???
+ free(backlog);
+ backlog=t;
+ }
+ memcpy(backlog+bllen,buffer,n);
+ bllen+=n;
+ for(i=0,s=0;i<bllen;i++) {
+ if(backlog[i]=='\n') {
+ line=malloc(i-s+3);//on linux it crashes without the +1 +3? weird. when did I do that?
+ if(!line) {
+ printf("ANOTHER malloc error!\n");
+ exit(254);
+ }
+ memcpy(line,backlog+s,i-s+2);
+ line[i-s+1]=0;//gotta null terminate this. line_handler expects it .
+ s=i+1;//the character after the newline.
+ if(!strncmp(line,"PING",4)) {
+ t=malloc(strlen(line));
+ strcpy(t,"PONG ");
+ strcat(t,line+6);
+ write(fd,t,strlen(t));
+ //fprintf(fp,"PONG %s",line+6);//a whole FILE * and fdopen JUST for this??? oy...
+ //fflush(fp);
+ #ifdef DEBUG
+ printf("%s\nPONG %s\n",line,line+6);
+ write(fd,"PRIVMSG %s :PONG! w00t!\r\n",DEBUG,28);
+ #endif
+ } else if(!strncmp(line,"ERROR",5)) {
+ #ifdef DEBUG
+ printf("error: %s\n",line);
+ #endif
+ return 0;
+ } else {
+ line_handler(fd,line);
+ }
+ free(line);
+ }
+ }
+ //left shift the backlog so the last thing we got to is at the start
+ if(s > bllen) { //if the ending position is after the size of the backlog...
+ bllen=0;//fuck shifting. :P
+ } else {
+ for(i=s;i<=bllen;i++) {//should work.
+ backlog[i-s]=backlog[i];
+ }
+ bllen-=s;
+ }
+ }
+ }
+ }
+ }
+ }
+ return 0;
+}
+
//:hack.thebackupbox.net 433 * sysbot :Nickname is already in use.
//Need to have it check for this.
//and try a nick?