From 4e10c813f57981265534133a6d857fd66c6edccc Mon Sep 17 00:00:00 2001 From: Christoph Egger Date: Tue, 26 May 2015 15:48:21 +0200 Subject: [PATCH] Make signals from geiser work Move geiser to a proper QThread instead of a guile-only thread. This way it can properly send/receive signals. Also for some obscure reason the QVector hack is needed for things to work Closes T24 --- src/bindings/Guile.cxx | 26 ++++++++++++++++++-------- src/bindings/Guile.hxx | 12 ++++++++++++ src/main.cxx | 3 +++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/bindings/Guile.cxx b/src/bindings/Guile.cxx index 863c9cc..18d12e9 100644 --- a/src/bindings/Guile.cxx +++ b/src/bindings/Guile.cxx @@ -12,16 +12,12 @@ namespace { GuileInterpreter::GuileInterpreter() : logger(log4cxx::Logger::getLogger("bindings.Guile")) { - QString socketpath = Settings::get()->getRuntimeDirectory()->canonicalPath() - + "/frida." + QString::number(QCoreApplication::applicationPid(), 16) + ".geiser.sock"; - scm_init_guile(); - - SCM scm_socketpath = scm_from_locale_string(socketpath.toStdString().c_str()); scm_c_use_module("system repl server"); - SCM socket = scm_call_2(scm_c_public_ref("system repl server", "make-unix-domain-server-socket"), - scm_from_locale_keyword("path"), scm_socketpath); - scm_call_1(scm_c_public_ref("system repl server", "spawn-server"), socket); + + guile::Geiser* geiser = new guile::Geiser(this); + geiser->start(); + scm_c_load_extension("libguile-frida-binding", "scm_init_frida_module"); @@ -79,3 +75,17 @@ int GuileInterpreter::loadFile(const std::string& filename, LOG4CXX_DEBUG(logger, "Finished file \"" << filename << "\""); return 0; } + +namespace guile { + void Geiser::run() { + scm_init_guile(); + + QString socketpath = Settings::get()->getRuntimeDirectory()->canonicalPath() + + "/frida." + QString::number(QCoreApplication::applicationPid(), 16) + ".geiser.sock"; + + SCM scm_socketpath = scm_from_locale_string(socketpath.toStdString().c_str()); + SCM socket = scm_call_2(scm_c_public_ref("system repl server", "make-unix-domain-server-socket"), + scm_from_locale_keyword("path"), scm_socketpath); + scm_call_1(scm_c_public_ref("system repl server", "run-server"), socket); + } +} diff --git a/src/bindings/Guile.hxx b/src/bindings/Guile.hxx index 612f33b..244bb1c 100644 --- a/src/bindings/Guile.hxx +++ b/src/bindings/Guile.hxx @@ -4,6 +4,7 @@ #include #include +#include "qt.hxx" #include "Interpreter.hxx" class GuileInterpreter : public QObject, public Interpreter { @@ -36,4 +37,15 @@ private: log4cxx::LoggerPtr logger; }; +namespace guile { + class Geiser : public QThread { + Q_OBJECT + public: + Geiser(QObject* parent) : QThread(parent) {} + private: + void run() Q_DECL_OVERRIDE; + }; +} + + #endif /* INCLUDE__Guile_hxx_ */ diff --git a/src/main.cxx b/src/main.cxx index ccb2c52..b4b4ba8 100644 --- a/src/main.cxx +++ b/src/main.cxx @@ -11,6 +11,8 @@ #include #endif #include +#include +#include #include "log4cxx/logger.h" #include "log4cxx/basicconfigurator.h" @@ -35,6 +37,7 @@ int main(int argc, char** argv) QApplication::setApplicationName("frida"); QApplication::setApplicationVersion("0.0"); QApplication::addLibraryPath(CONFIG_LIBDIR "/frida/plugins/Interpreter"); + qRegisterMetaType >("QVector"); #ifdef ARGPARSE parser.addHelpOption(); parser.addVersionOption(); -- 2.39.5