X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=filesetup.c;h=93cddb1f467b3aea77cfc3b858c1164e89da8964;hp=bb25cd5c20bf43ea46646f3b5fb799637e23f5f2;hb=a08bc17f470c3ae3abbc90f9ca77c37866ad0028;hpb=b5605e9ded4188ed91faae1a43ecd333a9856f62 diff --git a/filesetup.c b/filesetup.c index bb25cd5c..93cddb1f 100644 --- a/filesetup.c +++ b/filesetup.c @@ -200,27 +200,48 @@ void generic_close_file(struct thread_data fio_unused *td, struct fio_file *f) int generic_open_file(struct thread_data *td, struct fio_file *f) { + int is_std = 0; int flags = 0; + if (!strcmp(f->file_name, "-")) { + if (td_rw(td)) { + log_err("fio: can't read/write to stdin/out\n"); + return 1; + } + is_std = 1; + + /* + * move output logging to stderr, if we are writing to stdout + */ + if (td_write(td)) + f_out = stderr; + } + if (td->o.odirect) flags |= OS_O_DIRECT; if (td->o.sync_io) flags |= O_SYNC; - if (td_write(td) || td_rw(td)) { + if (td_write(td)) { flags |= O_RDWR; if (f->filetype == FIO_TYPE_FILE) flags |= O_CREAT; - f->fd = open(f->file_name, flags, 0600); + if (is_std) + f->fd = dup(STDOUT_FILENO); + else + f->fd = open(f->file_name, flags, 0600); } else { if (f->filetype == FIO_TYPE_CHAR) flags |= O_RDWR; else flags |= O_RDONLY; - f->fd = open(f->file_name, flags); + if (is_std) + f->fd = dup(STDIN_FILENO); + else + f->fd = open(f->file_name, flags); } if (f->fd == -1) { @@ -453,8 +474,7 @@ void close_files(struct thread_data *td) unsigned int i; for_each_file(td, f, i) { - if ((f->flags & FIO_FILE_UNLINK) && - f->filetype == FIO_TYPE_FILE) + if (td->o.unlink && f->filetype == FIO_TYPE_FILE) unlink(f->file_name); td_io_close_file(td, f); @@ -478,7 +498,10 @@ static void get_file_type(struct fio_file *f) { struct stat sb; - f->filetype = FIO_TYPE_FILE; + if (!strcmp(f->file_name, "-")) + f->filetype = FIO_TYPE_PIPE; + else + f->filetype = FIO_TYPE_FILE; if (!lstat(f->file_name, &sb)) { if (S_ISBLK(sb.st_mode)) @@ -524,6 +547,7 @@ void add_file(struct thread_data *td, const char *fname) void get_file(struct fio_file *f) { + assert(f->flags & FIO_FILE_OPEN); f->references++; }