static FILE * find_logfile_handle(void) { pid_t pid; int i; unsigned int j; pid = getpid(); if (pid == initpid) return mainlogfile; if (pid == shm->mainpid) return mainlogfile; if (pid == watchdog_pid) return mainlogfile; i = find_pid_slot(pid); if (i != PIDSLOT_NOT_FOUND) return shm->logfiles[i]; else { /* try one more time. FIXME: This is awful. */ sleep(1); i = find_pid_slot(pid); if (i != PIDSLOT_NOT_FOUND) return shm->logfiles[i]; outputerr("## Couldn't find logfile for pid %d\n", pid); dump_pid_slots(); outputerr("## Logfiles for pids: "); for_each_pidslot(j) outputerr("%p ", shm->logfiles[j]); outputerr("\n"); } return NULL; }
void dump_pid_slots(void) { unsigned int i; printf("## pids:\n"); for_each_pidslot(i) printf("## slot%d: %d\n", i, shm->pids[i]); }
static FILE *robust_find_logfile_handle(void) { unsigned int j; FILE *handle = NULL; if ((logging == TRUE) && (logfiles_opened)) { handle = find_logfile_handle(); if (!handle) { outputerr("## child logfile handle was null logging to main!\n"); (void)fflush(stdout); for_each_pidslot(j) shm->logfiles[j] = mainlogfile; sleep(5); handle = find_logfile_handle(); } } return handle; }