Advertisement
Armaritto

Untitled

Mar 6th, 2024
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.60 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/wait.h>
  6. #define RED   "\x1B[31m"
  7. #define RESET "\x1B[0m"
  8.  
  9. char* varNames[1000];
  10. char* varValues[1000];
  11. int varCount = 0;
  12. int varIndex = 0;
  13.  
  14. void register_child_signal(){
  15.  
  16. }
  17.  
  18. void execute_command(char** args){
  19.     int pid;
  20.     int status;
  21.     pid = fork();
  22.     if(pid == 0){
  23.         execvp(args[0], args);
  24.         printf("Error! Command not found\n");
  25.         exit(0);
  26.     }
  27.     else if(pid < 0){
  28.         printf("Error forking!\n");
  29.     }
  30.     else{
  31.         do{
  32.             waitpid(pid, &status, 0);
  33.         }
  34.         while(!WIFEXITED(status) && !WIFSIGNALED(status));
  35.     }
  36. }
  37.  
  38. void execute_shell_builtin(char** command_array){
  39.     if(!strcmp("cd", command_array[0])){
  40.         if(command_array[1] == NULL || !strcmp("~", command_array[1])){
  41.             chdir(getenv("HOME"));
  42.         }
  43.         else if(!strcmp("..", command_array[1])){
  44.             chdir("..");
  45.         }
  46.         else{
  47.             chdir(command_array[1]);
  48.             if (chdir(command_array[1]) == -1){
  49.                 printf("Error! Directory not found\n");
  50.             }
  51.         }
  52.     }
  53.     else if(!strcmp("echo", command_array[0])){
  54.         if(command_array[1] == NULL){
  55.             printf("\n");
  56.         }
  57.         else{
  58.             int j = 1;
  59.             while(command_array[j] != NULL){
  60.                 if(command_array[j][0] == '$'){
  61.                     char** x = varNames;
  62.                     char* varName = command_array[1] + 1;
  63.                     for(int i = 0; i < varIndex; i++){
  64.                         if(!strcmp(varName, varNames[i])){
  65.                             printf("%s\n", varValues[i]);
  66.                             return;
  67.                         }
  68.                     }
  69.                     printf("Error! Variable not found\n");
  70.                 }
  71.                 else{
  72.                     for(int i = 1; command_array[i] != NULL; i++){
  73.                         printf("%s ", command_array[i]);
  74.                     }
  75.                     printf("\n");
  76.                 }
  77.                 j++;
  78.             }
  79.         }
  80.     }
  81.     else if(!strcmp("export", command_array[0])){
  82.         char* token = strtok(command_array[1], "=");
  83.         varNames[varIndex] = token;
  84.         token = strtok(NULL, "=");
  85.         varValues[varIndex] = token;
  86.         varIndex++;
  87.     }
  88.     int len = sizeof(varNames) / sizeof(varNames[0]);
  89.     for (int i = 0; i < len ; i++) {
  90.         printf("%s\n", varNames[i]);
  91.     }
  92.     for (int i = 0; i < len ; i++) {
  93.         printf("%s\n", varValues[i]);
  94.     }
  95. }
  96.  
  97. int evaluate_command(char** command_array){
  98.     if(!strcmp("cd", command_array[0]) || !strcmp("echo", command_array[0]) || !strcmp("export", command_array[0])){
  99.         return 0;
  100.     }
  101.     else if(!strcmp("exit", command_array[0])){
  102.         return -1;
  103.     }
  104.     else if(!strcmp(" ", command_array[0]) || !strcmp("", command_array[0])){
  105.         return 10;
  106.     }
  107.     else{
  108.         return 1;
  109.     }
  110. }
  111.  
  112. char** parse_command(char input[]){
  113.     static char* strings[100];
  114.     int index = 0;
  115.     char* token = strtok(input, " \n"); // split string by space and newline
  116.     while (token != NULL){
  117.         strings[index++] = token ;
  118.         token = strtok(NULL, " \n");
  119.     }
  120.     strings[index] = NULL;
  121.     return strings;
  122. }
  123.  
  124. void shell_loop(){
  125.     int status = 1;
  126.     do {
  127.         if(!strcmp(getenv("HOME"), getcwd(NULL, 0))){
  128.             printf(RED "%s", "ubuntu@Armia-PC:");
  129.             printf( "%s", "~$ " RESET);
  130.         }
  131.         else{
  132.             printf(RED "%s", "ubuntu@Armia-PC:");
  133.             printf("%s", getcwd(NULL, 0));
  134.             printf("%s", "$ " RESET);
  135.         }
  136.         char input_command[100] ;
  137.         fgets(input_command, 100, stdin);
  138.         char** command_array = parse_command(input_command);  // parse array of char to array of strings seperated by space and ended with null
  139.         int type = evaluate_command(command_array); // 0: shell builtin, 1: executable or error, -1: exit
  140.         switch (type) {
  141.             case 0:
  142.                 execute_shell_builtin(command_array);
  143.                 break;
  144.             case 1:
  145.                 execute_command(command_array);
  146.                 break;
  147.             case -1:
  148.                 status = 0;
  149.                 break;
  150.             default:
  151.                 break;
  152.         }
  153.  
  154.     }
  155.     while(status);
  156. }
  157.  
  158. void setup_environment(){
  159.     chdir(getenv("HOME"));
  160. }
  161.  
  162. void on_child_exit(){
  163.     /*reap_child_zombie()
  164.     write_to_log_file("Child terminated")*/
  165. }
  166.  
  167. int main() {
  168.     setup_environment();
  169.     shell_loop();
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement