- unsigned long long offset;
- unsigned int bytes;
- char *str, *p;
- FILE *f;
- int rw, i, reads, writes;
-
- if (!td->read_iolog && !td->write_iolog)
- return 0;
-
- if (td->read_iolog)
- f = fopen(td->iolog_file, "r");
- else
- f = fopen(td->iolog_file, "w");
-
- if (!f) {
- perror("fopen iolog");
- printf("file %s, %d/%d\n", td->iolog_file, td->read_iolog, td->write_iolog);
- return 1;
- }
-
- /*
- * That's it for writing, setup a log buffer and we're done.
- */
- if (td->write_iolog) {
- td->iolog_f = f;
- td->iolog_buf = malloc(8192);
- setvbuf(f, td->iolog_buf, _IOFBF, 8192);
- return 0;
- }
-
- /*
- * Read in the read iolog and store it, reuse the infrastructure
- * for doing verifications.
- */
- str = malloc(4096);
- reads = writes = i = 0;
- while ((p = fgets(str, 4096, f)) != NULL) {
- struct io_piece *ipo;
-
- if (sscanf(p, "%d,%llu,%u", &rw, &offset, &bytes) != 3) {
- fprintf(stderr, "bad iolog: %s\n", p);
- continue;
- }
- if (rw == DDIR_READ)
- reads++;
- else if (rw == DDIR_WRITE)
- writes++;
- else {
- fprintf(stderr, "bad ddir: %d\n", rw);
- continue;
+ char buffer[1024];
+ va_list args;
+ size_t len;
+
+ va_start(args, format);
+ len = vsnprintf(buffer, sizeof(buffer), format, args);
+ va_end(args);
+
+ if (is_backend)
+ return fio_server_text_output(FIO_LOG_ERR, buffer, len);
+ else if (log_syslog) {
+ syslog(LOG_INFO, "%s", buffer);
+ return len;
+ } else {
+ if (f_err != stderr) {
+ int fio_unused ret;
+
+ ret = fwrite(buffer, len, 1, stderr);