‘
Contains $PWD of rct-fork server. Exists only while running.
# File lib/rcodetools/fork.rb, line 64
64: def self.add_env_args(opts, settings)
65: opts.separator ''
66: opts.separator 'Process environment options:'
67:
68: opts.separator ''
69: opts.on('-e CODE', 'Execute CODE in parent process.',
70: 'May be specified multiple times.') do |code|
71: settings[:code] << code
72: end
73:
74: opts.separator ''
75: opts.on('-I DIRECTORY', 'Adds DIRECTORY to $LOAD_PATH.',
76: 'May be specified multiple times.') do |dir|
77: settings[:extra_paths] << dir
78: end
79:
80: opts.separator ''
81: opts.on('-r LIBRARY', 'Require LIBRARY in the parent process.',
82: 'May be specified multiple times.') do |lib|
83: settings[:requires] << lib
84: end
85: end
# File lib/rcodetools/fork_config.rb, line 9
9: def self.chdir_fork_directory
10: if run?
11: Dir.chdir File.read(PWD_FILE)
12: else
13: raise "rct-fork is not running."
14: end
15: end
# File lib/rcodetools/fork.rb, line 87
87: def self.daemonize(io = File.open('/dev/null', 'r+'))
88: fork and exit!
89: Process.setsid
90: fork and exit!
91:
92: STDIN.reopen io
93: STDOUT.reopen io
94: STDERR.reopen io
95:
96: yield if block_given?
97: end
# File lib/rcodetools/fork.rb, line 99
99: def self.parse_client_args(args)
100: settings = Marshal.load Marshal.dump(DEFAULT_SETTINGS)
101:
102: opts = OptionParser.new do |opts|
103: opts.banner = "Usage: #{$0} [options]\n#{USAGE_HELP}"
104:
105: opts.separator ''
106: opts.on('-p', '--port PORT',
107: 'Listen for connections on PORT.',
108: "Default: #{settings[:port]}") do |port|
109: settings[:port] = port.to_i
110: end
111:
112: opts.separator ''
113: opts.on('-h', '--help', 'You\re looking at it.') do
114: $stderr.puts opts
115: exit 1
116: end
117:
118: add_env_args opts, settings
119: end
120:
121: opts.parse! args
122:
123: return settings
124: end
# File lib/rcodetools/fork.rb, line 126
126: def self.parse_server_args(args)
127: settings = Marshal.load Marshal.dump(DEFAULT_SETTINGS)
128:
129: opts = OptionParser.new do |opts|
130: opts.banner = "Usage: #{$0} [options]\n#{USAGE_HELP}"
131:
132: opts.separator ''
133: opts.on('-p', '--port PORT',
134: 'Listen for connections on PORT.',
135: "Default: #{settings[:port]}") do |port|
136: settings[:port] = port.to_i
137: end
138:
139: opts.separator ''
140: opts.on('-h', '--help', 'You\re looking at it.') do
141: $stderr.puts opts
142: exit 1
143: end
144:
145: add_env_args opts, settings
146: end
147:
148: opts.parse! args
149:
150: return settings
151: end
# File lib/rcodetools/fork_config.rb, line 21
21: def self.run?
22: File.file? PWD_FILE
23: end
# File lib/rcodetools/fork.rb, line 213
213: def self.setup_environment(settings)
214: settings[:extra_paths].map! { |dir| dir.split ':' }
215: settings[:extra_paths].flatten!
216: settings[:extra_paths].each { |dir| $:.unshift dir }
217:
218: begin
219: settings[:requires].each { |file| require file }
220: settings[:code].each { |code| eval code, TOPLEVEL_BINDING }
221: rescue Exception
222: $@.reject! {|s| s =~ %rcodetools/fork\.rb!}
223: raise
224: end
225: end
# File lib/rcodetools/fork.rb, line 153
153: def self.start_client(args = ARGV)
154: trap 'INT' do exit 1 end # Exit gracefully
155:
156: settings = parse_client_args args
157:
158: args = Marshal.dump [settings, ARGV]
159:
160: socket = TCPSocket.new 'localhost', settings[:port]
161:
162: socket.puts args.length
163: socket.write args
164: socket.close_write
165:
166: until socket.eof?
167: $stdout.puts socket.gets
168: end
169: end
# File lib/rcodetools/fork.rb, line 171
171: def self.start_server(args = ARGV)
172: begin
173: require 'rubygems'
174: rescue LoadError
175: end
176: write_pwd
177: settings = parse_server_args args
178: setup_environment settings
179:
180: server = TCPServer.new 'localhost', settings[:port]
181:
182: $stderr.puts "#{$0} Running as PID #{$$} on #{settings[:port]}"
183:
184: loop do
185: Thread.new server.accept do |socket|
186: begin
187: args_length = socket.gets.to_i
188: args = socket.read args_length
189: settings, argv = Marshal.load args
190:
191: fork do
192: daemonize socket do
193: ARGV.replace argv
194: setup_environment settings
195: socket.close
196: end
197: end
198:
199: socket.close # close my copy.
200: rescue => e
201: socket.close if socket
202: end
203: end
204: end
205: rescue Interrupt, SystemExit
206: File.unlink PWD_FILE
207: rescue Exception => e
208: File.unlink PWD_FILE
209: puts "Failed to catch #{e.class}:#{e.message}"
210: puts "\t#{e.backtrace.join "\n\t"}"
211: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.