ali@0: #include ali@0: #include ali@0: #ifndef WIN32 ali@0: #include ali@0: #endif ali@5: #include ali@0: ali@0: #define SPAWN_BUFSIZE 128 ali@0: ali@9: gboolean spawn_sync(const char *working_directory,char **argv, ali@9: char **standard_output,int *exit_status,GError **error) ali@0: { ali@0: /* Don't use g_spawn_sync on WIN32 for now to avoid needing the helper */ ali@6: #ifndef WIN32 ali@7: char *standard_error=NULL; ali@0: gboolean retval; ali@0: GSpawnFlags flags=G_SPAWN_SEARCH_PATH; ali@0: if (!standard_output) ali@0: flags=G_SPAWN_STDOUT_TO_DEV_NULL; ali@9: retval=g_spawn_sync(working_directory,argv,NULL,flags,NULL,NULL, ali@9: standard_output,&standard_error,exit_status,error); ali@7: if (standard_error) ali@11: g_printerr("%s",standard_error); ali@0: g_free(standard_error); ali@7: if (retval && exit_status) ali@0: *exit_status=WEXITSTATUS(*exit_status); ali@0: return retval; ali@0: #else ali@0: FILE *fp; ali@0: int i,r; ali@0: size_t n,len; ali@9: char *current_dir; ali@6: GString *command_line,*string; ali@9: if (working_directory) ali@9: { ali@9: current_dir=g_get_current_dir(); ali@9: if (g_chdir(working_directory)<0) ali@9: { ali@9: g_set_error(error,G_FILE_ERROR,g_file_error_from_errno(errno), ali@9: "%s: %s",working_directory,g_strerror(errno)); ali@9: g_free(current_dir); ali@9: return FALSE; ali@9: } ali@9: } ali@9: else ali@9: current_dir=NULL; ali@6: command_line=g_string_new(NULL); ali@0: for(i=0;argv[i];i++) ali@0: { ali@0: if (i) ali@6: g_string_append_c(command_line,' '); ali@6: g_string_append(command_line,argv[i]); ali@0: } ali@0: fp=popen(command_line->str,"r"); ali@6: g_string_free(command_line,TRUE); ali@9: if (current_dir) ali@9: { ali@9: if (g_chdir(current_dir)<0) ali@9: g_error("Failed to restore current directory: %s", ali@9: g_strerror(errno)); ali@9: g_free(current_dir); ali@9: } ali@0: if (!fp) ali@0: { ali@7: g_set_error(error,G_FILE_ERROR,g_file_error_from_errno(errno), ali@7: "%s: %s",command_line->str,g_strerror(errno)); ali@0: return FALSE; ali@0: } ali@6: string=g_string_new(NULL); ali@0: do ali@0: { ali@0: len=string->len; ali@6: g_string_set_size(string,len+SPAWN_BUFSIZE); ali@0: n=fread(string->str+len,1,SPAWN_BUFSIZE,fp); ali@0: if (n<0) ali@0: { ali@7: g_set_error(error,G_FILE_ERROR,g_file_error_from_errno(errno), ali@7: "Error reading from bookloupe: %s",g_strerror(errno)); ali@0: (void)pclose(fp); ali@6: g_string_free(string,TRUE); ali@0: return FALSE; ali@0: } ali@6: g_string_set_size(string,len+n); ali@0: } while(n); ali@0: r=pclose(fp); ali@0: if (r<0) ali@0: { ali@7: g_set_error(error,G_FILE_ERROR,g_file_error_from_errno(errno), ali@7: "Error reading from bookloupe: %s",g_strerror(errno)); ali@6: g_string_free(string,TRUE); ali@0: return FALSE; ali@0: } ali@0: else ali@0: { ali@0: if (exit_status) ali@0: *exit_status=r; ali@0: if (standard_output) ali@6: *standard_output=g_string_free(string,FALSE); ali@0: else ali@6: g_string_free(string,TRUE); ali@0: return TRUE; ali@0: } ali@0: #endif ali@0: }