From ae4d758aead1517600cb83ecf67406afc45b5f50 Mon Sep 17 00:00:00 2001 From: Aaron Blakely Date: Fri, 27 Mar 2015 10:44:40 -0500 Subject: [PATCH] Started on module interface. Currently producing segfaults. --- Makefile | 5 ++-- exported.txt | 8 +++++++ lib/irc.h | 1 + lib/module.h | 8 +++++++ mods/test.so | Bin 0 -> 8204 bytes mods/test/Makefile | 4 ++++ mods/test/build.sh | 0 mods/test/test.c | 26 +++++++++++++++++++++ mods/test/test.o | Bin 0 -> 2336 bytes mods/test/test.so | Bin 0 -> 8248 bytes src/events.c | 10 +++++++- src/irc.c | 14 ++++++++++- src/main.c | 2 -- src/module.c | 57 +++++++++++++++++++++++++++++++++++++++++++++ src/util.c | 2 -- 15 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 exported.txt create mode 100755 mods/test.so create mode 100644 mods/test/Makefile create mode 100755 mods/test/build.sh create mode 100644 mods/test/test.c create mode 100644 mods/test/test.o create mode 100755 mods/test/test.so diff --git a/Makefile b/Makefile index 667beeb..bdf71a5 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ CC=gcc -CFLAGS=-g -std=gnu99 -c -lconfig -I./lib -BINFLAGS=-g -lconfig +CFLAGS=-g -std=gnu99 -c -lconfig -ldl -I./lib +BINFLAGS=-g -rdynamic -ldl -lconfig SRC=./src OBJ=./build OBJECTS=$(OBJ)/*.o @@ -13,6 +13,7 @@ main: $(CC) $(CFLAGS) $(SRC)/irc.c -o $(OBJ)/irc.o $(CC) $(CFLAGS) $(SRC)/util.c -o $(OBJ)/util.o $(CC) $(CFLAGS) $(SRC)/events.c -o $(OBJ)/events.o + $(CC) $(CFLAGS) $(SRC)/module.c -o $(OBJ)/module.o $(CC) -o $(EXEC) $(OBJECTS) $(BINFLAGS) @echo "All Done!" diff --git a/exported.txt b/exported.txt new file mode 100644 index 0000000..f1d161f --- /dev/null +++ b/exported.txt @@ -0,0 +1,8 @@ +{ + extern "C" + { + add_handler; + irc_privmsg; + irc_notice; + }; +} diff --git a/lib/irc.h b/lib/irc.h index 13876c5..28f2d36 100644 --- a/lib/irc.h +++ b/lib/irc.h @@ -28,6 +28,7 @@ struct irc_conn void irc_connect(struct irc_conn *bot); void irc_auth(struct irc_conn *bot); void irc_notice(struct irc_conn *bot, char *to, char *fmt, ...); +void irc_privmsg(struct irc_conn *bot, char *to, char *fmt, ...); void irc_raw(struct irc_conn *bot, char *fmt, ...); void irc_parse_raw(struct irc_conn *bot, char *raw); diff --git a/lib/module.h b/lib/module.h index e69de29..3b130c0 100644 --- a/lib/module.h +++ b/lib/module.h @@ -0,0 +1,8 @@ +#ifndef MODULE_H +#define MODULE_H + +#include "irc.h" + +void load_module(struct irc_conn *bot, char *where, int stype, char *file); + +#endif \ No newline at end of file diff --git a/mods/test.so b/mods/test.so new file mode 100755 index 0000000000000000000000000000000000000000..75064ab19ca90cf3933ec94d87736977ab41b31b GIT binary patch literal 8204 zcmeHMTWlOx89wWcW9Mc&x7JMz9)%dCrCrzVPcDqau|Ijh254ngl2Yh0q!#3#!Qq(`_|2-l-_t5leQuveT6v(^1tFruDWPu?&>1 zn@aAbTa_MD(xr0bwiToL+scubvOZI``vUA#7fL@L^~ZT0Rq?9z%bd!esbXc@HXw)} z*SPGMRt_mg=x(%mIYT3MqS#3Yj5bS z_kQ`#rLWCCd%Wf66Zab4{r%q?zTJMQ@xyD+#vra*{9=V@_B47B+UqJtKi3~ z;M5Kcm$&o)s1&yixaL&`|9M=M^uG+8`ovov0ioI2s>HnpQm5or;)d+!Tp;DwP$(dCL^(2&z$G4(E~?YfzY0 zE}9+|$z0R`awcsKiNRbvF4EbU0q2%TB?qDbGaJ|`jCd?!MG$VlH0=}sWnyAqc>msR zV|!qGphM;74g@fhVdC9&hwh!<5mgQ~x|yO_V(s7Vc)u4|Ppky{Sj zIhAJ}IQt^~IS0Oq04^#n4M%wkL%rUC(^}-xC~@zmt`Dal_Vo|-y8Dft(Or=gf1mHfAe zrzX!2gQq<8@!DE|`uS*KrkKvKL) zUM4>FsX9%BC)!#-;I9Lc@T2eOum01okKOU`-c{Q08dO)J z3VH7KOzj8o>^sr*m6JCH8(YsIMbh6ryBzWQk$|-c>QU%WrVS_ciQT`3s5D3Yc=E>N zBF7htI39i~Wb!TDb6∈Q|Zk&(9*?1w#U>U zPS!$sY@uX5g7Fvw)7T3BPCdqS9K*0s%HN~GJwbgX=VvRWLbEcF6p5tPW(q5p92$z} zcA>sf_%{2W))1H`TOTt0Ea*!xiGe0C>NG-h&!pme?x^sMH2F5KuB)F!XKw}8f~yI3 zlcdnl)Z5T}pmEh#>qo_&O;10zW9t@zNvDS{_>~RpYG``CrhCounxDXvEvI;ILoWAT zmOmrKkUS_4df-71Jm`V{&mN##E)~ws<`#Lz>4r~*p2eup`vet!A6R3v<>%Ia+%IJb zx~mNN*=9jK6wwWzN;};-Q23eUip}Cl*DlS9^0QP?J&!3fF|Fjh&(nhgm4|I2j;p|o z&n>eB*t%sIQIwyhI3Bihng6uXN54p(`{AzQFDv4k~&^ z(dQL?QPJ-y`ZGoOd3s-W_bzQ)|3E%tg zWB}C4*)+kmOxB7AhBEoUKt7p@J&}wF$t5CYLIh%GGqAL&m9r&h;yE*!&A1o?vRphB zAp=z#PFW%#-$4Rad<1p*wiC!@r~D~4=dWN9LxtN$*c>qq%KHPyXM1jc2D(mr-fx&rlQR^u zr#;SVPyQ({wcN`4DetQs2P(3t^q3VUYEJuh<%p?#wk>NfzDGAHjJ{_$?WdJJ(*+Vb z3fnPs4i%?8f45-Tz>11`^M66v^Z3oE4q{5*VVuR2j<^INVQgRR`yKo6#-H-opXZ)bD4=Q_aJTLz% z*wc`6{(K+d@2{h(!@1wsp7WaV#OLoWHya^9(d7T)AKNqi4MfiT`Tky1_Qw}ZWsU8a z{=s9<_p6{vkoDM&m;Vz4gq7Q`zL)6Ap4(Z?{?8Cl{_U)wDBC~g!Buxk8xpO>#j%~L zITg6*1W{*uhKc97&lu5DYU8-Bo`2{*^EfVUKkq9v%`3%k{x}3E?|TAzSX-&ezaQE1 z{llr^N5*`Aa^wE;^Pn4FCis5h#%l%NC*1gQ!TY}(uPg8GZoIzyoan}ve(xr^A3Hhk zuWtQS<#QD`zVv&p?PrbPea@}lP(F`v<5(2DKRE<`d>!R|#{nbHwb(~ACnW2Bd`aeg z!YTBN^*DE_q`yJ%x_0Yt6ue&D_(Ou%p&Nf#c)y#I+%I@GE^6EJdTD>sdRd0=?~9st zjlR?PD)a-bKVOA@=#==f6Pq)4b52Q6 z#FviaUnGw650CyGg?r}%9X(b$cUfNrZv$TGeC2VezjPgKui~dy;!DpQ6#2#` zqgZj%lDW$4%9>`@NJKKR6b`p~zI3ST;Qnr5>+Z8qr_x2tO^%;F#d&40^9$f{4 z&I2hr^Kv76j3wVD?Nczff_+$4J^-^%$lNNPb2$4<&7(p`W3IEZ3g>d_6wYnwJd1Om L?YZ^r^SS>3;){6W literal 0 HcmV?d00001 diff --git a/mods/test/Makefile b/mods/test/Makefile new file mode 100644 index 0000000..c83dea2 --- /dev/null +++ b/mods/test/Makefile @@ -0,0 +1,4 @@ +gcc -c -fPIC -I../../lib test.c -o test.o +gcc test.o -shared test.so +mv test.so .. +rm test.o \ No newline at end of file diff --git a/mods/test/build.sh b/mods/test/build.sh new file mode 100755 index 0000000..e69de29 diff --git a/mods/test/test.c b/mods/test/test.c new file mode 100644 index 0000000..1184ad1 --- /dev/null +++ b/mods/test/test.c @@ -0,0 +1,26 @@ +#include "irc.h" +#include "events.h" +#include +#include + +void hello(struct irc_conn *bot, char *user, char *chan, char *text) +{ + printf("hi\n"); + + char *buf = (char *)malloc(sizeof(char *) * 500); + sprintf(buf, "hi %s", bot->nick); + + printf("trigger: %s\n", buf); + + if (!strcmp(text, buf)) + { + irc_privmsg(bot, chan, "hi %s", user); + } + + free(buf); +} + +void mod_init(struct irc_conn *b, char *where) +{ + add_handler(PRIVMSG_CHAN, hello); +} \ No newline at end of file diff --git a/mods/test/test.o b/mods/test/test.o new file mode 100644 index 0000000000000000000000000000000000000000..8e109a71efe5cc513a9fb6e7c48442996aae3b9f GIT binary patch literal 2336 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 literal 0 HcmV?d00001 diff --git a/src/events.c b/src/events.c index d6c268c..2547201 100644 --- a/src/events.c +++ b/src/events.c @@ -1,6 +1,7 @@ #include "irc.h" #include "util.h" #include "events.h" +#include "module.h" #include #include #include @@ -29,6 +30,7 @@ void init_events() void add_handler(int type, void *handler) { + printf("Installing handler @ %p [type: %i]\n", handler, type); int handler_count; if (type == PRIVMSG_SELF) @@ -63,10 +65,12 @@ void handle_chan_privmsg(struct irc_conn *bot, char *user, char *chan, char *tex void handle_self_privmsg(struct irc_conn *bot, char *user, char *text) { void (*handler)(); - char *cmd, *arg; + char *cmd, *arg, *modpath; cmd = text; arg = skip(cmd, ' '); + modpath = (char *)malloc(sizeof(char)*500); + for (int i = 0; i < privmsg_self.count; i++) { handler = privmsg_self.handlers[i]; @@ -90,12 +94,16 @@ void handle_self_privmsg(struct irc_conn *bot, char *user, char *text) if (strcmp(bot->admin, user)) { irc_notice(bot, user, "Loading module: mods/%s.so", arg); + sprintf(modpath, "./mods/%s.so", arg); + load_module(bot, user, PRIVMSG_SELF, modpath); } else { irc_notice(bot, user, "You are unauthorized to use this command."); } } + + free(modpath); } void handle_join(struct irc_conn *bot, char *user, char *chan) diff --git a/src/irc.c b/src/irc.c index 766948e..8a6cfa9 100644 --- a/src/irc.c +++ b/src/irc.c @@ -75,6 +75,18 @@ void irc_notice(struct irc_conn *bot, char *to, char *fmt, ...) irc_raw(bot, "NOTICE %s :%s", to, msg_); } +void irc_privmsg(struct irc_conn *bot, char *to, char *fmt, ...) +{ + char msg_[4096]; + va_list ap; + + va_start(ap, fmt); + vsnprintf(msg_, sizeof msg_, fmt, ap); + va_end(ap); + + irc_raw(bot, "PRIVMSG %s :%s", to, msg_); +} + void irc_raw(struct irc_conn *bot, char *fmt, ...) { va_list ap; @@ -122,7 +134,7 @@ void irc_parse_raw(struct irc_conn *bot, char *raw) if (!strcmp("PRIVMSG", raw)) { - if (strcmp(user, bot->nick)) + if (!strcmp(par, bot->nick)) { handle_self_privmsg(bot, user, text); } diff --git a/src/main.c b/src/main.c index 77aa9c2..c1a73c6 100644 --- a/src/main.c +++ b/src/main.c @@ -64,8 +64,6 @@ int main() // Free the config before entering the main loop config_destroy(cf); - add_handler(PRIVMSG_SELF, hello_cmd); - add_handler(PRIVMSG_SELF, hello_cmd); for (;;) { diff --git a/src/module.c b/src/module.c index e69de29..99dd6e2 100644 --- a/src/module.c +++ b/src/module.c @@ -0,0 +1,57 @@ +#include "irc.h" +#include "util.h" +#include "events.h" +#include +#include +#include + +void load_module(struct irc_conn *bot, char *where, int stype, char *file) +{ + void *handle; + void (*mod_init)(struct irc_conn *bot, char *where, void (*ah)()); + char *error = (char *)malloc(sizeof(char *)*1024); + + + handle = dlopen(file, RTLD_NOW | RTLD_GLOBAL); + if (!handle) + { + sprintf(error, "Error: %s", dlerror()); + + if (stype == PRIVMSG_CHAN) + { + irc_privmsg(bot, where, error); + } + else + { + irc_notice(bot, where, error); + } + + return; + } + + dlerror(); + + *(void **)(&mod_init) = dlsym(handle, "mod_init"); + + if ((error = dlerror()) != NULL) + { + //sprintf(error, "Error: %s", error); + eprint("Error: %s\n", error); + if (stype == PRIVMSG_CHAN) + { + irc_privmsg(bot, where, error); + } + else + { + irc_notice(bot, where, error); + } + } + + (*mod_init)(bot, where); + + dlclose(handle); + + irc_privmsg(bot, where, "Module '%s' loaded.", file); + + free(error); +} \ No newline at end of file diff --git a/src/util.c b/src/util.c index 08e9249..a4a997b 100644 --- a/src/util.c +++ b/src/util.c @@ -25,8 +25,6 @@ void eprint(char *fmt, ...) { fprintf(stderr, "%s\n", strerror(errno)); } - - exit(1); } void strlcpy(char *to, const char *from, int len)