system/dd: emit status messages to stderr (not stdout)

Previously `dd` clobbered its output by writing status messages (e.g.
transfer statistics) to stdout.

Now all status messages are written to stderr.

Signed-off-by: Lars Kruse <devel@sumpfralle.de>
This commit is contained in:
Lars Kruse 2025-09-10 15:27:15 +02:00 • committed by Xiang Xiao
parent 93060aa59d
commit db36c8c617

View file

@ -110,7 +110,8 @@ static int dd_write(FAR struct dd_s *dd)
nbytes = write(dd->outfd, buffer, dd->nbytes - written);
if (nbytes < 0)
{
printf("%s: failed to write: %s\n", g_dd, strerror(errno));
fprintf(stderr, "%s: failed to write: %s\n", g_dd,
strerror(errno));
return ERROR;
}
@ -142,7 +143,7 @@ static int dd_read(FAR struct dd_s *dd)
continue;
}
printf("%s: failed to read: %s\n", g_dd, strerror(errno));
fprintf(stderr, "%s: failed to read: %s\n", g_dd, strerror(errno));
return ERROR;
}
@ -174,7 +175,8 @@ static inline int dd_infopen(FAR const char *name, FAR struct dd_s *dd)
dd->infd = open(name, O_RDONLY);
if (dd->infd < 0)
{
printf("%s: failed to open '%s': %s\n", g_dd, name, strerror(errno));
fprintf(stderr, "%s: failed to open '%s': %s\n", g_dd, name,
strerror(errno));
return ERROR;
}
@ -196,7 +198,8 @@ static inline int dd_outfopen(FAR const char *name, FAR struct dd_s *dd)
dd->outfd = open(name, dd->oflags, 0644);
if (dd->outfd < 0)
{
printf("%s: failed to open '%s': %s\n", g_dd, name, strerror(errno));
fprintf(stderr, "%s: failed to open '%s': %s\n", g_dd, name,
strerror(errno));
return ERROR;
}
@ -212,7 +215,8 @@ static int dd_verify(FAR struct dd_s *dd)
ret = lseek(dd->infd, dd->skip ? dd->skip * dd->sectsize : 0, SEEK_SET);
if (ret < 0)
{
printf("%s: failed to infd lseek: %s\n", g_dd, strerror(errno));
fprintf(stderr, "%s: failed to infd lseek: %s\n", g_dd,
strerror(errno));
return ret;
}
@ -220,7 +224,8 @@ static int dd_verify(FAR struct dd_s *dd)
ret = lseek(dd->outfd, 0, SEEK_SET);
if (ret < 0)
{
printf("%s: failed to outfd lseek: %s\n", g_dd, strerror(errno));
fprintf(stderr, "%s: failed to outfd lseek: %s\n", g_dd,
strerror(errno));
return ret;
}
@ -241,7 +246,7 @@ static int dd_verify(FAR struct dd_s *dd)
ret = read(dd->outfd, buffer, dd->nbytes);
if (ret != dd->nbytes)
{
printf("%s: failed to outfd read: %d\n",
fprintf(stderr, "%s: failed to outfd read: %d\n",
g_dd, ret < 0 ? errno : ret);
break;
}
@ -255,7 +260,8 @@ static int dd_verify(FAR struct dd_s *dd)
snprintf(msg, sizeof(msg), "\noutfile sector %d", sector);
lib_dumpbuffer(msg, buffer, dd->nbytes);
#else
printf("%s: sector %d differs unexpectedly\n", g_dd, sector);
fprintf(stderr, "%s: sector %d differs unexpectedly\n", g_dd,
sector);
#endif
ret = ERROR;
break;
@ -266,7 +272,7 @@ static int dd_verify(FAR struct dd_s *dd)
if (ret < 0)
{
printf("%s: failed to dd verify: %d\n", g_dd, ret);
fprintf(stderr, "%s: failed to dd verify: %d\n", g_dd, ret);
}
free(buffer);
@ -277,10 +283,10 @@ static int dd_verify(FAR struct dd_s *dd)
* Name: print_usage
****************************************************************************/
static void print_usage(void)
static void print_usage(FAR FILE *stream)
{
printf("usage:\n");
printf(" %s [if=<infile>] [of=<outfile>] [bs=<sectsize>] "
fprintf(stream, "usage:\n");
fprintf(stream, " %s [if=<infile>] [of=<outfile>] [bs=<sectsize>] "
"[count=<sectors>] [skip=<sectors>] [seek=<sectors>] [verify] "
"[conv=<nocreat,notrunc>]\n", g_dd);
}
@ -360,7 +366,7 @@ int main(int argc, FAR char **argv)
}
else
{
printf("%s: unknown conversion '%.*s'\n", g_dd,
fprintf(stderr, "%s: unknown conversion '%.*s'\n", g_dd,
(int)len, cur);
goto errout_with_paths;
}
@ -375,7 +381,7 @@ int main(int argc, FAR char **argv)
}
else
{
print_usage();
print_usage(stderr);
goto errout_with_paths;
}
}
@ -384,8 +390,9 @@ int main(int argc, FAR char **argv)
if ((dd.oflags & O_RDONLY) && (infile == NULL || outfile == NULL))
{
printf("%s: invalid parameters: %s\n", g_dd, strerror(EINVAL));
print_usage();
fprintf(stderr, "%s: invalid parameters: %s\n", g_dd,
strerror(EINVAL));
print_usage(stderr);
goto errout_with_paths;
}
@ -394,7 +401,7 @@ int main(int argc, FAR char **argv)
dd.buffer = malloc(dd.sectsize);
if (!dd.buffer)
{
printf("%s: failed to malloc: %s\n", g_dd, strerror(errno));
fprintf(stderr, "%s: failed to malloc: %s\n", g_dd, strerror(errno));
goto errout_with_paths;
}
@ -419,7 +426,8 @@ int main(int argc, FAR char **argv)
ret = lseek(dd.infd, dd.skip * dd.sectsize, SEEK_SET);
if (ret < 0)
{
printf("%s: failed to lseek: %s\n", g_dd, strerror(errno));
fprintf(stderr, "%s: failed to lseek: %s\n", g_dd,
strerror(errno));
ret = ERROR;
goto errout_with_outf;
}
@ -430,7 +438,7 @@ int main(int argc, FAR char **argv)
ret = lseek(dd.outfd, dd.seek * dd.sectsize, SEEK_SET);
if (ret < 0)
{
printf("%s: failed to lseek on output: %s\n",
fprintf(stderr, "%s: failed to lseek on output: %s\n",
g_dd, strerror(errno));
ret = ERROR;
goto errout_with_outf;
@ -483,9 +491,9 @@ int main(int argc, FAR char **argv)
elapsed -= (((uint64_t)ts0.tv_sec * NSEC_PER_SEC) + ts0.tv_nsec);
elapsed /= NSEC_PER_USEC; /* usec */
printf("%" PRIu64 " bytes (%" PRIu32 " blocks) copied, %u usec, ",
fprintf(stderr, "%" PRIu64 " bytes (%" PRIu32 " blocks) copied, %u usec, ",
total, sector, (unsigned int)elapsed);
printf("%u KB/s\n" ,
fprintf(stderr, "%u KB/s\n" ,
(unsigned int)(((double)total / 1024)
/ ((double)elapsed / USEC_PER_SEC)));
#endif
@ -501,7 +509,8 @@ errout_with_outf:
dd.outfd = close(dd.outfd);
if (dd.outfd < 0)
{
printf("%s failed to close outfd:%s\n", g_dd, strerror(errno));
fprintf(stderr, "%s failed to close outfd:%s\n", g_dd,
strerror(errno));
}
}
@ -511,7 +520,8 @@ errout_with_inf:
dd.infd = close(dd.infd);
if (dd.infd < 0)
{
printf("%s failed to close infd:%s\n", g_dd, strerror(errno));
fprintf(stderr, "%s failed to close infd:%s\n", g_dd,
strerror(errno));
}
}