+/* External engines are specified by "external:name.o") */
+static const char *get_engine_name(const char *str)
+{
+ char *p = strstr(str, ":");
+
+ if (!p)
+ return str;
+
+ p++;
+ strip_blank_front(&p);
+ strip_blank_end(p);
+ return p;
+}
+
+static int exists_and_not_file(const char *filename)
+{
+ struct stat sb;
+
+ if (lstat(filename, &sb) == -1)
+ return 0;
+
+ if (S_ISREG(sb.st_mode))
+ return 0;
+
+ return 1;
+}
+
+/*
+ * Initialize the various random states we need (random io, block size ranges,
+ * read/write mix, etc).
+ */
+static int init_random_state(struct thread_data *td)
+{
+ unsigned long seeds[6];
+ int fd, num_maps, blocks;
+ struct fio_file *f;
+ unsigned int i;
+
+ fd = open("/dev/urandom", O_RDONLY);
+ if (fd == -1) {
+ td_verror(td, errno, "open");
+ return 1;
+ }
+
+ if (read(fd, seeds, sizeof(seeds)) < (int) sizeof(seeds)) {
+ td_verror(td, EIO, "read");
+ close(fd);
+ return 1;
+ }
+
+ close(fd);
+
+ os_random_seed(seeds[0], &td->bsrange_state);
+ os_random_seed(seeds[1], &td->verify_state);
+ os_random_seed(seeds[2], &td->rwmix_state);
+
+ if (td->file_service_type == FIO_FSERVICE_RANDOM)
+ os_random_seed(seeds[3], &td->next_file_state);
+
+ os_random_seed(seeds[5], &td->file_size_state);
+
+ if (!td_random(td))
+ return 0;
+
+ if (td->rand_repeatable)
+ seeds[4] = FIO_RANDSEED * td->thread_number;
+
+ if (!td->norandommap) {
+ for_each_file(td, f, i) {
+ blocks = (f->real_file_size + td->rw_min_bs - 1) / td->rw_min_bs;
+ num_maps = (blocks + BLOCKS_PER_MAP-1)/ BLOCKS_PER_MAP;
+ f->file_map = malloc(num_maps * sizeof(long));
+ if (!f->file_map) {
+ log_err("fio: failed allocating random map. If running a large number of jobs, try the 'norandommap' option\n");
+ return 1;
+ }
+ f->num_maps = num_maps;
+ memset(f->file_map, 0, num_maps * sizeof(long));
+ }
+ }
+
+ os_random_seed(seeds[4], &td->random_state);
+ return 0;
+}
+
+