axyd icon

myshell_dynamic_array_Size

axyd | PRO | 06/12/24 05:12:18 AM UTC | 0 ⭐ | 13905 👁️ | Never ⏰ | []
C |

1.69 KB

|

None

|

0 👍

/

0 👎

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
 
#define MAXLINE 81
#define MAXARG 10
#define WHITE "\t \n"
#define RED   "\x1B[31m"
#define GRN   "\x1B[32m"
#define RESET "\x1B[0m"
 
void execCommand(char *input){
    char *args[MAXARG]; //array of tokens
    char *token;
    int tknCtr = 0;
 
    /*Split string into tokens*/
    //first token
    token = strtok(input, WHITE);
    args[0] = token;
    //all other tokens
    while(token != NULL){
        token = strtok(NULL, WHITE);
        args[++tknCtr] = token;
    }
    
    /*Shell fork*/
    int forkStatus = 0;
    pid_t pexec, waitPexec;
 
    if ((pexec = fork()) == 0){
        //search current directory, including relative paths
        int status = execv(args[0], args);
 
        //search /bin directory
        if( status == -1){
            //prepend first token with /bin directory
            char dir1[80] = "/bin";
            char buf[256];
 
            snprintf(buf, sizeof buf, "%s/%s", dir1, args[0]);
            args[0] = buf;
 
            status = execv(args[0], args);
            
            //binary not found in /bin directory
            if( status == -1){
                printf(RED"\n\t/!\\ ERROR: command not found/!\\\n\n"RESET);
            }
        }
        exit(0);
    } else if (pexec < 0) {
        printf(RED"\n\t/!\\ ERROR: could not fork executor /!\\\n"RESET);
    } else {
        while ((waitPexec = wait(&forkStatus)) > 0);    //wait on child
    }
}
 
int main(){
    char input[MAXLINE];
    
    do{
        printf(GRN"What command do you desire: "RESET);
    
        scanf("%80[^\n]", input);       //read until enter pressed      
        while ((getchar()) != '\n');    //flush stdin buffer
 
        if (strcmp(input, "exit") == 0) break;
 
        execCommand(input);
    } while (strcmp(input, "exit") != 0);
    
    printf("\n\tGOODBYE !\n");
    exit(EXIT_SUCCESS);
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