00001
00002
00003
00004
00005
00006
00007
#include "wvipaliaser.h"
00008
#include "wvinterface.h"
00009
#include <assert.h>
00010
00011
00012 WvIPAliaser::AliasList WvIPAliaser::all_aliases;
00013
00014
00015
00016
00017
00018
00019
00020 WvIPAliaser::Alias::Alias(
const WvIPAddr &_ip) : ip(_ip)
00021 {
00022
WvIPAddr noip;
00023
WvIPNet nonet(noip, noip);
00024 link_count = 0;
00025
00026
for (index = 0; index < 256; index++)
00027 {
00028
WvInterface i(
WvString(
"lo:wv%s", index));
00029
00030
if (!i.
isup() || i.
ipaddr() == nonet)
00031 {
00032 i.
setipaddr(ip);
00033 i.
up(
true);
00034
if (
WvIPAddr(i.
ipaddr()) != ip)
00035 {
00036
00037 index = -1;
00038 i.
up(
false);
00039 }
00040
return;
00041 }
00042
00043
if (i.
isup() &&
WvIPNet(i.
ipaddr(),32) == ip)
00044 {
00045
00046
00047
return;
00048 }
00049 }
00050
00051
00052 index = -1;
00053 }
00054
00055
00056 WvIPAliaser::Alias::~Alias()
00057 {
00058
if (index >= 0)
00059 {
00060
WvInterface i(
WvString(
"lo:wv%s", index));
00061
00062 i.
up(
false);
00063 }
00064 }
00065
00066
00067
00068
00069
00070
00071
00072 WvIPAliaser::WvIPAliaser() : interfaces()
00073 {
00074
00075 }
00076
00077
00078 WvIPAliaser::~WvIPAliaser()
00079 {
00080
00081
start_edit();
00082
done_edit();
00083 }
00084
00085
00086 void WvIPAliaser::start_edit()
00087 {
00088 AliasList::Iter i(aliases);
00089
00090
#ifndef NDEBUG
00091
AliasList::Iter i_all(all_aliases);
00092
#endif
00093
00094 interfaces.
update();
00095
00096
for (i.rewind(); i.next(); )
00097 {
00098 assert(i_all.find(i.ptr()));
00099
00100
00101 i().link_count--;
00102 }
00103
00104
00105 aliases.zap();
00106 }
00107
00108
00109 WvIPAliaser::Alias *WvIPAliaser::ipsearch(WvIPAliaser::AliasList &l,
00110
const WvIPAddr &ip)
00111 {
00112 AliasList::Iter i(l);
00113
00114
for (i.rewind(); i.next(); )
00115 {
00116
if (i->ip ==
WvIPAddr(ip))
00117
return i.ptr();
00118 }
00119
00120
return NULL;
00121 }
00122
00123
00124 void WvIPAliaser::add(
const WvIPAddr &ip)
00125 {
00126 Alias *a;
00127
00128
if (
WvIPAddr(ip) ==
WvIPAddr() || ipsearch(aliases, ip))
00129
return;
00130
00131 a = ipsearch(all_aliases, ip);
00132
if (a)
00133 {
00134
00135 aliases.append(a,
false);
00136 a->link_count++;
00137 }
00138
else if (!interfaces.
islocal(
WvIPAddr(ip)))
00139 {
00140
00141
00142 a =
new Alias(ip);
00143 aliases.append(a,
false);
00144 all_aliases.append(a,
true);
00145 a->link_count++;
00146 }
00147 }
00148
00149
00150 void WvIPAliaser::done_edit()
00151 {
00152 AliasList::Iter i(all_aliases);
00153
00154 i.rewind(); i.next();
00155
while (i.cur())
00156 {
00157 Alias &a = *i;
00158
if (!a.link_count)
00159 i.unlink();
00160
else
00161 i.next();
00162 }
00163 }
00164
00165
00166 void WvIPAliaser::dump()
00167 {
00168 {
00169
WvLog log(
"local aliases");
00170 AliasList::Iter i(aliases);
00171
for (i.rewind(); i.next(); )
00172 {
00173 Alias &a = *i;
00174
log(
"#%s = lo:wv%s: %s (%s links)\n",
00175 a.index, a.index, a.ip, a.link_count);
00176 }
00177
log(
".\n");
00178 }
00179
00180 {
00181
WvLog log(
"global aliases");
00182 AliasList::Iter i(all_aliases);
00183
for (i.rewind(); i.next(); )
00184 {
00185 Alias &a = *i;
00186
log(
"#%s = lo:wv%s: %s (%s links)\n",
00187 a.index, a.index, a.ip, a.link_count);
00188 }
00189
log(
".\n.\n");
00190 }
00191 }