diff options
author | epochqwert <epoch@53flpnlls43fcguy.onion> | 2015-03-28 00:16:57 -0500 |
---|---|---|
committer | epochqwert <epoch@53flpnlls43fcguy.onion> | 2015-03-28 00:16:57 -0500 |
commit | 7f43ddc3b96848b1a788a86ae663279dead86f27 (patch) | |
tree | e5eff4a1146267325451959741546ff7f6d74df6 /libirc | |
parent | 9429905cb75e36107df9c0b44a3dd9293520f4f2 (diff) | |
download | segfault-7f43ddc3b96848b1a788a86ae663279dead86f27.tar.gz segfault-7f43ddc3b96848b1a788a86ae663279dead86f27.zip |
added a function to deleted an individual key:value in libhashtable
added a function that does line cutting to libirc (and its prototype in the header)
made segfault take advantage of the new cutting function.
Diffstat (limited to 'libirc')
-rw-r--r-- | libirc/irc.h | 1 | ||||
-rw-r--r-- | libirc/libirc.c | 117 |
2 files changed, 102 insertions, 16 deletions
diff --git a/libirc/irc.h b/libirc/irc.h index 4520bf4..231cd84 100644 --- a/libirc/irc.h +++ b/libirc/irc.h @@ -1,3 +1,4 @@ int runit(int fd,void (*line_handler)(),void (*extra_handler)()) ; int ircConnect(char *serv,char *port,char *nick,char *user) ; int serverConnect(char *serv,char *port) ; +char **line_cutter(int fd,char *line,struct user *user) ; diff --git a/libirc/libirc.c b/libirc/libirc.c index 2394459..dd1c0d0 100644 --- a/libirc/libirc.c +++ b/libirc/libirc.c @@ -12,29 +12,64 @@ //#define DEBUG "epoch" //nick or channel to send debug info to. #define CHUNK 4096 +int main(int argc,char *argv[]) { + return 0; +} + +#define SILLYLIMIT 256 + int serverConnect(char *serv,char *port) { - struct addrinfo hints, *servinfo, *p; int rv; int fd=0; + int n=1; + int try_ipv4=0; + char buf[SILLYLIMIT]; + struct addrinfo hints, *servinfo, *p=0; + struct in_addr saddr; + struct in6_addr saddr6; + struct hostent *he; memset(&hints,0,sizeof hints); hints.ai_family=AF_INET; hints.ai_socktype=SOCK_STREAM; if((fd=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0) { perror("socket"); - return fd; + return -1; } - if((rv=getaddrinfo(serv,port,&hints,&servinfo)) != 0) { - fprintf(stderr,"error resolving '%s'.\n",serv); - return 0; - } - for(p=servinfo;p;p=p->ai_next) { - if (connect(fd,p->ai_addr, p->ai_addrlen) < 0) { - perror("connect"); - continue; - } - break; - } - return p?fd:0; +/* + for(try_ipv4=0;try_ipv4 < 2;try_ipv4++) { + if(!(he=gethostbyname2( + try_ipv4 + ?inet_aton(serv,&saddr) + ?inet_ntoa(saddr) + :serv + :inet_pton(AF_INET6,serv,&saddr6) + ?inet_ntop(AF_INET6,&saddr6,buf,SILLYLIMIT) + :serv + ,try_ipv4?AF_INET:AF_INET6))) return -1; + + for(;*(he->h_addr_list);he->h_addr_list++) { + printf("trying to connect to %s:%s attempt #%d\n",serv,port,n); + n++; +*/ +// if((rv=getaddrinfo(he->h_addr_list,port,&hints,&servinfo)) != 0) { + if((rv=getaddrinfo(serv,port,&hints,&servinfo)) != 0) { + fprintf(stderr,"error resolving '%s'.\n",serv); + return -1; + } + for(p=servinfo;p;p=p->ai_next) { + if(connect(fd,p->ai_addr, p->ai_addrlen) < 0) { + perror("connect"); + continue; + } else { + return fd; + } + } + //printf("trying a differnt address...\n"); + //} + //printf("trying a different AF...\n"); + //} + //printf("well, shit. how'd I get here?\n"); + return -1; } int fdlen(int *fds) { @@ -59,7 +94,7 @@ int runem(int *fds,void (*line_handler)(),void (*extra_handler)()) { FD_ZERO(&master); FD_ZERO(&readfs); for(i=0;fds[i] != -1;i++) { - if(!backlogs[i]) return 252; + //if(!backlogs[i]) return 252;//wtf is this here for? ofc they're not set! FD_SET(fds[i],&master); backlogs[i]=malloc(CHUNK+1); memset(backlogs[i],0,CHUNK); @@ -70,7 +105,7 @@ int runem(int *fds,void (*line_handler)(),void (*extra_handler)()) { while(!done) { for(fd=0;fd<=fdmax;fd++) { if(FD_ISSET(fd,&master)) { - extra_handler(fd); + if(extra_handler) extra_handler(fd); } } readfs=master; @@ -169,3 +204,53 @@ int ircConnect(char *serv,char *port,char *nick,char *user) { write(fd,sendstr,strlen(sendstr)); return fd; } + +struct user { + char *nick; + char *user; + char *host; +}; + +//this function mangles the input. +//gotta free the returned pointer but not each pointer in the array. +char **line_cutter(int fd,char *line,struct user *user) { + int i; + char **a=malloc(16);//heh. + memset(a,0,sizeof(char *)*16); + if(!user) return 0; + user->nick=0; + user->user=0; + user->host=0; + + if(strchr(line,'\r')) *strchr(line,'\r')=0; + if(strchr(line,'\n')) *strchr(line,'\n')=0; + if(line[0]==':') { + if((user->nick=strchr(line,':'))) { + *(user->nick)=0; + (user->nick)++; + } + } + if(user->nick) { + if((a[0]=strchr((user->nick),' '))) { + for(i=0;a[i+1]=strchr(a[i],' ') && i<15;i++) { + *a[i]=0; + a[i]++; + if(a[i][0] == ':') {//we're done. + a[i]++; + break; + } + } + } + if(((user->user)=strchr((user->nick),'!'))) { + *(user->user)=0; + (user->user)++; + if(((user->host)=strchr((user->user),'@'))) { + *(user->host)=0; + (user->host)++; + } + } else { + user->host=user->nick; + } + } + return a; +} |