Ejemplo n.º 1
0
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);
  }
}
Ejemplo n.º 2
0
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;
}