Lindenii Project Forge
Login
Commit info
ID54125fb6438e492e2bc1cf4b1c49f4ac94138ed6
AuthorRunxi Yu<me@runxiyu.org>
Author dateMon, 17 Feb 2025 00:40:15 +0800
CommitterRunxi Yu<me@runxiyu.org>
Committer dateMon, 17 Feb 2025 00:40:15 +0800
Actions
Get patch
git_hooks{.go,_client}: Add stub for git hook clients
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
}
/git_hooks_client
git_hooks_client:
#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;
}