#include "common.h" #include #include #include #include #include #include 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); }