2007/10/3, Kazuo TAKADA &lt;<a href="mailto:kztakada@sm.sony.co.jp">kztakada@sm.sony.co.jp</a>&gt;:<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi,<br><br>If the dd command fails in a sequence of copying, it always returns<br>EXIT_SUCCESS.&nbsp;&nbsp;So, I can&#39;t judge whether the command had succeeded or<br>failed.<br><br>Its behavior doesn&#39;t conform to POSIX.<br><br>
&nbsp;&nbsp;POSIX 1003.1:<br>&nbsp;&nbsp;<a href="http://www.opengroup.org/onlinepubs/009695399/utilities/dd.html">http://www.opengroup.org/onlinepubs/009695399/utilities/dd.html</a><br>&nbsp;&nbsp;| EXIT STATUS<br>&nbsp;&nbsp;| The following exit values shall be returned:
<br>&nbsp;&nbsp;|<br>&nbsp;&nbsp;|&nbsp;&nbsp;0<br>&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp; The input file was copied successfully.<br>&nbsp;&nbsp;| &gt;0<br>&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp; An error occurred.<br><br>For example, copy some data to a small size device repeatly.<br><br>--------------------------------------------------
<br>(with a root account)<br># ./busybox dd if=/dev/zero of=/dev/ram<br>dd: writing &#39;/dev/ram&#39;: No space left on device<br>32769+0 records in<br>32768+0 records out<br># echo $?<br>0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;= should be failed!!
<br><br># ./busybox dd if=/dev/zero of=/dev/ram count=1<br>1+0 records in<br>1+0 records out<br># echo $?<br>0<br><br># /bin/dd if=/dev/zero of=/dev/ram&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;= GNU&#39;s one<br>dd: writing to `/dev/ram&#39;: No space left on device
<br>32769+0 records in<br>32768+0 records out<br># echo $?<br>1<br>--------------------------------------------------<br><br>The old busybox-1.2.2.1 returns EXIT_FAILURE.&nbsp;&nbsp;It is the version that<br>dd had not reconstructed yet.
<br><br>Can you accept the patch below?<br>write_and_stats() is the function which returns a bool value.<br><br>----------------------------------------------------------------------<br>--- coreutils/dd.c.orig 2007-09-03 20:48:
39.000000000 +0900<br>+++ coreutils/dd.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-10-03 10:31:50.000000000 +0900<br>@@ -106,7 +106,7 @@<br> #endif<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_t ibs = 512, obs = 512;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssize_t n, w;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssize_t n, w = 0;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *ibuf, *obuf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* And these are all zeroed at once! */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct {<br>@@ -303,13 +303,17 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp += d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc += d;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (oc == obs) {
<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (write_and_stats(ofd, obuf, obs, obs, outfile))<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (write_and_stats(ofd, obuf, obs, obs, outfile)) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w = -1;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto out_status;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (write_and_stats(ofd, ibuf, n, obs, outfile))<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (write_and_stats(ofd, ibuf, n, obs, outfile)) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w = -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto out_status;
<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ENABLE_FEATURE_DD_IBS_OBS &amp;&amp; oc) {<br>@@ -330,5 +334,5 @@<br>&nbsp;&nbsp;out_status:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dd_output_status(0);<br><br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EXIT_SUCCESS;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (w &gt;= 0 ? EXIT_SUCCESS : EXIT_FAILURE);
<br> }<br>----------------------------------------------------------------------</blockquote><div><br>&nbsp; &nbsp; It may be faster to do <br><br>if ((w = write_and_stats(...)))<br>&nbsp; goto out_status;<br><br>&nbsp; and<br><br>return w;<br>
<br>&nbsp; because write_and_stats returns 1 on failure. You can even tweak<br>&nbsp; it to return either EXIT_SUCCESS or EXIT_FAILURE and change the<br>&nbsp; if to:<br><br>if ((w = write_and_stats(...)) == EXIT_SUCCESS)<br>&nbsp; goto out_status;
<br><br>&nbsp; (which is the same but symbolically different).<br> </div><br></div>&nbsp;&nbsp;&nbsp;&nbsp; Loïc<br>