Skip to content

Commit

Permalink
Implement Kernel.exec for 1.9 with environment variable as first argu…
Browse files Browse the repository at this point in the history
…ment
  • Loading branch information
erik-megarad committed Mar 18, 2012
1 parent f1c7558 commit 6cc5a4f
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 27 deletions.
1 change: 1 addition & 0 deletions kernel/common/load_order18.txt
Expand Up @@ -92,6 +92,7 @@ range18.rbc
struct.rbc
struct18.rbc
process.rbc
process18.rbc
random.rbc
regexp.rbc
regexp18.rbc
Expand Down
26 changes: 0 additions & 26 deletions kernel/common/process.rb
Expand Up @@ -730,32 +730,6 @@ def system(prog, *args)
end
module_function :system

def exec(cmd, *args)
if args.empty? and cmd.kind_of? String
raise Errno::ENOENT if cmd.empty?
if /([*?{}\[\]<>()~&|$;'`"\n\s]|[^\w-])/o.match(cmd)
Process.perform_exec "/bin/sh", ["sh", "-c", cmd]
else
Process.perform_exec cmd, [cmd]
end
else
if cmd.kind_of? Array
prog = cmd[0]
name = cmd[1]
else
name = prog = cmd
end

argv = [name]
args.each do |arg|
argv << arg.to_s
end

Process.perform_exec prog, argv
end
end
module_function :exec

def `(str) #`
str = StringValue(str) unless str.kind_of?(String)
pid, output = Process.replace(str)
Expand Down
27 changes: 27 additions & 0 deletions kernel/common/process18.rb
@@ -0,0 +1,27 @@
module Kernel
def exec(cmd, *args)
if args.empty? and cmd.kind_of? String
raise Errno::ENOENT if cmd.empty?
if /([*?{}\[\]<>()~&|$;'`"\n\s]|[^\w-])/o.match(cmd)
Process.perform_exec "/bin/sh", ["sh", "-c", cmd]
else
Process.perform_exec cmd, [cmd]
end
else
if cmd.kind_of? Array
prog = cmd[0]
name = cmd[1]
else
name = prog = cmd
end

argv = [name]
args.each do |arg|
argv << arg.to_s
end

Process.perform_exec prog, argv
end
end
module_function :exec
end
38 changes: 38 additions & 0 deletions kernel/common/process19.rb
Expand Up @@ -19,3 +19,41 @@ def self.daemon(stay_in_dir=false, keep_stdio_open=false)
return 0
end
end

module Kernel
def exec(environment_or_cmd, *args)
if environment_or_cmd.kind_of? Hash
environment_or_cmd.each do |key, value|
ENV[key] = value
end

cmd = args.shift
else
cmd = environment_or_cmd
end

if args.empty? and cmd.kind_of? String
raise Errno::ENOENT if cmd.empty?
if /([*?{}\[\]<>()~&|$;'`"\n\s]|[^\w-])/o.match(cmd)
Process.perform_exec "/bin/sh", ["sh", "-c", cmd]
else
Process.perform_exec cmd, [cmd]
end
else
if cmd.kind_of? Array
prog = cmd[0]
name = cmd[1]
else
name = prog = cmd
end

argv = [name]
args.each do |arg|
argv << arg.to_s
end

Process.perform_exec prog, argv
end
end
module_function :exec
end
1 change: 0 additions & 1 deletion spec/tags/19/ruby/core/kernel/exec_tags.txt
@@ -1,4 +1,3 @@
fails:Kernel#exec passes environment vars to the child environment
fails:Kernel#exec raises Errno::ENOENT if the script does not exist
fails:Kernel#exec raises Errno::EACCES when the file does not have execute permissions
fails:Kernel#exec raises Errno::ACCES when passed a directory

0 comments on commit 6cc5a4f

Please sign in to comment.