diff options
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | libirc/examples/link.c | 124 | ||||
-rw-r--r-- | libirc/libirc.c | 158 | ||||
-rw-r--r-- | segfault.c | 78 |
4 files changed, 234 insertions, 132 deletions
@@ -12,6 +12,8 @@ clean: rm -f segfault install: - cd libirc && $(MAKE) install - cd libhashtable && $(MAKE) install + cp -f libirc/libirc.so /usr/local/lib + cp -f libhashtable/libhashtable.so /usr/local/lib +# cd libirc && $(MAKE) install +# cd libhashtable && $(MAKE) install cp -f segfault /usr/local/bin/segfault diff --git a/libirc/examples/link.c b/libirc/examples/link.c new file mode 100644 index 0000000..5c13e94 --- /dev/null +++ b/libirc/examples/link.c @@ -0,0 +1,124 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <irc.h> + +#define mywrite(a,b) write(a,b,strlen(b)) + +int *fds; +char **chans; + +void extra_handler(int fd) { + return; +} + +struct user { + char *nick; + char *user; + char *host; +}; + +void privmsg_others(int fd,char *msg) { + int i; + char tmp[512]; + for(i=0;fds[i] != -1;i++) { + if(fds[i] != fd) { + snprintf(tmp,sizeof(tmp)-1,"PRIVMSG %s :%s\r\n",chans[fdtoi(fds[i])],msg); + write(fds[i],tmp,strlen(tmp)); + } + } +} + +void message_handler(int fd,char *from,struct user *user,char *line) { + int i; + char tmp[512]; + if(!strcmp(from,chans[fdtoi(fd)])) {//don't want to be forwarding PMs. :P + snprintf(tmp,sizeof(tmp)-1,"<%s> %s",user->nick,line); + privmsg_others(fd,tmp); + } +} + +void line_handler(int fd,char *line) {//this should be built into the libary? + char *s=line,*t=0,*u=0; + char tmp[512]; + struct user *user=malloc(sizeof(struct user)); + 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; + printf("line: '%s'\n",line); + if(line[0]==':') { + if((user->nick=strchr(line,':'))) { + *(user->nick)=0; + (user->nick)++; + } + } + if(user->nick) { + if((s=strchr((user->nick),' '))) { + *s=0; + s++; + if((t=strchr(s,' '))) { + *t=0; + t++; + if((u=strchr(t,' '))) {//: + *u=0; + u++; + } + } + } + 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; + } + } + if(!user->user && s) { + if(!strcmp(s,"004")) { + snprintf(tmp,sizeof(tmp)-1,"JOIN %s\r\n",chans[fdtoi(fd)]); + mywrite(fd,tmp); + } + } + if(s && t && u) { + if(!strcmp(s,"PRIVMSG")) { + message_handler(fd,*t=='#'?t:user->nick,user,++u); + } + } + if(s && user->nick && t) { + if(!strcmp(s,"JOIN")) { + snprintf(tmp,sizeof(tmp)-1,"%cACTION %s has joined %s%c",1,user->nick,t+1,1); + privmsg_others(fd,tmp); + //send a join message to the other end. + } + } + free(user); +} + +int fdtoi(int fd) { + int i; + for(i=0;fds[i] != -1;i++) { + if(fds[i] == fd) return i; + } + return -1; +} + +int main(int argc,char *argv[]) { + fds=malloc(sizeof(int) * (argc+3) / 3); + chans=malloc(sizeof(char *) * (argc+3) / 3); + int i=0; + printf("%d\n",argc); + for(i=0;((i*3)+3)<argc;i++) { + printf("%d server: %s port: %s channel: %s\n",i,argv[(i*3)+1],argv[(i*3)+2],argv[(i*3)+3]); + fds[i]=serverConnect(argv[(i*3)+1],argv[(i*3)+2]); + chans[i]=strdup(argv[(i*3)+3]); + mywrite(fds[i],"NICK link\r\nUSER a b c :d\r\n"); + } + fds[i]=-1; + //heh. you can write your own code for picking a different nick per server. fuck you. + runem(fds,line_handler,extra_handler); +} diff --git a/libirc/libirc.c b/libirc/libirc.c index d2bff54..7968f76 100644 --- a/libirc/libirc.c +++ b/libirc/libirc.c @@ -132,15 +132,14 @@ int runit(int fd,void (*line_handler)(),void (*extra_handler)()) { return 0; } -#if 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; +int runem(int *fds,void (*line_handler)(),void (*extra_handler)()) { fd_set master; fd_set readfs; struct timeval timeout; int fdmax=0,n,s,i; + int fd; char *backlog=malloc(CHUNK+1); char *t,*line=0; int blsize=CHUNK; @@ -149,92 +148,89 @@ int runem(int *fd,void (*line_handler)(),void (*extra_handler)()) { 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; + for(i=0;fds[i] != -1;i++) { + FD_SET(fds[i],&master); + fdmax=fds[i]>fdmax?fds[i]: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); - } + 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; + } + readfs=master; + 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"); + 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); } - 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); + 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); + 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)) { + } else if(!strncmp(line,"ERROR",5)) { #ifdef DEBUG - printf("error: %s\n",line); + printf("error: %s\n",line); #endif - return 0; - } else { - line_handler(fd,line); - } - free(line); + 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; + } + //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; } } } @@ -242,13 +238,8 @@ int runem(int *fd,void (*line_handler)(),void (*extra_handler)()) { } return 0; } -#endif -//:hack.thebackupbox.net 433 * sysbot :Nickname is already in use. -//Need to have it check for this. -//and try a nick? -//or something... -//I don't want to add any string parsing to this function. :/ +//not needed? int ircConnect(char *serv,char *port,char *nick,char *user) { char sendstr[1024]; int fd; @@ -260,4 +251,3 @@ int ircConnect(char *serv,char *port,char *nick,char *user) { write(fd,sendstr,strlen(sendstr)); return fd; } - @@ -64,6 +64,7 @@ int lines_sent; unsigned long oldtime; int maxtails; int currentmaxtails; +char seghome[SEGHOMELEN]; struct hashtable alias; struct hashtable builtin; @@ -73,8 +74,6 @@ union hack { void *data; }; -#define HACK(a) (void *)((union hack){a}.data) - void (*func)(int fd,...); struct user { @@ -104,19 +103,16 @@ char *tailmode_to_txt(int mode) { char *modes="recmbsnf"; int i,j=0; char *m=malloc(strlen(modes)); - for(i=0;i<strlen(modes);i++) { - if(mode & 1<<i) { + for(i=0;i<strlen(modes);i++) + if(mode & 1<<i) m[j++]=modes[i]; - } - } m[j]=0; return m; } void mywrite(int fd,char *b) { int r; - if(!b) return; - if(fd<0) return; + if(!b || fd <0) return; r=write(fd,b,strlen(b)); if(r == -1) exit(1); if(r != strlen(b)) exit(2); @@ -153,8 +149,7 @@ void privmsg(int fd,char *who,char *msg) { int sz; int cs; int count=0; - if(!who) return; - if(!msg) return; + if(!who || !msg) return; for(i=0;i<strlen(msg);i+=LINELEN) { cs=(strlen(msg+i)<=LINELEN)?strlen(msg+i):LINELEN; sz=8+strlen(who)+2+cs+3;//"PRIVMSG ", " :", "\r\n\0"; @@ -175,17 +170,13 @@ void privmsg(int fd,char *who,char *msg) { //try to shorten this up sometime... char *format_magic(int fd,char *from,struct user *user,char *orig_fmt,char *arg) { int i=0,j=1,sz=0,c=1; - char seghome[SEGHOMELEN]; - char *output,*fmt; + char overflow_space[100]; + char *output,*fmt,*argCopy; char **args,**notargs; - char *argCopy; - char *argN[10]; - char randC[10][2]={"0","1","2","3","4","5","6","7","8","9"}; - //lets split up arg? + char *argN[10],randC[10][2]={"0","1","2","3","4","5","6","7","8","9"}; if(!arg) arg="%s"; if(!(argCopy=strdup(arg))) return 0; - getcwd(seghome,SEGHOMELEN); - for(argN[j]=argCopy;argCopy[i];i++) { + for(argN[0]=argCopy;argCopy[i];i++) { if(argCopy[i] == ' ') { argN[j]=argCopy+i; argN[j][0]=0; @@ -198,18 +189,12 @@ char *format_magic(int fd,char *from,struct user *user,char *orig_fmt,char *arg) } if(!orig_fmt) exit(70); if(!(fmt=strdup(orig_fmt))) return 0; - for(i=0;fmt[i];i++) { - if(fmt[i] == '%') { - i++; - switch(fmt[i]) { + for(i=0;fmt[i];i++) + if(fmt[i] == '%') + switch(fmt[++i]) case '~':case 'p':case 'n':case 'h':case 'u':case 'f':case 's': case 'm':case '%':case '0':case '1':case '2':case '3':case '4': - case '5':case '6':case '7':case '8':case '9':case 'r': - //when adding new format things add here and... - c++; - } - } - } + case '5':case '6':case '7':case '8':case '9':case 'r': c++; args=malloc((sizeof(char *)) * (c + 1)); notargs=malloc((sizeof(char *)) * (c + 2)); c=0; @@ -219,7 +204,7 @@ char *format_magic(int fd,char *from,struct user *user,char *orig_fmt,char *arg) switch(fmt[i]) { case '~':case 'p':case 'n':case 'h':case 'u':case 'f':case 's': case 'm':case '%':case '0':case '1':case '2':case '3':case '4': - case '5':case '6':case '7':case '8':case '9':case 'r'://here. + case '5':case '6':case '7':case '8':case '9':case 'r': args[c]=((fmt[i]=='n')?user->nick: ((fmt[i]=='u')?user->user: ((fmt[i]=='~')?seghome: @@ -296,7 +281,7 @@ void extra_handler(int fd) { if(redirect_to_fd != -1) { fd=redirect_to_fd; } - for(i=0;i<currentmaxtails;i++) { + for(i=0;i<currentmaxtails;i++) {//RIP THIS SHIT OUT SOMETIME if(tailf[i].fp) { if(feof(tailf[i].fp)) { clearerr(tailf[i].fp); @@ -328,11 +313,7 @@ void extra_handler(int fd) { if(strchr(tmp,'\r')) *strchr(tmp,'\r')=0; if(strchr(tmp,'\n')) *strchr(tmp,'\n')=0; if(tailf[i].opt & TAILO_EVAL) {//eval - if(tailf[i].opt & TAILO_FORMAT) { - tmp2=format_magic(fd,tailf[i].to,tailf[i].user,tmp,tailf[i].args); - } else { - tmp2=strdup(tmp); - } + tmp2=tailf[i].opt&TAILO_FORMAT?format_magic(fd,tailf[i].to,tailf[i].user,tmp,tailf[i].args):strdup(tmp); message_handler(fd,tailf[i].to,tailf[i].user,tmp2,0); free(tmp2); } @@ -398,7 +379,8 @@ void file_tail(int fd,char *from,char *file,char *args,int opt,struct user *user eofp(tailf[i].fp); } if(!from) exit(73); - tailf[i].to=strdup(from); + if(tailf[i].to) free(tailf[i].to); + tailf[i].to=strdup(from);//if this properly free()d before being assigned to? if(!tailf[i].to) { mywrite(fd,"QUIT :malloc error 3!!!\r\n"); return; @@ -497,7 +479,7 @@ void c_changetail(int fd,char *from,char *line,struct user *user,...) { } } if((fdd=open(line,O_RDONLY|O_NONBLOCK,0)) == -1) { - snprintf(tmp,sizeof(tmp)-1,"%s: (%s) fd:%d",strerror(errno),line,fdd); + snprintf(tmp,sizeof(tmp)-1,"changetail: %s: (%s) fd:%d",strerror(errno),line,fdd); privmsg(fd,"#cmd",tmp); return; } @@ -767,7 +749,7 @@ char append_file(int fd,char *from,char *file,char *line,unsigned short nl) { derp[1]=0; if(line == 0) return mywrite(fd,"QUIT :line == 0 in append_file\r\n"),-1; if((fdd=open(file,O_WRONLY|O_NONBLOCK|O_APPEND|O_CREAT,0640)) == -1) { - snprintf(tmp,sizeof(tmp)-1,"%s: (%s) fd:%d",strerror(errno),file,fdd); + snprintf(tmp,sizeof(tmp)-1,"append_file: %s: (%s) fd:%d",strerror(errno),file,fdd); privmsg(fd,from,tmp); return 0; } @@ -841,23 +823,23 @@ void c_tails(int fd,char *from,...) { } } -char recording,recording_raw; +char *recording,recording_raw; void c_record(int fd,char *from,char *line,...) { if(!line) { privmsg(fd,from,"usage: !record 0|1"); return; } - if(*line == '0') { + if(*line == '0' && *(line+1) == 0) { + if(recording) free(recording); privmsg(fd,from,"no longer recording IRC."); recording=0; return; } - if(*line == '1') { - recording=1; + else { + recording=strdup(line); unlink(LOG); privmsg(fd,from,"recording IRC."); - return; } privmsg(fd,from,recording?"1":"0"); } @@ -891,7 +873,7 @@ void c_leetsetout(int fd,char *from,char *msg,...) { if(redirect_to_fd != -1) close(redirect_to_fd); redirect_to_fd=open(msg+3,((msg[0]-'0')*100) + ((msg[1]-'0')*10) + (msg[2]-'0'),022); if(redirect_to_fd == -1) { - snprintf(tmp,sizeof(tmp)-1,"%s: (%s) fd:%d",strerror(errno),msg+3,redirect_to_fd); + snprintf(tmp,sizeof(tmp)-1,"leetsetout: %s: (%s) fd:%d",strerror(errno),msg+3,redirect_to_fd); privmsg(fd,"#cmd",tmp); return; } @@ -973,6 +955,7 @@ void message_handler(int fd,char *from,struct user *user,char *msg,int redones) char *oldcommand; char *args; char tmp[512]; + char *tmp2; int len; int sz; //privmsg(fd,"#debug",msg); @@ -991,8 +974,10 @@ void message_handler(int fd,char *from,struct user *user,char *msg,int redones) } if(recording) { debug_time(fd,from,"writing to log..."); - snprintf(tmp,sizeof(tmp)-1,"<%s> %s",user->nick,msg); - append_file(fd,user->nick,LOG,tmp,'\n'); + //snprintf(tmp,sizeof(tmp)-1,"<%s> %s",user->nick,msg); + tmp2=format_magic(fd,from,user,recording,msg); + append_file(fd,user->nick,LOG,tmp2,'\n'); + free(tmp2); debug_time(fd,from,"finished writing to log."); } len=strchr(msg,'*')?strchr(msg,'*')-msg:strlen(myuser->nick); @@ -1244,6 +1229,7 @@ int main(int argc,char *argv[]) { // "segfault segfault segfault :segfault"); printf("cd %s\n",pwd->pw_dir); chdir(getenv("seghome")?getenv("seghome"):pwd->pw_dir); + getcwd(seghome,SEGHOMELEN); prestartup_stuff(fd); return runit(fd,line_handler,extra_handler); } |