From cbc5664d370230803ac25705485ef1c6ed5f8416 Mon Sep 17 00:00:00 2001
From: Alberto Gonzalez <boqwxp@airmail.cc>
Date: Mon, 16 Mar 2020 16:42:04 +0000
Subject: [PATCH] Clean up `exec` code according to review.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Co-Authored-By: Miodrag Milanović <mmicko@gmail.com>
---
 passes/cmds/exec.cc | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/passes/cmds/exec.cc b/passes/cmds/exec.cc
index ec7b5b377..7b5428f16 100644
--- a/passes/cmds/exec.cc
+++ b/passes/cmds/exec.cc
@@ -20,7 +20,16 @@
 #include "kernel/register.h"
 #include "kernel/log.h"
 #include <cstdio>
-#include <sys/wait.h>
+
+#if defined(_WIN32)
+#  define WIFEXITED(x) 1
+#  define WIFSIGNALED(x) 0
+#  define WIFSTOPPED(x) 0
+#  define WEXITSTATUS(x) ((x) & 0xff)
+#  define WTERMSIG(x) SIGTERM
+#else
+#  include <sys/wait.h>
+#endif
 
 USING_YOSYS_NAMESPACE
 PRIVATE_NAMESPACE_BEGIN
@@ -63,7 +72,7 @@ struct ExecPass : public Pass {
 	void execute(std::vector<std::string> args, RTLIL::Design *design) YS_OVERRIDE
 	{
 		std::string cmd = "";
-		char buf[4096] = {};
+		char buf[1024] = {};
 		std::string linebuf = "";
 		bool flag_cmd = false;
 		bool flag_quiet = false;
@@ -139,7 +148,11 @@ struct ExecPass : public Pass {
 
 		fflush(stdout);
 		bool keep_reading = true;
-		auto *f = popen(cmd.c_str(), "r");
+		int status = 0;
+		int retval = 0;
+
+#ifndef EMSCRIPTEN
+		FILE *f = popen(cmd.c_str(), "r");
 		if (f == nullptr)
 			log_cmd_error("errno %d after popen() returned NULL.\n", errno);
 		while (keep_reading) {
@@ -162,8 +175,8 @@ struct ExecPass : public Pass {
 				pos = linebuf.find('\n');
 			}
 		}
-		int status = pclose(f);
-		int retval = -1;
+		status = pclose(f);
+#endif
 
 		if(WIFEXITED(status)) {
 		    retval = WEXITSTATUS(status);