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
|
|
|
}
|