int monitor(int refreshRate, int serverSock) { serverSocket = serverSock; FD_ZERO(&activeFds); FD_SET(serverSocket, &activeFds); configLength = readConfig(serverSocket, &monitorRequests, saveLogReport); tail = initialiseRegister(); refreshMonitoring(false); struct timeval timeout; timeout.tv_sec = refreshRate; timeout.tv_usec = 0; bool pause = false; manageReads(&activeFds, &timeout, &sigintReceived, &pause, NULL, dataReceivedCallback, timeoutCallback, saveLogReport); killCount += refreshRegisterEntries(); killAllChildren(); cleanupGlobals(); return killCount; }
int CDECL main(int argc, char **argv) { if (argc ==1) { cerr << "Usage: makeeco eco_file" << endl; return -1; } Bitboard::init(); initOptions(argv[0]); Attacks::init(); Scoring::init(); if (!initGlobals(argv[0], false)) { cleanupGlobals(); exit(-1); } atexit(cleanupGlobals); ifstream eco_file( argv[argc-1], ios::in); if (!eco_file.good()) { cerr << "Cannot open file: " << argv[argc-1] << endl; return -1; } Board b; cout << "// This is a machine-generated file. Do not edit." << endl; cout << endl; cout << "#include \"ecodata.h\"" << endl << endl; cout << "const struct ECOData eco_codes[] =" << endl; cout << "{{" << '"' << "A00" << '"' << ", "; write_64(b.hashCode(),cout); cout << ", " << '"' << '"' << "}," << endl; int lines = 1; while (eco_file.good() && !eco_file.eof()) { string eco_line; getline(eco_file,eco_line); if (do_eco(eco_line)) { cerr << "error in ECO file, line " << lines << endl; } ++lines; } cout << "{0,0," << '"' << '"' << "}};" << endl; return 0; }
//private void setupMonitoring(bool isRetry, char* processName, unsigned long int duration, RegisterEntry* tail) { int num = 0; Process** runningProcesses = searchRunningProcesses(&num, processName, false, saveLogReport); if (runningProcesses == NULL) { // Nothing to be done if (num == 0) { if (!isRetry) { LogReport report; report.message = stringJoin("No process found with name: ", processName); report.type = INFO; saveLogReport(report, false); free(report.message); } return; } exit(-1); } int i; for(i = 0; i < num; ++i) { Process* p = runningProcesses[i]; if (p -> pid == getpid()) { // If procnannys were killed in the beginning, but a new one was started in between and the user expects to track that. // Should never happen/be done. LogReport report; report.message = "Config file had procnanny as one of the entries. It will be ignored if no other procnanny is found."; report.type = WARNING; saveLogReport(report, false); continue; } if (isProcessAlreadyBeingMonitored(p->pid)) { continue; } logProcessMonitoringInit(processName, p->pid); RegisterEntry* freeChild = getFirstFreeChild(); if (freeChild == NULL) { // fork a new child int writeToChildFD[2]; int readFromChildFD[2]; if (pipe(writeToChildFD) < 0) { destroyProcessArray(runningProcesses, num); LogReport report; report.message = "Pipe creation error when trying to monitor new process."; report.type = ERROR; saveLogReport(report, true); // TODO: Kill all children // TODO: Log all final kill count exit(-1); } if (pipe(readFromChildFD) < 0) { destroyProcessArray(runningProcesses, num); LogReport report; report.message = "Pipe creation error when trying to monitor new process."; report.type = ERROR; saveLogReport(report, true); // TODO: Kill all children // TODO: Log all final kill count exit(-1); } pid_t forkPid = fork(); switch (forkPid) { case -1: destroyProcessArray(runningProcesses, num); exit(-1); case CHILD: close(writeToChildFD[1]); close(readFromChildFD[0]); writingToParent = readFromChildFD[1]; readingFromParent = writeToChildFD[0]; pid_t targetPid = p->pid; destroyProcessArray(runningProcesses, num); cleanupGlobals(); while (true) { ProcessStatusCode childStatus = childMain(targetPid, duration); write(writingToParent, &childStatus, 1); MonitorMessage message; assert(read(readingFromParent, &message, sizeof(MonitorMessage)) == sizeof(MonitorMessage)); targetPid = message.targetPid; duration = message.monitorDuration; } break; default: // parent close(writeToChildFD[0]); close(readFromChildFD[1]); tail->monitoringProcess = forkPid; tail->monitoredProcess = p->pid; tail->monitorDuration = duration; tail->monitoredName = copyString(p->command); tail->startingTime = time(NULL); tail->isAvailable = false; tail->writeToChildFD = writeToChildFD[1]; tail->readFromChildFD = readFromChildFD[0]; FD_SET(tail->readFromChildFD, &activeFds); tail->next = constuctorRegisterEntry((pid_t)0, NULL, NULL); tail = tail->next; break; } } else { // use freeChild freeChild->isAvailable = false; freeChild->monitoredProcess = p->pid; free(freeChild->monitoredName); freeChild->monitoredName = copyString(p->command); freeChild->monitorDuration = duration; freeChild->startingTime = time(NULL); MonitorMessage message; message.targetPid = p->pid; message.monitorDuration = duration; write(freeChild->writeToChildFD, &message, sizeof(MonitorMessage)); } } destroyProcessArray(runningProcesses, num); }