Skip to content

Commit db36c8c

Browse files
sumpfrallexiaoxiang781216
authored andcommitted
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>
1 parent 93060aa commit db36c8c

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

system/dd/dd_main.c

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ static int dd_write(FAR struct dd_s *dd)
110110
nbytes = write(dd->outfd, buffer, dd->nbytes - written);
111111
if (nbytes < 0)
112112
{
113-
printf("%s: failed to write: %s\n", g_dd, strerror(errno));
113+
fprintf(stderr, "%s: failed to write: %s\n", g_dd,
114+
strerror(errno));
114115
return ERROR;
115116
}
116117

@@ -142,7 +143,7 @@ static int dd_read(FAR struct dd_s *dd)
142143
continue;
143144
}
144145

145-
printf("%s: failed to read: %s\n", g_dd, strerror(errno));
146+
fprintf(stderr, "%s: failed to read: %s\n", g_dd, strerror(errno));
146147
return ERROR;
147148
}
148149

@@ -174,7 +175,8 @@ static inline int dd_infopen(FAR const char *name, FAR struct dd_s *dd)
174175
dd->infd = open(name, O_RDONLY);
175176
if (dd->infd < 0)
176177
{
177-
printf("%s: failed to open '%s': %s\n", g_dd, name, strerror(errno));
178+
fprintf(stderr, "%s: failed to open '%s': %s\n", g_dd, name,
179+
strerror(errno));
178180
return ERROR;
179181
}
180182

@@ -196,7 +198,8 @@ static inline int dd_outfopen(FAR const char *name, FAR struct dd_s *dd)
196198
dd->outfd = open(name, dd->oflags, 0644);
197199
if (dd->outfd < 0)
198200
{
199-
printf("%s: failed to open '%s': %s\n", g_dd, name, strerror(errno));
201+
fprintf(stderr, "%s: failed to open '%s': %s\n", g_dd, name,
202+
strerror(errno));
200203
return ERROR;
201204
}
202205

@@ -212,15 +215,17 @@ static int dd_verify(FAR struct dd_s *dd)
212215
ret = lseek(dd->infd, dd->skip ? dd->skip * dd->sectsize : 0, SEEK_SET);
213216
if (ret < 0)
214217
{
215-
printf("%s: failed to infd lseek: %s\n", g_dd, strerror(errno));
218+
fprintf(stderr, "%s: failed to infd lseek: %s\n", g_dd,
219+
strerror(errno));
216220
return ret;
217221
}
218222

219223
dd->eof = 0;
220224
ret = lseek(dd->outfd, 0, SEEK_SET);
221225
if (ret < 0)
222226
{
223-
printf("%s: failed to outfd lseek: %s\n", g_dd, strerror(errno));
227+
fprintf(stderr, "%s: failed to outfd lseek: %s\n", g_dd,
228+
strerror(errno));
224229
return ret;
225230
}
226231

@@ -241,7 +246,7 @@ static int dd_verify(FAR struct dd_s *dd)
241246
ret = read(dd->outfd, buffer, dd->nbytes);
242247
if (ret != dd->nbytes)
243248
{
244-
printf("%s: failed to outfd read: %d\n",
249+
fprintf(stderr, "%s: failed to outfd read: %d\n",
245250
g_dd, ret < 0 ? errno : ret);
246251
break;
247252
}
@@ -255,7 +260,8 @@ static int dd_verify(FAR struct dd_s *dd)
255260
snprintf(msg, sizeof(msg), "\noutfile sector %d", sector);
256261
lib_dumpbuffer(msg, buffer, dd->nbytes);
257262
#else
258-
printf("%s: sector %d differs unexpectedly\n", g_dd, sector);
263+
fprintf(stderr, "%s: sector %d differs unexpectedly\n", g_dd,
264+
sector);
259265
#endif
260266
ret = ERROR;
261267
break;
@@ -266,7 +272,7 @@ static int dd_verify(FAR struct dd_s *dd)
266272

267273
if (ret < 0)
268274
{
269-
printf("%s: failed to dd verify: %d\n", g_dd, ret);
275+
fprintf(stderr, "%s: failed to dd verify: %d\n", g_dd, ret);
270276
}
271277

272278
free(buffer);
@@ -277,10 +283,10 @@ static int dd_verify(FAR struct dd_s *dd)
277283
* Name: print_usage
278284
****************************************************************************/
279285

280-
static void print_usage(void)
286+
static void print_usage(FAR FILE *stream)
281287
{
282-
printf("usage:\n");
283-
printf(" %s [if=<infile>] [of=<outfile>] [bs=<sectsize>] "
288+
fprintf(stream, "usage:\n");
289+
fprintf(stream, " %s [if=<infile>] [of=<outfile>] [bs=<sectsize>] "
284290
"[count=<sectors>] [skip=<sectors>] [seek=<sectors>] [verify] "
285291
"[conv=<nocreat,notrunc>]\n", g_dd);
286292
}
@@ -360,7 +366,7 @@ int main(int argc, FAR char **argv)
360366
}
361367
else
362368
{
363-
printf("%s: unknown conversion '%.*s'\n", g_dd,
369+
fprintf(stderr, "%s: unknown conversion '%.*s'\n", g_dd,
364370
(int)len, cur);
365371
goto errout_with_paths;
366372
}
@@ -375,7 +381,7 @@ int main(int argc, FAR char **argv)
375381
}
376382
else
377383
{
378-
print_usage();
384+
print_usage(stderr);
379385
goto errout_with_paths;
380386
}
381387
}
@@ -384,8 +390,9 @@ int main(int argc, FAR char **argv)
384390

