F
Florian Weingarten
Hey everybody,
I am having some weird problems with the Timeout module and IO.popen.
Basically, what I want to do is: Sign some data by gpg. For some reason, gpg
hangs sometimes and I want to have a timeout. If gpg does not return after
some time, I want to abort.
My code looks like this:
def pgpsign(msg)
signed_msg = msg
begin
Timeout::timeout(@gpgtimeout) {
io = IO.popen("#{@gpg} --clearsign --home=#{@gpghome}","w+") or return msg
io.puts msg
io.close_write
signed_msg = io.readlines.to_s
io.close
}
rescue
puts "GPG timed out. Sending unsigned message."
end
return signed_msg
end
However, if gpg really times out, I will get the following messages
fo/usr/lib/ruby/1.8/timeout.rb:60:in `puts': execution expired (Timeout::Error)
from /home/flo/bin/test.rb:423:in `pgpsign'
from /home/flo/bin/test.rb:421:in `pgpsign'
from /home/flo/bin/test.rb:410:in `msg'
from /home/flo/bin/test.rb:578
from /home/flo/bin/test.rb:574:in `each'
from /home/flo/bin/test.rb:574
gpg: [stdout]: write error: Broken pipe
gpg: iobuf_flush failed on close: file write error
What's up with that? Any ideas? Why do I get an exception, if I use
begin/rescue and why does gpg say broken pipe? Is there any easier
way to do what I want? I am sorry if this is a bit off-topic,
I know it feels more like a general misunderstanding of pipes than
a ruby specific problem.
Thanks in advance,
Flo
I am having some weird problems with the Timeout module and IO.popen.
Basically, what I want to do is: Sign some data by gpg. For some reason, gpg
hangs sometimes and I want to have a timeout. If gpg does not return after
some time, I want to abort.
My code looks like this:
def pgpsign(msg)
signed_msg = msg
begin
Timeout::timeout(@gpgtimeout) {
io = IO.popen("#{@gpg} --clearsign --home=#{@gpghome}","w+") or return msg
io.puts msg
io.close_write
signed_msg = io.readlines.to_s
io.close
}
rescue
puts "GPG timed out. Sending unsigned message."
end
return signed_msg
end
However, if gpg really times out, I will get the following messages
fo/usr/lib/ruby/1.8/timeout.rb:60:in `puts': execution expired (Timeout::Error)
from /home/flo/bin/test.rb:423:in `pgpsign'
from /home/flo/bin/test.rb:421:in `pgpsign'
from /home/flo/bin/test.rb:410:in `msg'
from /home/flo/bin/test.rb:578
from /home/flo/bin/test.rb:574:in `each'
from /home/flo/bin/test.rb:574
gpg: [stdout]: write error: Broken pipe
gpg: iobuf_flush failed on close: file write error
What's up with that? Any ideas? Why do I get an exception, if I use
begin/rescue and why does gpg say broken pipe? Is there any easier
way to do what I want? I am sorry if this is a bit off-topic,
I know it feels more like a general misunderstanding of pipes than
a ruby specific problem.
Thanks in advance,
Flo