[geany/geany] 47a7b5: Remove the unneeded win32_spawn() and win32_get_exit_status()

Dimitar Zhekov git-noreply at xxxxx
Fri May 15 17:07:40 UTC 2015


Branch:      refs/heads/master
Author:      Dimitar Zhekov <dimitar.zhekov at gmail.com>
Committer:   Dimitar Zhekov <dimitar.zhekov at gmail.com>
Date:        Mon, 30 Mar 2015 17:33:55 UTC
Commit:      47a7b507a7f0d4febf94d58368572b4db644856d
             https://github.com/geany/geany/commit/47a7b507a7f0d4febf94d58368572b4db644856d

Log Message:
-----------
Remove the unneeded win32_spawn() and win32_get_exit_status()

These are not part of the plugin interface, and are not used in Geany
any more after the spawn changes.


Modified Paths:
--------------
    src/win32.c
    src/win32.h

Modified: src/win32.c
493 lines changed, 0 insertions(+), 493 deletions(-)
===================================================================
@@ -57,31 +57,6 @@
 #include <glib/gstdio.h>
 #include <gdk/gdkwin32.h>
 
-#define BUFSIZE 4096
-#define CMDSIZE 32768
-
-struct _geany_win32_spawn
-{
-	HANDLE hChildStdinRd;
-	HANDLE hChildStdinWr;
-	HANDLE hChildStdoutRd;
-	HANDLE hChildStdoutWr;
-	HANDLE hChildStderrRd;
-	HANDLE hChildStderrWr;
-	HANDLE hInputFile;
-	HANDLE hStdout;
-	HANDLE hStderr;
-	HANDLE processId;
-	DWORD dwExitCode;
-};
-typedef struct _geany_win32_spawn geany_win32_spawn;
-
-static gboolean GetContentFromHandle(HANDLE hFile, gchar **content, GError **error);
-static HANDLE GetTempFileHandle(GError **error);
-static gboolean CreateChildProcess(geany_win32_spawn *gw_spawn, TCHAR *szCmdline,
-		const TCHAR *dir, GError **error);
-static VOID ReadFromPipe(HANDLE hRead, HANDLE hWrite, HANDLE hFile, GError **error);
-
 
 /* The timer handle used to refresh windows below modal native dialogs. If
  * ever more than one dialog can be shown at a time, this needs to be changed
@@ -837,17 +812,6 @@ void win32_open_browser(const gchar *uri)
 }
 
 
-/* Returns TRUE if the command, which child_pid refers to, returned with a successful exit code,
- * otherwise FALSE. */
-gboolean win32_get_exit_status(GPid child_pid)
-{
-	DWORD exit_code;
-	GetExitCodeProcess(child_pid, &exit_code);
-
-	return (exit_code == 0);
-}
-
-
 static FILE *open_std_handle(DWORD handle, const char *mode)
 {
 	HANDLE lStdHandle;
@@ -929,299 +893,7 @@ void win32_init_debug_code(void)
 		/* create a console window to get log messages on Windows,
 		 * especially useful when generating tags files */
 		debug_setup_console();
-		/* Enable GLib process spawn debug mode when Geany was started with the debug flag */
-		g_setenv("G_SPAWN_WIN32_DEBUG", "1", FALSE);
-	}
-}
-
-
-static gchar *create_temp_file(void)
-{
-	gchar *name;
-	gint fd;
-
-	fd = g_file_open_tmp("tmp_XXXXXX", &name, NULL);
-	if (fd == -1)
-		name = NULL;
-	else
-		close(fd);
-
-	return name;
-}
-
-
-/* Sometimes this blocks for 30s before aborting when there are several
- * pages of (error) output and sometimes hangs - see the FIXME.
- * Also gw_spawn.dwExitCode seems to be not set properly. */
-/* Process spawning implementation for Windows, by Pierre Joye.
- * Don't call this function directly, use utils_spawn_[a]sync() instead. */
-static
-gboolean _broken_win32_spawn(const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags,
-					 gchar **std_out, gchar **std_err, gint *exit_status, GError **error)
-{
-	TCHAR  buffer[CMDSIZE]=TEXT("");
-	TCHAR  cmdline[CMDSIZE] = TEXT("");
-	TCHAR* lpPart[CMDSIZE]={NULL};
-	DWORD  retval = 0;
-	gint argc = 0, i;
-	gint cmdpos = 0;
-
-	SECURITY_ATTRIBUTES saAttr;
-	BOOL fSuccess;
-	geany_win32_spawn gw_spawn;
-
-	/* Temp file */
-	HANDLE hStdoutTempFile = NULL;
-	HANDLE hStderrTempFile = NULL;
-
-	gchar *stdout_content = NULL;
-	gchar *stderr_content = NULL;
-
-	while (argv[argc])
-	{
-		++argc;
-	}
-	g_return_val_if_fail (std_out == NULL ||
-						!(flags & G_SPAWN_STDOUT_TO_DEV_NULL), FALSE);
-	g_return_val_if_fail (std_err == NULL ||
-						!(flags & G_SPAWN_STDERR_TO_DEV_NULL), FALSE);
-
-	if (flags & G_SPAWN_SEARCH_PATH)
-	{
-		retval = SearchPath(NULL, argv[0], ".exe", sizeof(buffer), buffer, lpPart);
-		if (retval > 0)
-			g_snprintf(cmdline, sizeof(cmdline), "\"%s\"", buffer);
-		else
-			g_strlcpy(cmdline, argv[0], sizeof(cmdline));
-		cmdpos = 1;
-	}
-
-	for (i = cmdpos; i < argc; i++)
-	{
-		g_snprintf(cmdline, sizeof(cmdline), "%s %s", cmdline, argv[i]);
-		/*MessageBox(NULL, cmdline, cmdline, MB_OK);*/
-	}
-
-	if (std_err != NULL)
-	{
-		hStderrTempFile = GetTempFileHandle(error);
-		if (hStderrTempFile == INVALID_HANDLE_VALUE)
-		{
-			gchar *msg = g_win32_error_message(GetLastError());
-			geany_debug("win32_spawn: Second CreateFile failed (%d)", (gint) GetLastError());
-			g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR, "%s", msg);
-			g_free(msg);
-			return FALSE;
-		}
-	}
-
-	if (std_out != NULL)
-	{
-		hStdoutTempFile = GetTempFileHandle(error);
-		if (hStdoutTempFile == INVALID_HANDLE_VALUE)
-		{
-			gchar *msg = g_win32_error_message(GetLastError());
-			geany_debug("win32_spawn: Second CreateFile failed (%d)", (gint) GetLastError());
-			g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR, "%s", msg);
-			g_free(msg);
-			return FALSE;
-		}
-	}
-
-	/* Set the bInheritHandle flag so pipe handles are inherited. */
-	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
-	saAttr.bInheritHandle = TRUE;
-	saAttr.lpSecurityDescriptor = NULL;
-
-	/* Get the handle to the current STDOUT and STDERR. */
-	gw_spawn.hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
-	gw_spawn.hStderr = GetStdHandle(STD_ERROR_HANDLE);
-	gw_spawn.dwExitCode = 0;
-
-	/* Create a pipe for the child process's STDOUT. */
-	if (! CreatePipe(&(gw_spawn.hChildStdoutRd), &(gw_spawn.hChildStdoutWr), &saAttr, 0))
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("win32_spawn: Stdout pipe creation failed (%d)", (gint) GetLastError());
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR_PIPE, "%s", msg);
-		g_free(msg);
-		return FALSE;
-	}
-
-	/* Ensure that the read handle to the child process's pipe for STDOUT is not inherited.*/
-	SetHandleInformation(gw_spawn.hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);
-
-	/* Create a pipe for the child process's STDERR. */
-	if (! CreatePipe(&(gw_spawn.hChildStderrRd), &(gw_spawn.hChildStderrWr), &saAttr, 0))
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("win32_spawn: Stderr pipe creation failed");
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR_PIPE, "%s", msg);
-		g_free(msg);
-		return FALSE;
-	}
-
-	/* Ensure that the read handle to the child process's pipe for STDOUT is not inherited.*/
-	SetHandleInformation(gw_spawn.hChildStderrRd, HANDLE_FLAG_INHERIT, 0);
-
-	/* Create a pipe for the child process's STDIN.  */
-	if (! CreatePipe(&(gw_spawn.hChildStdinRd), &(gw_spawn.hChildStdinWr), &saAttr, 0))
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("win32_spawn: Stdin pipe creation failed");
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR_PIPE, "%s", msg);
-		g_free(msg);
-		return FALSE;
-	}
-
-	/* Ensure that the write handle to the child process's pipe for STDIN is not inherited. */
-	SetHandleInformation(gw_spawn.hChildStdinWr, HANDLE_FLAG_INHERIT, 0);
-
-	/* Now create the child process. */
-	fSuccess = CreateChildProcess(&gw_spawn, cmdline, dir, error);
-	if (exit_status)
-	{
-		*exit_status = gw_spawn.dwExitCode;
-	}
-
-	if (! fSuccess)
-	{
-		geany_debug("win32_spawn: Create process failed");
-		return FALSE;
-	}
-
-	/* Read from pipe that is the standard output for child process. */
-	if (std_out != NULL)
-	{
-		ReadFromPipe(gw_spawn.hChildStdoutRd, gw_spawn.hChildStdoutWr, hStdoutTempFile, error);
-		if (! GetContentFromHandle(hStdoutTempFile, &stdout_content, error))
-		{
-			return FALSE;
-		}
-		*std_out = stdout_content;
-	}
-
-	if (std_err != NULL)
-	{
-		ReadFromPipe(gw_spawn.hChildStderrRd, gw_spawn.hChildStderrWr, hStderrTempFile, error);
-		if (! GetContentFromHandle(hStderrTempFile, &stderr_content, error))
-		{
-			return FALSE;
-		}
-		*std_err = stderr_content;
-	}
-	return TRUE;
-}
-
-
-/* Note: g_spawn is broken for receiving both stdio and stderr e.g. when
- * running make and there are compile errors. See glib/giowin32.c header
- * comment about Windows bugs, e.g. #338943 */
-/* Simple replacement for _broken_win32_spawn().
- * flags is ignored, G_SPAWN_SEARCH_PATH is implied.
- * Don't call this function directly, use utils_spawn_[a]sync() instead.
- * Adapted from tm_workspace_create_global_tags(). */
-gboolean win32_spawn(const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags,
-					 gchar **std_out, gchar **std_err, gint *exit_status, GError **error)
-{
-	gint ret;
-	gboolean fail;
-	gchar *tmp_file = create_temp_file();
-	gchar *tmp_errfile = create_temp_file();
-	gchar *command;
-	gchar *locale_command;
-
-	if (env != NULL)
-	{
-		return _broken_win32_spawn(dir, argv, env, flags, std_out, std_err,
-			exit_status, error);
-	}
-	if (!tmp_file || !tmp_errfile)
-	{
-		g_warning("%s: Could not create temporary files!", G_STRFUNC);
-		return FALSE;
-	}
-	command = g_strjoinv(" ", argv);
-	SETPTR(command, g_strdup_printf("cmd.exe /S /C \"%s >%s 2>%s\"",
-		command, tmp_file, tmp_errfile));
-	locale_command = g_locale_from_utf8(command, -1, NULL, NULL, NULL);
-	if (! locale_command)
-		locale_command = g_strdup(command);
-	geany_debug("WIN32: actually running command:\n%s", command);
-	g_chdir(dir);
-	errno = 0;
-	ret = system(locale_command);
-	/* the command can return -1 as an exit code, so check errno also */
-	fail = ret == -1 && errno;
-	if (!fail)
-	{
-		if (std_out != NULL)
-			g_file_get_contents(tmp_file, std_out, NULL, NULL);
-		if (std_err != NULL)
-			g_file_get_contents(tmp_errfile, std_err, NULL, NULL);
-	}
-	else if (error)
-		g_set_error_literal(error, G_SPAWN_ERROR, errno, g_strerror(errno));
-
-	g_free(command);
-	g_free(locale_command);
-	g_unlink(tmp_file);
-	g_free(tmp_file);
-	g_unlink(tmp_errfile);
-	g_free(tmp_errfile);
-	if (exit_status)
-		*exit_status = ret;
-
-	return !fail;
-}
-
-
-static gboolean GetContentFromHandle(HANDLE hFile, gchar **content, GError **error)
-{
-	DWORD filesize;
-	gchar * buffer;
-	DWORD dwRead;
-
-	filesize = GetFileSize(hFile, NULL);
-	if (filesize < 1)
-	{
-		*content = NULL;
-		return TRUE;
-	}
-
-	buffer = g_malloc(filesize + 1);
-	if (! buffer)
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("GetContentFromHandle: Alloc failed");
-		g_set_error(error, G_SPAWN_ERROR, G_SPAWN_ERROR, "%s", msg);
-		g_free(msg);
-		return FALSE;
-	}
-
-	SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
-	if (! ReadFile(hFile, buffer, filesize, &dwRead, NULL) || dwRead == 0)
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("GetContentFromHandle: Cannot read tempfile");
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR_FAILED, "%s", msg);
-		g_free(msg);
-		return FALSE;
-	}
-
-	if (! CloseHandle(hFile))
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("GetContentFromHandle: CloseHandle failed (%d)", (gint) GetLastError());
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR_FAILED, "%s", msg);
-		g_free(msg);
-		g_free(buffer);
-		*content = NULL;
-		return FALSE;
 	}
