diff --git a/README b/README index 4c15852..c892b65 100644 --- a/README +++ b/README @@ -96,5 +96,8 @@ TODO Copyright ========= +(C) 2011 Bytemark Hosting +Written by Brian Candler -Copyright (C) 2011 Bytemark Computer Consulting Ltd +Distribute under the same terms as Ruby +http://www.ruby-lang.org/en/LICENSE.txt diff --git a/lib/linux/netlink/nlsocket.rb b/lib/linux/netlink/nlsocket.rb index 50ff0f6..47c70c3 100644 --- a/lib/linux/netlink/nlsocket.rb +++ b/lib/linux/netlink/nlsocket.rb @@ -29,6 +29,17 @@ module Netlink raise "Bad AF #{af}!" if af != Socket::AF_NETLINK raise "Bad PID #{pid}!" if pid != 0 end + + # Create a new Netlink socket, and pass it to the given block. Ensures + # the the socket is closed when we're finished. + def self.open(opt={}) + sock = self.new(opt) + begin + yield(sock) + ensure + sock.close + end + end attr_accessor :socket # the underlying Socket attr_accessor :seq # the last sequence number used @@ -64,6 +75,11 @@ module Netlink } end end + + # Close the Netlink socket + def close + @socket.close + end # Generate the next sequence number def next_seq diff --git a/lib/linux/netlink/route/addr_handler.rb b/lib/linux/netlink/route/addr_handler.rb index 792d794..1e4c393 100644 --- a/lib/linux/netlink/route/addr_handler.rb +++ b/lib/linux/netlink/route/addr_handler.rb @@ -111,10 +111,20 @@ module Netlink ipaddr_modify(RTM_DELADDR, 0, opt) end + SCOPES = { + :global => 0, + :nowhere => 1, + :host => 254, + :link => 253, + :site => 200 + } + def ipaddr_modify(code, flags, msg) #:nodoc: msg = IFAddr.new(msg) msg.index = index(msg.index) unless msg.index.is_a?(Integer) msg.address ||= msg.local + msg.scope = SCOPES[msg.scope.to_s.downcase.to_sym] if + msg.scope && !msg.scope.is_a?(Integer) # Note: IPAddr doesn't support addresses off the subnet base, # so there's no point trying to set msg.prefixlen from the IPAddr mask @rtsocket.cmd code, msg, flags|NLM_F_REQUEST