#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>


static void usage(const char *name)
{
	fprintf(stderr, "usage: %s my_addr [peer_addr] message\n", name);
	exit(1);
}


int main(int argc, char **argv)
{
	struct sockaddr_un me, peer;
	char buf[100];
	ssize_t got;
	socklen_t len;
	int s;

	if (argc != 3 && argc != 4)
		usage(*argv);

	s = socket(AF_UNIX, SOCK_DGRAM, 0);
	if (s < 0) {
		perror("socket");
		return 1;
	}

	unlink(argv[1]);
	memset(&me, 0, sizeof(me));
	me.sun_family = AF_UNIX;
	strcpy(me.sun_path, argv[1]);

	if (bind(s, (struct sockaddr *) &me, sizeof(me)) < 0) {
		perror("bind");
		return 1;
	}

	if (argc == 3) {
		len = sizeof(peer);
		got = recvfrom(s, buf, sizeof(buf), 0,
		    (struct sockaddr *) &peer, &len);
		if (got < 0) {
			perror("recvfrom");
			return 1;
		}
		buf[got] = 0;
		printf("got %s\n", buf);
		if (sendto(s, argv[2], strlen(argv[2]), 0,
		    (struct sockaddr *) &peer, len) < 0) {
			perror("sendto");
			return 1;
		}
	} else {
		memset(&peer, 0, sizeof(peer));
		peer.sun_family = AF_UNIX;
		strcpy(peer.sun_path, argv[2]);

		if (sendto(s, argv[3], strlen(argv[3]), 0,
		    (struct sockaddr *) &peer, sizeof(peer)) < 0) {
			perror("sendto");
			return 1;
		}
		got = recv(s, buf, sizeof(buf), 0);
		if (got < 0) {
			perror("recv");
			return 1;
		}
		buf[got] = 0;
		printf("got %s\n", buf);
	}
	return 0;
}
