Added working NLSocket.open and scope handling.

This commit is contained in:
mbloch
2011-05-18 15:26:53 +01:00
parent 7f1cee61b7
commit cd58b64499
3 changed files with 30 additions and 1 deletions

5
README
View File

@@ -96,5 +96,8 @@ TODO
Copyright
=========
(C) 2011 Bytemark Hosting
Written by Brian Candler <B.Candler@pobox.com>
Copyright (C) 2011 Bytemark Computer Consulting Ltd
Distribute under the same terms as Ruby
http://www.ruby-lang.org/en/LICENSE.txt

View File

@@ -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

View File

@@ -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