aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--git_hooks.go45
-rw-r--r--git_hooks_client/.gitignore1
-rw-r--r--git_hooks_client/Makefile1
-rw-r--r--git_hooks_client/git_hooks_client.c43
4 files changed, 90 insertions, 0 deletions
diff --git a/git_hooks.go b/git_hooks.go
new file mode 100644
index 0000000..86300cb
--- /dev/null
+++ b/git_hooks.go
@@ -0,0 +1,45 @@
+package main
+
+import (
+ "errors"
+ "fmt"
+ "net"
+ "os"
+ "syscall"
+)
+
+var err_not_unixconn = errors.New("Not a unix connection")
+
+func hooks_handle_connection(conn net.Conn) (err error) {
+ defer conn.Close()
+
+ unix_conn, ok := conn.(*net.UnixConn)
+ if !ok {
+ return err_not_unixconn
+ }
+
+ fd, err := unix_conn.File()
+ if err != nil {
+ return err
+ }
+ defer fd.Close()
+
+ ucred, err := get_ucred(fd)
+ if err != nil {
+ return err
+ }
+
+ pid := ucred.Pid
+
+ _ = pid
+
+ return nil
+}
+
+func get_ucred(fd *os.File) (*syscall.Ucred, error) {
+ ucred, err := syscall.GetsockoptUcred(int(fd.Fd()), syscall.SOL_SOCKET, syscall.SO_PEERCRED)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get credentials: %v", err)
+ }
+ return ucred, nil
+}
diff --git a/git_hooks_client/.gitignore b/git_hooks_client/.gitignore
new file mode 100644
index 0000000..129c0b4
--- /dev/null
+++ b/git_hooks_client/.gitignore
@@ -0,0 +1 @@
+/git_hooks_client
diff --git a/git_hooks_client/Makefile b/git_hooks_client/Makefile
new file mode 100644
index 0000000..0dd283e
--- /dev/null
+++ b/git_hooks_client/Makefile
@@ -0,0 +1 @@
+git_hooks_client:
diff --git a/git_hooks_client/git_hooks_client.c b/git_hooks_client/git_hooks_client.c
new file mode 100644
index 0000000..b274e03
--- /dev/null
+++ b/git_hooks_client/git_hooks_client.c
@@ -0,0 +1,43 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <string.h>
+
+int main() {
+ int sock;
+ struct sockaddr_un addr;
+ const char *message = "hi";
+ const char *socket_path = getenv("LINDENII_FORGE_HOOKS_SOCKET_PATH");
+
+ if (socket_path == NULL) {
+ exit(EXIT_FAILURE);
+ }
+
+ sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock == -1) {
+ perror("socket");
+ exit(EXIT_FAILURE);
+ }
+
+ memset(&addr, 0, sizeof(struct sockaddr_un));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, socket_path, sizeof(addr.sun_path) - 1);
+
+ if (connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
+ perror("connect");
+ close(sock);
+ exit(EXIT_FAILURE);
+ }
+
+ if (send(sock, message, strlen(message), 0) == -1) {
+ perror("send");
+ close(sock);
+ exit(EXIT_FAILURE);
+ }
+
+ close(sock);
+
+ return 0;
+}