@@ -110,7 +110,7 @@ func (r *Reader) Lookup(ipAddress net.IP, result interface{}) error {
110
110
if r .buffer == nil {
111
111
return errors .New ("cannot call Lookup on a closed database" )
112
112
}
113
- pointer , err := r .lookupPointer (ipAddress )
113
+ pointer , _ , err := r .lookupPointer (ipAddress )
114
114
if pointer == 0 || err != nil {
115
115
return err
116
116
}
@@ -123,14 +123,20 @@ func (r *Reader) Lookup(ipAddress net.IP, result interface{}) error {
123
123
// is an advanced API, which exists to provide clients with a means to cache
124
124
// previously-decoded records.
125
125
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 ) {
126
131
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" )
128
133
}
129
- pointer , err := r .lookupPointer (ipAddress )
134
+ pointer , mask , err := r .lookupPointer (ipAddress )
130
135
if pointer == 0 || err != nil {
131
- return NotFound , err
136
+ return NotFound , 0 , err
132
137
}
133
- return r .resolveDataPointer (pointer )
138
+ ptr , err := r .resolveDataPointer (pointer )
139
+ return ptr , mask , err
134
140
}
135
141
136
142
// 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 {
166
172
return err
167
173
}
168
174
169
- func (r * Reader ) lookupPointer (ipAddress net.IP ) (uint , error ) {
175
+ func (r * Reader ) lookupPointer (ipAddress net.IP ) (uint , uint , error ) {
170
176
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" )
172
178
}
173
179
174
180
ipV4Address := ipAddress .To4 ()
175
181
if ipV4Address != nil {
176
182
ipAddress = ipV4Address
177
183
}
178
184
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 ())
180
186
}
181
187
182
188
return r .findAddressInTree (ipAddress )
183
189
}
184
190
185
- func (r * Reader ) findAddressInTree (ipAddress net.IP ) (uint , error ) {
191
+ func (r * Reader ) findAddressInTree (ipAddress net.IP ) (uint , uint , error ) {
186
192
187
193
bitCount := uint (len (ipAddress ) * 8 )
188
194
189
- var node uint
195
+ var node , i uint
190
196
if bitCount == 32 {
191
197
node = r .ipv4Start
192
198
}
193
199
194
200
nodeCount := r .Metadata .NodeCount
195
201
196
- for i : = uint (0 ); i < bitCount && node < nodeCount ; i ++ {
202
+ for i = uint (0 ); i < bitCount && node < nodeCount ; i ++ {
197
203
bit := uint (1 ) & (uint (ipAddress [i >> 3 ]) >> (7 - (i % 8 )))
198
204
199
205
var err error
200
206
node , err = r .readNode (node , bit )
201
207
if err != nil {
202
- return 0 , err
208
+ return 0 , 0 , err
203
209
}
204
210
}
205
211
if node == nodeCount {
206
212
// Record is empty
207
- return 0 , nil
213
+ return 0 , 0 , nil
208
214
} else if node > nodeCount {
209
- return node , nil
215
+ return node , i , nil
210
216
}
211
217
212
- return 0 , newInvalidDatabaseError ("invalid node in search tree" )
218
+ return 0 , 0 , newInvalidDatabaseError ("invalid node in search tree" )
213
219
}
214
220
215
221
func (r * Reader ) Netmask (ipAddress net.IP ) (uint , error ) {
0 commit comments