X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/c3700deebdbd94f6c9f336b90bb441e858a016a7..7e551bb166cb5e24d52a32938335cd18f9efb217:/Inject.cpp diff --git a/Inject.cpp b/Inject.cpp index eb85351..a451b3d 100644 --- a/Inject.cpp +++ b/Inject.cpp @@ -1,5 +1,5 @@ -/* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2015 Jay Freeman (saurik) +/* Cycript - The Truly Universal Scripting Language + * Copyright (C) 2009-2016 Jay Freeman (saurik) */ /* GNU Affero General Public License, Version 3 {{{ */ @@ -55,7 +55,7 @@ Type_ *shift(Type_ *data, size_t size) { return reinterpret_cast(reinterpret_cast(data) + size); } -void InjectLibrary(int pid, int argc, const char *argv[]) { +void InjectLibrary(int pid, std::ostream &stream, int argc, const char *const argv[]) { auto cynject(LibraryFor(reinterpret_cast(&main))); auto slash(cynject.rfind('/')); _assert(slash != std::string::npos); @@ -113,8 +113,32 @@ void InjectLibrary(int pid, int argc, const char *argv[]) { std::ostringstream inject; inject << cynject << " " << std::dec << pid << " " << library; - for (decltype(argc) i(0); i != argc; ++i) - inject << " " << argv[i]; + for (decltype(argc) i(0); i != argc; ++i) { + inject << " '"; + for (const char *arg(argv[i]); *arg != '\0'; ++arg) + if (*arg != '\'') + inject.put(*arg); + else + inject << "'\\''"; + inject << "'"; + } + + FILE *process(popen(inject.str().c_str(), "r")); + _assert(process != NULL); + + for (;;) { + char data[1024]; + auto writ(fread(data, 1, sizeof(data), process)); + stream.write(data, writ); + + if (writ == sizeof(data)) + continue; + _assert(!ferror(process)); + if (feof(process)) + break; + } - _assert(system(inject.str().c_str()) == 0); + auto status(pclose(process)); // XXX: _scope (sort of?) + _assert(status != -1); + _assert(status == 0); }