summaryrefslogtreecommitdiff
path: root/libirc/libirc.c
diff options
context:
space:
mode:
Diffstat (limited to 'libirc/libirc.c')
-rw-r--r--libirc/libirc.c117
1 files changed, 101 insertions, 16 deletions
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;
+}