aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/cli/ipc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cli/ipc.c')
-rw-r--r--src/cli/ipc.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/src/cli/ipc.c b/src/cli/ipc.c
index 6d555c0..5a43283 100644
--- a/src/cli/ipc.c
+++ b/src/cli/ipc.c
@@ -412,13 +412,32 @@ static bool ipc_socket_filepath_in_use(const char *socket_filepath) {
return in_use;
}
+/* Removes the socket that a GPU Screen Recorder instance that was killed left behind, so the same ipc socket path can be used again */
+static bool ipc_remove_unused_socket(const char *socket_filepath) {
+ struct stat file_stat;
+ if(lstat(socket_filepath, &file_stat) == -1)
+ return true;
+
+ if(!S_ISSOCK(file_stat.st_mode)) {
+ gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_ipc_init: can't use \"%s\" as the ipc socket path because a file that isn't a socket already exists there", socket_filepath);
+ return false;
+ }
+
+ if(ipc_socket_filepath_in_use(socket_filepath)) {
+ gsr_log(GSR_LOG_LEVEL_ERROR, "gsr_ipc_init: another program is already listening on \"%s\"", socket_filepath);
+ return false;
+ }
+
+ unlink(socket_filepath);
+ return true;
+}
+
static bool ipc_bind(gsr_ipc *self, const struct sockaddr_un *addr) {
+ if(!ipc_remove_unused_socket(self->socket_filepath))
+ return false;
+
const mode_t prev_mask = umask(0777 & ~GSR_IPC_SOCKET_MODE);
- int bind_result = bind(self->socket_fd, (const struct sockaddr*)addr, sizeof(*addr));
- if(bind_result == -1 && errno == EADDRINUSE && !ipc_socket_filepath_in_use(self->socket_filepath)) {
- unlink(self->socket_filepath);
- bind_result = bind(self->socket_fd, (const struct sockaddr*)addr, sizeof(*addr));
- }
+ const int bind_result = bind(self->socket_fd, (const struct sockaddr*)addr, sizeof(*addr));
const int bind_error = errno;
umask(prev_mask);