Current section

Files

Jump to
vintage_net src to_elixir.c
Raw

src/to_elixir.c

#include <err.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <ei.h>
#define SOCKET_PATH "/tmp/vintage_net/comms"
static void encode_string(ei_x_buff *buff, const char *str)
{
// Encode strings as binaries so that we get Elixir strings
// NOTE: the strings that we encounter here are expected to be ASCII to
// my knowledge
ei_x_encode_binary(buff, str, strlen(str));
}
int main(int argc, char *argv[])
{
if (argc != 2)
errx(EXIT_FAILURE, "Expecting a message");
int fd = socket(AF_UNIX, SOCK_DGRAM, 0);
if (fd < 0)
err(EXIT_FAILURE, "socket");
struct sockaddr_un addr;
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX;
strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);
if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1)
err(EXIT_FAILURE, "connect");
ei_x_buff buff;
if (ei_x_new_with_version(&buff) < 0)
err(EXIT_FAILURE, "ei_x_new_with_version");
ei_x_encode_tuple_header(&buff, 2);
ei_x_encode_atom(&buff, "to_elixir");
encode_string(&buff, argv[1]);
ssize_t rc = write(fd, buff.buff, buff.index);
if (rc < 0)
err(EXIT_FAILURE, "write");
if (rc != buff.index)
errx(EXIT_FAILURE, "write wasn't able to send %d chars all at once!", buff.index);
close(fd);
return 0;
}