/* * CheckJobs * * arguments: none * * returns: none * * Checks the status of running jobs. */ void CheckJobs() { bgjobL* job = bgjobs; int wait_settings; wait_settings = WNOHANG | WUNTRACED | WCONTINUED; while (job != NULL){ int status; pid_t pid = waitpid(-1, &status, wait_settings); if (pid > 0){ if (pid == job->pid){ if (WIFCONTINUED(status)){ job->status = "Running"; } else{ job->status = "Done"; printf("[%d] %s %s\n", job->jid, job->status, job->name); DeleteJob(job->pid); } } } job = job->next; } } /* CheckJobs */
void CGuiMPIJobDlg::OnRemoveBtn() { char str[CONSOLE_STR_LENGTH+1]; int error; char key[100]; char value[CONSOLE_STR_LENGTH]; char *pszJob; int index; CString jobstr; UpdateData(); if ((m_job.GetLength() < 1) || (m_sock == INVALID_SOCKET)) return; index = m_job_list.GetCurSel(); jobstr = m_job; jobstr.Delete(0, jobstr.Find('@')+1); jobstr = jobstr.Left(jobstr.Find(' ')); strcpy(str, "dbfirst jobs"); if (WriteString(m_sock, str) == SOCKET_ERROR) { error = WSAGetLastError(); sprintf(value, "Error: JobsToFile, writing '%s' failed, %d\n", str, error); Translate_Error(error, str); strcat(value, str); MessageBox(value, "Connection Error"); Disconnect(); return; } if (ReadStringTimeout(m_sock, str, MPD_DEFAULT_TIMEOUT)) { if (strcmp(str, "DBS_FAIL") == 0) { //printf("no jobs on %s\n", host); //WriteString(m_sock, "done"); //easy_closesocket(m_sock); return; } if (strcmp(str, "DBS_END") == 0) { //printf("no jobs on %s\n", host); //WriteString(m_sock, "done"); //easy_closesocket(m_sock); return; } GetKeyAndValue(str, key, value); pszJob = strstr(value, "@")+1; if (strcmp(pszJob, jobstr) == 0) { //printf("%s : %s\n", key, value); DeleteJob(m_sock, pszJob); SaveKeyToDelete(key); } } else { //printf("Error, JobsToFile, unable to read the jobs on %s.\n", host); //WriteString(m_sock, "done"); //easy_closesocket(m_sock); return; } while (true) { strcpy(str, "dbnext jobs"); if (WriteString(m_sock, str) == SOCKET_ERROR) { error = WSAGetLastError(); sprintf(value, "writing '%s' failed, %d\n", str, error); Translate_Error(error, str); strcat(value, str); MessageBox(value, "Connection Error"); Disconnect(); return; } if (ReadStringTimeout(m_sock, str, MPD_DEFAULT_TIMEOUT)) { if (strcmp(str, "DBS_FAIL") == 0) { //printf("unexpected error reading the next job\n"); //WriteString(m_sock, "done"); //easy_closesocket(m_sock); return; } if (strcmp(str, "DBS_END") == 0) { break; } GetKeyAndValue(str, key, value); pszJob = strstr(value, "@")+1; if (strcmp(pszJob, jobstr) == 0) { //printf("%s : %s\n", key, value); DeleteJob(m_sock, pszJob); SaveKeyToDelete(key); } } else { //printf("Unable to read the jobs on %s.\n", host); //WriteString(m_sock, "done"); //easy_closesocket(m_sock); return; } } if (s_pKeyList == NULL) { sprintf(value, "The specified job, %s, does not exist on %s\n", pszJob, m_host); MessageBox(value, "Note"); } KeyNode *n; while (s_pKeyList) { n = s_pKeyList; s_pKeyList = s_pKeyList->next; DeleteKey(m_sock, n->key); delete n; } if (m_job_list.GetCount() > 1) { OnRefreshBtn(); if (index == m_job_list.GetCount()) index--; m_job_list.SetCurSel(index); GetJobDetails(); } else { OnRefreshBtn(); } }
/* * RunBuiltInCmd * * arguments: * commandT *cmd: the command to be run * * returns: none * * Runs a built-in command. */ static void RunBuiltInCmd(commandT* cmd) { if(strcmp(cmd->argv[0],"cd")==0){ changeWorkingDir(cmd->argv[1]); } /* "pwd" command*/ else if(strcmp(cmd->argv[0],"pwd")==0){ char *dir = getCurrentWorkingDir(); printf("%s\n",dir); free(dir); } else if(!strcmp(cmd->argv[0],"jobs")){ bgjobL* job = bgjobs; while (job != NULL){ if (!strcmp(job->status, "Running")){ printf("[%d] %s %s &\n", job->jid, job->status, job->name); } else{ printf("[%d] %s %s\n", job->jid, job->status, job->name); } job = job->next; } } else if (!strcmp(cmd->argv[0],"fg")){ bgjobL* job; if(cmd->argv[1] != NULL){ job = GetJobFromJid(atoi(cmd->argv[1])); } else{ job = GetMRJob(); } //bring bg process to foreground if (job != NULL){ tcsetpgrp(job->pid, STDIN_FILENO); crpid = job->pid; crName = job->name; DeleteJob(job->pid); kill(-crpid, SIGCONT); int status = 0; waitpid(crpid, &status, WUNTRACED); crpid = 0; crName = NULL; } } else if (!strcmp(cmd->argv[0],"bg")){ bgjobL* job; if(cmd->argv[1] != NULL){ job = GetJobFromJid(atoi(cmd->argv[1])); if (job != NULL){ kill(job->pid, SIGCONT); job->status = "Running"; } } else{ job = GetMRJob(); if (job != NULL){ kill(job->pid, SIGCONT); job->status = "Running"; } } } else if(!strcmp(cmd->argv[0],"alias")){ addAlias(cmd); } else if(!strcmp(cmd->argv[0],"unalias")){ deleteAlias(cmd->argv[1]); } else if(!strcmp(cmd->argv[0],"exit")){ return; } } /* RunBuiltInCmd */
/* Print File to port */ void WDPROC DumpPrinter(HWND hwnd, LPSTR szAppName, LPSTR szFileName) { #define PRINT_BUF_SIZE 4096 char *buffer; char *portname; int i, iport; DLGPROC lpfnSpoolProc; HPJOB hJob; UINT count; HFILE hf; int error = FALSE; DLGPROC lpfnCancelProc; long lsize; long ldone; char pcdone[10]; MSG msg; HWND hDlgModeless; if ((buffer = LocalAllocPtr(LHND, PRINT_BUF_SIZE)) == (char *)NULL) return; /* get list of ports */ GetProfileString("ports", NULL, "", buffer, PRINT_BUF_SIZE); /* select a port */ lpfnSpoolProc = (DLGPROC)MakeProcInstance((FARPROC)SpoolDlgProc, hdllInstance); iport = DialogBoxParam(hdllInstance, "SpoolDlgBox", hwnd, lpfnSpoolProc, (LPARAM)buffer); FreeProcInstance((FARPROC)lpfnSpoolProc); if (!iport) { LocalFreePtr((void NEAR *)buffer); return; } portname = buffer; for (i=1; i<iport && lstrlen(portname)!=0; i++) portname += lstrlen(portname)+1; /* open file and get length */ hf = _lopen(szFileName, OF_READ); if (hf == HFILE_ERROR) { LocalFreePtr((void NEAR *)buffer); return; } lsize = _llseek(hf, 0L, 2); (void) _llseek(hf, 0L, 0); if (lsize <= 0) lsize = 1; hJob = OpenJob(portname, szFileName, (HDC)NULL); switch ((int)hJob) { case SP_APPABORT: case SP_ERROR: case SP_OUTOFDISK: case SP_OUTOFMEMORY: case SP_USERABORT: _lclose(hf); LocalFreePtr((void NEAR *)buffer); return; } if (StartSpoolPage(hJob) < 0) error = TRUE; ldone = 0; lpfnCancelProc = (DLGPROC)MakeProcInstance((FARPROC)CancelDlgProc, hdllInstance); hDlgModeless = CreateDialogParam(hdllInstance, "CancelDlgBox", hwnd, lpfnCancelProc, (LPARAM)szAppName); while (!error && hDlgModeless && IsWindow(hDlgModeless) && ((count = _lread(hf, buffer, PRINT_BUF_SIZE))!= 0) ) { wsprintf(pcdone, "%d%% done", (int)(ldone * 100 / lsize)); SetWindowText(GetDlgItem(hDlgModeless, CANCEL_PCDONE), pcdone); if (WriteSpool(hJob, buffer, count) < 0) error = TRUE; ldone += count; while (IsWindow(hDlgModeless) && PeekMessage(&msg, hDlgModeless, 0, 0, PM_REMOVE)) { if (!IsDialogMessage(hDlgModeless, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } LocalFreePtr((void NEAR *)buffer); _lclose(hf); if (!hDlgModeless || !IsWindow(hDlgModeless)) error=TRUE; if (IsWindow(hDlgModeless)) DestroyWindow(hDlgModeless); hDlgModeless = 0; FreeProcInstance((FARPROC)lpfnCancelProc); EndSpoolPage(hJob); if (error) DeleteJob(hJob, 0); else CloseJob(hJob); }