feat: first init

- Simple unix daemon
- Python, Go, and C client
This commit is contained in:
darwincereska
2026-04-13 22:34:27 -04:00
commit 4a0aabce43
22 changed files with 3527 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
/**
* @file chipper_client.c
* @brief The C client sdk for connecting to the Chipper Socket
*/
#include "chipper_client.h"
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#define CHIPPER_CLIENT_BUFFER 2048
static int chipper_fd = -1;
static struct sockaddr_un chipper_addr;
static char chipper_service[64];
static char chipper_source[64];
int chipper_client_init(const char *socket_path, const char *service, const char *source) {
if (chipper_fd != -1) return 0; // Already initialized
chipper_fd = socket(AF_UNIX, SOCK_DGRAM, 0);
if (chipper_fd == -1) {
perror("chipper_client socket");
return -1;
}
memset(&chipper_addr, 0, sizeof(chipper_addr));
chipper_addr.sun_family = AF_UNIX;
strncpy(chipper_addr.sun_path, socket_path, sizeof(chipper_addr.sun_path) - 1);
strncpy(chipper_service, service, sizeof(chipper_service) -1);
chipper_service[sizeof(chipper_service) - 1] = '\0';
strncpy(chipper_source, source, sizeof(chipper_source) - 1);
chipper_source[sizeof(chipper_source) - 1] = '\0';
return 0;
}
void chipper_client_close(void) {
if (chipper_fd != -1) {
close(chipper_fd);
chipper_fd = -1;
}
}
int chipper_client_log(const char *level, const char *fmt, ...) {
if (chipper_fd == -1) {
errno = EBADF;
return -1;
}
char msg_buf[CHIPPER_CLIENT_BUFFER];
char final_buf[CHIPPER_CLIENT_BUFFER];
va_list args;
va_start(args, fmt);
vsnprintf(msg_buf, sizeof(msg_buf), fmt, args);
va_end(args);
snprintf(final_buf, sizeof(final_buf),
"level=%s service=%s source=%s msg=\"%s\"",
level, chipper_service, chipper_source, msg_buf
);
ssize_t n = sendto(chipper_fd, final_buf, strlen(final_buf), 0, (struct sockaddr *)&chipper_addr, sizeof(chipper_addr));
if (n == -1) {
perror("chipper_client sendto");
return -1;
}
return 0;
}
+15
View File
@@ -0,0 +1,15 @@
/**
* @file chipper_client.h
* @brief The C client sdk for connecting to the Chipper Socket
*/
#ifndef CHIPPER_CLIENT_H
#define CHIPPER_CLIENT_H
int chipper_client_init(const char *socket_path, const char *service, const char *source);
void chipper_client_close(void);
int chipper_client_log(const char *level, const char *fmt, ...);
#endif // CHIPPER_CLIENT_H
+40
View File
@@ -0,0 +1,40 @@
package chipper
import (
"fmt"
"net"
)
type Client struct {
conn *net.UnixConn
service string
source string
}
func NewClient(socketPath, service, source string) (*Client, error) {
addr := &net.UnixAddr{Name: socketPath, Net: "unixgram"}
conn, err := net.DialUnix("unixgram", nil, addr)
if err != nil {
return nil, err
}
return &Client{
conn: conn,
service: service,
source: source,
}, nil
}
func (c *Client) Log(level, msg string) error {
line := fmt.Sprintf(
"level=%s service=%s source=%s msg=\"%s\"",
level, c.service, c.source, msg,
)
_, err := c.conn.Write([]byte(line))
return err
}
func (c *Client) Close() error {
return c.conn.Close()
}
+16
View File
@@ -0,0 +1,16 @@
import socket
class ChipperClient:
def __init__(self, socket_path: str ="/tmp/chipper.sock", service: str = "myapp", source: str = "worker") -> None:
self.socket_path = socket_path
self.service = service
self.source = source
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
def log(self, level: str, msg: str) -> None:
# level=info service=pyapp source=worker msg="something"
line = f'level={level} service={self.service} source={self.source} msg="{msg}"'
self.sock.sendto(line.encode("utf-8"), self.socket_path)
def close(self) -> None:
self.sock.close()