summaryrefslogtreecommitdiff
path: root/core/hook.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/hook.c')
-rw-r--r--core/hook.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/core/hook.c b/core/hook.c
new file mode 100644
index 0000000..b915901
--- /dev/null
+++ b/core/hook.c
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2026, Chloe M., et al.
+ * Provided under the BSD-3 clause.
+ */
+
+#include <sys/wait.h>
+#include <unistd.h>
+#include "bop/hook.h"
+
+/* Shell we use by default */
+#define DEFAULT_SHELL_PATH "/bin/sh"
+
+/*
+ * Execute the shell for a specific shell script
+ *
+ * @script_path: Path of shell script
+ */
+static void
+exec_shell_for(const char *script_path)
+{
+ if (script_path == NULL) {
+ return;
+ }
+
+ execl(DEFAULT_SHELL_PATH, DEFAULT_SHELL_PATH, script_path, NULL);
+}
+
+/*
+ * Run a shell hook with POSIX sh
+ *
+ * XXX: Maybe support '#!/bin/xxx'?
+ */
+int
+bop_shell_hook(const char *hook_path)
+{
+ pid_t child;
+ int status;
+
+ if (hook_path == NULL) {
+ return -1;
+ }
+
+ child = fork();
+ if (child == 0) {
+ exec_shell_for(hook_path);
+ } else {
+ waitpid(child, &status, 0);
+ }
+
+ return 0;
+}