about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2012-06-12 18:29:00 -0700
committerEric Wong <normalperson@yhbt.net>2012-06-12 18:29:00 -0700
commit5c62376bc9a1b0d7c8e664784a1fb97747a7c392 (patch)
tree4f1fe250ca670465dc9576e9a73b3ce79105394f
parent506df98df1dae59281fbb3b3c2c6bea7549a2288 (diff)
downloadraindrops-5c62376bc9a1b0d7c8e664784a1fb97747a7c392.tar.gz
When unix_listener_stats is called without arguments, it should
still match the behavior of tcp_listener_stats and return
ListenerStats object with zero values.

This allows callers to iterate through the results to find the
pathnames of all the Unix domain sockets in in listen mode.
-rw-r--r--lib/raindrops/linux.rb14
-rw-r--r--test/test_linux.rb11
2 files changed, 21 insertions, 4 deletions
diff --git a/lib/raindrops/linux.rb b/lib/raindrops/linux.rb
index 1752b8a..7cfb653 100644
--- a/lib/raindrops/linux.rb
+++ b/lib/raindrops/linux.rb
@@ -54,14 +54,20 @@ module Raindrops::Linux
         Regexp.escape(path)
       end
     end
-    paths = /^\w+: \d+ \d+ 00000000 \d+ (\d+)\s+\d+ (#{paths.join('|')})$/n
+    paths = /^\w+: \d+ \d+ (\d+) \d+ (\d+)\s+\d+ (#{paths.join('|')})$/n
 
     # no point in pread since we can't stat for size on this file
     File.read(*PROC_NET_UNIX_ARGS).scan(paths) do |s|
       path = s[-1]
-      case s[0].to_i
-      when 2 then rv[path].queued += 1
-      when 3 then rv[path].active += 1
+      case s[0]
+      when "00000000" # client sockets
+        case s[1].to_i
+        when 2 then rv[path].queued += 1
+        when 3 then rv[path].active += 1
+        end
+      else
+        # listeners, vivify empty stats
+        rv[path]
       end
     end
 
diff --git a/test/test_linux.rb b/test/test_linux.rb
index a84eecf..0e79a86 100644
--- a/test/test_linux.rb
+++ b/test/test_linux.rb
@@ -67,6 +67,17 @@ class TestLinux < Test::Unit::TestCase
     assert_equal 1, stats[tmp.path].queued
   end
 
+  def test_unix_all_unused
+    tmp = Tempfile.new("\xde\xad\xbe\xef") # valid path, really :)
+    File.unlink(tmp.path)
+    us = UNIXServer.new(tmp.path)
+    stats = unix_listener_stats
+    assert stats.keys.include?(tmp.path), stats.inspect
+
+    assert_equal 0, stats[tmp.path].active
+    assert_equal 0, stats[tmp.path].queued
+  end
+
   def test_unix_resolves_symlinks
     tmp = Tempfile.new("\xde\xad\xbe\xef") # valid path, really :)
     File.unlink(tmp.path)