Skip to content

Commit f637536

Browse files
committed
fixes 081e45f
1 parent 081e45f commit f637536

3 files changed

Lines changed: 20 additions & 45 deletions

File tree

.travis.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,6 @@ env:
2828
- MRUBY_VERSION=1.2.0
2929
- MRUBY_VERSION=head
3030

31-
matrix:
32-
allow_failures:
33-
- env: MRUBY_VERSION=1.2.0
34-
3531
script:
3632
- rake compile
3733
- rake test

src/internal.c

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -81,17 +81,14 @@ mrb_execarg_new(mrb_state *mrb)
8181
static void
8282
mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, mrb_value opts, struct mrb_execarg *eargp)
8383
{
84-
int ai, use_cmd;
84+
int ai, use_cmd, do_exit;
8585
char **result;
8686
char *shell;
87-
char *dln_cmd;
88-
const char *tCmd;
89-
char fbuf[/*MAXPATHLEN*/80]; // TODO
87+
const char *tCmd, *fCmd;
88+
char buf[80];
9089
mrb_value argv0 = mrb_nil_value();
9190

92-
ai = mrb_gc_arena_save(mrb);
93-
tCmd = mrb_string_value_ptr(mrb, argv[0]);
94-
dln_cmd = dln_find_exe_r(tCmd, 0, fbuf, sizeof(fbuf));
91+
ai = mrb_gc_arena_save(mrb);
9592

9693
if (mrb_hash_p(opts)) {
9794
eargp->fd.in = mrb_hash_get(mrb, opts, mrb_check_intern(mrb, "in", 2));
@@ -101,11 +98,11 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
10198
eargp->fd.in = eargp->fd.out = eargp->fd.err = mrb_nil_value();
10299
}
103100

104-
#if defined(__APPLE__) || defined(__linux__)
105-
use_cmd = ((argc > 1 || !strrchr(tCmd, ' ')) && dln_cmd) ? 1 : 0;
106-
#else
107-
use_cmd = ((argc > 1 || strstr(tCmd, ".exe") || !strrchr(tCmd, ' ')) && dln_cmd) ? 1 : 0; //TODO bei z.B. readelf.exe -v wäre ohne dln_cmd use_cmd=1, aber dln_find_exe_r kann "readelf -v" nicht auflösen!
108-
#endif
101+
tCmd = mrb_string_value_ptr(mrb, argv[0]);
102+
fCmd = dln_find_exe_r(tCmd, 0, buf, sizeof(buf));
103+
104+
do_exit = !fCmd && strncmp("exit", tCmd, 4) == 0;
105+
use_cmd = (!strrchr(tCmd, ' ') && (fCmd || (!do_exit && argc > 1))) ? 1 : 0;
109106

110107
if (use_cmd) {
111108
result = (char **)mrb_malloc(mrb, sizeof(char *) * (argc + 1));
@@ -114,17 +111,13 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
114111
argc = 3;
115112
result = (char **)mrb_malloc(mrb, sizeof(char *) * (argc + 1));
116113

117-
118-
119-
120-
121114
#if defined(__APPLE__) || defined(__linux__)
122115
shell = getenv("SHELL");
123-
if (!shell) shell = strdup(dln_find_exe_r("sh", 0, fbuf, sizeof(fbuf)));
116+
if (!shell) shell = strdup("bin/sh");
124117
result[1] = strdup("-c");
125118
#else
126119
shell = getenv("ComSpec");
127-
if (!shell) shell = strdup(dln_find_exe_r("cmd.exe", 0, fbuf, sizeof(fbuf)));
120+
if (!shell) shell = strdup("C:\\WINDOWS\\system32\\cmd.exe");
128121
result[1] = strdup("/c");
129122
#endif
130123
result[0] = shell;
@@ -134,21 +127,16 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
134127
result[argc] = NULL;
135128

136129
#if defined(__APPLE__) || defined(__linux__)
137-
if (result[0][0] != '/') {
138-
argv0 = mrb_str_new(mrb, dln_find_exe_r(tCmd, 0, fbuf, sizeof(fbuf)), 5); //TODO redundand?
130+
if (fCmd && result[0][0] != '/') {
131+
argv0 = mrb_str_new_cstr(mrb, fCmd);
139132
}
140133
#else
141-
if (result[0][1] != ':') {
142-
char *dln_result = dln_find_exe_r(tCmd, 0, fbuf, sizeof(fbuf));
143-
argv0 = mrb_str_new(mrb, dln_result, strlen(dln_result) ); // TODO: !!!
134+
if (fCmd && result[0][1] != ':') {
135+
argv0 = mrb_str_new_cstr(mrb, fCmd);
144136
}
145137
#endif
146138

147-
148-
149-
150139
if (mrb_bool(argv0)) {
151-
// mrb_str_cat_cstr(mrb, argv0, result[0]);
152140
result[0] = mrb_str_to_cstr(mrb, argv0);
153141
}
154142

test/process.rb

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def IO.sysopen(path, mod)
3434

3535
def read(path)
3636
f = File.open(path)
37-
f.read.to_s.strip
37+
f.read.to_s.strip.sub("\r", '').sub("\n", '')
3838
ensure
3939
f.close if f
4040
end
@@ -110,10 +110,6 @@ def assert_windows(*args, &block)
110110
assert_raise(ArgumentError) { spawn }
111111
assert_raise(TypeError) { spawn 123 }
112112

113-
# This test fails on travis (returns status 0 even cmd does not exist)
114-
# Suspended, now fails on windows as well
115-
# assert_raise(RuntimeError) { wait_for_pid spawn('.exe') } unless ENV['TRAVIS']
116-
117113
pid = spawn 'exit 0'
118114
wait_for_pid(pid)
119115

@@ -128,11 +124,6 @@ def assert_windows(*args, &block)
128124

129125
wait_for_pid(pid)
130126
assert_equal var, read('tmp/spawn.txt')
131-
132-
readelfpip = IO.sysopen('tmp/readelf.txt', 'w')
133-
pid = spawn("readelf.exe -v", out: readelfpip)
134-
# pid = spawn("readelf.exe", "-v", out: readelfpip) TODO pipe doesnt work with proper spawn call (spawn program directly w/o using cmd)
135-
wait_for_pid(pid)
136127
end
137128

138129
assert('Process.spawn', 'env') do
@@ -159,19 +150,19 @@ def assert_windows(*args, &block)
159150

160151
wait_for_pid(pid)
161152

162-
assert_equal var * 2, read('tmp/pipe.txt').sub("\r", '').sub("\n", '')
153+
assert_equal var * 2, read('tmp/pipe.txt')
163154
ensure
164155
IO._sysclose(pip) if OS.posix?
165156
end
166157
end
167158

168159
assert('Process.spawn', 'pipe error') do
169160
begin
170-
pip = IO.sysopen('tmp/pipe_error.txt', 'w')
171-
pid = spawn("ls -asdw", err: pip)
161+
pip = IO.sysopen('tmp/pipe.err', 'w')
162+
pid = spawn('ruby unknown', err: pip)
172163

173164
wait_for_pid(pid)
174-
assert_include read('tmp/pipe_error.txt'), "ls: option requires an argument"
165+
assert_false read('tmp/pipe.err').empty?
175166
ensure
176167
IO._sysclose(pip) if OS.posix?
177168
end

0 commit comments

Comments
 (0)