aboutsummaryrefslogtreecommitdiff
path: root/coreutils/dd.c
diff options
context:
space:
mode:
Diffstat (limited to 'coreutils/dd.c')
-rw-r--r--coreutils/dd.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c
index a3c9ababf..a704ca99b 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -203,6 +203,7 @@ static void dd_output_status(int UNUSED_PARAM cur_signal)
203} 203}
204 204
205#if ENABLE_FEATURE_DD_IBS_OBS 205#if ENABLE_FEATURE_DD_IBS_OBS
206# ifdef O_DIRECT
206static int clear_O_DIRECT(int fd) 207static int clear_O_DIRECT(int fd)
207{ 208{
208 if (errno == EINVAL) { 209 if (errno == EINVAL) {
@@ -214,6 +215,7 @@ static int clear_O_DIRECT(int fd)
214 } 215 }
215 return 0; 216 return 0;
216} 217}
218# endif
217#endif 219#endif
218 220
219static ssize_t dd_read(void *ibuf, size_t ibs) 221static ssize_t dd_read(void *ibuf, size_t ibs)
@@ -228,8 +230,10 @@ static ssize_t dd_read(void *ibuf, size_t ibs)
228#endif 230#endif
229 n = safe_read(ifd, ibuf, ibs); 231 n = safe_read(ifd, ibuf, ibs);
230#if ENABLE_FEATURE_DD_IBS_OBS 232#if ENABLE_FEATURE_DD_IBS_OBS
233# ifdef O_DIRECT
231 if (n < 0 && (G.flags & FLAG_IDIRECT) && clear_O_DIRECT(ifd)) 234 if (n < 0 && (G.flags & FLAG_IDIRECT) && clear_O_DIRECT(ifd))
232 goto read_again; 235 goto read_again;
236# endif
233#endif 237#endif
234 return n; 238 return n;
235} 239}
@@ -242,8 +246,10 @@ static bool write_and_stats(const void *buf, size_t len, size_t obs,
242 IF_FEATURE_DD_IBS_OBS(write_again:) 246 IF_FEATURE_DD_IBS_OBS(write_again:)
243 n = full_write(ofd, buf, len); 247 n = full_write(ofd, buf, len);
244#if ENABLE_FEATURE_DD_IBS_OBS 248#if ENABLE_FEATURE_DD_IBS_OBS
249# ifdef O_DIRECT
245 if (n < 0 && (G.flags & FLAG_ODIRECT) && clear_O_DIRECT(ofd)) 250 if (n < 0 && (G.flags & FLAG_ODIRECT) && clear_O_DIRECT(ofd))
246 goto write_again; 251 goto write_again;
252# endif
247#endif 253#endif
248 254
249#if ENABLE_FEATURE_DD_THIRD_STATUS_LINE 255#if ENABLE_FEATURE_DD_THIRD_STATUS_LINE
@@ -506,8 +512,13 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
506 if (infile) { 512 if (infile) {
507 int iflag = O_RDONLY; 513 int iflag = O_RDONLY;
508#if ENABLE_FEATURE_DD_IBS_OBS 514#if ENABLE_FEATURE_DD_IBS_OBS
509 if (G.flags & FLAG_IDIRECT) 515 if (G.flags & FLAG_IDIRECT) {
516# ifdef O_DIRECT
510 iflag |= O_DIRECT; 517 iflag |= O_DIRECT;
518# else
519 bb_error_msg_and_die("O_DIRECT not supported on this platform");
520# endif
521 }
511#endif 522#endif
512 xmove_fd(MINGW_SPECIAL(xopen)(infile, iflag), ifd); 523 xmove_fd(MINGW_SPECIAL(xopen)(infile, iflag), ifd);
513#if ENABLE_PLATFORM_MINGW32 524#if ENABLE_PLATFORM_MINGW32
@@ -524,8 +535,13 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
524 if (G.flags & FLAG_APPEND) 535 if (G.flags & FLAG_APPEND)
525 oflag |= O_APPEND; 536 oflag |= O_APPEND;
526#if ENABLE_FEATURE_DD_IBS_OBS 537#if ENABLE_FEATURE_DD_IBS_OBS
527 if (G.flags & FLAG_ODIRECT) 538 if (G.flags & FLAG_ODIRECT) {
539# ifdef O_DIRECT
528 oflag |= O_DIRECT; 540 oflag |= O_DIRECT;
541# else
542 bb_error_msg_and_die("O_DIRECT not supported on this platform");
543# endif
544 }
529#endif 545#endif
530 xmove_fd(xopen(outfile, oflag), ofd); 546 xmove_fd(xopen(outfile, oflag), ofd);
531 547