#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