From d32bb30e79f212d25b07d0cbb42d11f61e49be92 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Thu, 6 Sep 2018 12:08:04 +0200 Subject: [PATCH] With --enable-track-src-odirect, do not report error 22 due to unaligned EOF --- cdrskin/cdrfifo.c | 18 +++++++++++++++++- cdrskin/cdrskin_timestamp.h | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cdrskin/cdrfifo.c b/cdrskin/cdrfifo.c index f249eaa..26d28db 100644 --- a/cdrskin/cdrfifo.c +++ b/cdrskin/cdrfifo.c @@ -108,6 +108,9 @@ struct CdrfifO { /* index of currently active (i.e. reading) follow-up */ int follow_up_fd_idx; + /* short read encountered, take subsequent errno 22 with O_DIRECT as EOF */ + int o_direct_was_short; + /* (simultaneous) peer chaining */ struct CdrfifO *next; @@ -178,6 +181,7 @@ int Cdrfifo_new(struct CdrfifO **ff, int source_fd, int dest_fd, } o->follow_up_fd_counter= 0; o->follow_up_fd_idx= -1; + o->o_direct_was_short= 0; o->next= o->prev= NULL; o->chain_idx= 0; @@ -697,8 +701,17 @@ after_write:; else if(can_read < Cdrfifo_o_direct_chunK) can_read= -1; ret= 0; - if(can_read>0) + if(can_read>0) { ret= read(o->source_fd,o->buffer+o->write_idx,can_read); + if(ret > 0) { + if(ret < can_read) { + /* Probably EOF. Prepare for errno = 22 in the next read. */ + o->o_direct_was_short= 1; + } else { + o->o_direct_was_short= 0; + } + } + } if(can_read < 0) { /* waiting for a full Cdrfifo_o_direct_chunK to fit */ if(can_write <= 0 && o->dest_fd >= 0) { @@ -732,6 +745,8 @@ after_write:; #endif /* ! Libburn_has_open_trac_srC */ if(ret==-1) { + if(o->o_direct_was_short && errno == 22) + goto have_eof; /* >>> handle input error */; fprintf(stderr,"\ncdrfifo %d: on read: errno=%d , \"%s\"\n", @@ -740,6 +755,7 @@ after_write:; o->source_fd= -1; } else if(ret==0) { /* eof */ +have_eof:; /* activate eventual follow-up source fd */ if(Cdrfifo_debuG || (flag&1)) fprintf(stderr,"\ncdrfifo %d: on read(%d,buffer,%d): eof\n", diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index b0612b4..414b53e 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2018.09.02.200129" +#define Cdrskin_timestamP "2018.09.06.100353"