Advertisement
Guest User

Untitled

a guest
Jul 25th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. From 21253610f9ef87db8e2a75b863b7fcfbd0cdb421 Mon Sep 17 00:00:00 2001
  2. From: "Darrick J. Wong" <darrick.wong@oracle.com>
  3. Date: Tue, 25 Jul 2017 13:45:01 -0500
  4. Subject: [PATCH] In patch 4944defad4 ("xfs_db: redirect printfs when
  5. metadumping to stdout"), we solved the problem of xfs_db printfs ending up in
  6. the metadump stream by reassigning stdout for the duration of a stdout
  7. metadump. Unfortunately, musl doesn't allow stdout to be reassigned (in
  8. their view "extern FILE *stdout" means "extern FILE * const stdout"), so we
  9. abandon the old approach in favor of playing games with dup() to switch the
  10. raw file descriptors.
  11.  
  12. While we're at it, fix a regression where an unconverted outf test
  13. allows progress info to end up in the metadump stream.
  14.  
  15. Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
  16. ---
  17. db/metadump.c | 47 ++++++++++++++++++++++++++++++++++++-----------
  18. 1 file changed, 36 insertions(+), 11 deletions(-)
  19.  
  20. diff --git a/db/metadump.c b/db/metadump.c
  21. index 96641e0..4e2f648 100644
  22. --- a/db/metadump.c
  23. +++ b/db/metadump.c
  24. @@ -78,6 +78,7 @@ static int obfuscate = 1;
  25. static int zero_stale_data = 1;
  26. static int show_warnings = 0;
  27. static int progress_since_warning = 0;
  28. +static bool stdout_metadump;
  29.  
  30. void
  31. metadump_init(void)
  32. @@ -137,7 +138,7 @@ print_progress(const char *fmt, ...)
  33. va_end(ap);
  34. buf[sizeof(buf)-1] = '\0';
  35.  
  36. - f = (outf == stdout) ? stderr : stdout;
  37. + f = stdout_metadump ? stderr : stdout;
  38. fprintf(f, "\r%-59s", buf);
  39. fflush(f);
  40. progress_since_warning = 1;
  41. @@ -2750,7 +2751,8 @@ metadump_f(
  42. xfs_agnumber_t agno;
  43. int c;
  44. int start_iocur_sp;
  45. - bool stdout_metadump = false;
  46. + int outfd = -1;
  47. + int ret;
  48. char *p;
  49.  
  50. exitcode = 1;
  51. @@ -2870,16 +2872,35 @@ metadump_f(
  52. * metadump operation so that dbprintf and other messages
  53. * are sent to the console instead of polluting the
  54. * metadump stream.
  55. + *
  56. + * We get to do this the hard way because musl doesn't
  57. + * allow reassignment of stdout.
  58. */
  59. - outf = stdout;
  60. - stdout = stderr;
  61. + fflush(stdout);
  62. + outfd = dup(STDOUT_FILENO);
  63. + if (outfd < 0) {
  64. + perror("opening dump stream");
  65. + goto out;
  66. + }
  67. + ret = dup2(STDERR_FILENO, STDOUT_FILENO);
  68. + if (ret < 0) {
  69. + perror("redirecting stdout");
  70. + close(outfd);
  71. + goto out;
  72. + }
  73. + outf = fdopen(outfd, "a");
  74. + if (outf == NULL) {
  75. + fprintf(stderr, "cannot create dump stream\n");
  76. + dup2(outfd, 1);
  77. + close(outfd);
  78. + goto out;
  79. + }
  80. stdout_metadump = true;
  81. } else {
  82. outf = fopen(argv[optind], "wb");
  83. if (outf == NULL) {
  84. print_warning("cannot create dump file");
  85. - free(metablock);
  86. - return 0;
  87. + goto out;
  88. }
  89. }
  90.  
  91. @@ -2907,15 +2928,19 @@ metadump_f(
  92. if (progress_since_warning)
  93. fputc('\n', stdout_metadump ? stderr : stdout);
  94.  
  95. - if (stdout_metadump)
  96. - stdout = outf;
  97. - else
  98. - fclose(outf);
  99. + if (stdout_metadump) {
  100. + fflush(outf);
  101. + fflush(stdout);
  102. + ret = dup2(outfd, STDOUT_FILENO);
  103. + if (ret < 0)
  104. + perror("un-redirecting stdout");
  105. + }
  106. + fclose(outf);
  107.  
  108. /* cleanup iocur stack */
  109. while (iocur_sp > start_iocur_sp)
  110. pop_cur();
  111. -
  112. +out:
  113. free(metablock);
  114.  
  115. return 0;
  116. --
  117. 2.13.3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement