From: Jay Freeman (saurik) Date: Fri, 10 Jan 2014 10:35:41 +0000 (-0800) Subject: Implement /etc/cycript/setup.d (temporary name). X-Git-Tag: v0.9.500~77 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/d00dec149bf35e5ddf0186c62c6b924ecfdd492c?hp=89d16b11d9ce1c739871f92c3170128e0befc96c Implement /etc/cycript/setup.d (temporary name). --- diff --git a/Execute.cpp b/Execute.cpp index 4f2aa91..7641df7 100644 --- a/Execute.cpp +++ b/Execute.cpp @@ -22,6 +22,9 @@ #include "Internal.hpp" #include +#include +#include +#include #include "cycript.hpp" @@ -32,6 +35,7 @@ #include "Execute.hpp" #include +#include #include #include @@ -1467,6 +1471,66 @@ JSGlobalContextRef CYGetJSContext(JSContextRef context) { return reinterpret_cast(JSObjectGetPrivate(CYCastJSObject(context, CYGetProperty(context, CYGetGlobalObject(context), cy_s))))->context_; } +extern "C" bool CydgetMemoryParse(const uint16_t **data, size_t *size); + +void *CYMapFile(const char *path, size_t *psize) { + int fd; + _syscall(fd = open(path, O_RDONLY)); + + struct stat stat; + _syscall(fstat(fd, &stat)); + size_t size(stat.st_size); + + *psize = size; + + void *base; + _syscall(base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0)); + + _syscall(close(fd)); + return base; +} + +static void CYRunSetups(JSContextRef context) { + std::string folder("/etc/cycript/setup.d"); + DIR *setups(opendir(folder.c_str())); + if (setups == NULL) + return; + + for (;;) { + dirent setup; + dirent *result; + _syscall(readdir_r(setups, &setup, &result)); + + if (result == NULL) + break; + _assert(result == &setup); + + const char *name(setup.d_name); + size_t length(strlen(name)); + if (length < 4) + continue; + + if (name[0] == '.') + continue; + if (memcmp(name + length - 3, ".cy", 3) != 0) + continue; + + std::string script(folder + "/" + name); + CYUTF8String utf8; + utf8.data = reinterpret_cast(CYMapFile(script.c_str(), &utf8.size)); + + CYPool pool; + CYUTF16String utf16(CYPoolUTF16String(pool, utf8)); + munmap(const_cast(utf8.data), utf8.size); + + if (CydgetMemoryParse(&utf16.data, &utf16.size)) + CYExecute(context, pool, CYPoolUTF8String(pool, utf16)); + free(const_cast(utf16.data)); + } + + _syscall(closedir(setups)); +} + extern "C" void CYSetupContext(JSGlobalContextRef context) { CYInitializeDynamic(); @@ -1556,6 +1620,8 @@ extern "C" void CYSetupContext(JSGlobalContextRef context) { (*hooks_->SetupContext)(context); CYArrayPush(context, alls, cycript); + + CYRunSetups(context); } JSGlobalContextRef CYGetJSContext() { diff --git a/String.hpp b/String.hpp index 12a2b23..7256fe5 100644 --- a/String.hpp +++ b/String.hpp @@ -31,6 +31,12 @@ struct CYUTF8String { const char *data; size_t size; + CYUTF8String() : + data(NULL), + size(0) + { + } + CYUTF8String(const char *data) : data(data), size(strlen(data))