#define _GNU_SOURCE #include #include #include #include #include #include /* For SYS_xxx definitions */ #include static unsigned long long arcrandom_uniform_ll(unsigned long long upper_bound) { unsigned long long r, mini; long ret; if (upper_bound < 2) return 0; mini = -upper_bound % upper_bound; for (;;) { do { /* <=256 byte requests always succeed */ ret = syscall(__NR_getrandom, &r, sizeof(r), 0, 0, 0, 0); } while ((ret == -1) && (errno == EINTR)); if (ret != sizeof(r)) _exit(1); if (r >= mini) break; } return r % upper_bound; } int main(int argc, char *argv[]) { unsigned long long up; unsigned long long nr; if (argc != 3) { return 1; } else { errno = 0; char *endptr = NULL; nr = strtoull(argv[1], &endptr, 10); if (errno != 0 || argv[1] == endptr) return 1; up = strtoull(argv[2], &endptr, 10); if (errno != 0 || argv[2] == endptr) return 1; } while (nr--) { printf("%llu\n", arcrandom_uniform_ll(up)); } return 0; }