385391
if ((dd.oflags & O_RDONLY) && (infile == NULL || outfile == NULL))
386392
{
387-
printf("%s: invalid parameters: %s\n", g_dd, strerror(EINVAL));
388-
print_usage();
393+
fprintf(stderr, "%s: invalid parameters: %s\n", g_dd,
394+
strerror(EINVAL));
395+
print_usage(stderr);
389396
goto errout_with_paths;
390397
}
391398

@@ -394,7 +401,7 @@ int main(int argc, FAR char **argv)
394401
dd.buffer = malloc(dd.sectsize);
395402
if (!dd.buffer)
396403
{
397-
printf("%s: failed to malloc: %s\n", g_dd, strerror(errno));
404+
fprintf(stderr, "%s: failed to malloc: %s\n", g_dd, strerror(errno));
398405
goto errout_with_paths;
399406
}
400407

@@ -419,7 +426,8 @@ int main(int argc, FAR char **argv)
419426
ret = lseek(dd.infd, dd.skip * dd.sectsize, SEEK_SET);
420427
if (ret < 0)
421428
{
422-
printf("%s: failed to lseek: %s\n", g_dd, strerror(errno));
429+
fprintf(stderr, "%s: failed to lseek: %s\n", g_dd,
430+
strerror(errno));
423431
ret = ERROR;
424432
goto errout_with_outf;
425433
}
@@ -430,7 +438,7 @@ int main(int argc, FAR char **argv)
430438
ret = lseek(dd.outfd, dd.seek * dd.sectsize, SEEK_SET);
431439
if (ret < 0)
432440
{
433-
printf("%s: failed to lseek on output: %s\n",
441+
fprintf(stderr, "%s: failed to lseek on output: %s\n",
434442
g_dd, strerror(errno));
435443
ret = ERROR;
436444
goto errout_with_outf;
@@ -483,9 +491,9 @@ int main(int argc, FAR char **argv)
483491
elapsed -= (((uint64_t)ts0.tv_sec * NSEC_PER_SEC) + ts0.tv_nsec);
484492
elapsed /= NSEC_PER_USEC; /* usec */
485493

486-
printf("%" PRIu64 " bytes (%" PRIu32 " blocks) copied, %u usec, ",
494+
fprintf(stderr, "%" PRIu64 " bytes (%" PRIu32 " blocks) copied, %u usec, ",
487495
total, sector, (unsigned int)elapsed);
488-
printf("%u KB/s\n" ,
496+
fprintf(stderr, "%u KB/s\n" ,
489497
(unsigned int)(((double)total / 1024)
490498
/ ((double)elapsed / USEC_PER_SEC)));
491499
#endif
@@ -501,7 +509,8 @@ int main(int argc, FAR char **argv)
501509
dd.outfd = close(dd.outfd);
502510
if (dd.outfd < 0)
503511
{
504-
printf("%s failed to close outfd:%s\n", g_dd, strerror(errno));
512+
fprintf(stderr, "%s failed to close outfd:%s\n", g_dd,
513+
strerror(errno));
505514
}
506515
}
507516

@@ -511,7 +520,8 @@ int main(int argc, FAR char **argv)
511520
dd.infd = close(dd.infd);
512521
if (dd.infd < 0)
513522
{
514-
printf("%s failed to close infd:%s\n", g_dd, strerror(errno));
523+
fprintf(stderr, "%s failed to close infd:%s\n", g_dd,
524+
strerror(errno));
515525
}
516526
}
517527

0 commit comments

Comments
 (0)