From 33a57979738e5ab13950ec1c0e7298e41ef50929 Mon Sep 17 00:00:00 2001
From: Patrick Ohly <patrick.ohly@intel.com>
Date: Thu, 23 Feb 2017 18:10:47 +0100
Subject: [PATCH] aslfiles.c: manipulate fds instead of FILE

Copying what stdout/stderr point to is not portable and fails with
musl because FILE is an undefined struct.

Instead, use lower-level Unix functions to modify the file that stderr
writes into. This works on the platforms that Yocto targets.

Upstream-Status: Inappropriate [embedded specific]

Signed-off-by: Patrick Ohly <patrick.ohly@intel.com>
---
 source/compiler/aslfiles.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/source/compiler/aslfiles.c b/source/compiler/aslfiles.c
index 947e465..7a352b4 100644
--- a/source/compiler/aslfiles.c
+++ b/source/compiler/aslfiles.c
@@ -44,6 +44,11 @@
 #include "aslcompiler.h"
 #include "acapps.h"
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
 #define _COMPONENT          ACPI_COMPILER
         ACPI_MODULE_NAME    ("aslfiles")
 
@@ -569,6 +574,8 @@ FlOpenMiscOutputFiles (
 
     if (Gbl_DebugFlag)
     {
+        int fd;
+
         Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
         if (!Filename)
         {
@@ -582,20 +589,15 @@ FlOpenMiscOutputFiles (
         /* TBD: hide this behind a FlReopenFile function */
 
         Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
-        Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
-            freopen (Filename, "w+t", stderr);
-
-        if (!Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle)
+        fd = open(Filename, O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
+        if (fd < 0 ||
+            dup2(fd, fileno(stderr)))
         {
-            /*
-             * A problem with freopen is that on error,
-             * we no longer have stderr.
-             */
             Gbl_DebugFlag = FALSE;
-            memcpy (stderr, stdout, sizeof (FILE));
             FlFileError (ASL_FILE_DEBUG_OUTPUT, ASL_MSG_DEBUG_FILENAME);
             AslAbort ();
         }
+        Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle = stderr;
 
         AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
         AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
-- 
2.1.4

