aboutsummaryrefslogtreecommitdiff
path: root/coreutils
diff options
context:
space:
mode:
Diffstat (limited to 'coreutils')
-rw-r--r--coreutils/dd.c20
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
203static int clear_O_DIRECT(int fd) 204static 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
216static ssize_t dd_read(void *ibuf, size_t ibs) 218static 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