/* $Id: $ */
/* vim: shiftwidth=4 tabstop=4 noexpandtab
 * MiniUPnP project
 * (c) 2016 Thomas Bernard
 * website : http://miniupnp.free.fr/ or http://miniupnp.tuxfamily.org/
 * This software is subject to the conditions detailed
 * in the LICENCE file provided within the distribution */

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

#include "codelength.h"
#include "printresponse.h"

static volatile sig_atomic_t quitting = 0;

static void sighandler(int sig)
{
	(void)sig;
	quitting = 1;
}

int main(int argc, char * * argv)
{
	int i;
	int s;
	struct sockaddr_un addr;
	const char * sockpath = "/var/run/minissdpd.sock";
	unsigned char buffer[4096];
	ssize_t n;
	const char command5[] = { 0x05, 0x00 };
	struct sigaction sa;

	for(i=0; i<argc-1; i++) {
		if(0==strcmp(argv[i], "-s"))
			sockpath = argv[++i];
	}

	/* set signal handlers */
	memset(&sa, 0, sizeof(struct sigaction));
	sa.sa_handler = sighandler;
	if(sigaction(SIGINT, &sa, NULL)) {
		fprintf(stderr, "Failed to set SIGINT handler.\n");
	}
	sa.sa_handler = sighandler;
	if(sigaction(SIGTERM, &sa, NULL)) {
		fprintf(stderr, "Failed to set SIGTERM handler.\n");
	}

	s = socket(AF_UNIX, SOCK_STREAM, 0);
	addr.sun_family = AF_UNIX;
	strncpy(addr.sun_path, sockpath, sizeof(addr.sun_path));
	if(connect(s, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) < 0) {
		fprintf(stderr, "connecting to %s : ", addr.sun_path);
		perror("connect");
		return 1;
	}
	printf("connected to %s\n", addr.sun_path);
	n = write(s, command5, sizeof(command5));	/* NOTIF command */
	printf("%d bytes written\n", (int)n);

	while(!quitting) {
		n = read(s, buffer, sizeof(buffer));
		if(n < 0) {
			if(errno == EINTR) continue;
			perror("read");
			break;
		} else if(n == 0) {
			printf("Socket closed\n");
			break;
		}
		printf("%d bytes read\n", (int)n);
		printresponse(buffer, (int)n);
	}
	printf("Quit...\n");
	close(s);
	return 0;
}