}
 }
 
-void InjectLibrary(pid_t pid);
+void InjectLibrary(pid_t, int, const char *[]);
 
 int Main(int argc, char * const argv[], char const * const envp[]) {
     bool tty(isatty(STDIN_FILENO));
         memset(&address, 0, sizeof(address));
         address.sun_family = AF_UNIX;
 
-        sprintf(address.sun_path, "/tmp/.s.cy.%u", getpid());
+        const char *tmp;
+#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
+        tmp = "/Library/Caches";
+#else
+        tmp = "/tmp";
+#endif
+
+        sprintf(address.sun_path, "%s/.s.cy.%u", tmp, getpid());
         unlink(address.sun_path);
 
         struct File {
         _syscall(chmod(address.sun_path, 0777));
 
         _syscall(listen(server, 1));
-        InjectLibrary(pid);
+        InjectLibrary(pid, 1, (const char *[]) {address.sun_path, NULL});
         client_ = _syscall(accept(server, NULL, NULL));
     }
 #else
 
 #include <unistd.h>
 #include <sstream>
 
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
     _assert(pthread_create(&client->thread_, NULL, &OnClient, client) == 0);
 }
 
-static void CYHandleProcess(pid_t pid) {
-    CYInitializeDynamic();
-
+static void CYHandleSocket(const char *path) {
     int socket(_syscall(::socket(PF_UNIX, SOCK_STREAM, 0)));
 
     struct sockaddr_un address;
     memset(&address, 0, sizeof(address));
     address.sun_family = AF_UNIX;
-    sprintf(address.sun_path, "/tmp/.s.cy.%u", pid);
+    strcpy(address.sun_path, path);
 
     _syscall(connect(socket, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
+
+    CYInitializeDynamic();
     CYHandleClient(socket);
 }
 
 extern "C" void CYHandleServer(pid_t pid) { try {
-    CYHandleProcess(pid);
+    char path[1024];
+    sprintf(path, "/tmp/.s.cy.%u", pid);
+    CYHandleSocket(path);
 } catch (const CYException &error) {
     CYPool pool;
     fprintf(stderr, "%s\n", error.PoolCString(pool));
 
 extern "C" char *MSmain0(int argc, char *argv[]) { try {
     _assert(argc == 2);
-    auto arg(argv[1]);
-
-    char *end;
-    pid_t pid(strtoul(arg, &end, 10));
-    _assert(end == arg + strlen(arg));
+    CYHandleSocket(argv[1]);
 
     static void *handle(NULL);
     if (handle == NULL) {
         handle = dlopen(info.dli_fname, RTLD_NOLOAD);
     }
 
-    CYHandleProcess(pid);
-
     return NULL;
 } catch (const CYException &error) {
     CYPool pool;
 
 **/
 /* }}} */
 
+#include <sstream>
 #include <string>
 
 #include <dlfcn.h>
     return reinterpret_cast<Type_ *>(reinterpret_cast<uint8_t *>(data) + size);
 }
 
-void InjectLibrary(pid_t pid) {
+void InjectLibrary(int pid, int argc, const char *argv[]) {
     auto cynject(LibraryFor(reinterpret_cast<void *>(&main)));
     auto slash(cynject.rfind('/'));
     _assert(slash != std::string::npos);
     library += ".dylib";
 #endif
 
-    CYPool pool;
-    int status(system(pool.sprintf(1024, "%s %u %s %u", cynject.c_str(), pid, library.c_str(), getpid())));
-    _assert(status == 0);
+    std::ostringstream inject;
+    inject << cynject << " " << std::dec << pid << " " << library;
+    for (decltype(argc) i(0); i != argc; ++i)
+        inject << " " << argv[i];
+
+    _assert(system(inject.str().c_str()) == 0);
 }