#define DEF_RWMIX_READ (50)
#define DEF_NICE (0)
-static char fio_version_string[] = "fio 1.3";
+static char fio_version_string[] = "fio 1.4";
static int repeatable = DEF_RAND_REPEAT;
static char *ini_file;
}
if (td->filetype == FIO_TYPE_FILE) {
- if (td->directory[0] != '\0')
+ if (td->directory && td->directory[0] != '\0')
sprintf(td->file_name, "%s/%s.%d", td->directory, jobname, td->jobnum);
else
sprintf(td->file_name, "%s.%d", jobname, td->jobnum);
static int check_str(char *p, char *name, str_cb_fn *cb, struct thread_data *td)
{
- char *s = strstr(p, name);
+ char *s;
+ if (strncmp(p, name, strlen(name)))
+ return 1;
+
+ s = strstr(p, name);
if (!s)
return 1;
static int check_strstore(char *p, char *name, char *dest)
{
- char *s = strstr(p, name);
+ char *s;
+ if (strncmp(p, name, strlen(name)))
+ return 1;
+
+ s = strstr(p, name);
if (!s)
return 1;
char option[128];
char *str, *p1, *p2;
+ if (strncmp(p, name, strlen(name)))
+ return 1;
+
strcpy(option, p);
p = option;
static int str_iolog_cb(struct thread_data *td, char *file)
{
- strncpy(td->iolog_file, file, sizeof(td->iolog_file) - 1);
+ td->iolog_file = strdup(file);
+ return 0;
+}
+static int str_prerun_cb(struct thread_data *td, char *file)
+{
+ td->exec_prerun = strdup(file);
+ return 0;
+}
+
+static int str_postrun_cb(struct thread_data *td, char *file)
+{
+ td->exec_postrun = strdup(file);
return 0;
}
unsigned long long ull;
unsigned long ul1, ul2;
struct thread_data *td;
- char *string, *name;
+ char *string, *name, *tmpbuf;
fpos_t off;
FILE *f;
char *p;
string = malloc(4096);
name = malloc(256);
+ tmpbuf = malloc(4096);
while ((p = fgets(string, 4096, f)) != NULL) {
if (is_empty_or_comment(p))
fgetpos(f, &off);
continue;
}
- if (!check_strstore(p, "directory", td->directory)) {
+ if (!check_strstore(p, "directory", tmpbuf)) {
+ td->directory = strdup(tmpbuf);
fgetpos(f, &off);
continue;
}
continue;
}
if (!check_str(p, "iolog", str_iolog_cb, td)) {
- td->iolog = 1;
+ td->read_iolog = 1;
+ td->write_iolog = 0;
+ fgetpos(f, &off);
+ continue;
+ }
+ if (!td->read_iolog &&
+ !check_str(p, "write_iolog", str_iolog_cb, td)) {
+ td->write_iolog = 1;
+ fgetpos(f, &off);
+ continue;
+ }
+ if (!check_str(p, "exec_prerun", str_prerun_cb, td)) {
+ fgetpos(f, &off);
+ continue;
+ }
+ if (!check_str(p, "exec_postrun", str_postrun_cb, td)) {
fgetpos(f, &off);
continue;
}
free(string);
free(name);
+ free(tmpbuf);
fclose(f);
return 0;
}