summaryrefslogtreecommitdiff
path: root/process.c
diff options
context:
space:
mode:
Diffstat (limited to 'process.c')
-rw-r--r--process.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/process.c b/process.c
index 4763a87631..a2b3d7ceb5 100644
--- a/process.c
+++ b/process.c
@@ -713,7 +713,7 @@ static VALUE
rb_f_fork(obj)
VALUE obj;
{
-#if !defined(__human68k__) && !defined(NT) && !defined(__MACOS__) && !defined(__EMX__)
+#if !defined(__human68k__) && !defined(NT) && !defined(__MACOS__) && !defined(__EMX__) && !defined(__VMS)
int pid;
rb_secure(2);
@@ -886,6 +886,30 @@ rb_f_system(argc, argv)
last_status_set(status == -1 ? 127 : status);
return status == 0 ? Qtrue : Qfalse;
#else
+#if defined(__VMS)
+ VALUE cmd;
+ int status;
+
+ if (argc == 0) {
+ rb_last_status = Qnil;
+ rb_raise(rb_eArgError, "wrong number of arguments");
+ }
+
+ if (TYPE(argv[0]) == T_ARRAY) {
+ if (RARRAY(argv[0])->len != 2) {
+ rb_raise(rb_eArgError, "wrong first argument");
+ }
+ argv[0] = RARRAY(argv[0])->ptr[0];
+ }
+ cmd = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" "));
+
+ SafeStringValue(cmd);
+ status = system(RSTRING(cmd)->ptr);
+ last_status_set((status & 0xff) << 8);
+
+ if (status == 0) return Qtrue;
+ return Qfalse;
+#else
volatile VALUE prog = 0;
int pid;
int i;
@@ -938,6 +962,7 @@ rb_f_system(argc, argv)
if (NUM2INT(rb_last_status) == 0)
return Qtrue;
return Qfalse;
+#endif /* __VMS */
#endif /* __human68k__ */
#endif /* DJGPP */
#endif /* NT */