WIP plugin listening on unix socket
TODO: Use a thread to listen on the socket.
This commit is contained in:
parent
1e49ca39e7
commit
c850536731
6 changed files with 159 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
/.cache/
|
||||
/build*/
|
23
CMakeLists.txt
Normal file
23
CMakeLists.txt
Normal file
|
@ -0,0 +1,23 @@
|
|||
cmake_minimum_required(VERSION 3.25)
|
||||
project(obs-studio-plugin-unix-socket-control)
|
||||
|
||||
add_compile_options(
|
||||
-Wall -Wextra -Wpedantic
|
||||
$<$<CONFIG:DEBUG>:-O0>
|
||||
)
|
||||
|
||||
if(NOT DEFINED CMAKE_BUILD_TYPE OR NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE "Debug")
|
||||
message("Set build type to Debug by default")
|
||||
endif()
|
||||
|
||||
set(unix-socket-control_SOURCES
|
||||
src/plugin.c
|
||||
src/socket.c
|
||||
)
|
||||
|
||||
add_library(unix-socket-control MODULE
|
||||
${unix-socket-control_SOURCES})
|
||||
|
||||
find_package(libobs REQUIRED)
|
||||
target_link_libraries(unix-socket-control PRIVATE OBS::libobs)
|
1
compile_commands.json
Symbolic link
1
compile_commands.json
Symbolic link
|
@ -0,0 +1 @@
|
|||
buildDebug/compile_commands.json
|
24
src/plugin.c
Normal file
24
src/plugin.c
Normal file
|
@ -0,0 +1,24 @@
|
|||
// plugin includes
|
||||
#include <obs-module.h>
|
||||
#include <obs-frontend-api.h>
|
||||
|
||||
// local includes
|
||||
#include "socket.h"
|
||||
|
||||
static UnixSocketHandler global_unix_socket_handler={
|
||||
.flags = 0xFFFFFFFFFFFFFFFF
|
||||
};
|
||||
|
||||
OBS_DECLARE_MODULE()
|
||||
|
||||
OBS_MODULE_USE_DEFAULT_LOCALE("unix-socket-control", "en-US")
|
||||
|
||||
bool obs_module_load(void) {
|
||||
global_unix_socket_handler = init_unix_socket_handler();
|
||||
|
||||
return is_unix_socket_handler_valid(global_unix_socket_handler) ? true : false;
|
||||
}
|
||||
|
||||
void obs_module_unload(void) {
|
||||
cleanup_unix_socket_handler(&global_unix_socket_handler);
|
||||
}
|
67
src/socket.c
Normal file
67
src/socket.c
Normal file
|
@ -0,0 +1,67 @@
|
|||
#include "socket.h"
|
||||
|
||||
// standard library includes
|
||||
#include <stdlib.h>
|
||||
|
||||
// unix includes
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define UNIX_SOCKET_HANDLER_SOCKET_NAME "/tmp/obs-studio-plugin-unix-socket-handler-socket"
|
||||
|
||||
UnixSocketHandler init_unix_socket_handler(void) {
|
||||
UnixSocketHandler handler;
|
||||
|
||||
memset(&handler, 0, sizeof(UnixSocketHandler));
|
||||
|
||||
umask(S_IRWXO);
|
||||
|
||||
// Set up linked list of events.
|
||||
handler.events_head.next = &handler.events_tail;
|
||||
handler.events_tail.prev = &handler.events_head;
|
||||
|
||||
handler.events_head.type = UNIX_SOCKET_EVENT_HEAD;
|
||||
handler.events_tail.type = UNIX_SOCKET_EVENT_TAIL;
|
||||
|
||||
// Set up unix socket.
|
||||
handler.socket_descriptor = socket(AF_UNIX, SOCK_SEQPACKET, 0);
|
||||
if (handler.socket_descriptor == -1) {
|
||||
handler.flags = 0xFFFFFFFFFFFFFFFF;
|
||||
return handler;
|
||||
}
|
||||
|
||||
handler.name.sun_family = AF_UNIX;
|
||||
strncpy(handler.name.sun_path,
|
||||
UNIX_SOCKET_HANDLER_SOCKET_NAME,
|
||||
sizeof(handler.name.sun_path) - 1);
|
||||
|
||||
int ret = bind(handler.socket_descriptor,
|
||||
(const struct sockaddr*) &handler.name,
|
||||
sizeof(handler.name));
|
||||
if (ret == -1) {
|
||||
close(handler.socket_descriptor);
|
||||
handler.socket_descriptor = -1;
|
||||
handler.flags = 0xFFFFFFFFFFFFFFFF;
|
||||
return handler;
|
||||
}
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void cleanup_unix_socket_handler(UnixSocketHandler *handler) {
|
||||
if (handler->flags == 0xFFFFFFFFFFFFFFFF) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (handler->socket_descriptor >= 0) {
|
||||
close(handler->socket_descriptor);
|
||||
handler->socket_descriptor = -1;
|
||||
unlink(UNIX_SOCKET_HANDLER_SOCKET_NAME);
|
||||
}
|
||||
handler->flags = 0xFFFFFFFFFFFFFFFF;
|
||||
}
|
||||
|
||||
int is_unix_socket_handler_valid(UnixSocketHandler handler) {
|
||||
return handler.flags == 0xFFFFFFFFFFFFFFFF ? 0 : 1;
|
||||
}
|
42
src/socket.h
Normal file
42
src/socket.h
Normal file
|
@ -0,0 +1,42 @@
|
|||
#ifndef OBS_STUDIO_PLUGIN_UNIX_SOCKET_CONTROL_SOCKET_H_
|
||||
#define OBS_STUDIO_PLUGIN_UNIX_SOCKET_CONTROL_SOCKET_H_
|
||||
|
||||
// standard library includes
|
||||
#include <stdint.h>
|
||||
|
||||
// unix includes
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
typedef enum UnixSocketEventType {
|
||||
UNIX_SOCKET_EVENT_NOP,
|
||||
UNIX_SOCKET_EVENT_HEAD,
|
||||
UNIX_SOCKET_EVENT_TAIL,
|
||||
UNIX_SOCKET_EVENT_START_RECORDING,
|
||||
UNIX_SOCKET_EVENT_STOP_RECORDING,
|
||||
UNIX_SOCKET_EVENT_START_STREAMING,
|
||||
UNIX_SOCKET_EVENT_STOP_STREAMING
|
||||
} UnixSocketEventType;
|
||||
|
||||
typedef struct UnixSocketEvent {
|
||||
struct UnixSocketEvent *next;
|
||||
struct UnixSocketEvent *prev;
|
||||
UnixSocketEventType type;
|
||||
} UnixSocketEvent;
|
||||
|
||||
typedef struct UnixSocketHandler {
|
||||
/*
|
||||
* All ones - invalid/cleaned-up instance
|
||||
*/
|
||||
uint64_t flags;
|
||||
UnixSocketEvent events_head;
|
||||
UnixSocketEvent events_tail;
|
||||
struct sockaddr_un name;
|
||||
int socket_descriptor;
|
||||
} UnixSocketHandler;
|
||||
|
||||
UnixSocketHandler init_unix_socket_handler(void);
|
||||
void cleanup_unix_socket_handler(UnixSocketHandler *handler);
|
||||
int is_unix_socket_handler_valid(UnixSocketHandler handler);
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue