static void RunBuiltInCmd(commandT* cmd) { if (cmd->fd_in != STDIN_FILENO) { dup2(cmd->fd_in, STDIN_FILENO); close(cmd->fd_in); } if (cmd->fd_out != STDOUT_FILENO) { dup2(cmd->fd_out, STDOUT_FILENO); close(cmd->fd_out); } if (!strcmp(cmd->argv[0], "alias")) { if (cmd->argc == 1) { DisplayAlias(alist); } else { char* cmdline = strdup(cmd->cmdline); strsep(&cmdline, " "); AddAlias(&alist, cmdline); } } else if (!strcmp(cmd->argv[0], "cd")) { char* dir = NULL; char err[256]; if (cmd->argc == 1) { dir = getenv("HOME"); } else { if ((cmd->argv[1])[0] == '~') { char* fulldir = (char*)malloc(sizeof(char) * 256); char* homedir = getenv("HOME"); strcat(fulldir, homedir); if (strlen(cmd->argv[1]) > 2) { char subdir[128]; memcpy(subdir, &(cmd->argv[1])[1], strlen(cmd->argv[1]) - 1); subdir[strlen(cmd->argv[1])] = 0; strcat(fulldir, subdir); } dir = fulldir; } else { dir = cmd->argv[1]; } } sprintf(err, "cd: fail to change directory: %s\n", dir); if (chdir(dir)) { perror(err); } } else if (!strcmp(cmd->argv[0], "bg")) { if (cmd->argc == 1) BGJob(bgjobs, -1); else BGJob(bgjobs, atoi(cmd->argv[1])); } else if (!strcmp(cmd->argv[0], "fg")) { if (cmd->argc == 1) FGJob(bgjobs, -1); else FGJob(bgjobs, atoi(cmd->argv[1])); } else if (!strcmp(cmd->argv[0], "jobs")) { DisplayJobs(bgjobs); } else if (!strcmp(cmd->argv[0], "unalias")) { if (cmd->argc == 1) { printf("unalias: not enough arguments\n"); } else { DelAlias(&alist, cmd->argv[1]); } } if (cmd->fd_in != STDIN_FILENO) { close(cmd->fd_in); } if (cmd->fd_out != STDOUT_FILENO) { close(cmd->fd_out); } }
DWORD _CRTAPI1 main( int argc, char *argv[] ) { DWORD rc; char *s, *s1, *AliasName; char *ExeName; BOOL fDelete; BOOL DisplayAllAliases; ConvertAppToOem( argc,argv ); AliasName = NULL; ExeName = NULL; fVerbose = FALSE; fDelete = FALSE; DisplayAllAliases = TRUE; rc = NO_ERROR; while (rc == NO_ERROR && --argc) { s = *++argv; if (*s == '-' || *s == '/') { while (*++s) { switch( *s ) { case '?': case 'h': case 'H': usage(); break; case 'd': case 'D': fDelete = TRUE; break; case 'v': case 'V': fVerbose = TRUE; break; case 'p': case 'P': if (!--argc) { fprintf( stderr, "ALIAS: Argument to -p switch missing.\n" ); usage(); } if (ExeName != NULL) { free( ExeName ); ExeName = NULL; } s1 = *++argv; ExeName = calloc( 1, strlen( s1 )+2 ); strcpy( ExeName, s1 ); break; case 'f': case 'F': if (!--argc) { fprintf( stderr, "ALIAS: Argument to -f switch missing.\n" ); usage(); } DisplayAllAliases = FALSE; rc = DoAliasFile( *++argv, ExeName ? ExeName : "CMD.EXE", fDelete ); break; default: fprintf( stderr, "ALIAS: invalid switch /%c\n", *s ); usage(); break; } } } else { DisplayAllAliases = FALSE; if (AliasName == NULL) { if (fDelete) { rc = DoAlias( s, NULL, ExeName ? ExeName : "CMD.EXE" ); } else { AliasName = s; } } else { if (fDelete) { rc = DoAlias( AliasName, NULL, ExeName ? ExeName : "CMD.EXE" ); AliasName = s; } else { rc = DoAlias( AliasName, s, ExeName ? ExeName : "CMD.EXE" ); AliasName = NULL; } } } } if (rc == NO_ERROR) { if (AliasName != NULL) { if (fDelete) { rc = DoAlias( AliasName, NULL, ExeName ? ExeName : "CMD.EXE" ); } else { rc = DisplayAlias( AliasName, ExeName ? ExeName : "CMD.EXE" ); } } else if (DisplayAllAliases) { rc = DisplayAliases( ExeName ); } } if (ExeName != NULL) { free( ExeName ); ExeName = NULL; } exit( rc ); return rc; }