Lindenii Project Forge
Commit info | |
---|---|
ID | 54125fb6438e492e2bc1cf4b1c49f4ac94138ed6 |
Author | Runxi Yu<me@runxiyu.org> |
Author date | Mon, 17 Feb 2025 00:40:15 +0800 |
Committer | Runxi Yu<me@runxiyu.org> |
Committer date | Mon, 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; }