1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>deliver_filter (RFilter::Deliver)</title>
<link rel=StyleSheet href="../../.././rdoc-style.css" type="text/css" media="screen" />
</head>
<body bgcolor="white">
<pre><span class="cmt"># File lib/rfilter/deliver.rb, line 172</span>
<span class="kw">def</span> deliver_filter(message, *command)
<span class="kw">begin</span>
to_r, to_w = IO.pipe
from_r, from_w = IO.pipe
<span class="kw">if</span> pid = fork
<span class="cmt"># parent</span>
to_r.close
from_w.close
writer = Thread::new {
message.each { |line|
to_w << line
to_w << <span class="str">"\n"</span> <span class="kw">unless</span> line[-1] == ?\n
}
to_w.close
}
<span class="kw">yield</span> from_r
<span class="kw">else</span>
<span class="cmt"># child</span>
<span class="kw">begin</span>
to_w.close
from_r.close
STDIN.reopen(to_r)
to_r.close
STDOUT.reopen(from_w)
from_w.close
exec(*command)
<span class="kw">ensure</span>
exit!
<span class="kw">end</span>
<span class="kw">end</span>
<span class="kw">ensure</span>
writer.kill <span class="kw">if</span> writer <span class="kw">and</span> writer.alive?
[ to_r, to_w, from_r, from_w ].each { |io|
<span class="kw">if</span> io && !io.closed?
<span class="kw">begin</span>
io.close
<span class="kw">rescue</span> Errno::EPIPE
<span class="kw">end</span>
<span class="kw">end</span>
}
<span class="kw">end</span>
Process.waitpid2(pid, 0)[1]
<span class="kw">end</span></pre>
</body>
</html>
|