From 8ed1fa992c5e8e9aa3694e064db294a5c3f7416c Mon Sep 17 00:00:00 2001
From: LEE JEONG EUN <dlwjddms0102@hanmail.net>
Date: Tue, 8 May 2018 17:27:31 +0900
Subject: [PATCH] final---

---
 include/built_in.h    |   3 +
 include/commands.c    |   0
 src/built_in.c        |   6 +-
 src/commands.c        | 214 ++++++++++++++++++++++++++++++++++++++++--
 src/main.c            |  45 +++++++--
 src/signal_handlers.c |  20 +++-
 test                  | Bin 0 -> 7380 bytes
 test.c                |  12 +++
 8 files changed, 280 insertions(+), 20 deletions(-)
 create mode 100644 include/commands.c
 create mode 100755 test
 create mode 100644 test.c

diff --git a/include/built_in.h b/include/built_in.h
index b2df0aa..27588e0 100644
--- a/include/built_in.h
+++ b/include/built_in.h
@@ -1,6 +1,9 @@
 #ifndef BUILT_IN_H_
+
 #define BUILT_IN_H_
 
+int bgpid_num;
+char running[1024];
 typedef int (*built_in_command_do)(int, char**);
 typedef int (*built_in_command_validate)(int, char**);
 
diff --git a/include/commands.c b/include/commands.c
new file mode 100644
index 0000000..e69de29
diff --git a/src/built_in.c b/src/built_in.c
index 9a466e9..cb8c540 100644
--- a/src/built_in.c
+++ b/src/built_in.c
@@ -32,12 +32,16 @@ int do_pwd(int argc, char** argv) {
   return 0;
 }
 
+
 int do_fg(int argc, char** argv) {
   if (!validate_fg_argv(argc, argv))
     return -1;
 
   // TODO: Fill this.
-
+  int state;
+ // printf("\nbgpid_num=%d\n",bgpid_num);
+  waitpid(bgpid_num,&state,0);
+ // printf("waitpid complete\n");
   return 0;
 }
 
diff --git a/src/commands.c b/src/commands.c
index 13e9c33..5347500 100644
--- a/src/commands.c
+++ b/src/commands.c
@@ -2,16 +2,140 @@
 #include <stdlib.h>
 #include <string.h>
 #include <assert.h>
-
+#include <stdio_ext.h>
+#include <unistd.h>
 #include "commands.h"
 #include "built_in.h"
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <arpa/inet.h>
+#include <pthread.h>
+#include"built_in.h"
+
+#define BUFF_SIZE 1024
+#define SOCKET_PATH "tpf_unix_sock.server"
+#define SERVER_PATH "tpf_unix_sock.server"
+#define CLIENT_PATH "tpf_unix_sock.clent"
+
+
 
 static struct built_in_command built_in_commands[] = {
   { "cd", do_cd, validate_cd_argv },
   { "pwd", do_pwd, validate_pwd_argv },
-  { "fg", do_fg, validate_fg_argv }
+  { "fg", do_fg, validate_fg_argv },
+  
 };
 
