@@ -121,6 +121,31 @@ func networkRelease(prefix netip.Prefix, node *node) *netip.Prefix {
121121 return result
122122}
123123
124+ func networkIsAvailable (prefix netip.Prefix , node * node ) bool {
125+ if node == nil {
126+ return true
127+ }
128+
129+ if node .prefix .Addr ().Compare (prefix .Addr ()) == 0 && node .prefix .Bits () == prefix .Bits () {
130+ if node .left != nil && (node .left .left != nil || node .left .right != nil ) {
131+ return false
132+ }
133+ if node .right != nil && (node .right .left != nil || node .right .right != nil ) {
134+ return false
135+ }
136+ return ! node .acquired
137+ }
138+
139+ if node .left != nil && node .left .prefix .Overlaps (prefix ) && ! node .left .acquired {
140+ return networkIsAvailable (prefix , node .left )
141+ }
142+ if node .right != nil && node .right .prefix .Overlaps (prefix ) && ! node .right .acquired {
143+ return networkIsAvailable (prefix , node .right )
144+ }
145+
146+ return false
147+ }
148+
124149func listNetworks (node * node ) []netip.Prefix {
125150 if node == nil {
126151 return nil
@@ -308,13 +333,13 @@ func (n *node) toGraphviz() error {
308333 n .toGraphvizRecursive (& sb )
309334 sb .WriteString ("}\n " )
310335
311- if _ , err := os .Stat ("/graphviz" ); os .IsNotExist (err ) {
312- if err := os .Mkdir ("/graphviz" , 0o700 ); err != nil {
336+ if _ , err := os .Stat (". /graphviz" ); os .IsNotExist (err ) {
337+ if err := os .Mkdir (". /graphviz" , 0o700 ); err != nil {
313338 return err
314339 }
315340 }
316341
317- filePath := filepath .Clean ("/graphviz/" + strings .NewReplacer ("/" , "_" , "." , "_" ).Replace (n .prefix .String ()) + ".dot" )
342+ filePath := filepath .Clean (". /graphviz/" + strings .NewReplacer ("/" , "_" , "." , "_" ).Replace (n .prefix .String ()) + ".dot" )
318343 file , err := os .Create (filePath )
319344 if err != nil {
320345 return err
0 commit comments