ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/HostUpdate/Host.cpp
Revision: 900
Committed: 2007-04-29T02:26:40-07:00 (18 years, 1 month ago) by douglas
File size: 2575 byte(s)
Log Message:
Woo!

File Contents

# Content
1 // Host Update
2 //
3 // Douglas Thrift
4 //
5 // $Id$
6
7 #include "Host.hpp"
8
9 Host::Host(const std::string& host, const std::string& name, const std::string& address, const std::string& platform)
10 {
11 ::memset(&this->address, 0, sizeof(in_addr));
12
13 #ifdef _WIN32
14 if (count == 0)
15 if (::WSAStartup(MAKEWORD(2, 0), &data) != 0)
16 {
17 std::cerr << "Host(): WSAStartup()\n";
18
19 ::exit(1);
20 }
21
22 count++;
23 #endif
24
25 setHost(host);
26
27 if (name != "")
28 setName(name, address == "");
29
30 if (address != "")
31 setAddress(address, name == "");
32
33 setPlatform(platform);
34 }
35
36 Host::~Host()
37 {
38 #ifdef _WIN32
39 count--;
40
41 if (count == 0)
42 if (::WSACleanup() != 0)
43 {
44 std::cerr << "~Host(): WSACleanup()\n";
45
46 ::exit(1);
47 }
48 #endif
49 }
50
51 void Host::setName(const std::string& name, bool lookup)
52 {
53 this->name = name;
54
55 if (lookup)
56 {
57 struct ::hostent* ent(::gethostbyname(this->name.c_str()));
58
59 ::memcpy(&address, *(ent->h_addr_list), ent->h_length);
60 }
61 }
62
63 void Host::setAddress(const std::string& address, bool lookup)
64 {
65 ::in_addr_t value = ::inet_addr(address.c_str());
66
67 if (value == INADDR_NONE)
68 std::cerr << "Host.setAddress(): INADDR_NONE\n";
69 else
70 ::memcpy(&this->address, &value, sizeof(::in_addr_t));
71
72 if (lookup)
73 {
74 struct ::hostent* ent(::gethostbyaddr((char*)(&this->address), sizeof(in_addr), AF_INET));
75
76 if (ent != NULL)
77 name = ent->h_name;
78 }
79 }
80
81 bool Host::operator==(const Host& host) const
82 {
83 if (this->host == host.host)
84 if (name == host.name)
85 if (std::string(::inet_ntoa(address)) == ::inet_ntoa(host.address))
86 return platform == host.platform;
87 else
88 return false;
89 else
90 return false;
91 else
92 return false;
93 }
94
95 Host Host::operator++()
96 {
97 std::string file(std::string("hosts") + slash + host);
98 std::ifstream fin(file.c_str());
99
100 if (fin.is_open())
101 {
102 std::getline(fin, name);
103
104 std::string address;
105
106 std::getline(fin, address);
107
108 ::in_addr_t value(::inet_addr(address.c_str()));
109
110 if (value == INADDR_NONE)
111 std::cerr << "Host.operator++(): INADDR_NONE\n";
112 else
113 ::memcpy(&this->address, &value, sizeof(in_addr_t));
114
115 std::getline(fin, platform);
116 fin.close();
117 }
118
119 return *this;
120 }
121
122 Host Host::operator++(int)
123 {
124 Host old = *this;
125
126 ++*this;
127
128 return old;
129 }
130
131 Host Host::operator--()
132 {
133 std::string file = std::string("hosts") + slash + host;
134
135 std::ofstream fout(file.c_str());
136
137 fout << name << '\n' << ::inet_ntoa(address) << '\n' << platform << '\n';
138
139 fout.close();
140
141 return *this;
142 }
143
144 Host Host::operator--(int)
145 {
146 Host old = *this;
147
148 --*this;
149
150 return old;
151 }
152
153 #ifdef _WIN32
154
155 unsigned Host::count(0);
156 WSADATA Host::data;
157
158 #endif

Properties

Name Value
svn:eol-style native
svn:keywords Id