From 43e1daab23ff4465b1900d677e96f99da71c83f1 Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Fri, 7 Feb 2014 18:08:28 +0000 Subject: [PATCH] Avoiding to have two file descriptors open to the same stdio drive --- cdrskin/cdrskin_timestamp.h | 2 +- libburn/write.c | 28 ++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/cdrskin/cdrskin_timestamp.h b/cdrskin/cdrskin_timestamp.h index 1b6803c..be6f862 100644 --- a/cdrskin/cdrskin_timestamp.h +++ b/cdrskin/cdrskin_timestamp.h @@ -1 +1 @@ -#define Cdrskin_timestamP "2014.02.05.191839" +#define Cdrskin_timestamP "2014.02.07.180650" diff --git a/libburn/write.c b/libburn/write.c index 5ccf9cd..9c3b0af 100644 --- a/libburn/write.c +++ b/libburn/write.c @@ -3151,6 +3151,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address, char *data, off_t data_count, int flag) { int alignment = 0, start, upto, chunksize, err, fd = -1, ret; + int do_close = 0, getfl_ret; char msg[81], *rpt; struct buffer *buf = NULL, *buffer_mem = d->buffer; @@ -3223,10 +3224,25 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address, "Drive is busy on attempt to write random access",0,0); {ret = 0; goto ex;} } - if(d->drive_role != 1) { - fd = burn_stdio_open_write(d, byte_address, 2048, 0); - if (fd == -1) - {ret = 0; goto ex;} + if (d->drive_role != 1) { + if (d->stdio_fd >= 0) { + /* Avoid to have a read-only fd open */ + getfl_ret = fcntl(d->stdio_fd, F_GETFL); + if (((O_RDWR | O_WRONLY | O_RDONLY) & getfl_ret) == + O_RDONLY) { + close(d->stdio_fd); + d->stdio_fd = -1; + } + } + if (d->stdio_fd >= 0) { + /* Avoid to have two fds open */ + fd = d->stdio_fd; + } else { + fd = burn_stdio_open_write(d, byte_address, 2048, 0); + if (fd == -1) + {ret = 0; goto ex;} + do_close = 1; + } } d->cancel = 0; d->busy = BURN_DRIVE_WRITING_SYNC; @@ -3255,7 +3271,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address, } if (err == BE_CANCELLED) { d->busy = BURN_DRIVE_IDLE; - if(fd >= 0) + if(fd >= 0 && do_close) close(fd); {ret = -(start * 2048 - byte_address); goto ex;} } @@ -3271,7 +3287,7 @@ int burn_random_access_write(struct burn_drive *d, off_t byte_address, d->needs_sync_cache = 0; } - if(fd >= 0) + if(fd >= 0 && do_close) close(fd); d->buffer = buffer_mem; d->busy = BURN_DRIVE_IDLE;