+
+
+void * server(void*** argvp ){
+	int server_socket, client_socket, client_addr_size;
+	char buf[256];
+	char ***argv=*(char ***)argvp;
+	struct sockaddr_un server_addr;
+	struct sockaddr_un client_addr;
+	
+	memset(&server_addr,0, sizeof(struct sockaddr_un));
+	memset(&client_addr, 0, sizeof(struct sockaddr_un));
+	memset(buf, 0, 256);
+
+	server_socket = socket(AF_UNIX, SOCK_STREAM, 0);
+	if(server_socket < 0) {printf("server socket fail\n"); 
+				exit(0);}
+
+	bzero(&server_addr, sizeof(server_addr));
+	server_addr.sun_family = AF_UNIX; 
+	strcpy(server_addr.sun_path, SOCKET_PATH);
+	int len = sizeof(server_addr);
+	unlink(SOCKET_PATH);
+int state =bind(server_socket,(struct sockaddr*)&server_addr, len);
+	if(state ==-1) {
+		printf("bind error\n");
+		exit(1);
+	}
+state = listen(server_socket, 5);
+	if(state ==-1){
+		printf("listen error\n");
+		exit(1);
+	}
+while(1){
+	client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &len);
+
+if(client_socket == -1){
+	printf("client connect fail\n");
+	close(server_socket);
+	close(client_socket);
+	exit(1);
+	}
+
+
+int pid;
+if((pid=fork())<0)
+	perror("fork fail\n");
+else if (pid !=0)
+	sleep(1);
+else {
+	
+	dup2(client_socket,0);
+	execv(argv[0][0],argv[0]);
+	}
+}
+
+
+close(client_socket);
+
+}
+
+void * client(void*** argvp){
+
+	int client_socket;
+	char ***argv=*(char ***)argvp;
+	struct sockaddr_un server_addr;
+	struct sockaddr_un client_addr;
+	char buf[256];
+
+	memset(&server_addr, 0, sizeof(struct sockaddr_un));
+	memset(&client_addr,0, sizeof(struct sockaddr_un));
+	
+
+	client_socket = socket (AF_UNIX, SOCK_STREAM, 0);
+	if(client_socket == -1)
+	{	
+		printf("client socket fail\n");
+		exit(1);
+	}
+	bzero(&client_addr, sizeof(client_addr));
+	client_addr.sun_family = AF_UNIX;
+	strcpy(client_addr.sun_path, CLIENT_PATH);
+	int len = sizeof(client_addr);
+	
+	server_addr.sun_family = AF_UNIX;
+	strcpy(server_addr.sun_path, SERVER_PATH);
+
+	if(connect(client_socket, (struct sockaddr*)&server_addr, len) == -1)
+	{
+		printf("connect fail\n");
+		exit(1);
+	}
+		
+
+  
+	int pid;
+	if((pid = fork())<0)
+	perror("fork fail\n");
+	else if (pid != 0)
+		sleep(1);
+	else {
+		dup2(client_socket,1);
+		close(client_socket);
+		execv(argv[0][0],argv[0]);
+		exit(1);
+	} 
+	close(client_socket);
+	exit(0);
+}
+
 static int is_built_in_command(const char* command_name)
 {
   static const int n_built_in_commands = sizeof(built_in_commands) / sizeof(built_in_commands[0]);
@@ -22,12 +146,9 @@ static int is_built_in_command(const char* command_name)
     }
   }
 
-  return -1; // Not found
+  return -1; 
 }
 
-/*
- * Description: Currently this function only handles single built_in commands. You should modify this structure to launch process and offer pipeline functionality.
- */
 int evaluate_command(int n_commands, struct single_command (*commands)[512])
 {
   if (n_commands > 0) {
@@ -49,12 +170,84 @@ int evaluate_command(int n_commands, struct single_command (*commands)[512])
       return 0;
     } else if (strcmp(com->argv[0], "exit") == 0) {
       return 1;
-    } else {
-      fprintf(stderr, "%s: command not found\n", com->argv[0]);
-      return -1;
+    } else if (strcmp(com->argv[0], "vim") == 0){	
+	for(int i=0;i<n_commands; i++){
+		int pid, status;
+		if((pid = fork())<0) perror("Don't execute fork");
+		else if (pid >0) wait(&status);
+		else  { 
+			char temp[512] = "/usr/bin/";
+			strcat(temp, com->argv[0]);
+			strcpy(com->argv,temp);
+			bgpid_num=getpid();
+			printf("\n%d\n",bgpid_num);
+			execv(com->argv[0], com->argv);
+			if(execv(com->argv[0], com->argv)) 
+			{ 	
+				fprintf(stderr, "%s: command not found\n", com->argv[0]);
+      				return -1;
+			}
+	
+		}
+	}
+	return 0;
+    } else if(n_commands >=2){
+		
+		int pid, status;
+		pthread_t pt[2];
+		int a =5;
+		char ***pointer;
+		pointer=&(com->argv);
+		if((pid = fork())<0)
+			perror("fork fail\n");
+		if(pid > 0){
+			com = (*commands)+1;
+			pointer=&(com->argv);
+			pthread_create(&pt[0], NULL, &server, (void*)&pointer);
+			sleep(2);
+		}		
+		else {
+		pthread_create(&pt[1], NULL, &client, (void*)&pointer);
+		sleep(2);	
+		}
+		return 0;
+	} else {
+
+
+		for(int i=0;i<n_commands; i++){
+			int status;
+			int pid;	
+		
+			if((pid = fork())<0) perror("Don't execute fork");
+			else if (pid>0){
+	 			printf("%s\n",com->argv[com->argc-1]);
+				if(strcmp(com->argv[com->argc-1],"&"))
+				wait(&status);
+			}
+			else  {
+			bgpid_num = getpid();
+			printf("\n%d\n",bgpid_num);
+        		execv(com->argv[0], com->argv);
+
+			if(execv(com->argv[0], com->argv)) 
+			{	 	
+			char c[100] = "/bin/";
+			strcat(c, com->argv[0]);
+			com->argv[0] = c;
+			execv(com->argv[0], com->argv);
+			if(execv(com->argv[0],com->argv)){
+				fprintf(stderr, "%s: command not found\n", com->argv[0]);
+      				return -1;
+				} 
+			}
+		}
+	}
+	
+     
     }
-  }
 
