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; } }
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; }