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

#include "../config.h"

int main(int argc, char **argv) {
	struct sockaddr_un address;
	int sock;
	size_t addrLength;
	char buff[512];
	char *p;
	char c_len;
	int i;
	int len, write_len;
	pid_t pid;

	//	if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0){
	if ((sock = socket(PF_LOCAL, SOCK_STREAM, 0)) < 0){
		perror("socket");
		exit(1);
	}

	address.sun_family = AF_UNIX;    /* Unix domain socket */
//	strcpy(address.sun_path, "./sample-socket");
	sprintf(address.sun_path, "%s/.%s/.remote-sock", getenv("HOME"), PACKAGE);

	/* The total length of the address includes the sun_family 
	   element */

#ifndef HAVE_GETOPT_LONG
        addrLength = sizeof(address.sun_len) + sizeof(address.sun_family) + strlen(address.sun_path) + 1;
        address.sun_len = addrLength;
#else
        addrLength = sizeof(address.sun_family) + strlen(address.sun_path);
#endif

	if (connect(sock, (struct sockaddr *) &address, addrLength)){
		perror("connect");
		goto LAUNCH_NEW;
	}

	p = &buff[1];
	*p = argc;
	p++;

	for(i=0 ; i < argc ; i ++){
		strcpy(p, argv[i]);
		p = p + strlen(argv[i]) + 1;
	}

	len = p - buff - 1;

	if(len >= 256){
		printf("String too long\n");
		close(sock);
		exit(1);
	}

	buff[0] = (unsigned char )len;

	printf("Sending %d bytes of data...", len);

	write_len = write(sock, buff, len+1);
	if(write_len != len+1){
		perror("write");
		printf("Write failed\n");
	}

	close(sock);
	printf("done\n");
    
	return 0;

 LAUNCH_NEW:

	pid = fork();
	if(pid == -1){
		perror("fork");
		exit(1);
	}

	if(pid == 0){
		execvp("ebview", argv);
	} else {
		// Parent
		exit(0);
	}
}


syntax highlighted by Code2HTML, v. 0.9.1