Skip to content

Commit cbd79bd

Browse files
authored
Merge pull request #1 from nsone/netmask-singlecall
Implemented method named LookupOffsetWithNetmask() to fetch the netma…
2 parents b981530 + 01c23dc commit cbd79bd

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

reader.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func (r *Reader) Lookup(ipAddress net.IP, result interface{}) error {
110110
if r.buffer == nil {
111111
return errors.New("cannot call Lookup on a closed database")
112112
}
113-
pointer, err := r.lookupPointer(ipAddress)
113+
pointer, _, err := r.lookupPointer(ipAddress)
114114
if pointer == 0 || err != nil {
115115
return err
116116
}
@@ -123,14 +123,20 @@ func (r *Reader) Lookup(ipAddress net.IP, result interface{}) error {
123123
// is an advanced API, which exists to provide clients with a means to cache
124124
// previously-decoded records.
125125
func (r *Reader) LookupOffset(ipAddress net.IP) (uintptr, error) {
126+
ptr, _, err := r.LookupOffsetWithNetmask(ipAddress)
127+
return ptr, err
128+
}
129+
130+
func (r *Reader) LookupOffsetWithNetmask(ipAddress net.IP) (uintptr, uint, error) {
126131
if r.buffer == nil {
127-
return 0, errors.New("cannot call LookupOffset on a closed database")
132+
return 0, 0, errors.New("cannot call LookupOffset on a closed database")
128133
}
129-
pointer, err := r.lookupPointer(ipAddress)
134+
pointer, mask, err := r.lookupPointer(ipAddress)
130135
if pointer == 0 || err != nil {
131-
return NotFound, err
136+
return NotFound, 0, err
132137
}
133-
return r.resolveDataPointer(pointer)
138+
ptr, err := r.resolveDataPointer(pointer)
139+
return ptr, mask, err
134140
}
135141

136142
// Decode the record at |offset| into |result|. The result value pointed to
@@ -166,50 +172,50 @@ func (r *Reader) decode(offset uintptr, result interface{}) error {
166172
return err
167173
}
168174

169-
func (r *Reader) lookupPointer(ipAddress net.IP) (uint, error) {
175+
func (r *Reader) lookupPointer(ipAddress net.IP) (uint, uint, error) {
170176
if ipAddress == nil {
171-
return 0, errors.New("ipAddress passed to Lookup cannot be nil")
177+
return 0, 0, errors.New("ipAddress passed to Lookup cannot be nil")
172178
}
173179

174180
ipV4Address := ipAddress.To4()
175181
if ipV4Address != nil {
176182
ipAddress = ipV4Address
177183
}
178184
if len(ipAddress) == 16 && r.Metadata.IPVersion == 4 {
179-
return 0, fmt.Errorf("error looking up '%s': you attempted to look up an IPv6 address in an IPv4-only database", ipAddress.String())
185+
return 0, 0, fmt.Errorf("error looking up '%s': you attempted to look up an IPv6 address in an IPv4-only database", ipAddress.String())
180186
}
181187

182188
return r.findAddressInTree(ipAddress)
183189
}
184190

185-
func (r *Reader) findAddressInTree(ipAddress net.IP) (uint, error) {
191+
func (r *Reader) findAddressInTree(ipAddress net.IP) (uint, uint, error) {
186192

187193
bitCount := uint(len(ipAddress) * 8)
188194

189-
var node uint
195+
var node, i uint
190196
if bitCount == 32 {
191197
node = r.ipv4Start
192198
}
193199

194200
nodeCount := r.Metadata.NodeCount
195201

196-
for i := uint(0); i < bitCount && node < nodeCount; i++ {
202+
for i = uint(0); i < bitCount && node < nodeCount; i++ {
197203
bit := uint(1) & (uint(ipAddress[i>>3]) >> (7 - (i % 8)))
198204

199205
var err error
200206
node, err = r.readNode(node, bit)
201207
if err != nil {
202-
return 0, err
208+
return 0, 0, err
203209
}
204210
}
205211
if node == nodeCount {
206212
// Record is empty
207-
return 0, nil
213+
return 0, 0, nil
208214
} else if node > nodeCount {
209-
return node, nil
215+
return node, i, nil
210216
}
211217

212-
return 0, newInvalidDatabaseError("invalid node in search tree")
218+
return 0, 0, newInvalidDatabaseError("invalid node in search tree")
213219
}
214220

215221
func (r *Reader) Netmask(ipAddress net.IP) (uint, error) {

0 commit comments

Comments
 (0)