diff options
Diffstat (limited to 'libirc/libirc.c')
-rw-r--r-- | libirc/libirc.c | 107 |
1 files changed, 9 insertions, 98 deletions
diff --git a/libirc/libirc.c b/libirc/libirc.c index 7968f76..fad958d 100644 --- a/libirc/libirc.c +++ b/libirc/libirc.c @@ -37,101 +37,6 @@ int serverConnect(char *serv,char *port) { return p?fd:0; } -int runit(int fd,void (*line_handler)(),void (*extra_handler)()) { - fd_set master; - fd_set readfs; - struct timeval timeout; - int fdmax,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); - FD_SET(fd,&master); - fdmax=fd; - memset(backlog,0,CHUNK); - memset(buffer,0,CHUNK); - if(fd) { - int done=0; - while(!done) { - 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; - } - 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)); -#ifdef DEBUG - printf("%s\nPONG %s\n",line,line+6); -#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; -} - //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 *fds,void (*line_handler)(),void (*extra_handler)()) { @@ -165,7 +70,7 @@ int runem(int *fds,void (*line_handler)(),void (*extra_handler)()) { timeout.tv_sec=0; timeout.tv_usec=1000; if( select(fdmax+1,&readfs,0,0,&timeout) == -1 ) { - printf("\n!!!It is rashing here!!!\n\n"); + printf("\n!!!It is crashing here!!!\n\n"); perror("select"); return 1; } @@ -206,8 +111,6 @@ int runem(int *fds,void (*line_handler)(),void (*extra_handler)()) { 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); @@ -239,6 +142,14 @@ int runem(int *fds,void (*line_handler)(),void (*extra_handler)()) { return 0; } +//wrap runem to keep runit around :P +int runit(int fd,void (*line_handler)(),void (*extra_handler)()) { + int fds[2]; + fds[0]=fd; + fds[1]=-1; + runem(fds,line_handler,extra_handler); +} + //not needed? int ircConnect(char *serv,char *port,char *nick,char *user) { char sendstr[1024]; |