]> git.saurik.com Git - cycript.git/blobdiff - Console.cpp
Forgot to add @ to ObjectiveC lexer for @"" support.
[cycript.git] / Console.cpp
index 754422e7fe88b3f40d56cf013176055bb15098dd..569157a6dcc65bbfd49f46b8b238a0a0ac730dc0 100644 (file)
@@ -354,9 +354,9 @@ static void *Map(const char *path, size_t *psize) {
     return base;
 }
 
-int main(int argc, char const * const argv[], char const * const envp[]) {
-    _aprcall(apr_app_initialize(&argc, &argv, &envp));
+void InjectLibrary(pid_t pid);
 
+int Main(int argc, char const * const argv[], char const * const envp[]) {
     bool tty(isatty(STDIN_FILENO));
     bool compile(false);
 
@@ -388,7 +388,7 @@ int main(int argc, char const * const argv[], char const * const envp[]) {
                 fprintf(stderr,
                     "usage: cycript [-c]"
 #ifdef CY_ATTACH
-                    " [-p <pid>]"
+                    " [-p <pid|name>]"
 #endif
                     " [<script> [<arg>...]]\n"
                 );
@@ -428,10 +428,51 @@ int main(int argc, char const * const argv[], char const * const envp[]) {
             case 'p': {
                 size_t size(strlen(arg));
                 char *end;
+
                 pid = strtoul(arg, &end, 0);
                 if (arg + size != end) {
-                    fprintf(stderr, "invalid pid for -p\n");
-                    return 1;
+                    // XXX: arg needs to be escaped in some horrendous way of doom
+                    const char *command(apr_psprintf(pool, "ps axc|sed -e '/^ *[0-9]/{s/^ *\\([0-9]*\\)\\( *[^ ]*\\)\\{3\\} *-*\\([^ ]*\\)/\\3 \\1/;/^%s /{s/^[^ ]* //;q;};};d'", arg));
+
+                    if (FILE *pids = popen(command, "r")) {
+                        char value[32];
+                        size = 0;
+
+                        for (;;) {
+                            size_t read(fread(value + size, 1, sizeof(value) - size, pids));
+                            if (read == 0)
+                                break;
+                            else {
+                                size += read;
+                                if (size == sizeof(value)) {
+                                    pid = _not(pid_t);
+                                    goto pclose;
+                                }
+                            }
+                        }
+
+                      size:
+                        if (size == 0)
+                            goto pclose;
+                        if (value[size - 1] == '\n') {
+                            --size;
+                            goto size;
+                        }
+
+                        value[size] = '\0';
+                        size = strlen(value);
+                        pid = strtoul(value, &end, 0);
+                        if (value + size != end)
+                            pid = _not(pid_t);
+
+                      pclose:
+                        _syscall(pclose(pids));
+                    }
+
+                    if (pid == _not(pid_t)) {
+                        fprintf(stderr, "invalid pid for -p\n");
+                        return 1;
+                    }
                 }
             } break;
 #endif
@@ -482,6 +523,8 @@ int main(int argc, char const * const argv[], char const * const envp[]) {
     if (pid == _not(pid_t))
         socket = -1;
     else {
+        InjectLibrary(pid);
+
         socket = _syscall(::socket(PF_UNIX, SOCK_STREAM, 0));
 
         struct sockaddr_un address;
@@ -548,3 +591,17 @@ int main(int argc, char const * const argv[], char const * const envp[]) {
 
     return 0;
 }
+
+int main(int argc, char const * const argv[], char const * const envp[]) {
+    apr_status_t status(apr_app_initialize(&argc, &argv, &envp));
+    if (status != APR_SUCCESS) {
+        fprintf(stderr, "apr_app_initialize() != APR_SUCCESS\n");
+        return 1;
+    } else try {
+        return Main(argc, argv, envp);
+    } catch (const CYException &error) {
+        CYPool pool;
+        fprintf(stderr, "%s\n", error.PoolCString(pool));
+        return 1;
+    }
+}