You can now use '\' to escape a colon in a filename.
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
can specify a number of files by separating the names with a
':' colon. So if you wanted a job to open /dev/sda and /dev/sdb
as the two working files, you would use
can specify a number of files by separating the names with a
':' colon. So if you wanted a job to open /dev/sda and /dev/sdb
as the two working files, you would use
- filename=/dev/sda:/dev/sdb. '-' is a reserved name, meaning
- stdin or stdout. Which of the two depends on the read/write
+ filename=/dev/sda:/dev/sdb. If the wanted filename does need to
+ include a colon, then escape that with a '\' character. For
+ instance, if the filename is "/dev/dsk/foo@3,0:c", then you would
+ use filename="/dev/dsk/foo@3,0\:c". '-' is a reserved name,
+ meaning stdin or stdout. Which of the two depends on the read/write
direction set.
opendir=str Tell fio to recursively add any file it can find in this
direction set.
opendir=str Tell fio to recursively add any file it can find in this
+/*
+ * Return next file in the string. Files are separated with ':'. If the ':'
+ * is escaped with a '\', then that ':' is part of the filename and does not
+ * indicate a new file.
+ */
+static char *get_next_file_name(char **ptr)
+{
+ char *str = *ptr;
+ char *p, *start;
+
+ if (!str || !strlen(str))
+ return NULL;
+
+ start = str;
+ do {
+ /*
+ * No colon, we are done
+ */
+ p = strchr(str, ':');
+ if (!p) {
+ *ptr = NULL;
+ break;
+ }
+
+ /*
+ * We got a colon, but it's the first character. Skip and
+ * continue
+ */
+ if (p == start) {
+ str = ++start;
+ continue;
+ }
+
+ if (*(p - 1) != '\\') {
+ *p = '\0';
+ *ptr = p + 1;
+ break;
+ }
+
+ memmove(p - 1, p, strlen(p) + 1);
+ str = p;
+ } while (1);
+
+ return start;
+}
+
static int str_filename_cb(void *data, const char *input)
{
struct thread_data *td = data;
static int str_filename_cb(void *data, const char *input)
{
struct thread_data *td = data;
if (!td->files_index)
td->o.nr_files = 0;
if (!td->files_index)
td->o.nr_files = 0;
- while ((fname = strsep(&str, ":")) != NULL) {
+ while ((fname = get_next_file_name(&str)) != NULL) {
if (!strlen(fname))
break;
if (check_dir(td, fname)) {
if (!strlen(fname))
break;
if (check_dir(td, fname)) {