void execute_forking(char **subcmd) { char *cmd = subcmd[0]; char **args = &subcmd[1]; if (strcmp(cmd, "echo") == 0) { echo(args); } else if ((strcmp(cmd, "etime") == 0) || (strcmp(cmd, "limits") == 0) || ((strcmp(cmd, "&")) == 0)) { execute_external(subcmd[1],&subcmd[1]); } else { execute_external(cmd, subcmd); } }
/*int execute_subcmd(char **subcmd){ int retval,redirection_type; char *cmd = subcmd[0]; char **args = &subcmd[1]; //Handle Redirection here redirection_type = check_redirection(args); if( redirection_type == 3) printf("Invalid Redirection operation\n"); else if(redirection_type == 0) {//No Redirection if (strcmp(cmd, "exit") == 0) { retval = exit_shell(); } else if (strcmp(cmd, "cd") == 0) { retval = cd(args[0]); } else if (strcmp(cmd, "echo") == 0) { retval = echo(args); } else if (strcmp(cmd, "etime") == 0) { retval = etime(args); } else if (strcmp(cmd, "limits") == 0) { retval = limits(args); } else { retval = execute_external(cmd, subcmd); } } else handle_redirection(subcmd,redirection_type); return retval; }*/ int execute_subcmd(char **subcmd) { int retval; if ((retval = execute_non_forking(subcmd)) == 2) { execute_external(subcmd[0], subcmd); } return retval; }
BOOL parse_cmd(char *cmd) { unsigned int i, rc; int Argc; // argument count #define MAXARGS 32 char *Argv[MAXARGS]; // argument pointers char *pszTemp; if (strlen(cmd)==0) { return FALSE; } if (strlen(cmd)==2) if (cmd[1]==':') { if (QueryDriveReady(cmd[0]-'a'+1)) DosSetDefaultDisk(cmd[0]-'a'+1); return FALSE; } while (( *cmd == ' ' ) || ( *cmd == '\t' )) cmd++; // loop through arguments for ( Argc = 0; (( Argc < MAXARGS ) && ( *cmd )); Argc++ ) { pszTemp = cmd; // save start of argument while ( isdelim( *cmd ) == 0 ) { if ( *cmd ) cmd++; } // check flag for terminators if (Argc == 0) { // '\0' after program name only if (( *cmd != '\0' )) *cmd++ = '\0'; } // update the Argv pointer Argv[ Argc ] = pszTemp; log("Argv[%d]=%s\n", Argc, pszTemp); // skip delimiters for Argv[2] onwards while (( *cmd ) && ( isdelim( *cmd ))) cmd++; } while (*cmd && isdelim(*cmd)) cmd--; // change the first trailing delimiter to '\0' cmd++; *cmd = '\0'; /* second NULL terminator */ Argv[Argc] = NULL; log("Argv[%d]=%s\n", Argc, 0); if (!strcmp(Argv[0], "exit")) { return TRUE; } for (i = 0; commands[i]; i ++) { if (!strcmp(Argv[0], commands[i]->cmdname)) { (*(commands[i]->func))(Argc, Argv); return FALSE; } } //log("argc=%d\n", Argc); //for (i = 0; i < Argc; i++) // log("argv[%d]=%s\n", i, Argv[i]); execute_external(Argc, Argv); return FALSE; }