# HG changeset patch # User John W. Eaton # Date 1460399942 14400 # Node ID 46f059de4dce1a62efd3b3f4bf7c273b49608e26 # Parent 80258bb3a14b447ce4c5d92465fac97727212066 use namespace instead of struct with static members for system call wrappers * oct-syscalls.h, oct-syscalls.cc: Use octave::syscalls namespace instead of struct with static members. Change all uses. diff -r 80258bb3a14b -r 46f059de4dce libinterp/corefcn/oct-procbuf.cc --- a/libinterp/corefcn/oct-procbuf.cc Mon Apr 11 13:53:17 2016 -0400 +++ b/libinterp/corefcn/oct-procbuf.cc Mon Apr 11 14:39:02 2016 -0400 @@ -90,7 +90,7 @@ if (is_open ()) return 0; - if (pipe (pipe_fds) < 0) + if (octave::syscalls::pipe (pipe_fds) < 0) return 0; if (mode & std::ios::in) @@ -202,7 +202,7 @@ do { - wait_pid = octave_syscalls::waitpid (proc_pid, &wstatus, 0); + wait_pid = octave::syscalls::waitpid (proc_pid, &wstatus, 0); } while (wait_pid == -1 && errno == EINTR); } diff -r 80258bb3a14b -r 46f059de4dce libinterp/corefcn/sighandlers.cc --- a/libinterp/corefcn/sighandlers.cc Mon Apr 11 13:53:17 2016 -0400 +++ b/libinterp/corefcn/sighandlers.cc Mon Apr 11 14:39:02 2016 -0400 @@ -1021,7 +1021,7 @@ { int status; - if (octave_syscalls::waitpid (pid, &status, WNOHANG) > 0) + if (octave::syscalls::waitpid (pid, &status, WNOHANG) > 0) { oc.have_status = 1; diff -r 80258bb3a14b -r 46f059de4dce libinterp/corefcn/syscalls.cc --- a/libinterp/corefcn/syscalls.cc Mon Apr 11 13:53:17 2016 -0400 +++ b/libinterp/corefcn/syscalls.cc Mon Apr 11 14:39:02 2016 -0400 @@ -122,7 +122,7 @@ { std::string msg; - int status = octave_syscalls::dup2 (i_old, i_new, msg); + int status = octave::syscalls::dup2 (i_old, i_new, msg); return ovl (status, msg); } @@ -187,7 +187,7 @@ std::string msg; - int status = octave_syscalls::execvp (exec_file, exec_args, msg); + int status = octave::syscalls::execvp (exec_file, exec_args, msg); return ovl (status, msg); } @@ -274,7 +274,7 @@ std::string msg; pid_t pid; - pid = octave_syscalls::popen2 (exec_file, arg_list, sync_mode, + pid = octave::syscalls::popen2 (exec_file, arg_list, sync_mode, filedesc, msg, interactive); if (pid < 0) error (msg.c_str ()); @@ -440,7 +440,7 @@ std::string msg; - int status = octave_fcntl (fid, req, arg, msg); + int status = octave::syscalls::fcntl (fid, req, arg, msg); return ovl (status, msg); } @@ -476,7 +476,7 @@ std::string msg; - pid_t pid = octave_syscalls::fork (msg); + pid_t pid = octave::syscalls::fork (msg); return ovl (pid, msg); } @@ -492,7 +492,7 @@ std::string msg; - pid_t pid = octave_syscalls::getpgrp (msg); + pid_t pid = octave::syscalls::getpgrp (msg); return ovl (pid, msg); } @@ -507,7 +507,7 @@ if (args.length () != 0) print_usage (); - return ovl (octave_syscalls::getpid ()); + return ovl (octave::syscalls::getpid ()); } DEFUNX ("getppid", Fgetppid, args, , @@ -520,7 +520,7 @@ if (args.length () != 0) print_usage (); - return ovl (octave_syscalls::getppid ()); + return ovl (octave::syscalls::getppid ()); } DEFUNX ("getegid", Fgetegid, args, , @@ -533,7 +533,7 @@ if (args.length () != 0) print_usage (); - return ovl (octave_syscalls::getegid ()); + return ovl (octave::syscalls::getegid ()); } DEFUNX ("getgid", Fgetgid, args, , @@ -546,7 +546,7 @@ if (args.length () != 0) print_usage (); - return ovl (octave_syscalls::getgid ()); + return ovl (octave::syscalls::getgid ()); } DEFUNX ("geteuid", Fgeteuid, args, , @@ -559,7 +559,7 @@ if (args.length () != 0) print_usage (); - return ovl (octave_syscalls::geteuid ()); + return ovl (octave::syscalls::geteuid ()); } DEFUNX ("getuid", Fgetuid, args, , @@ -572,7 +572,7 @@ if (args.length () != 0) print_usage (); - return ovl (octave_syscalls::getuid ()); + return ovl (octave::syscalls::getuid ()); } DEFUNX ("kill", Fkill, args, , @@ -606,7 +606,7 @@ std::string msg; - int status = octave_syscalls::kill (pid, sig, msg); + int status = octave::syscalls::kill (pid, sig, msg); return ovl (status, msg); } @@ -725,7 +725,7 @@ int fid[2]; std::string msg; - int status = octave_syscalls::pipe (fid, msg); + int status = octave::syscalls::pipe (fid, msg); if (status < 0) return ovl (-1, -1, -1, msg); @@ -1132,7 +1132,7 @@ std::string msg; int status; - pid_t result = octave_syscalls::waitpid (pid, &status, options, msg); + pid_t result = octave::syscalls::waitpid (pid, &status, options, msg); return ovl (result, status, msg); } diff -r 80258bb3a14b -r 46f059de4dce liboctave/system/oct-env.cc --- a/liboctave/system/oct-env.cc Mon Apr 11 13:53:17 2016 -0400 +++ b/liboctave/system/oct-env.cc Mon Apr 11 14:39:02 2016 -0400 @@ -466,7 +466,7 @@ if (hd.empty ()) { - octave_passwd pw = octave_passwd::getpwuid (octave_syscalls::getuid ()); + octave_passwd pw = octave_passwd::getpwuid (octave::syscalls::getuid ()); hd = pw ? pw.dir () : std::string (file_ops::dir_sep_str ()); } @@ -479,7 +479,7 @@ { if (user_name.empty ()) { - octave_passwd pw = octave_passwd::getpwuid (octave_syscalls::getuid ()); + octave_passwd pw = octave_passwd::getpwuid (octave::syscalls::getuid ()); user_name = pw ? pw.name () : std::string ("unknown"); } diff -r 80258bb3a14b -r 46f059de4dce liboctave/system/oct-syscalls.cc --- a/liboctave/system/oct-syscalls.cc Mon Apr 11 13:53:17 2016 -0400 +++ b/liboctave/system/oct-syscalls.cc Mon Apr 11 14:39:02 2016 -0400 @@ -47,368 +47,378 @@ #define NOT_SUPPORTED(nm) \ nm ": not supported on this system" -int -octave_syscalls::dup2 (int old_fd, int new_fd) +namespace octave { - std::string msg; - return dup2 (old_fd, new_fd, msg); -} + namespace + syscalls + { + int + dup2 (int old_fd, int new_fd) + { + std::string msg; + return octave::syscalls::dup2 (old_fd, new_fd, msg); + } -int -octave_syscalls::dup2 (int old_fd, int new_fd, std::string& msg) -{ - msg = ""; + int + dup2 (int old_fd, int new_fd, std::string& msg) + { + msg = ""; - int status = -1; + int status = -1; #if defined (HAVE_DUP2) - status = gnulib::dup2 (old_fd, new_fd); + status = gnulib::dup2 (old_fd, new_fd); - if (status < 0) - msg = gnulib::strerror (errno); + if (status < 0) + msg = gnulib::strerror (errno); #else - msg = NOT_SUPPORTED ("dup2"); + msg = NOT_SUPPORTED ("dup2"); #endif - return status; -} + return status; + } -int -octave_syscalls::execvp (const std::string& file, const string_vector& argv) -{ - std::string msg; - return execvp (file, argv, msg); -} + int + execvp (const std::string& file, const string_vector& argv) + { + std::string msg; + return octave::syscalls::execvp (file, argv, msg); + } -int -octave_syscalls::execvp (const std::string& file, const string_vector& args, - std::string& msg) -{ - msg = ""; + int + execvp (const std::string& file, const string_vector& args, + std::string& msg) + { + msg = ""; - int status = -1; + int status = -1; #if defined (HAVE_EXECVP) - char **argv = args.c_str_vec (); + char **argv = args.c_str_vec (); - status = ::execvp (file.c_str (), argv); + status = ::execvp (file.c_str (), argv); - string_vector::delete_c_str_vec (argv); + string_vector::delete_c_str_vec (argv); - if (status < 0) - msg = gnulib::strerror (errno); + if (status < 0) + msg = gnulib::strerror (errno); #else - msg = NOT_SUPPORTED ("execvp"); + msg = NOT_SUPPORTED ("execvp"); #endif - return status; -} + return status; + } -pid_t -octave_syscalls::fork (std::string& msg) -{ - pid_t status = -1; + pid_t + fork (std::string& msg) + { + pid_t status = -1; #if defined (HAVE_FORK) - status = ::fork (); + status = ::fork (); - if (status < 0) - msg = gnulib::strerror (errno); + if (status < 0) + msg = gnulib::strerror (errno); #else - msg = NOT_SUPPORTED ("fork"); + msg = NOT_SUPPORTED ("fork"); #endif - return status; -} + return status; + } -pid_t -octave_syscalls::vfork (std::string& msg) -{ - pid_t status = -1; + pid_t + vfork (std::string& msg) + { + pid_t status = -1; #if defined (HAVE_VFORK) || defined (HAVE_FORK) # if defined (HAVE_VFORK) - status = ::vfork (); + status = ::vfork (); # else - status = ::fork (); + status = ::fork (); # endif - if (status < 0) - msg = gnulib::strerror (errno); + if (status < 0) + msg = gnulib::strerror (errno); #else - msg = NOT_SUPPORTED ("vfork"); + msg = NOT_SUPPORTED ("vfork"); #endif - return status; -} + return status; + } -pid_t -octave_syscalls::getpgrp (std::string& msg) -{ - pid_t status = -1; + pid_t + getpgrp (std::string& msg) + { + pid_t status = -1; #if defined (HAVE_GETPGRP) - status = ::getpgrp (); + status = ::getpgrp (); - if (status < 0) - msg = gnulib::strerror (errno); + if (status < 0) + msg = gnulib::strerror (errno); #else - msg = NOT_SUPPORTED ("getpgrp"); + msg = NOT_SUPPORTED ("getpgrp"); #endif - return status; -} + return status; + } -pid_t -octave_syscalls::getpid (void) -{ + pid_t + getpid (void) + { #if defined (HAVE_GETPID) - return ::getpid (); + return ::getpid (); #else - return 0; + return 0; #endif -} + } -pid_t -octave_syscalls::getppid (void) -{ + pid_t + getppid (void) + { #if defined (HAVE_GETPPID) - return ::getppid (); + return ::getppid (); #else - return 0; + return 0; #endif -} + } -gid_t -octave_syscalls::getgid (void) -{ + gid_t + getgid (void) + { #if defined (HAVE_GETGID) - return ::getgid (); + return ::getgid (); #else - return 0; + return 0; #endif -} + } -gid_t -octave_syscalls::getegid (void) -{ + gid_t + getegid (void) + { #if defined (HAVE_GETEGID) - return ::getegid (); + return ::getegid (); #else - return 0; + return 0; #endif -} + } -uid_t -octave_syscalls::getuid (void) -{ + uid_t + getuid (void) + { #if defined (HAVE_GETUID) - return ::getuid (); + return ::getuid (); #else - return 0; + return 0; #endif -} + } -uid_t -octave_syscalls::geteuid (void) -{ + uid_t + geteuid (void) + { #if defined (HAVE_GETEUID) - return ::geteuid (); + return ::geteuid (); #else - return 0; + return 0; #endif -} + } -int -octave_syscalls::pipe (int *fildes) -{ - std::string msg; - return pipe (fildes, msg); -} + int + pipe (int *fildes) + { + std::string msg; + return octave::syscalls::pipe (fildes, msg); + } -int -octave_syscalls::pipe (int *fildes, std::string& msg) -{ - msg = ""; + int + pipe (int *fildes, std::string& msg) + { + msg = ""; - int status = -1; + int status = -1; - status = gnulib::pipe (fildes); + status = gnulib::pipe (fildes); - if (status < 0) - msg = gnulib::strerror (errno); + if (status < 0) + msg = gnulib::strerror (errno); - return status; -} + return status; + } -pid_t -octave_syscalls::waitpid (pid_t pid, int *status, int options) -{ - std::string msg; - return waitpid (pid, status, options, msg); -} + pid_t + waitpid (pid_t pid, int *status, int options) + { + std::string msg; + return octave::syscalls::waitpid (pid, status, options, msg); + } -pid_t -octave_syscalls::waitpid (pid_t pid, int *status, int options, - std::string& msg) -{ - pid_t retval = -1; - msg = ""; + pid_t + waitpid (pid_t pid, int *status, int options, + std::string& msg) + { + pid_t retval = -1; + msg = ""; #if defined (HAVE_WAITPID) - retval = ::octave_waitpid (pid, status, options); + retval = ::octave_waitpid (pid, status, options); - if (retval < 0) - msg = gnulib::strerror (errno); + if (retval < 0) + msg = gnulib::strerror (errno); #else - msg = NOT_SUPPORTED ("waitpid"); + msg = NOT_SUPPORTED ("waitpid"); #endif - return retval; -} + return retval; + } -int -octave_syscalls::kill (pid_t pid, int sig) -{ - std::string msg; - return kill (pid, sig, msg); -} + int + kill (pid_t pid, int sig) + { + std::string msg; + return octave::syscalls::kill (pid, sig, msg); + } -int -octave_syscalls::kill (pid_t pid, int sig, std::string& msg) -{ - msg = ""; + int + kill (pid_t pid, int sig, std::string& msg) + { + msg = ""; - int status = -1; + int status = -1; #if defined (HAVE_KILL) - status = ::kill (pid, sig); + status = ::kill (pid, sig); - if (status < 0) - msg = gnulib::strerror (errno); + if (status < 0) + msg = gnulib::strerror (errno); #else - msg = NOT_SUPPORTED ("kill"); + msg = NOT_SUPPORTED ("kill"); #endif - return status; -} + return status; + } -pid_t -octave_syscalls::popen2 (const std::string& cmd, const string_vector& args, - bool sync_mode, int *fildes) -{ - std::string msg; - bool interactive = false; - return popen2 (cmd, args, sync_mode, fildes, msg, interactive); -} + pid_t + popen2 (const std::string& cmd, const string_vector& args, + bool sync_mode, int *fildes) + { + std::string msg; + bool interactive = false; + return octave::syscalls::popen2 (cmd, args, sync_mode, fildes, msg, + interactive); + } -pid_t -octave_syscalls::popen2 (const std::string& cmd, const string_vector& args, - bool sync_mode, int *fildes, std::string& msg) -{ - bool interactive = false; - return popen2 (cmd, args, sync_mode, fildes, msg, interactive); -} + pid_t + popen2 (const std::string& cmd, const string_vector& args, + bool sync_mode, int *fildes, std::string& msg) + { + bool interactive = false; + return octave::syscalls::popen2 (cmd, args, sync_mode, fildes, msg, + interactive); + } -pid_t -octave_syscalls::popen2 (const std::string& cmd, const string_vector& args, - bool sync_mode, int *fildes, std::string& msg, - bool &interactive) -{ + pid_t + popen2 (const std::string& cmd, const string_vector& args, + bool sync_mode, int *fildes, std::string& msg, + bool &interactive) + { #if defined (__WIN32__) && ! defined (__CYGWIN__) - return ::octave_popen2 (cmd, args, sync_mode, fildes, msg); + return ::octave_popen2 (cmd, args, sync_mode, fildes, msg); #else - pid_t pid; - int child_stdin[2], child_stdout[2]; + pid_t pid; + int child_stdin[2], child_stdout[2]; - if (pipe (child_stdin, msg) == 0) - { - if (pipe (child_stdout, msg) == 0) + if (pipe (child_stdin, msg) == 0) { - pid = fork (msg); - if (pid < 0) - msg = "popen2: process creation failed -- " + msg; - else if (pid == 0) + if (pipe (child_stdout, msg) == 0) { - std::string child_msg; + pid = fork (msg); + if (pid < 0) + msg = "popen2: process creation failed -- " + msg; + else if (pid == 0) + { + std::string child_msg; + + interactive = false; - interactive = false; - - // Child process - gnulib::close (child_stdin[1]); - gnulib::close (child_stdout[0]); + // Child process + gnulib::close (child_stdin[1]); + gnulib::close (child_stdout[0]); - if (dup2 (child_stdin[0], STDIN_FILENO) >= 0) - { - gnulib::close (child_stdin[0]); - if (dup2 (child_stdout[1], STDOUT_FILENO) >= 0) + if (dup2 (child_stdin[0], STDIN_FILENO) >= 0) { - gnulib::close (child_stdout[1]); - if (execvp (cmd, args, child_msg) < 0) - child_msg = "popen2 (child): unable to start process -- " + child_msg; + gnulib::close (child_stdin[0]); + if (dup2 (child_stdout[1], STDOUT_FILENO) >= 0) + { + gnulib::close (child_stdout[1]); + if (execvp (cmd, args, child_msg) < 0) + child_msg = "popen2 (child): unable to start process -- " + child_msg; + } + else + child_msg = "popen2 (child): file handle duplication failed -- " + child_msg; } else child_msg = "popen2 (child): file handle duplication failed -- " + child_msg; + + (*current_liboctave_error_handler) (child_msg.c_str ()); + + exit (0); } else - child_msg = "popen2 (child): file handle duplication failed -- " + child_msg; + { + // Parent process + gnulib::close (child_stdin[0]); + gnulib::close (child_stdout[1]); - (*current_liboctave_error_handler) (child_msg.c_str ()); - - exit (0); +#if defined (F_SETFL) && defined (O_NONBLOCK) + if (! sync_mode + && octave::syscalls::fcntl (child_stdout[0], F_SETFL, + O_NONBLOCK, msg) < 0) + msg = "popen2: error setting file mode -- " + msg; + else +#endif + { + fildes[0] = child_stdin[1]; + fildes[1] = child_stdout[0]; + return pid; + } + } + gnulib::close (child_stdout[0]); + gnulib::close (child_stdout[1]); } else - { - // Parent process - gnulib::close (child_stdin[0]); - gnulib::close (child_stdout[1]); + msg = "popen2: pipe creation failed -- " + msg; -#if defined (F_SETFL) && defined (O_NONBLOCK) - if (! sync_mode && octave_fcntl (child_stdout[0], F_SETFL, - O_NONBLOCK, msg) < 0) - msg = "popen2: error setting file mode -- " + msg; - else -#endif - { - fildes[0] = child_stdin[1]; - fildes[1] = child_stdout[0]; - return pid; - } - } - gnulib::close (child_stdout[0]); - gnulib::close (child_stdout[1]); + gnulib::close (child_stdin[0]); + gnulib::close (child_stdin[1]); } else msg = "popen2: pipe creation failed -- " + msg; - gnulib::close (child_stdin[0]); - gnulib::close (child_stdin[1]); - } - else - msg = "popen2: pipe creation failed -- " + msg; - - return -1; + return -1; #endif -} + } + + int + fcntl (int fd, int cmd, long arg) + { + std::string msg; + return octave::syscalls::fcntl (fd, cmd, arg, msg); + } -int -octave_fcntl (int fd, int cmd, long arg) -{ - std::string msg; - return octave_fcntl (fd, cmd, arg, msg); + int + fcntl (int fd, int cmd, long arg, std::string& msg) + { + msg = ""; + + int status = -1; + + status = gnulib::fcntl (fd, cmd, arg); + + if (status < 0) + msg = gnulib::strerror (errno); + + return status; + } + } } - -int -octave_fcntl (int fd, int cmd, long arg, std::string& msg) -{ - msg = ""; - - int status = -1; - - status = gnulib::fcntl (fd, cmd, arg); - - if (status < 0) - msg = gnulib::strerror (errno); - - return status; -} diff -r 80258bb3a14b -r 46f059de4dce liboctave/system/oct-syscalls.h --- a/liboctave/system/oct-syscalls.h Mon Apr 11 13:53:17 2016 -0400 +++ b/liboctave/system/oct-syscalls.h Mon Apr 11 14:39:02 2016 -0400 @@ -31,47 +31,61 @@ #include -struct -OCTAVE_API -octave_syscalls +namespace +octave { - static int dup2 (int, int); - static int dup2 (int, int, std::string&); + namespace + syscalls + { + extern OCTAVE_API int dup2 (int, int); + extern OCTAVE_API int dup2 (int, int, std::string&); + + extern OCTAVE_API int execvp (const std::string&, const string_vector&); + extern OCTAVE_API int execvp (const std::string&, const string_vector&, + std::string&); - static int execvp (const std::string&, const string_vector&); - static int execvp (const std::string&, const string_vector&, std::string&); + extern OCTAVE_API pid_t fork (std::string&); + + extern OCTAVE_API pid_t vfork (std::string&); + + extern OCTAVE_API pid_t getpgrp (std::string&); - static pid_t fork (std::string&); - static pid_t vfork (std::string&); + extern OCTAVE_API pid_t getpid (void); + + extern OCTAVE_API pid_t getppid (void); - static pid_t getpgrp (std::string&); + extern OCTAVE_API gid_t getgid (void); - static pid_t getpid (void); - static pid_t getppid (void); + extern OCTAVE_API gid_t getegid (void); - static gid_t getgid (void); - static gid_t getegid (void); + extern OCTAVE_API uid_t getuid (void); + + extern OCTAVE_API uid_t geteuid (void); - static uid_t getuid (void); - static uid_t geteuid (void); + extern OCTAVE_API int pipe (int *); + extern OCTAVE_API int pipe (int *, std::string&); - static int pipe (int *); - static int pipe (int *, std::string&); + extern OCTAVE_API pid_t waitpid (pid_t, int *status, int); + extern OCTAVE_API pid_t waitpid (pid_t, int *status, int, std::string&); + + extern OCTAVE_API int kill (pid_t, int); + extern OCTAVE_API int kill (pid_t, int, std::string&); - static pid_t waitpid (pid_t, int *status, int); - static pid_t waitpid (pid_t, int *status, int, std::string&); + extern OCTAVE_API pid_t + popen2 (const std::string&, const string_vector&, bool, int *); - static int kill (pid_t, int); - static int kill (pid_t, int, std::string&); + extern OCTAVE_API pid_t + popen2 (const std::string&, const string_vector&, bool, int *, + std::string&); - static pid_t popen2 (const std::string&, const string_vector&, bool, int *); - static pid_t popen2 (const std::string&, const string_vector&, bool, int *, - std::string&); - static pid_t popen2 (const std::string&, const string_vector&, bool, int *, - std::string&, bool &interactive); -}; + extern OCTAVE_API pid_t + popen2 (const std::string&, const string_vector&, bool, int *, + std::string&, bool &interactive); + + extern OCTAVE_API int fcntl (int, int, long); + extern OCTAVE_API int fcntl (int, int, long, std::string&); + } +} #endif -extern OCTAVE_API int octave_fcntl (int, int, long); -extern OCTAVE_API int octave_fcntl (int, int, long, std::string&);