diff options
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/dd.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c index 06c1b7b9c..3e034eb1e 100644 --- a/coreutils/dd.c +++ b/coreutils/dd.c | |||
@@ -200,6 +200,7 @@ static void dd_output_status(int UNUSED_PARAM cur_signal) | |||
200 | } | 200 | } |
201 | 201 | ||
202 | #if ENABLE_FEATURE_DD_IBS_OBS | 202 | #if ENABLE_FEATURE_DD_IBS_OBS |
203 | # ifdef O_DIRECT | ||
203 | static int clear_O_DIRECT(int fd) | 204 | static int clear_O_DIRECT(int fd) |
204 | { | 205 | { |
205 | if (errno == EINVAL) { | 206 | if (errno == EINVAL) { |
@@ -211,6 +212,7 @@ static int clear_O_DIRECT(int fd) | |||
211 | } | 212 | } |
212 | return 0; | 213 | return 0; |
213 | } | 214 | } |
215 | # endif | ||
214 | #endif | 216 | #endif |
215 | 217 | ||
216 | static ssize_t dd_read(void *ibuf, size_t ibs) | 218 | static ssize_t dd_read(void *ibuf, size_t ibs) |
@@ -225,8 +227,10 @@ static ssize_t dd_read(void *ibuf, size_t ibs) | |||
225 | #endif | 227 | #endif |
226 | n = safe_read(ifd, ibuf, ibs); | 228 | n = safe_read(ifd, ibuf, ibs); |
227 | #if ENABLE_FEATURE_DD_IBS_OBS | 229 | #if ENABLE_FEATURE_DD_IBS_OBS |
230 | # ifdef O_DIRECT | ||
228 | if (n < 0 && (G.flags & FLAG_IDIRECT) && clear_O_DIRECT(ifd)) | 231 | if (n < 0 && (G.flags & FLAG_IDIRECT) && clear_O_DIRECT(ifd)) |
229 | goto read_again; | 232 | goto read_again; |
233 | # endif | ||
230 | #endif | 234 | #endif |
231 | return n; | 235 | return n; |
232 | } | 236 | } |
@@ -239,8 +243,10 @@ static bool write_and_stats(const void *buf, size_t len, size_t obs, | |||
239 | IF_FEATURE_DD_IBS_OBS(write_again:) | 243 | IF_FEATURE_DD_IBS_OBS(write_again:) |
240 | n = full_write(ofd, buf, len); | 244 | n = full_write(ofd, buf, len); |
241 | #if ENABLE_FEATURE_DD_IBS_OBS | 245 | #if ENABLE_FEATURE_DD_IBS_OBS |
246 | # ifdef O_DIRECT | ||
242 | if (n < 0 && (G.flags & FLAG_ODIRECT) && clear_O_DIRECT(ofd)) | 247 | if (n < 0 && (G.flags & FLAG_ODIRECT) && clear_O_DIRECT(ofd)) |
243 | goto write_again; | 248 | goto write_again; |
249 | # endif | ||
244 | #endif | 250 | #endif |
245 | 251 | ||
246 | #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE | 252 | #if ENABLE_FEATURE_DD_THIRD_STATUS_LINE |
@@ -501,8 +507,13 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
501 | if (infile) { | 507 | if (infile) { |
502 | int iflag = O_RDONLY; | 508 | int iflag = O_RDONLY; |
503 | #if ENABLE_FEATURE_DD_IBS_OBS | 509 | #if ENABLE_FEATURE_DD_IBS_OBS |
504 | if (G.flags & FLAG_IDIRECT) | 510 | if (G.flags & FLAG_IDIRECT) { |
511 | # ifdef O_DIRECT | ||
505 | iflag |= O_DIRECT; | 512 | iflag |= O_DIRECT; |
513 | # else | ||
514 | bb_error_msg_and_die("O_DIRECT not supported on this platform"); | ||
515 | # endif | ||
516 | } | ||
506 | #endif | 517 | #endif |
507 | xmove_fd(xopen(infile, iflag), ifd); | 518 | xmove_fd(xopen(infile, iflag), ifd); |
508 | } else { | 519 | } else { |
@@ -516,8 +527,13 @@ int dd_main(int argc UNUSED_PARAM, char **argv) | |||
516 | if (G.flags & FLAG_APPEND) | 527 | if (G.flags & FLAG_APPEND) |
517 | oflag |= O_APPEND; | 528 | oflag |= O_APPEND; |
518 | #if ENABLE_FEATURE_DD_IBS_OBS | 529 | #if ENABLE_FEATURE_DD_IBS_OBS |
519 | if (G.flags & FLAG_ODIRECT) | 530 | if (G.flags & FLAG_ODIRECT) { |
531 | # ifdef O_DIRECT | ||
520 | oflag |= O_DIRECT; | 532 | oflag |= O_DIRECT; |
533 | # else | ||
534 | bb_error_msg_and_die("O_DIRECT not supported on this platform"); | ||
535 | # endif | ||
536 | } | ||
521 | #endif | 537 | #endif |
522 | xmove_fd(xopen(outfile, oflag), ofd); | 538 | xmove_fd(xopen(outfile, oflag), ofd); |
523 | 539 | ||