diff --git a/Assignment-05/starter/dshlib.c b/Assignment-05/starter/dshlib.c index 4e869d1b3f8c2ad4b94aeb2121f069b12fe21b27..35a4c44255697b590cbe7f8b1b8014549f0b6b36 100644 --- a/Assignment-05/starter/dshlib.c +++ b/Assignment-05/starter/dshlib.c @@ -53,9 +53,6 @@ int build_cmd_buff(char *cmd_line, cmd_buff_t *cmd_buff) { return OK; } - - - int execute_pipeline(command_list_t *cmd_list) { int num_commands = cmd_list->num; int pipefd[2]; @@ -76,7 +73,7 @@ int execute_pipeline(command_list_t *cmd_list) { return ERR_MEMORY; } - if (pids[i] == 0) { + if (pids[i] == 0) { // Child process if (prev_pipe_read != -1) { dup2(prev_pipe_read, STDIN_FILENO); close(prev_pipe_read); @@ -89,10 +86,10 @@ int execute_pipeline(command_list_t *cmd_list) { } cmd_buff_t *cmd = &cmd_list->commands[i]; - execvp(cmd->exe, cmd->argv); + execvp(cmd->argv[0], cmd->argv); perror("execvp"); exit(EXIT_FAILURE); - } else { + } else { if (prev_pipe_read != -1) { close(prev_pipe_read); } @@ -118,7 +115,7 @@ int parse_pipeline(char *cmd_line, command_list_t *clist) { char *original_line = strdup(cmd_line); if (original_line == NULL) { - return ERR_MEMORY; + return ERR_MEMORY; } char *trimmed_line = original_line; @@ -135,38 +132,24 @@ int parse_pipeline(char *cmd_line, command_list_t *clist) { char *command = strtok_r(trimmed_line, PIPE_STRING, &saveptr1); while (command != NULL && command_count < CMD_MAX) { - memset(&clist->commands[command_count], 0, sizeof(command_t)); + memset(&clist->commands[command_count], 0, sizeof(cmd_buff_t)); char *token = strtok_r(command, " ", &saveptr2); if (token != NULL) { - if (strlen(token) >= EXE_MAX) { - free(original_line); - return ERR_CMD_OR_ARGS_TOO_BIG; - } - strcpy(clist->commands[command_count].exe, token); - int arg_count = 0; - while ((token = strtok_r(NULL, " ", &saveptr2)) != NULL) { - if (arg_count >= ARG_MAX - 1) { - free(original_line); - return ERR_CMD_OR_ARGS_TOO_BIG; - } - if (strlen(token) >= ARG_MAX) { - free(original_line); - return ERR_CMD_OR_ARGS_TOO_BIG; - } - strcpy(clist->commands[command_count].args[arg_count], token); + while (token != NULL && arg_count < CMD_ARGV_MAX - 1) { + clist->commands[command_count].argv[arg_count] = token; arg_count++; + token = strtok_r(NULL, " ", &saveptr2); } - clist->commands[command_count].args[arg_count] = NULL; + clist->commands[command_count].argv[arg_count] = NULL; } command_count++; - command = strtok_r(NULL, PIPE_STRING, &saveptr1); + command = strtok_r(NULL, PIPE_STRING, &saveptr1); } if (command != NULL) { - // Too many commands free(original_line); return ERR_TOO_MANY_COMMANDS; } @@ -176,52 +159,7 @@ int parse_pipeline(char *cmd_line, command_list_t *clist) { return OK; } - -/* - * Implement your exec_local_cmd_loop function by building a loop that prompts the - * user for input. Use the SH_PROMPT constant from dshlib.h and then - * use fgets to accept user input. - * - * while(1){ - * printf("%s", SH_PROMPT); - * if (fgets(cmd_buff, ARG_MAX, stdin) == NULL){ - * printf("\n"); - * break; - * } - * //remove the trailing \n from cmd_buff - * cmd_buff[strcspn(cmd_buff,"\n")] = '\0'; - * - * //IMPLEMENT THE REST OF THE REQUIREMENTS - * } - * - * Also, use the constants in the dshlib.h in this code. - * SH_CMD_MAX maximum buffer size for user input - * EXIT_CMD constant that terminates the dsh program - * SH_PROMPT the shell prompt - * OK the command was parsed properly - * WARN_NO_CMDS the user command was empty - * ERR_TOO_MANY_COMMANDS too many pipes used - * ERR_MEMORY dynamic memory management failure - * - * errors returned - * OK No error - * ERR_MEMORY Dynamic memory management failure - * WARN_NO_CMDS No commands parsed - * ERR_TOO_MANY_COMMANDS too many pipes used - * - * console messages - * CMD_WARN_NO_CMD print on WARN_NO_CMDS - * CMD_ERR_PIPE_LIMIT print on ERR_TOO_MANY_COMMANDS - * CMD_ERR_EXECUTE print on execution failure of external command - * - * Standard Library Functions You Might Want To Consider Using (assignment 1+) - * malloc(), free(), strlen(), fgets(), strcspn(), printf() - * - * Standard Library Functions You Might Want To Consider Using (assignment 2+) - * fork(), execvp(), exit(), chdir() - */ - - int exec_local_cmd_loop() { +int exec_local_cmd_loop() { char cmd_buff[SH_CMD_MAX]; int rc = OK; @@ -254,7 +192,9 @@ int parse_pipeline(char *cmd_line, command_list_t *clist) { rc = ERR_MEMORY; } - free_command_list(&cmd_list); + for (int i = 0; i < cmd_list.num; i++) { + free(cmd_list.commands[i]._cmd_buffer); + } } else { cmd_buff_t cmd; if (build_cmd_buff(cmd_buff, &cmd) != OK) {