local-socket.c

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

void GREEN (char *messg);
void YELLOW (char *messg);
short int loclsckt (char *file);

int main (int argc, char *argv[]) {
	char sockfile[] = "/tmp/somesckt", sf2[] = "/tmp/socket2", srvbuf[256], rep[300];
	unlink(sf2);
	unlink(sockfile);
	short int serv = loclsckt(sockfile), client, insock;
	pid_t pid = fork();
	if ((listen(serv,3)) != 0) {perror("listen fail in main()"); return -3;}

	if (pid <0) {perror("fork fail in main()"); return -1;}
	else if (pid == 0) {
		struct sockaddr_un srvn; size_t size;
		struct sockaddr WITH; size_t wsz;
		char buffer[4096], messg[256], line[256];
		if ((client = loclsckt(sf2)) < 0) exit;
		srvn.sun_family = AF_LOCAL;
		strcpy(srvn.sun_path, sockfile);
		size=SUN_LEN(&srvn);
		if ((connect(client,(struct sockaddr*)&srvn,size)) != 0) {
			perror("connect fail in main()"); 
			unlink(sf2); exit -2;}
		YELLOW("Child connected..."); 
		recv(client,&buffer,4095,0);
		sprintf(messg,"client is process %d on fd%d\n", atoi(buffer),client); YELLOW(messg);
		YELLOW("Use \"DC\" to disconnect\n");
		while (1) {
			printf("Client: ");
			fgets(line,255,stdin);
			send(client,(void*)line,256,0);
			sleep(1);
			fflush(stdout);
		}
	} else { 
		struct sockaddr_un IN; 
		socklen_t inlen=sizeof(IN);
		char messg[64]; 
		fd_set inset;
		FD_ZERO(&inset);
		FD_SET(serv,&inset); 
		if ((select(FD_SETSIZE,&inset,NULL,NULL,NULL)) > 0) {
			GREEN("Accept(Y)?");
			if (getchar() == 'N') { puts("goodbye!"); return -5; }
		} else perror("select fail in main()");
		if ((insock=accept(serv,(struct sockaddr*)&IN,&inlen)) < 0) 
			{perror("accept fail in main()"); return -4;}
		sprintf(messg,"%d",pid);
		send(insock,(void*)messg,6,0);
	}
	
	while (1) {
		recv(insock,srvbuf,255,0);
		if ((strlen(srvbuf)) < 1) continue;
		if ((strncmp(srvbuf,"DC",2)) == 0) {kill(pid,9);break;}
		sprintf(rep, "Server/parent process recieved: %s",srvbuf);GREEN(rep);
	}			
	
	close(client);
	unlink(sf2);
	close(serv);
	unlink(sockfile);
	return 0;
}


void GREEN (char *messg) {
	system("echo -en \"\033[1;32m\"");
	printf(messg);
	system("echo -en \"\033[1;00m\"");   
}


void YELLOW (char *messg) {
	system("echo -en \"\033[1;33m\"");
	printf(messg);
	system("echo -en \"\033[1;00m\"");   
}


short int loclsckt (char *file) {
	struct sockaddr_un name;
	short int sock;
	size_t size;

	if ((strlen(file)) > 107) {puts("loclsckt(): filename too long"); return -2;}
	if ((sock=socket(PF_LOCAL,SOCK_STREAM,0)) < 0) {
		perror("socket fail in loclsckt()"); return -1;}

	name.sun_family = AF_LOCAL;
	strcpy(name.sun_path, file);
	size=SUN_LEN(&name);
	if ((bind(sock,(struct sockaddr*)&name,size) < 0)) {
		perror("bind fail in loclsckt()"); return -3;}
	return sock;
}