pr_scoreboard_entry_t *util_scoreboard_entry_read(void) { static pr_scoreboard_entry_t scan_entry; int res = 0; if (util_scoreboard_fd < 0) { errno = EINVAL; return NULL; } /* Make sure the scoreboard file is read-locked. */ if (!util_scoreboard_read_locked) rlock_scoreboard(); memset(&scan_entry, '\0', sizeof(scan_entry)); /* NOTE: use readv(2)? */ errno = 0; while (scan_entry.sce_pid == 0) { while ((res = read(util_scoreboard_fd, &scan_entry, sizeof(scan_entry))) <= 0) { if (res < 0 && errno == EINTR) { continue; } else { unlock_scoreboard(); if (errno) { fprintf(stdout, "error reading scoreboard entry: %s\n", strerror(errno)); } return NULL; } } if (scan_entry.sce_pid) { unlock_scoreboard(); return &scan_entry; } } unlock_scoreboard(); return NULL; }
pr_scoreboard_entry_t *pr_scoreboard_read_entry(void) { static pr_scoreboard_entry_t scan_entry; int res = 0; if (scoreboard_fd < 0) { errno = EINVAL; return NULL; } /* Make sure the scoreboard file is read-locked. */ if (!scoreboard_read_locked) { /* Do not proceed if we cannot lock the scoreboard. */ if (rlock_scoreboard() < 0) return NULL; } memset(&scan_entry, '\0', sizeof(scan_entry)); /* NOTE: use readv(2)? */ while (TRUE) { while ((res = read(scoreboard_fd, &scan_entry, sizeof(scan_entry))) <= 0) { if (res < 0 && errno == EINTR) { pr_signals_handle(); continue; } else { unlock_scoreboard(); return NULL; } } if (scan_entry.sce_pid) { unlock_scoreboard(); return &scan_entry; } else continue; } unlock_scoreboard(); return NULL; }