summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--segfault.c341
1 files changed, 247 insertions, 94 deletions
diff --git a/segfault.c b/segfault.c
index 519f34e..3feca57 100644
--- a/segfault.c
+++ b/segfault.c
@@ -16,11 +16,12 @@
#include <signal.h>
#include <syslog.h>
#include <grp.h> //setgroups
+#include <dlfcn.h>
//epoch's libraries.
+#include <idc.h>
#include <irc.h>
#include <hashtable.h>
-#include <idc.h>
#include "access.h"
@@ -236,6 +237,8 @@ char *escahack(char *s) {//for single quotes
}
//try to shorten this up sometime...
+char format_helptext[256];
+
char *format_magic(int fd,char *from,struct user *user,char *orig_fmt,char *arg) {
char *magic[256];
int i=0,j=1,sz=0,c=1,d=0;
@@ -271,8 +274,9 @@ char *format_magic(int fd,char *from,struct user *user,char *orig_fmt,char *arg)
argN[j]="(null)";//fill up the rest to prevent null deref.
}
- //magic['r']=(char *)-1;//magic!
- //magic['$']=(char *)-2;//more magic!
+ magic['?']=format_helptext;
+ magic['r']="magic";//magic!
+ magic['$']="magic";//more magic!
magic['n']=(user->nick?user->nick:"user->nick");
magic['u']=(user->user?user->user:"user->user");
magic['h']=(user->host?user->host:"user->host");
@@ -284,6 +288,7 @@ char *format_magic(int fd,char *from,struct user *user,char *orig_fmt,char *arg)
magic['t']=time_str;
magic['s']=(arg?arg:"arg");
magic['A']="\x01";//for ctcp and action
+ magic['B']="\x02";//for bold
magic['C']="\x03";//for colors
magic['0']=argN[0];
magic['1']=argN[1];
@@ -298,6 +303,16 @@ char *format_magic(int fd,char *from,struct user *user,char *orig_fmt,char *arg)
magic['q']=(arg && strlen(arg)?escahack(arg):"");
magic['Q']=(arg && strlen(arg)?esca(arg,"\""):"");
magic['%']="%";
+ if(!format_helptext[0]) {
+ j=0;
+ for(i=0;i<256;i++) {
+ if(magic[i]) {
+ format_helptext[j]=i;
+ j++;
+ }
+ }
+ format_helptext[j]=0;
+ }
if(!orig_fmt) return 0;
if(!(fmt=strdup(orig_fmt))) return 0;
@@ -375,18 +390,21 @@ void eofp(FILE *fp) {
void tail_line_handler(int fd,char *line,int tailfd);
void tail_handler(struct shit *me,char *line) {//how how call this with line of NULL to signal EOF
- fprintf(stderr,"tail_handler: fd %d->%d got line: %s\n",me->fd,tailf[me->fd].srcfd,line);
+// fprintf(stderr,"tail_handler: fd %d->%d got line: %s\n",me->fd,tailf[me->fd].srcfd,line);
if(line) {
- fprintf(stderr,"about to tail_line_handler");
+// fprintf(stderr,"about to tail_line_handler");
tail_line_handler(tailf[me->fd].srcfd,line,me->fd);//HACK. SHOULD NOT HAVE 3 HERE. //what /should/ it have?
- fprintf(stderr,"back from tail_line_handler");
+// fprintf(stderr,"back from tail_line_handler");
}
else tailf[me->fd].fp=0;
}
+void c_raw(int fd,char *from,char *msg,struct user *user);//don't want to shuffle functions around, so just putting this here.
+
void tail_line_handler(int fd,char *line,int tailfd) {//the fd passed to this needs to be the server fd
char *tmp=strdup(line);
char *tmp2;
+// char *tmp3;
int i;
//need a better way to find this....
//for(i=0;i<currentmaxtails;i++) {//god help me.
@@ -412,11 +430,25 @@ void tail_line_handler(int fd,char *line,int tailfd) {//the fd passed to this ne
//printf("OHAI. WE SURVIVED!\n");
}
if(tailf[i].opt & TAILO_RAW) {//raw
- tmp2=malloc(strlen(tmp)+4);
- snprintf(tmp2,strlen(tmp)+3,"%s\r\n",tmp);
- fprintf(stderr,"attempting to write raw to %d: %s\n",fd,tmp);
- mywrite(fd,tmp2);
- free(tmp2);
+ if(tailf[i].opt & TAILO_FORMAT && tailf[i].args) {
+ tmp2=format_magic(fd,tailf[i].to,tailf[i].user,tailf[i].args,tmp);//the args is the format string.
+
+ //tmp3=malloc(strlen(tmp2)+4);
+ //snprintf(tmp3,strlen(tmp2)+3,"%s",tmp2);
+ fprintf(stderr,"attempting to write raw to %d: %s\n",fd,tmp2);
+ c_raw(fd,tailf[i].to,tmp2,tailf[i].user);//???
+ //mywrite(fd,tmp3);
+ //free(tmp3);
+
+ free(tmp2);
+ } else {
+ tmp2=malloc(strlen(tmp)+4);
+ snprintf(tmp2,strlen(tmp)+3,"%s\r\n",tmp);
+ fprintf(stderr,"attempting to write raw to %d: %s\n",fd,tmp);
+ //mywrite(fd,tmp2);
+ c_raw(fd,tailf[i].to,tmp2,tailf[i].user);
+ free(tmp2);
+ }
}
if(tailf[i].opt & TAILO_MSG) {//just msg the lines.
if(tailf[i].opt & TAILO_FORMAT && tailf[i].args) {
@@ -492,7 +524,7 @@ void extra_handler(int fd) {
void file_tail(int fd,char *from,char *file,char *args,int opt,struct user *user) {
int i,j;
int fdd;
-// char tmp[256];//?? this wasn't used for some reason
+ char tmp[512];
struct stat st;
if(*file == '#') {
from=file;
@@ -501,12 +533,12 @@ void file_tail(int fd,char *from,char *file,char *args,int opt,struct user *user
file++;
}
}
- if((fdd=open(file,O_RDWR|O_NONBLOCK,0)) == -1) {
+ if((fdd=open(file,O_RDONLY|O_NONBLOCK,0)) == -1) {//we only need RDWR if we're opening a named pipe
// if((fdd=open(file,O_RDONLY|O_NONBLOCK,0)) == -1) {
- fprintf(stderr,"file_tail failed for %s\n",file);
+// fprintf(stderr,"file_tail failed for %s\n",file);
// if((fdd=open(file,O_RDONLY,0)) == -1) {
-// snprintf(tmp,sizeof(tmp)-1,"file_tail: %s: (%s) fd:%d",strerror(errno),file,fdd);
-// privmsg(fd,"#cmd",tmp);
+ snprintf(tmp,sizeof(tmp)-1,"file_tail: %s: (%s) fd:%d",strerror(errno),file,fdd);
+ privmsg(fd,"#cmd",tmp);
return;
}
if(debug) {
@@ -514,7 +546,38 @@ void file_tail(int fd,char *from,char *file,char *args,int opt,struct user *user
// privmsg(fd,"#cmd",tmp);
}
fstat(fdd,&st); // <-- is this needed? yes. inode gets set later.
- if(opt & TAILO_ONCE) {
+ i=fdd;
+ if(i >= currentmaxtails) { currentmaxtails=i+1;}//not needed anymore?
+
+ switch(st.st_mode & S_IFMT) {
+ case S_IFIFO:
+ //fcntl(fdd,F_SETFL,O_RDWR);//this doesn't work.
+ close(fdd);
+ if((fdd=open(file,O_RDWR|O_NONBLOCK,0)) == -1) {
+ privmsg(fd,from,"failed to tail that file because I tried to reopen with RDWR because it is a named pipe. fix perms?");
+ return;
+ }
+ if(!(opt & TAILO_ONCE)) {
+ privmsg(fd,from,"warning: attempting to tail a named pipe without using the TAILO_ONCE option!");
+ }
+ tailf[i].fp=fdopen(fdd,"r+");
+ break;
+ case S_IFREG://we're good
+ //need to unset nonblock
+ close(fdd);
+ if((fdd=open(file,O_RDONLY,0)) == -1) {
+ privmsg(fd,from,"failed to tail that file because I tried to reopen with RDONLY because it is NOT a named pipe.");
+ return;
+ }
+ tailf[i].fp=fdopen(fdd,"r");
+ break;
+ default:// SOCK, LNK, REG, BLK, DIR, CHR, FIFO
+ snprintf(tmp,sizeof(tmp)-1,"warning: file_tail was told to open a file that isn't either regular or a named pipe... type: %d", st.st_mode & S_IFMT);
+ privmsg(fd,"#cmd",tmp);
+ break;
+ }
+
+ if(opt & TAILO_ONCE) {//this needs to be automatic for named pipes?
for(j=0;j<maxtails;j++) {//is this still a good loop?
if(tailf[j].fp && tailf[j].file && tailf[j].inode) {
if(tailf[j].inode == st.st_ino) {
@@ -525,13 +588,10 @@ void file_tail(int fd,char *from,char *file,char *args,int opt,struct user *user
//;just add another tail for it
}}}
}
- i=fdd;//hack hack hack. :P //I forgot I was using this. WHO CARES?!?
- if(i >= currentmaxtails) { currentmaxtails=i+1;}//not needed anymore?
- if(!(tailf[i].fp=fdopen(fdd,"r+"))) {
-// snprintf(tmp,sizeof(tmp),"file_tail: failed to fdopen(%s)\n",file);
-// privmsg(fd,from,tmp);
+ if(!(tailf[i].fp)) {//we only need r+ if we're using a named pipe
+ snprintf(tmp,sizeof(tmp),"file_tail: failed to fdopen(%s)\n",file);
+ privmsg(fd,from,tmp);
} else {
- fcntl(fdd,F_SETFL,O_RDWR);
if(!(opt & TAILO_BEGIN)) {
eofp(tailf[i].fp);
}
@@ -578,17 +638,112 @@ void file_tail(int fd,char *from,char *file,char *args,int opt,struct user *user
}
}
+void c_dlopen(int fd,char *from,char *line,...) {
+ int flags;
+ char tmp[512];
+ if(!line) {
+ privmsg(fd,from,"usage: !dlopen library [flags. defaults to RTLD_NOW]");
+ return;
+ }
+ char *sflags=strchr(line,' ');
+ if(sflags == 0) flags=RTLD_NOW;
+ else {
+ *sflags=0;
+ flags=atoi(sflags+1);
+ }
+ snprintf(tmp,sizeof(tmp)-1,"handle: %p",dlopen(line,flags));
+ privmsg(fd,from,tmp);
+}
+
+void c_dlclose(int fd,char *from,char *line,...) {
+ void *handle=(void *)atoi(line);
+ dlclose(handle);
+}
+
+void c_dlsym(int fd,char *from,char *line,...) {
+ char *symbol;
+ char tmp[512];
+ void *handle;
+ if(!line) {
+ privmsg(fd,from,"usage: !dlsym 0xhandle smybol_name");
+ return;
+ }
+ if((symbol=strchr(line,' ')) == 0) {
+ privmsg(fd,from,"dlsym needs at least two arguments. a handle from a previous dlopen, and a symbol you want the address of.");
+ return;
+ }
+ *symbol=0;
+ symbol++;
+ handle=(void *)atoi(line);
+ snprintf(tmp,sizeof(tmp)-1,"address of %s in %p: %p",symbol,handle,dlsym(handle,symbol));
+ privmsg(fd,from,tmp);
+}
+
+void c_leettail(int fd,char *from,char *file,struct user *user,...) {
+ int a;
+ int b;
+ int c;
+ int d;
+ int n;
+ if(!file) {
+ privmsg(fd,from,"!leettail NNfilename [format]");
+ privmsg(fd,from,"!leettail NNNfilename [format]");
+ privmsg(fd,from,"!leettail NN#channel:filename [format]");
+ privmsg(fd,from,"!leettail NNN#channel:filename [format]");
+ return;
+ }
+ if(file[0]) {
+ if(file[1]) {
+ if(file[2]) {
+ //
+ }else {
+ privmsg(fd,from,"usage1: !leettail NN filename");
+ privmsg(fd,from,"usage2: !leettail NNN filename");
+ return;
+ }}}
+ a=file[0]-'0';
+ b=file[1]-'0';
+ c=file[2]-'0';
+ if(c >= 0 && c <= 9) {
+ d=(a*100)+(b*10)+(c);
+ n=3;
+ } else {
+ d=(a*10)+(b);
+ n=2;
+ }
+ char *args;
+ if(file[0]==' ') file++;
+ if((args=strchr(file,' '))) {
+ *args=0;
+ args++;
+ }
+ file_tail(fd,from,file+n,args,d,user);
+}
+
+void prestartup_stuff(int fd) {
+ int fdd;
+ if((fdd=open("./scripts/prestartup",O_RDONLY))) {
+ close(fdd);
+ c_leettail(fd,"#cmd","22./scripts/prestartup",myuser);
+ }
+}
+
void c_addserver(int fd,char *from,char *line,...) {
int fdd;
+ if(!line) {
+ privmsg(fd,from,"wat");
+ return;
+ }
char *port=strchr(line,' ');
if(!port) port="6667";
else {*port=0;port++;}
- fprintf(stderr,"attempting to connect to %s:%s\n",line,port);
+ fprintf(stderr,"attempting to connect to '%s' on port '%s'\n",line,port);
fdd=serverConnect(line,port);
- fprintf(stderr,"connected! fd:%d\n",fdd);
if(fdd == -1) {
- return;//failed
+ fprintf(stderr,"failed to connect. fuck.\n");
+ return;
}
+ fprintf(stderr,"connected! fd:%d\n",fdd);
prestartup_stuff(fdd);
add_fd(fdd,irc_handler);
}
@@ -636,47 +791,6 @@ void c_mem(int fd,char *from,char *line,...) {
return;
}
-void c_leettail(int fd,char *from,char *file,struct user *user,...) {
- int a;
- int b;
- int c;
- int d;
- int n;
- if(!file) {
- privmsg(fd,from,"!leettail NNfilename [format]");
- privmsg(fd,from,"!leettail NNNfilename [format]");
- privmsg(fd,from,"!leettail NN#channel:filename [format]");
- privmsg(fd,from,"!leettail NNN#channel:filename [format]");
- return;
- }
- if(file[0]) {
- if(file[1]) {
- if(file[2]) {
- //
- }else {
- privmsg(fd,from,"usage1: !leettail NN filename");
- privmsg(fd,from,"usage2: !leettail NNN filename");
- return;
- }}}
- a=file[0]-'0';
- b=file[1]-'0';
- c=file[2]-'0';
- if(c >= 0 && c <= 9) {
- d=(a*100)+(b*10)+(c);
- n=3;
- } else {
- d=(a*10)+(b);
- n=2;
- }
- char *args;
- if(file[0]==' ') file++;
- if((args=strchr(file,' '))) {
- *args=0;
- args++;
- }
- file_tail(fd,from,file+n,args,d,user);
-}
-
//crashes on: !changetail filename
void c_changetail(int fd,char *from,char *line,struct user *user,...) {
struct stat st;
@@ -731,14 +845,6 @@ void c_changetail(int fd,char *from,char *line,struct user *user,...) {
privmsg(fd,from,tmp);
}
-void prestartup_stuff(int fd) {
- int fdd;
- if((fdd=open("./scripts/prestartup",O_RDONLY))) {
- close(fdd);
- c_leettail(fd,"#cmd","22./scripts/prestartup",myuser);
- }
-}
-
void debug_time(int fd,char *from,char *msg) {
char tmp[100];
if(debug) {
@@ -814,6 +920,24 @@ void c_amnesia(int fd,char *from,...) {//forget aliases
inittable(&alias,TSIZE);
}
+void c_rmalias_h(int fd,char *from,char *line,...) {
+ if(!ht_getnode(&alias,line)) {
+ privmsg(fd,from,"alias does not exist.");
+ return;
+ }
+ privmsg(fd,from,"alias deleted");
+ ht_delete(&alias,line);//deletes it out of the linked list.
+}
+
+void c_rmbuiltin_h(int fd,char *from,char *line,...) {
+ if(!ht_getnode(&builtin,line)) {
+ privmsg(fd,from,"builtin does not exist.");
+ return;
+ }
+ privmsg(fd,from,"builtin deleted");
+ ht_delete(&builtin,line);//deletes it out of the linked list.
+}
+
void c_lobotomy(int fd,char *from,...) {//forget builtins
ht_destroy(&builtin);
inittable(&builtin,TSIZE);
@@ -986,7 +1110,7 @@ char append_file(int fd,char *from,char *file,char *line,unsigned short nl) {
int fdd;
char tmp[512];
// char derp[2];
- FILE *fp;
+// FILE *fp;
// derp[0]=(char)nl;
// derp[1]=0;
if(line == 0) return mywrite(fd,"QUIT :line == 0 in append_file\r\n"),-1;
@@ -1001,7 +1125,7 @@ char append_file(int fd,char *from,char *file,char *line,unsigned short nl) {
privmsg(fd,"#cmd",tmp);
}
mywrite(fdd,line);
- mywrite(fdd,&nl);//kek
+ mywrite(fdd,(char *)&nl);//HACK. might want to fix this. opposite-endian will break.
// dprintf(fdd,"%s\n",line);
// fcntl(fdd,F_SETFL,O_WRONLY|O_APPEND|O_CREAT);
close(fdd);
@@ -1052,26 +1176,27 @@ void c_leetappend(int fd,char *from,char *msg,...) {
void c_tails(int fd,char *from,...) {
int i;
- int l;
+ //int l;
int at_least_one=0;
- char *tmp,*x;
+ char tmp[512];
+ char *x;
char derp[512];
snprintf(derp,sizeof(derp),"currentmaxtails: %d",currentmaxtails);
privmsg(fd,from,derp);
for(i=0;i<currentmaxtails;i++) {
if(tailf[i].fp) {
at_least_one=1;
- l=(strlen(tailf[i].file) + strlen(tailf[i].to) + 50);//??? hack. fix it.
- tmp=malloc(l);
- if(!tmp) {
- mywrite(fd,"QUIT :malloc error 8\r\n");
- return;
- }
+// l=(strlen(tailf[i].file) + strlen(tailf[i].to) + 50);//??? hack. fix it.
+// tmp=malloc(l);
+ //if(!tmp) {
+ // mywrite(fd,"QUIT :malloc error 8\r\n");
+ // return;
+ //}
x=tailmode_to_txt(tailf[i].opt);
- snprintf(tmp,l,"%d->%d %s [i:%d] @ %ld (%d) --[%s(%03u)]--> %s",fileno(tailf[i].fp),tailf[i].srcfd,tailf[i].file,tailf[i].inode,ftell(tailf[i].fp),tailf[i].lines,x,tailf[i].opt,tailf[i].to);
+ snprintf(tmp,sizeof(tmp)-1,"%d->%d %s [i:%d] @ %ld (%d) --[%s(%03u)]--> %s format: %s",fileno(tailf[i].fp),tailf[i].srcfd,tailf[i].file,tailf[i].inode,ftell(tailf[i].fp),tailf[i].lines,x,tailf[i].opt,tailf[i].to,tailf[i].args);
free(x);
privmsg(fd,from,tmp);
- free(tmp);
+ //free(tmp);
}
}
if(!at_least_one) {
@@ -1192,12 +1317,33 @@ void c_resetout(int fd,char *from,...) {
privmsg(fd,from,"output reset");
}
-void c_raw(int fd,char *from,char *msg,...) {
+void c_raw(int fd,char *from,char *msg,struct user *user) {
+ char tmp[512];
char *tmp2;
if(!msg) {
privmsg(fd,from,"usage: !raw stuff-to-send-to-server");
return;
}
+ if(!strncasecmp(msg,"KICK",4)) {
+ if(!strcmp(user->nick,myuser->nick)) {//if segfault is doing the kicking
+
+ } else {
+ snprintf(tmp,sizeof(tmp)-1,"KICK %s %s\r\nNICK dodged\r\n",from,user->nick);
+ mywrite(fd,tmp);
+ message_handler(fd,from,user,"lambda !raw nick %$segnick=%r",0);
+ return;
+ }
+ }
+ if(!strncasecmp(msg,"KILL",4)) {
+ if(!strcmp(user->nick,myuser->nick)) {//this is if SegFault is doing the killing.
+
+ } else {
+ snprintf(tmp,sizeof(tmp)-1,"KILL %s :fuck you I won't do what you tell me.\r\nNICK dodged\r\n",user->nick);
+ mywrite(fd,tmp);
+ message_handler(fd,from,user,"lambda !raw nick %$segnick=%r",0);
+ return;
+ }
+ }
tmp2=malloc(strlen(msg)+4);
snprintf(tmp2,strlen(msg)+3,"%s\r\n",msg);
mywrite(fd,tmp2);
@@ -1232,7 +1378,8 @@ int message_handler(int fd,char *from,struct user *user,char *msg,int redones) {
char to_me;
int len;
// int sz;
- printf("message_handler: entry: message: '%s' redones: %d\n",msg,redones);
+ if(*msg == ' ' || *msg == 0) return 1;//
+ printf("message_handler: fd: %d redones: %d msg: '%s'\n",fd,redones,msg);
if(redones && message_handler_trace) {
snprintf(tmp,sizeof(tmp)-1,"trace: n: %s u: %s h: %s message '%s' redones: '%d'",user->nick,user->user,user->host,msg,redones);
privmsg(fd,from,tmp);
@@ -1455,6 +1602,7 @@ void sigpipe_handler(int sig) {
}
int main(int argc,char *argv[]) {
+ format_helptext[0]=0;
idc.shitlen=0;
int i;
for(i=0;i<100;i++) {//fuckme
@@ -1472,6 +1620,7 @@ int main(int argc,char *argv[]) {
#define CMDCHR "!"
#define BUILDIN(a,b) ht_setkey(&builtin,CMDCHR a,(void *)((union hack){(void (*)(int,...))b}.data))
BUILDIN("builtin",c_builtin);
+ BUILDIN("rmbuiltin",c_rmbuiltin_h);
BUILDIN("builtins",c_builtins);
BUILDIN("raw",c_raw);
BUILDIN("leetsetout",c_leetsetout);
@@ -1492,10 +1641,14 @@ int main(int argc,char *argv[]) {
BUILDIN("id",c_id);
BUILDIN("kill",c_kill);
BUILDIN("alias",c_alias_h);
+ BUILDIN("rmalias",c_rmalias_h);
BUILDIN("aliases",c_aliases_h);
BUILDIN("lobotomy",c_lobotomy);
BUILDIN("amnesia",c_amnesia);
-// BUILDIN("addserver",c_addserver);
+ BUILDIN("dlopen",c_dlopen);
+ BUILDIN("dlsym",c_dlsym);
+ BUILDIN("dlclose",c_dlclose);
+ BUILDIN("addserver",c_addserver);
// BUILDIN("peek",c_mem);
// BUILDIN("poke",c_mem);
mode_magic=1;
@@ -1544,15 +1697,15 @@ int main(int argc,char *argv[]) {
getenv("segport")?getenv("segport"):PORT);
// myuser->nick,
// "segfault segfault segfault :segfault");
- fds[1]=serverConnect("127.0.0.1","6667");
- fds[2]=-1;
printf("cd %s\n",pwd->pw_dir);
chdir(getenv("seghome")?getenv("seghome"):pwd->pw_dir);
getcwd(seghome,SEGHOMELEN);
+// fds[1]=serverConnect("127.0.0.1","6665");//bitlbee. fuck this for now.
+ fds[1]=-1;
if(fds[0] == -1) return fprintf(stderr,"fds[0] == -1\n"),1;
- if(fds[1] == -1) return fprintf(stderr,"fds[1] == -1\n"),2;
+ //if(fds[1] == -1) return fprintf(stderr,"fds[1] == -1\n"),1;
prestartup_stuff(fds[0]);
- prestartup_stuff(fds[1]);
+ //prestartup_stuff(fds[1]);
printf("server fd: %d\n",fds[0]);
return runem(fds,line_handler,0);
}