From d04c74c8f5a45493895afdaba9b39772401fbf39 Mon Sep 17 00:00:00 2001 From: pabs Date: Sat, 9 Feb 2008 02:47:47 +0000 Subject: [PATCH] Revert to using popen on Win32 since it worked better and doesn't have any more security issues on Win32 than spawnlp git-svn-id: http://svn.voria.com/code@1635 1f10aa63-cdf2-0310-b900-c93c546f37ac --- synfig-core/trunk/configure.ac | 3 - synfig-core/trunk/src/modules/mod_dv/trgt_dv.cpp | 64 ++++------------- .../trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp | 70 ++++-------------- .../trunk/src/modules/mod_ffmpeg/trgt_ffmpeg.cpp | 63 +++-------------- .../modules/mod_imagemagick/mptr_imagemagick.cpp | 17 +++-- .../modules/mod_imagemagick/trgt_imagemagick.cpp | 82 ++++------------------ 6 files changed, 62 insertions(+), 237 deletions(-) diff --git a/synfig-core/trunk/configure.ac b/synfig-core/trunk/configure.ac index 45c00c0..b972337 100644 --- a/synfig-core/trunk/configure.ac +++ b/synfig-core/trunk/configure.ac @@ -534,9 +534,6 @@ AC_CHECK_FUNCS([fork]) AC_CHECK_FUNCS([kill]) AC_CHECK_FUNCS([pipe]) AC_CHECK_FUNCS([waitpid]) -AC_CHECK_FUNCS([_spawnlp]) -AC_CHECK_FUNCS([_pipe]) -AC_CHECK_FUNCS([cwait]) AC_CHECK_FUNCS( [isnan], diff --git a/synfig-core/trunk/src/modules/mod_dv/trgt_dv.cpp b/synfig-core/trunk/src/modules/mod_dv/trgt_dv.cpp index d4b7440..f215f64 100644 --- a/synfig-core/trunk/src/modules/mod_dv/trgt_dv.cpp +++ b/synfig-core/trunk/src/modules/mod_dv/trgt_dv.cpp @@ -64,7 +64,7 @@ using namespace etl; #if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID) #define UNIX_PIPE_TO_PROCESSES -#elif defined(HAVE__SPAWNLP) && defined(HAVE__PIPE) && defined(HAVE_CWAIT) +#else #define WIN32_PIPE_TO_PROCESSES #endif @@ -94,11 +94,11 @@ dv_trgt::dv_trgt(const char *Filename) dv_trgt::~dv_trgt() { if(file){ - fclose(file); - int status; #if defined(WIN32_PIPE_TO_PROCESSES) - cwait(&status,pid,0); + pclose(file); #elif defined(UNIX_PIPE_TO_PROCESSES) + fclose(file); + int status; waitpid(pid,&status,0); #endif } @@ -150,61 +150,21 @@ dv_trgt::init() #if defined(WIN32_PIPE_TO_PROCESSES) - int p[2]; - int stdin_fileno, stdout_fileno; - - if(_pipe(p, 512, O_BINARY | O_NOINHERIT) < 0) { - synfig::error(_("Unable to open pipe to encodedv")); - return false; - } - - // Save stdin/stdout so we can restore them later - stdin_fileno = _dup(_fileno(stdin)); - stdout_fileno = _dup(_fileno(stdout)); - - // encodedv should read from the pipe - if(_dup2(p[0], _fileno(stdin)) != 0) { - synfig::error(_("Unable to open pipe to encodedv")); - return false; - } - - FILE* outfile = fopen(filename.c_str(),"wb"); - if( outfile == NULL ){ - synfig::error(_("Unable to open pipe to encodedv")); - return false; - } - if(_dup2(_fileno(outfile), _fileno(stdout)) != 0) { - synfig::error(_("Unable to open pipe to encodedv")); - return false; - } - + string command; + if(wide_aspect) - pid = _spawnlp(_P_NOWAIT, "encodedv", "encodedv", "-w", "1", "-", (const char *)NULL); + command=strprintf("encodedv -w 1 - > \"%s\"\n",filename.c_str()); else - pid = _spawnlp(_P_NOWAIT, "encodedv", "encodedv", "-", (const char *)NULL); + command=strprintf("encodedv - > \"%s\"\n",filename.c_str()); - if( pid < 0) { - synfig::error(_("Unable to open pipe to encodedv")); - return false; - } + // Open the pipe to encodedv + file=popen(command.c_str(),POPEN_BINARY_WRITE_TYPE); - // Restore stdin/stdout - if(_dup2(stdin_fileno, _fileno(stdin)) != 0) { - synfig::error(_("Unable to open pipe to encodedv")); - return false; - } - if(_dup2(stdout_fileno, _fileno(stdout)) != 0) { + if(!file) + { synfig::error(_("Unable to open pipe to encodedv")); return false; } - close(stdin_fileno); - close(stdout_fileno); - - // Close the pipe read end - encodedv uses it - close(p[0]); - - // We write data to the write end of the pipe - file = fdopen(p[1], "wb"); #elif defined(UNIX_PIPE_TO_PROCESSES) diff --git a/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp b/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp index 12fa556..e74f772 100644 --- a/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp +++ b/synfig-core/trunk/src/modules/mod_ffmpeg/mptr_ffmpeg.cpp @@ -62,7 +62,7 @@ using namespace etl; #if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID) #define UNIX_PIPE_TO_PROCESSES -#elif defined(HAVE__SPAWNLP) && defined(HAVE__PIPE) && defined(HAVE_CWAIT) +#else #define WIN32_PIPE_TO_PROCESSES #endif @@ -83,66 +83,22 @@ ffmpeg_mptr::seek_to(int frame) { if(file) { - fclose(file); - int status; #if defined(WIN32_PIPE_TO_PROCESSES) - cwait(&status,pid,0); + pclose(file); #elif defined(UNIX_PIPE_TO_PROCESSES) - waitpid(pid,&status,0); + fclose(file); + int status; + waitpid(pid,&status,0); #endif } #if defined(WIN32_PIPE_TO_PROCESSES) - int p[2]; - int stdin_fileno, stdout_fileno; - - if(_pipe(p, 512, O_BINARY | O_NOINHERIT) < 0) { - cerr<<"Unable to open pipe to ffmpeg"<get_name().c_str(), "-vcodec", "mpeg1video", "-y", "--", filename.c_str(), (const char *)NULL); + command=strprintf("ffmpeg -f image2pipe -vcodec ppm -an -r %f -i pipe: -loop -hq -title \"%s\" -vcodec mpeg1video -y -- \"%s\"\n",desc.get_frame_rate(),get_canvas()->get_name().c_str(),filename.c_str()); else - pid = _spawnlp(_P_NOWAIT, "ffmpeg", "ffmpeg", "-f", "image2pipe", "-vcodec", "ppm", "-an", "-r", strprintf("%f", desc.get_frame_rate()).c_str(), "-i", "pipe:", "-loop", "-hq", "-title", get_canvas()->get_name().c_str(), "-vcodec", "mpeg1video", "-y", filename.c_str(), (const char *)NULL); - - if( pid < 0) { - synfig::error(_("Unable to open pipe to ffmpeg")); - return false; - } - - // Restore stdin/stdout - if(_dup2(stdin_fileno, _fileno(stdin)) != 0) { - synfig::error(_("Unable to open pipe to ffmpeg")); - return false; - } - if(_dup2(stdout_fileno, _fileno(stdout)) != 0) { - synfig::error(_("Unable to open pipe to ffmpeg")); - return false; - } - close(stdin_fileno); - close(stdout_fileno); - - // Close the pipe read end - ffmpeg uses it - close(p[0]); - - // We write data to the write end of the pipe - file = fdopen(p[1], "wb"); + command=strprintf("ffmpeg -f image2pipe -vcodec ppm -an -r %f -i pipe: -loop -hq -title \"%s\" -vcodec mpeg1video -y \"%s\"\n",desc.get_frame_rate(),get_canvas()->get_name().c_str(),filename.c_str()); + + file=popen(command.c_str(),POPEN_BINARY_WRITE_TYPE); #elif defined(UNIX_PIPE_TO_PROCESSES) diff --git a/synfig-core/trunk/src/modules/mod_imagemagick/mptr_imagemagick.cpp b/synfig-core/trunk/src/modules/mod_imagemagick/mptr_imagemagick.cpp index 4bcf1f8..921557f 100644 --- a/synfig-core/trunk/src/modules/mod_imagemagick/mptr_imagemagick.cpp +++ b/synfig-core/trunk/src/modules/mod_imagemagick/mptr_imagemagick.cpp @@ -63,7 +63,7 @@ using namespace etl; #if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID) #define UNIX_PIPE_TO_PROCESSES -#elif defined(HAVE__SPAWNLP) && defined(HAVE__PIPE) && defined(HAVE_CWAIT) +#else #define WIN32_PIPE_TO_PROCESSES #endif @@ -104,17 +104,26 @@ imagemagick_mptr::get_frame(synfig::Surface &surface,Time /*time*/, synfig::Prog return false; } string temp_file="/tmp/deleteme.png"; - string output="png32:"+temp_file; #if defined(WIN32_PIPE_TO_PROCESSES) + if(file) + pclose(file); + + string command; + if(filename.find("psd")!=String::npos) - _spawnlp(_P_WAIT, "convert", "convert", filename.c_str(), "-flatten", output.c_str(), (const char *)NULL); + command=strprintf("convert \"%s\" -flatten \"png32:%s\"\n",filename.c_str(),temp_file.c_str()); else - _spawnlp(_P_WAIT, "convert", "convert", filename.c_str(), output.c_str(), (const char *)NULL); + command=strprintf("convert \"%s\" \"png32:%s\"\n",filename.c_str(),temp_file.c_str()); + + if(system(command.c_str())!=0) + return false; #elif defined(UNIX_PIPE_TO_PROCESSES) + string output="png32:"+temp_file; + pid_t pid = fork(); if (pid == -1) { diff --git a/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp b/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp index f33b98f..627f1dd 100644 --- a/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp +++ b/synfig-core/trunk/src/modules/mod_imagemagick/trgt_imagemagick.cpp @@ -65,7 +65,7 @@ using namespace etl; #if defined(HAVE_FORK) && defined(HAVE_PIPE) && defined(HAVE_WAITPID) #define UNIX_PIPE_TO_PROCESSES -#elif defined(HAVE__SPAWNLP) && defined(HAVE__PIPE) && defined(HAVE_CWAIT) +#else #define WIN32_PIPE_TO_PROCESSES #endif @@ -92,11 +92,11 @@ imagemagick_trgt::imagemagick_trgt(const char *Filename) imagemagick_trgt::~imagemagick_trgt() { if(file){ - fclose(file); - int status; #if defined(WIN32_PIPE_TO_PROCESSES) - cwait(&status,pid,0); + pclose(file); #elif defined(UNIX_PIPE_TO_PROCESSES) + fclose(file); + int status; waitpid(pid,&status,0); #endif } @@ -138,11 +138,11 @@ imagemagick_trgt::end_frame() { fputc(0,file); fflush(file); - fclose(file); - int status; #if defined(WIN32_PIPE_TO_PROCESSES) - cwait(&status,pid,0); + pclose(file); #elif defined(UNIX_PIPE_TO_PROCESSES) + fclose(file); + int status; waitpid(pid,&status,0); #endif } @@ -166,68 +166,16 @@ imagemagick_trgt::start_frame(synfig::ProgressCallback *cb) #if defined(WIN32_PIPE_TO_PROCESSES) - int p[2]; - int stdin_fileno, stdout_fileno; + string command; - if(_pipe(p, 512, O_BINARY | O_NOINHERIT) < 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - - // Save stdin/stdout so we can restore them later - stdin_fileno = _dup(_fileno(stdin)); - stdout_fileno = _dup(_fileno(stdout)); - - // convert should read from the pipe - if(_dup2(p[0], _fileno(stdin)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } + command=strprintf("convert -depth 8 -size %dx%d rgb%s:-[0] -density %dx%d \"%s\"\n", + desc.get_w(), desc.get_h(), // size + ((channels(pf) == 4) ? "a" : ""), // rgba or rgb? + round_to_int(desc.get_x_res()/39.3700787402), // density + round_to_int(desc.get_y_res()/39.3700787402), + newfilename.c_str()); - /* - convert accepts the output filename on the command-line - if(_dup2(_fileno(output), _fileno(stdout)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - */ - - pid = _spawnlp(_P_NOWAIT, "convert", "convert", - "-depth", "8", - "-size", strprintf("%dx%d", desc.get_w(), desc.get_h()).c_str(), - ((channels(pf) == 4) ? "rgba:-[0]" : "rgb:-[0]"), - "-density", strprintf("%dx%d", round_to_int(desc.get_x_res()/39.3700787402), round_to_int(desc.get_y_res()/39.3700787402)).c_str(), - newfilename.c_str(), - (const char *)NULL); - - if( pid < 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - - // Restore stdin/stdout - if(_dup2(stdin_fileno, _fileno(stdin)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - if(_dup2(stdout_fileno, _fileno(stdout)) != 0) { - if(cb) cb->error(N_(msg)); - else synfig::error(N_(msg)); - return false; - } - close(stdin_fileno); - close(stdout_fileno); - - // Close the pipe read end - convert uses it - close(p[0]); - - // We write data to the write end of the pipe - file = fdopen(p[1], "wb"); + file=popen(command.c_str(),POPEN_BINARY_WRITE_TYPE); #elif defined(UNIX_PIPE_TO_PROCESSES) -- 2.7.4