diff --git a/sway/ipc.c b/sway/ipc.c
index d13eb87f..7ff0df01 100644
--- a/sway/ipc.c
+++ b/sway/ipc.c
@@ -52,7 +52,8 @@ void ipc_init(void) {
 
 	ipc_sockaddr = ipc_user_sockaddr();
 
-	if (getenv("SWAYSOCK") != NULL) {
+	// We want to use socket name set by user, not existing socket from another sway instance.
+	if (getenv("SWAYSOCK") != NULL && access(getenv("SWAYSOCK"), F_OK) == -1) {
 		strncpy(ipc_sockaddr->sun_path, getenv("SWAYSOCK"), sizeof(ipc_sockaddr->sun_path));
 	}
 
@@ -66,7 +67,12 @@ void ipc_init(void) {
 	}
 
 	// Set i3 IPC socket path so that i3-msg works out of the box
-	setenv("I3SOCK", ipc_sockaddr->sun_path, 1);
+	if (!getenv("I3SOCK")) {
+		setenv("I3SOCK", ipc_sockaddr->sun_path, 1);
+	}
+	if (!getenv("SWAYSOCK")) {
+		setenv("SWAYSOCK", ipc_sockaddr->sun_path, 1);
+	}
 
 	ipc_client_list = create_list();
 
diff --git a/sway/main.c b/sway/main.c
index a4fe5823..4afbccbd 100644
--- a/sway/main.c
+++ b/sway/main.c
@@ -107,10 +107,13 @@ int main(int argc, char **argv) {
 			verbose = 1;
 			break;
 		case 'p': ; // --get-socketpath
-			struct sockaddr_un *ipc_sockaddr = ipc_user_sockaddr();
-			fprintf(stdout, "%s\n", ipc_sockaddr->sun_path);
-			free(ipc_sockaddr);
-			exit(0);
+			if (getenv("SWAYSOCK")) {
+				fprintf(stdout, "%s\n", getenv("SWAYSOCK"));
+				exit(0);
+			} else {
+				fprintf(stderr, "sway socket not detected.\n");
+				exit(1);
+			}
 			break;
 		}
 	}