- 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);
-
- _syscall(connect(socket, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
+ int server(_syscall(socket(PF_UNIX, SOCK_STREAM, 0))); try {
+ struct sockaddr_un address;
+ memset(&address, 0, sizeof(address));
+ address.sun_family = AF_UNIX;
+
+ sprintf(address.sun_path, "/tmp/.s.cy.%u", getpid());
+
+ _syscall(bind(server, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
+ _syscall(chmod(address.sun_path, 0777));
+
+ try {
+ _syscall(listen(server, 1));
+ InjectLibrary(pid);
+ client = _syscall(accept(server, NULL, NULL));
+ } catch (...) {
+ // XXX: exception?
+ unlink(address.sun_path);
+ throw;
+ }
+ } catch (...) {
+ _syscall(close(server));
+ throw;
+ }