forked from hkc/sfxd
1
0
Fork 0
sfxd/src/sfxd.c

78 lines
2.5 KiB
C
Raw Normal View History

2024-02-21 15:36:58 +03:00
#include "common.h"
#include <stdbool.h>
2024-02-21 13:27:25 +03:00
#include <stdio.h>
2024-02-21 15:36:58 +03:00
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
2024-02-21 13:27:25 +03:00
2024-02-21 15:36:58 +03:00
struct msg_target {
FILE *file_handle;
int sock_fd;
struct sockaddr *sock_addr;
ssize_t sock_addr_size;
};
ssize_t send_data(struct msg_target tgt, const void *data, size_t len);
void execute_command(struct msg_target tgt, const char *command, const char *params);
int main(int argc, char **argv) {
struct sockaddr_un sa_server, sa_client;
int sock_fd;
static char buffer[BUFFER_SIZE];
char *sock_path = DAEMON_SOCKET_PATH;
EXPECT(sock_fd = socket(AF_UNIX, SOCK_DGRAM, 0), > 0);
memset(&sa_server, 0, sizeof(sa_server));
memset(&sa_client, 0, sizeof(sa_client));
sa_server.sun_family = AF_UNIX;
strncpy(sa_server.sun_path, sock_path, sizeof(sa_server.sun_path) - 1);
unlink(sa_server.sun_path);
EXPECT(bind(sock_fd, (struct sockaddr *)&sa_server, sizeof(struct sockaddr_un)), >= 0);
ssize_t data_len;
socklen_t sl_client = sizeof(sa_client);
while ((data_len = recvfrom(sock_fd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&sa_client, &sl_client)) != -1) {
buffer[data_len] = '\0';
struct sockaddr_un *sau_client = &sa_client;
char *command = buffer;
char *params = strchr(buffer, ' ');
if (params != NULL) {
*params = '\0';
params++;
}
execute_command((struct msg_target) { 0, sock_fd, (struct sockaddr *)&sa_client, sl_client }, command, params);
EXPECT(sendto(sock_fd, "OK\n", 4, 0, (struct sockaddr *)&sa_client, sl_client), == 4);
EXPECT(sendto(sock_fd, "", 0, 0, (struct sockaddr *)&sa_client, sl_client), == 0);
sl_client = sizeof(sa_client);
}
unlink(sa_server.sun_path);
}
ssize_t send_data(struct msg_target tgt, const void *data, size_t len) {
ssize_t written;
if (tgt.file_handle) {
if ((written = fwrite(data, 1, len, tgt.file_handle)) != len) {
PANIC_FMT("fwrite(ptr=%p, size=%zd, nmemb=%zd, stream=%p) -> %zd",
data, 1, len, tgt.file_handle, written);
}
} else {
if ((written = sendto(tgt.sock_fd, data, len, 0, tgt.sock_addr, tgt.sock_addr_size)) != len) {
PANIC_FMT("sendto(socket=%d, message=%p, length=%zd, flags=%d, dest_addr=%p, dest_len=%zd) -> %zd",
tgt.sock_fd, data, len, 0, tgt.sock_addr, tgt.sock_addr_size, written);
}
}
return written;
}
void execute_command(struct msg_target tgt, const char *command, const char *params) {
send_data(tgt, "WAAAAAAAAAAAAAA\n", 16);
2024-02-21 13:27:25 +03:00
}