+	
+  }
   return 0;
 }
 
@@ -74,3 +267,4 @@ void free_commands(int n_commands, struct single_command (*commands)[512])
 
   memset((*commands), 0, sizeof(struct single_command) * n_commands);
 }
+
diff --git a/src/main.c b/src/main.c
index 77c7804..8116d8f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5,27 +5,58 @@
 #include "commands.h"
 #include "built_in.h"
 #include "utils.h"
-
+#include "signal_handlers.h"
+#include <signal.h>
 int main()
 {
-  char buf[8096];
 
+/*
+signal(SIGINT,(void*)catch_sigint);
+signal(SIGTSTP,(void*)catch_sigtstp);
+*/
+  char buf[8096];
   while (1) {
+	signal(SIGINT, &catch_sigint);
+	signal(SIGTSTP, &catch_sigtstp);
     fgets(buf, 8096, stdin);
-
     struct single_command commands[512];
     int n_commands = 0;
+    int background = 0;
+    if(buf[strlen(buf)-1]=='&'){
+	background = 1;
+	buf[strlen(buf)]=0;
+	memset(running,NULL,1024);
+	strcpy(running,buf);
+	break;
+    }
     mysh_parse_command(buf, &n_commands, &commands);
-
+    if(background){
+	bgpid_num = fork();
+	if(bgpid_num){
+		free_commands(n_commands, &commands);
+		n_commands =0;
+		continue;
+	}
+    }
     int ret = evaluate_command(n_commands, &commands);
-
     free_commands(n_commands, &commands);
     n_commands = 0;
+   /* if(bgpid_num == 0){
+	if(ret == 0){
+		fprintf(stdout,"%d done %s\n",getpid(),running);
+	}
+	free_commands(n_commands,&commands);
+	n_commands = 0;
+	exit(0);
+    }*/
 
+    free_commands(n_commands, &commands);
+    n_commands = 0;
+	
     if (ret == 1) {
       break;
-    }
+    } 
+	memset(buf,NULL,8096);
   }
-
   return 0;
 }
diff --git a/src/signal_handlers.c b/src/signal_handlers.c
index 4b6fe2e..1968cf5 100644
--- a/src/signal_handlers.c
+++ b/src/signal_handlers.c
@@ -1,11 +1,27 @@
+
 #include "signal_handlers.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <signal.h>
 
 void catch_sigint(int signalNo)
-{
+{	
+	signal(SIGINT, &catch_sigint);
+	printf("\nShell doesn't close!\n");
+	
+	
   // TODO: File this!
 }
 
 void catch_sigtstp(int signalNo)
-{
+{	
+	signal(SIGTSTP, &catch_sigtstp);
+	printf("\nIt doesn't move!\n");
   // TODO: File this!
 }
+
+
+
diff --git a/test b/test
new file mode 100755
index 0000000000000000000000000000000000000000..d0f40c3cf28498811ed4a1c215e1f9c6258d1f01
GIT binary patch
literal 7380
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
Ax&QzG

literal 0
HcmV?d00001

diff --git a/test.c b/test.c
new file mode 100644
index 0000000..2459f92
--- /dev/null
+++ b/test.c
@@ -0,0 +1,12 @@
+#include<string.h>
+#include<stdio.h>
+#include<unistd.h>
+
+void main(){
+
+	while(1){
+		printf("background\n");
+		sleep(5);
+	}
+}
+
-- 
GitLab