# File lib/rfilter/deliver.rb, line 155 def deliver_filter(message, *command) begin to_r, to_w = IO.pipe from_r, from_w = IO.pipe if pid = fork # parent to_r.close from_w.close writer = Thread::new { message.each { |line| to_w << line to_w << "\n" unless line[-1] == ?\n } to_w.close } yield from_r else # child begin to_w.close from_r.close STDIN.reopen(to_r) to_r.close STDOUT.reopen(from_w) from_w.close exec(*command) ensure exit! end end ensure writer.kill if writer and writer.alive? [ to_r, to_w, from_r, from_w ].each { |io| if io && !io.closed? begin io.close rescue Errno::EPIPE end end } end Process.waitpid2(pid, 0)[1] end