void execute(char *line) { char *cmd; /* command */ int start, end; /* expression delimiters */ if(setExpressionDelimiters(line, "[^| ]([^|]*[^| ])?", &start, &end)) { cmd = getExpression(line, start, end, 0); ignoreSignals(); if(hasPipe(line)) { executePipe(line + end, cmd); } else if(!tryInternalCommand(cmd, JOBS_CONTROL)) { executeExternalCommand(cmd); } free(cmd); } }
void init() { MS_TRACE(); ignoreSignals(); DepLibUV::PrintVersion(); // Initialize static stuff. DepOpenSSL::ClassInit(); DepLibSRTP::ClassInit(); DepUsrSCTP::ClassInit(); RTC::UdpSocket::ClassInit(); RTC::TcpServer::ClassInit(); RTC::DtlsTransport::ClassInit(); RTC::SrtpSession::ClassInit(); Utils::Crypto::ClassInit(); }
int main(int argc, char **argv) { if(isArgumentForShowingVersion(argv)) showVersionAndExit(); char *buf; char *bufCopy; pid_t pid = getpid(); pid_t backgroundJob; int status = 0; char *prompt = getPrompt(); int bg; int jobNumber = 1; int counts; int jumpSet = 0; char *arguments[2048]; initialize(); printf("\n"); setPrompt(prompt); while ((buf = readline(prompt))) { if(strlen(buf) != 0) { bufCopy = buddy_malloc((strlen(buf)+1)*sizeof(char)); strcpy(bufCopy, buf); add_history(bufCopy); } else { printFinishedJobs(jobList); free(buf); continue; } free(buf); if(isCommandNotEmpty(bufCopy)) bg = isBackgroundCommand(bufCopy); getArgument(arguments, bufCopy, &counts); if(isExitCommand(bufCopy)){ buddy_free(bufCopy); freeList(jobList); if(arguments != NULL){ freeArguments(counts, arguments, NULL); } exit(0); } if(isCdCommand(bufCopy, arguments)){ changeDir(arguments); freeArguments(counts, arguments, bufCopy); } else if(isJobsCommand(bufCopy)) { printList(jobList); freeArguments(counts, arguments, bufCopy); } else if(isFgCommand(bufCopy, arguments)){ fg(arguments, jobList, counts, bufCopy); } else if(isBgCommand(bufCopy, arguments)){ bgS(arguments, jobList, counts, bufCopy); } else if (isCommandNotEmpty(bufCopy)) { if(bg == 1) { backgroundJob = fork(); if(backgroundJob == 0) { ignoreSignals(); runCommand(arguments, bufCopy); } else{ NodePtr n = createAndSetNode(&jobNumber, backgroundJob, bufCopy, bg); recordCommand(n, jobNumber, bg); freeArguments(counts, arguments, bufCopy); } } else { pid = fork(); if(pid == 0){ runCommand(arguments, bufCopy); } else { NodePtr n = createAndSetNode(&jobNumber, pid, bufCopy, bg); ignoreSignals(); if((waitpid(pid,&status,WUNTRACED))<0) err_sys("waitpid error"); freeArguments(counts, arguments, bufCopy); restoreSignalsAndDetermineStatus(status, jobList, n); } } } else { freeArguments(counts, arguments, bufCopy); } if(jumpSet == 0){ sigsetjmp(env, 1); jumpSet = 1; } continue; } if(buf == NULL) printf("\n"); exit(0); }