I have code that calls g_spawn_sync and sets an environment variable. The program that I am spawning simply dumps out the environment and exits. I found some odd behavior when running this test app on Cygwin, if I set any random variable, like "HELLO=world" it is not passed to the child. However, if I set PATH, I get it set along with 2 other variables. Attached is my test code that demonstrates the issue.
Environ.c - child program that dumps the environment Gspawn_env_test.cpp - program that spawns environ.c and reads the output Make - simple shell script that builds the test apps Cygwin 1.7.9 results: $ ./gspawn_env_test.exe ** (process:5080): DEBUG: Calling my_environ with envp set to HELLO=world ** (process:5080): DEBUG: result: ** (process:5080): DEBUG: ------------------------------------ ** (process:5080): DEBUG: Calling my_environ with envp set to PATH=/usr/bin ** (process:5080): DEBUG: result: PATH=/usr/bin SYSTEMROOT=C:\Windows WINDIR=C:\Windows ** (process:5080): DEBUG: ------------------------------------ Ubuntu 10.04 results: [mfisch@toaster ~/gspawn_issue]$ ./gspawn_env_test ** (process:29580): DEBUG: Calling my_environ with envp set to HELLO=world ** (process:29580): DEBUG: result: HELLO=world ** (process:29580): DEBUG: ------------------------------------ ** (process:29580): DEBUG: Calling my_environ with envp set to PATH=/usr/bin ** (process:29580): DEBUG: result: PATH=/usr/bin ** (process:29580): DEBUG: ------------------------------------
cygcheck.out
Description: cygcheck.out
#include <stdio.h> int main(void) { extern char **environ; int i = 0; for(i; environ[i]!=NULL; i++) printf("%s\n",environ[i]); }
#include <glib.h> #include <string> #include <unistd.h> #include <errno.h> #include <sys/wait.h> enum envpOption { ENVP_NULL, ENVP_PATH, ENVP_MISC }; void spawnproc(envpOption opt) { gchar * argv[2]; gchar * envp[2]; gchar * g_stdoutBuffer = NULL; gchar * g_stderrBuffer = NULL; gboolean resultStatus; int exit_status; GError * gerr = NULL; GSpawnFlags flags = (GSpawnFlags)(G_SPAWN_SEARCH_PATH); argv[0] = (gchar*)"./my_environ.exe"; argv[1] = NULL; if (opt == ENVP_MISC) { envp[0] = (gchar *)"HELLO=world"; envp[1] = NULL; resultStatus = g_spawn_sync("/home/mfisch/gspawn_issue", argv, envp, flags, NULL, NULL, &g_stdoutBuffer, &g_stderrBuffer, &exit_status, &gerr); } else if (opt == ENVP_PATH) { envp[0] = (gchar *)"PATH=/usr/bin"; envp[1] = NULL; resultStatus = g_spawn_sync("/home/mfisch/gspawn_issue", argv, envp, flags, NULL, NULL, &g_stdoutBuffer, &g_stderrBuffer, &exit_status, &gerr); } else if (opt == ENVP_NULL) { resultStatus = g_spawn_sync("/home/mfisch/gspawn_issue", argv, NULL, flags, NULL, NULL, &g_stdoutBuffer, &g_stderrBuffer, &exit_status, &gerr); } if (gerr) { g_warning("error: %s",gerr->message); } if (g_stdoutBuffer) { g_debug("result:\n%s",g_stdoutBuffer); } if (!resultStatus) { g_warning("error: spawn failed"); } } int main(void) { g_debug("Calling my_environ with envp set to HELLO=world"); spawnproc(ENVP_MISC); g_debug("------------------------------------"); g_debug("Calling my_environ with envp set to PATH=/usr/bin"); spawnproc(ENVP_PATH); g_debug("------------------------------------"); #if 0 g_debug("Calling my_environ with envp Disabled"); spawnproc(ENVP_NULL); g_debug("------------------------------------"); #endif }
make
Description: make
-- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple