コード例 #1
0
ファイル: executor.cpp プロジェクト: e-learning/aptu-os
void Executor::execute(CmdInfoPtr cmdInfo)
{
	int res = 0;
	int pipefd[2];
	if (cmdInfo->isPipe) {
        	res = pipe(pipefd);
		procError(res, "pipe", true);	
		pid_t pipedProc = fork();
		procError(pipedProc, "fork", true);
		if(pipedProc == 0) {
			res = close(pipefd[0]);
			procError(res, "close", true);
			res = dup2(pipefd[1], 1);
			res = close(pipefd[1]);
			procError(res, "dup", true);
		        execute(cmdInfo->pipeCmd);
			exit(EXIT_SUCCESS);
		} else {
			res = close(pipefd[1]);
			procError(res, "close", true);
			res = dup2(pipefd[0], 0);
			res = close(pipefd[0]);
			procError(res, "dup", true);
		}
		
	}
	switch(cmdInfo->cmdType) {
	case CmdInfo::C_LS : 	execLs(cmdInfo);
				break;
	case CmdInfo::C_PWD : 	execPwd(cmdInfo);
				break;
	case CmdInfo::C_PS :	execPs();
				break;
	case CmdInfo::C_PROG :	{
					std::vector<char*> argv;
					cmdInfo->getArgs(argv);
					res = execv(cmdInfo->command.c_str(), &argv[0]);	
					if (res == -1) {
						std::string path = "/bin/";
						path += cmdInfo->command;
						res = execv(path.c_str(), &argv[0]);	
					}	
					procError(res, "cli", true);	
					break; 
				}
	default : return;
	}
}
コード例 #2
0
int startService(){
    if (login() == -1) return -1;
    printf("IN COMMNAND SESSION\n");
    char buf[BUFFER_SIZE];
    while (1) {
        memset(buf, 0, sizeof(buf));
        if (recv(recvfd, buf, BUFFER_SIZE, 0) <= 0){
            printf("Receive erro:%s(errno:%d)\n", strerror(errno), errno);
            return -1;
        }                                          
        printf("COMMAND[%s]\n",buf);
        if (strcmp(buf, "get") == 0){
            recv(recvfd, buf, BUFFER_SIZE, 0);
            execGet(buf);
            continue;
        }
        if (strcmp(buf, "put") == 0) {
            recv(recvfd, buf, BUFFER_SIZE, 0);
            execPut(buf);
            continue;
        }
        if (strcmp(buf, "quit") == 0) {
            execQuit();
            printf("COMMAND SESSION OVER!\n");
            return 0;
        }
        if (strcmp(buf, "dir") == 0) {
            execDir();
            continue;
        }
        if (strcmp(buf, "cd") == 0) {
            recv(recvfd, buf, BUFFER_SIZE, 0);
            execCd(buf);
            continue;
        }
        if (strcmp(buf, "pwd") == 0) {
            execPwd();
            continue;
        }
        printf("Command Error!\n");
    }
    return 0;
}