X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/313708a920160155c9b9fa15e3337fbe2457ee58..b166b11b8612a2428d7b86bd3dd27207a3f60dab:/Connector.cpp?ds=inline diff --git a/Connector.cpp b/Connector.cpp deleted file mode 100644 index 9d49a05..0000000 --- a/Connector.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/* 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. -*/ -/* }}} */ - -#include - -#include "cycript.hpp" -#include "Pooling.hpp" - -#include -#include -#include -#include - -#include - -#include -#include - -#import - -void CYThrow(const char *format, ...) { - CYPool pool; - - va_list args; - va_start (args, format); - const char *message(apr_pvsprintf(pool, format, args)); - va_end (args); - - fprintf(stderr, "%s\n", message); - throw std::string(message); -} - -struct CYServer : - CYData -{ - int socket_; -}; - -apr_status_t CYPoolDLClose_(void *data) { - // XXX: this is an interesting idea - /* void *handle(reinterpret_cast(data)); - dlclose(handle); */ - return APR_SUCCESS; -} - -static void * APR_THREAD_FUNC Cyrver(apr_thread_t *thread, void *data) { - CYServer *server(reinterpret_cast(data)); - - for (;;) { - int socket(_syscall(accept(server->socket_, NULL, NULL))); - - if (void *handle = dlopen("/usr/lib/libcycript.dylib", RTLD_LAZY | RTLD_LOCAL)) { - apr_pool_t *pool; - _aprcall(apr_pool_create(&pool, NULL)); - - apr_pool_cleanup_register(pool, handle, &CYPoolDLClose_, &apr_pool_cleanup_null); - - if (void (*CYHandleClient_)(apr_pool_t *, int) = reinterpret_cast(dlsym(handle, "CYHandleClient"))) - (*CYHandleClient_)(pool, socket); - else - apr_pool_destroy(pool); - } else - CFLog(kCFLogLevelError, CFSTR("CY:Error: cannot load: %s"), dlerror()); - } - - delete server; - return NULL; -} - -static void Unlink() { - pid_t pid(getpid()); - char path[104]; - sprintf(path, "/tmp/.s.cy.%u", pid); - unlink(path); -} - -MSInitialize { - CFLog(kCFLogLevelError, CFSTR("CY:Notice: library loaded")); - - _aprcall(apr_initialize()); - - CYServer *server(new CYServer()); - server->socket_ = _syscall(socket(PF_UNIX, SOCK_STREAM, 0)); - - struct sockaddr_un address; - memset(&address, 0, sizeof(address)); - address.sun_family = AF_UNIX; - - pid_t pid(getpid()); - sprintf(address.sun_path, "/tmp/.s.cy.%u", pid); - - try { - _syscall(bind(server->socket_, reinterpret_cast(&address), SUN_LEN(&address))); - atexit(&Unlink); - _syscall(listen(server->socket_, 0)); - - apr_threadattr_t *attr; - _aprcall(apr_threadattr_create(&attr, server->pool_)); - - apr_thread_t *thread; - _aprcall(apr_thread_create(&thread, attr, &Cyrver, server, server->pool_)); - } catch (...) { - CFLog(kCFLogLevelError, CFSTR("CY:Error: cannot bind unix domain socket")); - } -}