File: webrick/httpservlet/cgi_runner.rb

Code

Code

   1  #
   2  # cgi_runner.rb -- CGI launcher.
   3  #
   4  # Author: IPR -- Internet Programming with Ruby -- writers
   5  # Copyright (c) 2000 TAKAHASHI Masayoshi, GOTOU YUUZOU
   6  # Copyright (c) 2002 Internet Programming with Ruby writers. All rights
   7  # reserved.
   8  #
   9  # $IPR: cgi_runner.rb,v 1.9 2002/09/25 11:33:15 gotoyuzo Exp $
  10 
  11  def sysread(io, size)
  12    buf = ""
  13    while size > 0
  14      tmp = io.sysread(size)
  15      buf << tmp
  16      size -= tmp.size
  17    end
  18    return buf
  19  end
  20 
  21  STDIN.binmode
  22 
  23  buf = ""
  24  len = sysread(STDIN, 8).to_i
  25  out = sysread(STDIN, len)
  26  STDOUT.reopen(open(out, "w"))
  27 
  28  len = sysread(STDIN, 8).to_i
  29  err = sysread(STDIN, len)
  30  STDERR.reopen(open(err, "w"))
  31 
  32  len  = sysread(STDIN, 8).to_i
  33  dump = sysread(STDIN, len)
  34  hash = Marshal.restore(dump)
  35  ENV.keys.each{|name| ENV.delete(name) }
  36  hash.each{|k, v| ENV[k] = v if v }
  37 
  38  dir = File::dirname(ENV["SCRIPT_FILENAME"])
  39  Dir::chdir dir
  40 
  41  if interpreter = ARGV[0]
  42    argv = ARGV.dup
  43    argv << ENV["SCRIPT_FILENAME"]
  44    exec(*argv)
  45    # NOTREACHED
  46  end
  47  exec ENV["SCRIPT_FILENAME"]