2
0

edge.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. edge.c -- edge tree management
  3. Copyright (C) 2000-2002 Guus Sliepen <guus@sliepen.warande.net>,
  4. 2000-2002 Ivo Timmermans <itimmermans@bigfoot.com>
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. $Id: edge.c,v 1.1.2.6 2002/02/10 21:57:54 guus Exp $
  17. */
  18. #include "config.h"
  19. #include <stdio.h>
  20. #include <syslog.h>
  21. #include <string.h>
  22. #include <avl_tree.h>
  23. #include <list.h>
  24. #include "net.h" /* Don't ask. */
  25. #include "netutl.h"
  26. #include "config.h"
  27. #include "conf.h"
  28. #include <utils.h>
  29. #include "subnet.h"
  30. #include "xalloc.h"
  31. #include "system.h"
  32. avl_tree_t *edge_tree; /* Tree with all known edges (replaces active_tree) */
  33. avl_tree_t *edge_weight_tree; /* Tree with all edges, sorted on weight */
  34. int edge_compare(edge_t *a, edge_t *b)
  35. {
  36. int result;
  37. result = strcmp(a->from.node->name, b->from.node->name);
  38. if(result)
  39. return result;
  40. else
  41. return strcmp(a->to.node->name, b->to.node->name);
  42. }
  43. /* Evil edge_compare() from a parallel universe ;)
  44. int edge_compare(edge_t *a, edge_t *b)
  45. {
  46. int result;
  47. return (result = strcmp(a->from.node->name, b->from.node->name)) || (result = strcmp(a->to.node->name, b->to.node->name)), result;
  48. }
  49. */
  50. int edge_name_compare(edge_t *a, edge_t *b)
  51. {
  52. int result;
  53. char *name_a1, *name_a2, *name_b1, *name_b2;
  54. if(strcmp(a->from.node->name, a->to.node->name) < 0)
  55. name_a1 = a->from.node->name, name_a2 = a->to.node->name;
  56. else
  57. name_a1 = a->to.node->name, name_a2 = a->from.node->name;
  58. if(strcmp(b->from.node->name, b->to.node->name) < 0)
  59. name_b1 = b->from.node->name, name_b2 = b->to.node->name;
  60. else
  61. name_b1 = b->to.node->name, name_b2 = b->from.node->name;
  62. result = strcmp(name_a1, name_b1);
  63. if(result)
  64. return result;
  65. else
  66. return strcmp(name_a2, name_b2);
  67. }
  68. int edge_weight_compare(edge_t *a, edge_t *b)
  69. {
  70. int result;
  71. result = a->weight - b->weight;
  72. if(result)
  73. return result;
  74. else
  75. return edge_name_compare(a, b);
  76. }
  77. void init_edges(void)
  78. {
  79. cp
  80. edge_tree = avl_alloc_tree((avl_compare_t)edge_compare, NULL);
  81. edge_weight_tree = avl_alloc_tree((avl_compare_t)edge_weight_compare, NULL);
  82. cp
  83. }
  84. avl_tree_t *new_edge_tree(void)
  85. {
  86. cp
  87. return avl_alloc_tree((avl_compare_t)edge_name_compare, NULL);
  88. cp
  89. }
  90. void free_edge_tree(avl_tree_t *edge_tree)
  91. {
  92. cp
  93. avl_delete_tree(edge_tree);
  94. cp
  95. }
  96. void exit_edges(void)
  97. {
  98. cp
  99. avl_delete_tree(edge_tree);
  100. cp
  101. }
  102. /* Creation and deletion of connection elements */
  103. edge_t *new_edge(void)
  104. {
  105. edge_t *e;
  106. cp
  107. e = (edge_t *)xmalloc_and_zero(sizeof(*e));
  108. cp
  109. return e;
  110. }
  111. void free_edge(edge_t *e)
  112. {
  113. cp
  114. free(e);
  115. cp
  116. }
  117. void edge_add(edge_t *e)
  118. {
  119. cp
  120. avl_insert(edge_tree, e);
  121. avl_insert(edge_weight_tree, e);
  122. avl_insert(e->from.node->edge_tree, e);
  123. avl_insert(e->to.node->edge_tree, e);
  124. cp
  125. }
  126. void edge_del(edge_t *e)
  127. {
  128. cp
  129. avl_delete(edge_tree, e);
  130. avl_delete(edge_weight_tree, e);
  131. avl_delete(e->from.node->edge_tree, e);
  132. avl_delete(e->to.node->edge_tree, e);
  133. cp
  134. }
  135. edge_t *lookup_edge(node_t *from, node_t *to)
  136. {
  137. edge_t v, *result;
  138. cp
  139. v.from.node = from;
  140. v.to.node = to;
  141. result = avl_search(edge_tree, &v);
  142. if(result)
  143. return result;
  144. cp
  145. v.from.node = to;
  146. v.to.node = from;
  147. return avl_search(edge_tree, &v);
  148. }
  149. void dump_edges(void)
  150. {
  151. avl_node_t *node;
  152. edge_t *e;
  153. char *from_address, *to_address;
  154. cp
  155. syslog(LOG_DEBUG, _("Edges:"));
  156. for(node = edge_tree->head; node; node = node->next)
  157. {
  158. e = (edge_t *)node->data;
  159. from_address = address2str(e->from.address);
  160. to_address = address2str(e->to.address);
  161. syslog(LOG_DEBUG, _(" %s at %s port %hd - %s at %s port %hd options %ld weight %d"),
  162. e->from.node->name, from_address, e->from.port,
  163. e->to.node->name, to_address, e->to.port,
  164. e->options, e->weight);
  165. free(from_address);
  166. free(to_address);
  167. }
  168. syslog(LOG_DEBUG, _("End of edges."));
  169. cp
  170. }