-	buffer[filesize] = '\0';
-	*content = buffer;
-	return TRUE;
 }
 
 
@@ -1236,171 +908,6 @@ gchar *win32_expand_environment_variables(const gchar *str)
 }
 
 
-static gboolean CreateChildProcess(geany_win32_spawn *gw_spawn, TCHAR *szCmdline,
-		const TCHAR *dir, GError **error)
-{
-	PROCESS_INFORMATION piProcInfo;
-	STARTUPINFOW siStartInfo;
-	BOOL bFuncRetn = FALSE;
-	gchar *expandedCmdline;
-	wchar_t w_commandline[CMDSIZE];
-	wchar_t w_dir[MAX_PATH];
-
-	/* Set up members of the PROCESS_INFORMATION structure. */
-	ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION));
-
-	/* Set up members of the STARTUPINFO structure.*/
-	ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
-
-	siStartInfo.cb         = sizeof(STARTUPINFO);
-	siStartInfo.hStdError  = gw_spawn->hChildStderrWr;
-	siStartInfo.hStdOutput = gw_spawn->hChildStdoutWr;
-	siStartInfo.hStdInput  = gw_spawn->hChildStdinRd;
-	siStartInfo.dwFlags   |= STARTF_USESTDHANDLES;
-
-	/* Expand environment variables like %blah%. */
-	expandedCmdline = win32_expand_environment_variables(szCmdline);
-
-	MultiByteToWideChar(CP_UTF8, 0, expandedCmdline, -1, w_commandline, G_N_ELEMENTS(w_commandline));
-	MultiByteToWideChar(CP_UTF8, 0, dir, -1, w_dir, G_N_ELEMENTS(w_dir));
-
-	/* Create the child process. */
-	bFuncRetn = CreateProcessW(NULL,
-		w_commandline,             /* command line */
-		NULL,          /* process security attributes */
-		NULL,          /* primary thread security attributes */
-		TRUE,          /* handles are inherited */
-		CREATE_NO_WINDOW,             /* creation flags */
-		NULL,          /* use parent's environment */
-		w_dir,           /* use parent's current directory */
-		&siStartInfo,  /* STARTUPINFO pointer */
-		&piProcInfo);  /* receives PROCESS_INFORMATION */
-
-	g_free(expandedCmdline);
-
-	if (bFuncRetn == 0)
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("CreateChildProcess: CreateProcess failed (%s)", msg);
-		g_set_error(error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED, "%s", msg);
-		g_free(msg);
-		return FALSE;
-	}
-	else
-	{
-		gint i;
-		gsize ms = 30*1000;
-
-		/* FIXME: this seems to timeout when there are many lines
-		 * to read - maybe because the child's pipe is full */
-		for (i = 0; i < 2 &&
-			WaitForSingleObject(piProcInfo.hProcess, ms) == WAIT_TIMEOUT; i++)
-		{
-			ui_set_statusbar(FALSE, _("Process timed out after %.02f s!"), ms / 1000.0F);
-			geany_debug("CreateChildProcess: timed out");
-			TerminateProcess(piProcInfo.hProcess, WAIT_TIMEOUT); /* NOTE: This will not kill grandkids. */
-		}
-
-		if (!GetExitCodeProcess(piProcInfo.hProcess, &gw_spawn->dwExitCode))
-		{
-			gchar *msg = g_win32_error_message(GetLastError());
-			geany_debug("GetExitCodeProcess failed: %s", msg);
-			g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR_FAILED, "%s", msg);
-			g_free(msg);
-		}
-		CloseHandle(piProcInfo.hProcess);
-		CloseHandle(piProcInfo.hThread);
-		return bFuncRetn;
-	}
-	return FALSE;
-}
-
-
-static VOID ReadFromPipe(HANDLE hRead, HANDLE hWrite, HANDLE hFile, GError **error)
-{
-	DWORD dwRead, dwWritten;
-	CHAR chBuf[BUFSIZE];
-
-	/* Close the write end of the pipe before reading from the
-	   read end of the pipe. */
-	if (! CloseHandle(hWrite))
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("ReadFromPipe: Closing handle failed");
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR_PIPE, "%s", msg);
-		g_free(msg);
-		return;
-	}
-
-	/* Read output from the child process, and write to parent's STDOUT. */
-	for (;;)
-	{
-		if (! ReadFile(hRead, chBuf, BUFSIZE, &dwRead, NULL) || dwRead == 0)
-			break;
-
-		if (! WriteFile(hFile, chBuf, dwRead, &dwWritten, NULL))
-			break;
-	}
-}
-
-
-static HANDLE GetTempFileHandle(GError **error)
-{
-	/* Temp file */
-	DWORD dwBufSize = BUFSIZE;
-	UINT uRetVal;
-	TCHAR szTempName[BUFSIZE];
-	TCHAR lpPathBuffer[BUFSIZE];
-	DWORD dwRetVal;
-	HANDLE hTempFile;
-
-	/* Get the temp path. */
-	dwRetVal = GetTempPath(dwBufSize,     /* length of the buffer*/
-						   lpPathBuffer); /* buffer for path */
-
-	if (dwRetVal > dwBufSize || (dwRetVal == 0))
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("GetTempFileHandle: GetTempPath failed (%d)", (gint) GetLastError());
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR, "%s", msg);
-		g_free(msg);
-		return NULL;
-	}
-
-	/* Create a temporary file for STDOUT. */
-	uRetVal = GetTempFileName(lpPathBuffer, /* directory for tmp files */
-							  TEXT("GEANY_VCDIFF_"),  /* temp file name prefix */
-							  0,            /* create unique name */
-							  szTempName);  /* buffer for name */
-	if (uRetVal == 0)
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("GetTempFileName failed (%d)", (gint) GetLastError());
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR, "%s", msg);
-		g_free(msg);
-		return NULL;
-	}
-
-	hTempFile = CreateFile((LPTSTR) szTempName, /* file name */
-						   GENERIC_READ | GENERIC_WRITE, /* open r-w */
-						   0,                    /* do not share */
-						   NULL,                 /* default security */
-						   CREATE_ALWAYS,        /* overwrite existing */
-						   FILE_ATTRIBUTE_NORMAL,/* normal file */
-						   NULL);                /* no template */
-
-	if (hTempFile == INVALID_HANDLE_VALUE)
-	{
-		gchar *msg = g_win32_error_message(GetLastError());
-		geany_debug("GetTempFileHandle: Second CreateFile failed (%d)", (gint) GetLastError());
-		g_set_error(error, G_SPAWN_ERROR, G_FILE_ERROR, "%s", msg);
-		g_free(msg);
-		return NULL;
-	}
-	return hTempFile;
-}
-
-
 /* From GDK (they got it from MS Knowledge Base article Q130698) */
 static gboolean resolve_link(HWND hWnd, wchar_t *link, gchar **lpszPath)
 {


Modified: src/win32.h
5 lines changed, 0 insertions(+), 5 deletions(-)
===================================================================
@@ -60,11 +60,6 @@ void win32_init_debug_code(void);
 
 void win32_set_working_directory(const gchar *dir);
 
-gboolean win32_get_exit_status(GPid child_pid);
-
-gboolean win32_spawn(const gchar *dir, gchar **argv, gchar **env, GSpawnFlags flags,
-					 gchar **std_out, gchar **std_err, gint *exit_status, GError **error);
-
 gchar *win32_get_shortcut_target(const gchar *file_name);
 
 gchar *win32_get_installation_dir(void);



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).


More information about the Commits mailing list