+static int str_fst_cb(void *data, const char *str)
+{
+ struct thread_data *td = data;
+ char *nr = get_opt_postfix(str);
+
+ td->file_service_nr = 1;
+ if (nr)
+ td->file_service_nr = atoi(nr);
+
+ return 0;
+}
+
+static int str_filename_cb(void *data, const char *input)
+{
+ struct thread_data *td = data;
+ char *fname, *str, *p;
+
+ p = str = strdup(input);
+
+ strip_blank_front(&str);
+ strip_blank_end(str);
+
+ if (!td->files_index)
+ td->nr_files = 0;
+
+ while ((fname = strsep(&str, ":")) != NULL) {
+ if (!strlen(fname))
+ break;
+ add_file(td, fname);
+ td->nr_files++;
+ }
+
+ free(p);
+ return 0;
+}
+
+static int str_directory_cb(void *data, const char fio_unused *str)
+{
+ struct thread_data *td = data;
+ struct stat sb;
+
+ if (lstat(td->directory, &sb) < 0) {
+ log_err("fio: %s is not a directory\n", td->directory);
+ td_verror(td, errno, "lstat");
+ return 1;
+ }
+ if (!S_ISDIR(sb.st_mode)) {
+ log_err("fio: %s is not a directory\n", td->directory);
+ return 1;
+ }
+
+ return 0;
+}
+
+static int str_opendir_cb(void *data, const char fio_unused *str)
+{
+ struct thread_data *td = data;
+
+ if (!td->files_index)
+ td->nr_files = 0;
+
+ return add_dir_files(td, td->opendir);
+}
+