diff -r 721e468c10f3 -r f28ad4577863 bl/spawn.c --- a/bl/spawn.c Fri Jan 27 21:40:35 2012 +0000 +++ b/bl/spawn.c Mon Jan 30 09:11:07 2012 +0000 @@ -7,8 +7,8 @@ #define SPAWN_BUFSIZE 128 -gboolean spawn_sync(char **argv,char **standard_output,int *exit_status, - GError **error) +gboolean spawn_sync(const char *working_directory,char **argv, + char **standard_output,int *exit_status,GError **error) { /* Don't use g_spawn_sync on WIN32 for now to avoid needing the helper */ #ifndef WIN32 @@ -17,8 +17,8 @@ GSpawnFlags flags=G_SPAWN_SEARCH_PATH; if (!standard_output) flags=G_SPAWN_STDOUT_TO_DEV_NULL; - retval=g_spawn_sync(NULL,argv,NULL,flags,NULL,NULL,standard_output, - &standard_error,exit_status,error); + retval=g_spawn_sync(working_directory,argv,NULL,flags,NULL,NULL, + standard_output,&standard_error,exit_status,error); if (standard_error) fputs(standard_error,stderr); g_free(standard_error); @@ -29,7 +29,21 @@ FILE *fp; int i,r; size_t n,len; + char *current_dir; GString *command_line,*string; + if (working_directory) + { + current_dir=g_get_current_dir(); + if (g_chdir(working_directory)<0) + { + g_set_error(error,G_FILE_ERROR,g_file_error_from_errno(errno), + "%s: %s",working_directory,g_strerror(errno)); + g_free(current_dir); + return FALSE; + } + } + else + current_dir=NULL; command_line=g_string_new(NULL); for(i=0;argv[i];i++) { @@ -39,6 +53,13 @@ } fp=popen(command_line->str,"r"); g_string_free(command_line,TRUE); + if (current_dir) + { + if (g_chdir(current_dir)<0) + g_error("Failed to restore current directory: %s", + g_strerror(errno)); + g_free(current_dir); + } if (!fp) { g_set_error(error,G_FILE_ERROR,g_file_error_from_errno(errno),