# HG changeset patch # User Kai T. Ohlhus # Date 1559678865 -7200 # Node ID 64ff1053ffbf75a457c81867a2a694b407aefa06 # Parent f26b13c80e45beb3597c943b08923128c0ad4253 F__open_with_system_app__: Consistent return value for all platforms. * libinterp/corefcn/sysdep.cc (F__open_with_system_app__): On all platforms this internal function returns 1 on success, that is if the system open call (not the called operation itself) was successful, and 0 otherwise. The previous undocumented check on macOS and Unix `PID == 0` (tmp(0).double_value () == 0) does not make sense and PID > 1 is more likely in case of success. See https://octave.org/doc/v5.1.0/XREFsystem.html for details. Reduce code duplication by using a new local marco `FSYSTEM_OPEN_STR`. Add documentation regarding the return value. diff -r f26b13c80e45 -r 64ff1053ffbf libinterp/corefcn/sysdep.cc --- a/libinterp/corefcn/sysdep.cc Tue Jun 04 09:44:58 2019 -0700 +++ b/libinterp/corefcn/sysdep.cc Tue Jun 04 22:07:45 2019 +0200 @@ -206,7 +206,7 @@ DEFUN (__open_with_system_app__, args, , doc: /* -*- texinfo -*- @deftypefn {} {} __open_with_system_app__ (@var{file}) -Undocumented internal function. +Internal function. Returns 1 on successful system call and 0 otherwise. @end deftypefn */) { if (args.length () != 1) @@ -214,32 +214,29 @@ std::string file = args(0).xstring_value ("__open_with_system_app__: argument must be a filename"); - octave_value retval; - #if defined (OCTAVE_USE_WINDOWS_API) - HINSTANCE status = ShellExecuteW (0, 0, - octave::sys::u8_to_wstring (file).c_str (), - 0, 0, SW_SHOWNORMAL); + HINSTANCE status + = ShellExecuteW (0, 0, octave::sys::u8_to_wstring (file).c_str (), + 0, 0, SW_SHOWNORMAL); // ShellExecute returns a value greater than 32 if successful. - retval = (reinterpret_cast (status) > 32); -#elif defined (__APPLE__) + return octave_value (reinterpret_cast (status) > 32); +#else +# if defined (__APPLE__) +# define FSYSTEM_OPEN_STR "open " +# else +# define FSYSTEM_OPEN_STR "xdg-open " +# endif octave_value_list tmp - = Fsystem (ovl ("open " + file + " 2> /dev/null", + = Fsystem (ovl (FSYSTEM_OPEN_STR + file + " 2> /dev/null", false, "async"), 1); +# undef FSYSTEM_OPEN_STR - retval = (tmp(0).double_value () == 0); -#else - octave_value_list tmp - = Fsystem (ovl ("xdg-open " + file + " 2> /dev/null", - false, "async"), - 1); - - retval = (tmp(0).double_value () == 0); + // Asynchronous Fsystem calls return the new child process identifier, + // which must be greater than 1 if successful. + return octave_value (tmp(0).double_value () > 1); #endif - - return retval; } namespace octave