def child_process
if (Process.euid == 0 && (@subprocess_user || @subprocess_group)) then
begin
require 'etc'
if (@subprocess_group) then
case (@subprocess_group)
when Numeric
gid = @subprocess_group
else
gid = Etc.getgrnam(@subprocess_group).gid
end
Process.gid = gid
Process.egid = gid
end
if (@subprocess_user) then
case (@subprocess_user)
when Numeric
uid = @subprocess_user
else
uid = Etc.getpwnam(@subprocess_user).uid
end
Process.uid = uid
Process.euid = uid
end
rescue
@logger.warning("[#{Time.now.httpdate}] failed to change subprocess privilege.")
end
end
socket_queue = SocketQueue.new(@messenger_queue_length)
messenger_thgrp = start_messengers(@messenger_threads, socket_queue, @document, @logger, MultiThreadMessenger)
while (cmd = @child_socket.read(CMD_LEN))
case (cmd)
when SEND_IO
socket = @child_socket.recv_io(TCPSocket)
socket_queue.push(socket)
@child_socket.write(RECV_IO)
when CLOSE
until (socket_queue.empty?)
sleep(0.1)
end
stop_messengers(@messenger_threads, socket_queue, messenger_thgrp)
@child_socket.write(CLOSE)
@child_socket.close
break
else
raise 'internal error.'
end
end
nil
end