Hi… I am well aware that this diff view is very suboptimal. It will be fixed when the refactored server comes along!
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;
}