--- /dev/null
+#include <substrate.h>
+
+#include "cycript.hpp"
+#include "Pooling.hpp"
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <sys/un.h>
+
+#include <apr-1/apr_thread_proc.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#import <CoreFoundation/CFLogUtilities.h>
+
+struct CYServer :
+ CYData
+{
+ int socket_;
+};
+
+apr_status_t CYPoolDLClose_(void *data) {
+ void *handle(reinterpret_cast<void *>(data));
+ dlclose(handle);
+ return APR_SUCCESS;
+}
+
+static void * APR_THREAD_FUNC Cyrver(apr_thread_t *thread, void *data) {
+ CYServer *server(reinterpret_cast<CYServer *>(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<void (*)(apr_pool_t *, int)>(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 {
+ _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<sockaddr *>(&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"));
+ }
+}
#include "Pooling.hpp"
#include "Struct.hpp"
-#include <unistd.h>
-
#include <CoreFoundation/CoreFoundation.h>
#include <CoreFoundation/CFLogUtilities.h>
#include <WebKit/WebScriptObject.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <sys/un.h>
-
#include <sys/mman.h>
#include <iostream>
#include "Parser.hpp"
#include "Cycript.tab.hh"
-#include <fcntl.h>
-
#include <apr-1/apr_thread_proc.h>
#undef _assert
static NSArray *Bridge_;
-struct CYData {
- apr_pool_t *pool_;
-
- virtual ~CYData() {
- }
-
- static void *operator new(size_t size, apr_pool_t *pool) {
- void *data(apr_palloc(pool, size));
- reinterpret_cast<CYData *>(data)->pool_ = pool;
- return data;
- }
-
- static void *operator new(size_t size) {
- apr_pool_t *pool;
- apr_pool_create(&pool, NULL);
- return operator new(size, pool);
- }
-
- static void operator delete(void *data) {
- apr_pool_destroy(reinterpret_cast<CYData *>(data)->pool_);
- }
-
- static void Finalize(JSObjectRef object) {
- delete reinterpret_cast<CYData *>(JSObjectGetPrivate(object));
- }
-};
+static void Finalize(JSObjectRef object) {
+ delete reinterpret_cast<CYData *>(JSObjectGetPrivate(object));
+}
class Type_privateData;
return true;
}
-static int Socket_;
apr_pool_t *Pool_;
struct CYExecute_ {
return NULL;
}
-static void * APR_THREAD_FUNC Cyrver(apr_thread_t *thread, void *data) {
- for (;;) {
- int socket(_syscall(accept(Socket_, NULL, NULL)));
- CYClient *client(new CYClient(socket));
- apr_threadattr_t *attr;
- _aprcall(apr_threadattr_create(&attr, Pool_));
- _aprcall(apr_thread_create(&client->thread_, attr, &OnClient, client, client->pool_));
- }
-
- return NULL;
-}
-
-void Unlink() {
- pid_t pid(getpid());
- char path[104];
- sprintf(path, "/tmp/.s.cy.%u", pid);
- unlink(path);
+extern "C" void CYHandleClient(apr_pool_t *pool, int socket) {
+ CYClient *client(new(pool) CYClient(socket));
+ apr_threadattr_t *attr;
+ _aprcall(apr_threadattr_create(&attr, client->pool_));
+ _aprcall(apr_thread_create(&client->thread_, attr, &OnClient, client, client->pool_));
}
MSInitialize { _pooled
NSMessageBuilder_ = objc_getClass("NSMessageBuilder");
NSZombie_ = objc_getClass("_NSZombie_");
Object_ = objc_getClass("Object");
-
- 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(Socket_, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
- atexit(&Unlink);
- _syscall(listen(Socket_, 0));
-
- apr_threadattr_t *attr;
- _aprcall(apr_threadattr_create(&attr, Pool_));
-
- apr_thread_t *thread;
- _aprcall(apr_thread_create(&thread, attr, &Cyrver, NULL, Pool_));
- } catch (...) {
- NSLog(@"failed to setup Cyrver");
- }
}
JSGlobalContextRef CYGetJSContext() {
definition.className = "Functor";
definition.staticFunctions = Functor_staticFunctions;
definition.callAsFunction = &Functor_callAsFunction;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
Functor_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
definition.deleteProperty = &Instance_deleteProperty;
definition.getPropertyNames = &Instance_getPropertyNames;
definition.callAsConstructor = &Instance_callAsConstructor;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
Instance_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
definition.getProperty = &Internal_getProperty;
definition.setProperty = &Internal_setProperty;
definition.getPropertyNames = &Internal_getPropertyNames;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
Internal_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
definition.staticFunctions = Pointer_staticFunctions;
definition.getProperty = &Pointer_getProperty;
definition.setProperty = &Pointer_setProperty;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
Pointer_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
//definition.staticValues = Selector_staticValues;
definition.staticFunctions = Selector_staticFunctions;
definition.callAsFunction = &Selector_callAsFunction;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
Selector_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
definition.getProperty = &Struct_getProperty;
definition.setProperty = &Struct_setProperty;
definition.getPropertyNames = &Struct_getPropertyNames;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
Struct_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
//definition.getProperty = &Type_getProperty;
definition.callAsFunction = &Type_callAsFunction;
definition.callAsConstructor = &Type_callAsConstructor;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
Type_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
definition.className = "ObjectiveC::Image::Classes";
definition.getProperty = &ObjectiveC_Image_Classes_getProperty;
definition.getPropertyNames = &ObjectiveC_Image_Classes_getPropertyNames;
- definition.finalize = &CYData::Finalize;
+ definition.finalize = &Finalize;
ObjectiveC_Image_Classes_ = JSClassCreate(&definition);
definition = kJSClassDefinitionEmpty;
svn := $(shell svnversion)
deb := $(shell grep ^Package: control | cut -d ' ' -f 2-)_$(shell grep ^Version: control | cut -d ' ' -f 2 | sed -e 's/\#/$(svn)/')_iphoneos-arm.deb
-all := cycript libcycript.dylib libcycript.plist
+all := cycript libcycript.dylib libcycript.plist Cycript.dylib
header := Cycript.tab.hh Parser.hpp Pooling.hpp Struct.hpp cycript.hpp
%.o: %.mm $(header)
$(target)g++ $(flags) -c -o $@ $<
+Cycript.dylib: Connector.o
+ $(target)g++ $(flags) -dynamiclib -o $@ $(filter %.o,$^) \
+ -lobjc -lapr-1 -lsubstrate \
+ -framework CoreFoundation
+ ldid -S $@
+
libcycript.dylib: ffi_type.o parse.o Output.o Cycript.tab.o lex.cy.o Library.o
$(target)g++ $(flags) -dynamiclib -o $@ $(filter %.o,$^) \
-install_name /usr/lib/libcycript.dylib \
cp -a Settings.plist package/Library/PreferenceLoader/Preferences/Cycript.plist; \
fi
if [[ -e Tweak.plist ]]; then cp -a Tweak.plist package/Library/MobileSubstrate/DynamicLibraries/Cycript.plist; fi
- #cp -a Cycript.dylib package/Library/MobileSubstrate/DynamicLibraries
+ cp -a Cycript.dylib package/Library/MobileSubstrate/DynamicLibraries
mkdir -p package/usr/{bin,lib}
cp -a libcycript.dylib package/usr/lib
- ln -s /usr/lib/libcycript.dylib package/Library/MobileSubstrate/DynamicLibraries/Cycript.dylib
cp -a cycript package/usr/bin
cp -a libcycript.plist package/usr/lib
dpkg-deb -b package $(deb)