From 19c2749eb64171a25ac5a8fb8eab5f73c83bd7f2 Mon Sep 17 00:00:00 2001 From: epochqwert Date: Wed, 4 Feb 2015 03:11:22 -0600 Subject: I don't remember. --- libirc/libirc.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) (limited to 'libirc/libirc.c') 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) { //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? -- cgit v1.2.3