X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b09da87b6557610325d46e3294ea0b6aba69ebf0..bce8339b629582dd04df0570468ac746adc0fcf7:/Application.mm diff --git a/Application.mm b/Application.mm index aaf1d5e..1455012 100644 --- a/Application.mm +++ b/Application.mm @@ -1,3 +1,42 @@ +/* Cycript - Remove Execution Server and Disassembler + * Copyright (C) 2009 Jay Freeman (saurik) +*/ + +/* Modified BSD License {{{ */ +/* + * Redistribution and use in source and binary + * forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the + * above copyright notice, this list of conditions + * and the following disclaimer. + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions + * and the following disclaimer in the documentation + * and/or other materials provided with the + * distribution. + * 3. The name of the author may not be used to endorse + * or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* }}} */ + #define _GNU_SOURCE #include @@ -22,45 +61,47 @@ #include "Cycript.tab.hh" +#include +#include +#include +#include + static jmp_buf ctrlc_; -void sigint(int) { +static void sigint(int) { longjmp(ctrlc_, 1); } -void Run(const char *code, FILE *fout) { _pooled - JSStringRef script(JSStringCreateWithUTF8CString(code)); - - JSContextRef context(CYGetJSContext()); - - JSValueRef exception(NULL); - JSValueRef result(JSEvaluateScript(context, script, NULL, NULL, 0, &exception)); - JSStringRelease(script); - - if (exception != NULL) - result = exception; - - if (!JSValueIsUndefined(context, result)) { - CFStringRef json; +void Run(int socket, std::string &code, FILE *fout) { + CYPool pool; - @try { json: - json = CYCopyJSONString(context, result); - } @catch (id error) { - CYThrow(context, error, &result); - goto json; - } - - if (fout != NULL) { - fputs([reinterpret_cast(json) UTF8String], fout); - fputs("\n", fout); - fflush(fout); + const char *json; + if (socket == -1) + json = CYExecute(pool, code.c_str()); + else { + const char *data(code.c_str()); + size_t size(code.size()); + CYSendAll(socket, &size, sizeof(size)); + CYSendAll(socket, data, size); + CYRecvAll(socket, &size, sizeof(size)); + if (size == _not(size_t)) + json = NULL; + else { + char *temp(new(pool) char[size + 1]); + CYRecvAll(socket, temp, size); + temp[size] = '\0'; + json = temp; } + } - CFRelease(json); + if (json != NULL && fout != NULL) { + fputs(json, fout); + fputs("\n", fout); + fflush(fout); } } -void Console() { +static void Console(int socket) { bool bypass(false); bool debug(false); @@ -145,9 +186,13 @@ void Console() { if (driver.source_ == NULL) goto restart; - std::ostringstream str; - driver.source_->Show(str); - code = str.str(); + if (socket != -1) + code = command; + else { + std::ostringstream str; + driver.source_->Show(str); + code = str.str(); + } } add_history(command.c_str()); @@ -155,14 +200,14 @@ void Console() { if (debug) std::cout << code << std::endl; - Run(code.c_str(), fout); + Run(socket, code, fout); } fputs("\n", fout); fflush(fout); } -void *Map(const char *path, size_t *psize) { +static void *Map(const char *path, size_t *psize) { int fd; _syscall(fd = open(path, O_RDONLY)); @@ -179,18 +224,61 @@ void *Map(const char *path, size_t *psize) { return base; } -int main(int argc, const char *argv[]) { +int main(int argc, char *argv[]) { + pid_t pid(_not(pid_t)); + + for (;;) switch (getopt(argc, argv, "p:")) { + case -1: + goto getopt; + case '?': + fprintf(stderr, "usage: cycript [-p ] [