Beispiel #1
0
void execCd(){
    char temp[MAX_ARGU_LENGTH];
    int i=2;
    int k=0;
    if(inputBuff[2]=='\0'){
        chdir("/home");
        return ;
    }
    while(inputBuff[i]==' '||inputBuff[i]=='\t')
        i++;
    for(;k<MAX_ARGU_LENGTH&&inputBuff[i]!=' '&&inputBuff[i]!='\t'&&inputBuff[i]!='\0';k++,i++)
        temp[k]=inputBuff[i];
    temp[k]='\0';
    if(hasWildcard(temp)){
            p=(StrList*)malloc(sizeof(StrList));
            p->link=NULL;
            heads=p;
            split(temp);
            completeArg("/",0);
            p=heads->link;
            if(chdir(p->str)<0)
                printf("cd; %s 错误的文件名或文件夹名!\n", p->str);
    }
    else if(chdir(temp) < 0){
        printf("cd; %s 错误的文件名或文件夹名!\n", temp);
    }
    //printf("%s|\n",temp);
}
Beispiel #2
0
int parse(const MyString& cmd, MyString* name, Vector<MyString>* pathes, Vector<MyString>* switches)
{
    if (name == nullptr || pathes == nullptr || switches == nullptr)
    {
        return -1;
    }

    pathes->clear();
    switches->clear();

    int i = getCmd(cmd, 0, name);
    if (i == cmd.size())
    {
        return 0;
    }
    if (*name == _T("mkdir"))
    {
        while (_istspace(cmd[i]))
            ++i;
        int j = cmd.size() - 1;
        while (_istspace(cmd[j]))
            --j;
        MyString path = cmd.substr(i, j - i + 1);
        pathes->append(path);
        return 0;
    }

    for (; i < cmd.size();)
    {
        if (_istspace(cmd[i]))
        {
            ++i;
        }
        else if (cmd[i] != _T('/'))
        {
            MyString path;
            i = getPath(cmd, i, &path);
            if (!isPath(path) && !hasWildcard(path))
            {
                printf("文件名、目录名或卷标语法不正确\n");
                *name = _T("");
                pathes->clear();
                switches->clear();
                return -1;
            }
            pathes->append(path);
        }
        else if (cmd[i] == _T('/'))
        {
            MyString s;
            i = getSwitch(cmd, i, &s);
            switches->append(s);
        }
        else
        {
            assert(0);
            return -1;
        }
    }
    return 0;
}
Beispiel #3
0
void CommandCopy::exec(VirtualDiskNode* vfs)
{
    if (!isNormalizedPath(m_dst))
    {
        m_dst = vfs->pathNormalize(m_dst);
    }
    if (hasWildcard(m_src))
    {
        WIN32_FIND_DATA find_data;
        HANDLE find_iter = INVALID_HANDLE_VALUE;

        find_iter = FindFirstFile(m_src.c_str(), &find_data);
        if (find_iter == INVALID_HANDLE_VALUE)
        {
            _tprintf(_T("系统找不到指定的文件\n"));
        }
        do 
        {
            if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                continue;
            }
            MyString file_name(find_data.cFileName);
            if (hasWildcard(m_dst))
            {
                if (!match(file_name, basename(m_dst)))
                {
                    continue;
                }
                MyString src = join(dirname(m_src), file_name);
                MyString dst = join(dirname(m_dst), file_name);
                if (copyFile(src, dst, vfs) == -1)
                {
                    assert(0);
                    continue;
                }
            }
            else
            {
                MyString src = join(dirname(m_src), file_name);
                MyString dst = join(m_dst, file_name);
                if (!vfs->isDir(m_dst))
                {
                    _tprintf(_T("系统找不到指定的目录\n"));
                    continue;
                }
                if (copyFile(src, dst, vfs) == -1)
                {
                    assert(0);
                    continue;
                }
            }
        }
        while (FindNextFile(find_iter, &find_data) != 0);
    }
    else
    {
        if (vfs->isDir(m_dst))
        {
            m_dst = join(m_dst, basename(m_src));
        }
        else
        {
            MyString file_name = basename(m_dst);
            if (!isLegalName(file_name))
            {
                throw CommandException(_T("文件名不能包含非法字符\n"));
            }
        }
        copyFile(m_src, m_dst, vfs);
    }
    return;
}
Beispiel #4
0
SimpleCmd * handleSimpleCmd(int begin,int end){

    int i, j, k;
    int fileFinished; //记录命令是否解析完毕
    char c, buff[50][200], inputFile[30], outputFile[30], *temp = NULL;
    SimpleCmd *cmd = (SimpleCmd*)malloc(sizeof(SimpleCmd));
    #ifdef DEBUG
    printf("%s!\n",inputBuff);
    #endif
    //默认为非后台命令,输入输出重定向为null
    cmd->isBack = 0;
    cmd->input = cmd->output = NULL;
    
    //初始化相应变量
    for(i = begin; i<50; i++){
        buff[i][0] = '\0';
    }
    inputFile[0] = '\0';
    outputFile[0] = '\0';
    
    i = begin;
    //跳过空格等无用信息
    while(i < end && (inputBuff[i] == ' ' || inputBuff[i] == '\t')){
        i++;
    }
    
    k = 0;
    j = 0;
    fileFinished = 0;
    temp = buff[k]; //以下通过temp指针的移动实现对buff[i]的顺次赋值过程
    while(i < end){
        /*根据命令字符的不同情况进行不同的处理*/
        switch(inputBuff[i]){ 
            case ' ':
            case '\t': //命令名及参数的结束标志
                temp[j] = '\0';
                j = 0;
                if(!fileFinished){
                    k++;
                    temp = buff[k];
                }
                break;

            case '<': //输入重定向标志
                if(j != 0){
            //此判断为防止命令直接挨着<符号导致判断为同一个参数,如果ls<sth
                    temp[j] = '\0';
                    j = 0;
                    if(!fileFinished){
                        k++;
                        temp = buff[k];
                    }
                }
                temp = inputFile;
                fileFinished = 1;
                i++;
                break;
                
            case '>': //输出重定向标志
                if(j != 0){
                    temp[j] = '\0';
                    j = 0;
                    if(!fileFinished){
                        k++;
                        temp = buff[k];
                    }
                }
                temp = outputFile;
                fileFinished = 1;
                i++;
                break;
                
            case '&': //后台运行标志
                if(j != 0){
                    temp[j] = '\0';
                    j = 0;
                    //printf("temp:%s\n",temp);
                    if(!fileFinished){
                        k++;
                        temp = buff[k];
                    }
                }
                cmd->isBack = 1;
                fileFinished = 1;
                i++;
                break;
                
            default: //默认则读入到temp指定的空间
                temp[j++] = inputBuff[i++];
                continue;
        }
        
        //跳过空格等无用信息
        while(i < end && (inputBuff[i] == ' ' || inputBuff[i] == '\t')){
            i++;
        }
    }
    
    if(inputBuff[end-1] != ' ' && inputBuff[end-1] != '\t' ){
        temp[j] = '\0';
        if(!fileFinished){
            k++;
        }
    }
//printf("k%d\n",k);
    //依次为命令名及其各个参数赋值
    cmd->args = (char**)malloc(sizeof(char*) * (MAX_ARGU_NUM));
    j=0;
    for(i = 0; i<k; i++){
        
        if(hasWildcard(buff[i])){
            p=(StrList*)malloc(sizeof(StrList));
            p->link=NULL;
            heads=p;
            split(buff[i]);
            completeArg("/",0);
            p=heads->link;
            while(p!=NULL){
                cmd->args[j]=(char *)malloc(sizeof(char)*(1+strlen(p->str)));
                strcpy(cmd->args[j++], p->str);
                p=p->link;
            }
           
        }else{
            cmd->args[j] = (char*)malloc(sizeof(char) * (strlen(buff[i]) + 1));
            strcpy(cmd->args[j++], buff[i]);
        }
        //printf("%s\n",cmd->args[i]);
    }

   cmd->args[j]=NULL;
    //如果有输入重定向文件,则为命令的输入重定向变量赋值
    if(strlen(inputFile) != 0){
        j = strlen(inputFile);
        cmd->input = (char*)malloc(sizeof(char) * (j + 1));
        strcpy(cmd->input, inputFile);
    }

    //如果有输出重定向文件,则为命令的输出重定向变量赋值
    if(strlen(outputFile) != 0){
        j = strlen(outputFile);
        cmd->output = (char*)malloc(sizeof(char) * (j + 1));   
        strcpy(cmd->output, outputFile);
    }
    #ifdef DEBUG
    printf("****\n");
    printf("isBack: %d\n",cmd->isBack);
        for(i = 0; i<j; i++){
            printf("args[%d]: %s\n",i,cmd->args[i]);
    }
    printf("input: %s\n",cmd->input);
    printf("output: %s\n",cmd->output);
    printf("****\n");
    #endif

    return cmd;
}