aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRon Yorston <rmy@pobox.com>2024-08-02 08:41:25 +0100
committerRon Yorston <rmy@pobox.com>2024-08-02 08:41:25 +0100
commitdab0de7dbe833a44b3e4c20fcd0044f2d878d10d (patch)
tree9246be4dadafaf4853940120eada8865e804fe5c
parentdde99c5ae2511f8509dae85ce33b22d554ce157c (diff)
downloadbusybox-w32-dab0de7dbe833a44b3e4c20fcd0044f2d878d10d.tar.gz
busybox-w32-dab0de7dbe833a44b3e4c20fcd0044f2d878d10d.tar.bz2
busybox-w32-dab0de7dbe833a44b3e4c20fcd0044f2d878d10d.zip
dd: add support for writing to physical drives
A common use of 'dd' is to copy boot images to removable media. This didn't work on Windows because opening a physical drive failed with the default flags used by 'dd'. If the output file is a physical drive remove incompatible flags. Writing to a physical drive requires elevated privileges and the drive must be offline. Adds 80 bytes. (GitHub issue #435)
-rw-r--r--coreutils/dd.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c
index a9ef68fbc..e6b88acf5 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -333,6 +333,17 @@ static void *alloc_buf(size_t size)
333 return xmalloc(size); 333 return xmalloc(size);
334} 334}
335 335
336#if ENABLE_PLATFORM_MINGW32
337// Does 'path' refer to a physical drive in the win32 device namespace?
338static int is_drive_path(const char *path)
339{
340 char *s = auto_string(strdup(path));
341
342 bs_to_slash(s);
343 return strncasecmp(s, "//./PhysicalDrive", 17) == 0;
344}
345#endif
346
336int dd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 347int dd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
337int dd_main(int argc UNUSED_PARAM, char **argv) 348int dd_main(int argc UNUSED_PARAM, char **argv)
338{ 349{
@@ -558,6 +569,12 @@ int dd_main(int argc UNUSED_PARAM, char **argv)
558# endif 569# endif
559 } 570 }
560#endif 571#endif
572#if ENABLE_PLATFORM_MINGW32
573 if (is_drive_path(outfile)) {
574 // Turn off options not supported by Windows device files.
575 oflag &= ~(O_CREAT | O_TRUNC);
576 }
577#endif
561 xmove_fd(xopen(outfile, oflag), ofd); 578 xmove_fd(xopen(outfile, oflag), ofd);
562 579
563#if ENABLE_PLATFORM_MINGW32 580#if ENABLE_PLATFORM_MINGW32