ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/HostUpdate/HostUpdate.cpp
(Generate patch)

Comparing HostUpdate/HostUpdate.cpp (file contents):
Revision 14 by Douglas Thrift, 2003-11-07T23:04:39-08:00 vs.
Revision 22 by Douglas Thrift, 2003-11-10T23:58:38-08:00

# Line 7 | Line 7
7   #include "HostUpdate.hpp"
8   #include "Host.hpp"
9  
10 + #ifdef _WIN32
11 + #include <windows.h>
12 + #endif
13 +
14   int main(int argc, char* argv[])
15   {
16          HostUpdate update;
# Line 25 | Line 29 | HostUpdate::HostUpdate()
29  
30          delete [] hosts;
31  
32 <        chdir("hosts");
33 <
30 <        CgiEnvironment env = cgi.getEnvironment();
32 >        string agent = sgetenv("HTTP_USER_AGENT");
33 >        string method = sgetenv("REQUEST_METHOD");
34  
35 <        string agent = env.getUserAgent();
36 <        string method = env.getRequestMethod();
35 >        parse(method);
36 >        mode();
37  
38          if (agent.find("Host Update/") == 0 && method == "POST" && agent.find(" (")
39                  != string::npos && agent.find(") libwww-perl/") != string::npos)
40          {
41 <                update(env, agent);
41 >                update(agent);
42          }
43          else
44          {
45 <                display(env);
45 >                display();
46          }
47   }
48  
49 < HostUpdate::~HostUpdate()
49 > void HostUpdate::parse(const string& method)
50   {
51 <        //
51 >        string query;
52 >
53 >        if (method == "POST")
54 >        {
55 >                getline(cin, query);
56 >        }
57 >        else
58 >        {
59 >                query = sgetenv("QUERY_STRING");
60 >        }
61 >
62 >        if (query == "") return;
63 >
64 >        istringstream input(query);
65 >
66 >        do
67 >        {
68 >                string name, value;
69 >
70 >                getline(input, name, '=');
71 >                getline(input, value, '&');
72 >
73 >                cgi.insert(pair<string, string>(name, value));
74 >        }
75 >        while (input.good());
76   }
77  
78 < void HostUpdate::update(CgiEnvironment& env, const string& agent)
78 > void HostUpdate::mode()
79   {
80 <        cout << "Content-Type: text/plain\n\n";
80 >        host = false, name = false, address = false, platform = false, since =
81 >                false;
82 >
83 >        for (multimap<string, string>::iterator itor = cgi.find("mode"); itor !=
84 >                cgi.upper_bound("mode"); itor++)
85 >        {
86 >                string mode = itor->second;
87 >
88 >                for (string::iterator itor = mode.begin(); itor != mode.end(); itor++)
89 >                {
90 >                        char mode = *itor;
91 >
92 >                        switch (mode)
93 >                        {
94 >                        case 'h':
95 >                                if (!host) host = true;
96 >                                break;
97 >                        case 'n':
98 >                                if (!name) name = true;
99 >                                break;
100 >                        case 'a':
101 >                                if (!address) address = true;
102 >                                break;
103 >                        case 'p':
104 >                                if (!platform) platform = true;
105 >                                break;
106 >                        case 's':
107 >                                if (!since) since = true;
108 >                                break;
109 >                        default:
110 >                                break;
111 >                        }
112 >                }
113 >        }
114 >
115 >        if (!host && !name && !address && !platform && !since) host = true, name =
116 >                true, address = true, platform = true, since = true;
117 > }
118  
119 <        vector<FormEntry> entries;
119 > void HostUpdate::update(const string& agent)
120 > {
121 >        cout << "Content-Type: text/plain\n\n";
122  
123 <        if (!cgi.getElement("host", entries)) return;
58 <        if (entries[0].isEmpty()) return;
123 >        multimap<string, string>::iterator itor = cgi.find("host");
124  
125 <        string host = entries[0].getStrippedValue(), name = env.getRemoteHost(),
126 <                address = env.getRemoteAddr();
125 >        if (itor == cgi.end()) return;
126 >        if (itor->second == "") return;
127  
128 <        if (name == address) name = "";
128 >        string host = itor->second, name = sgetenv("REMOTE_HOST"), address =
129 >           sgetenv("REMOTE_ADDR");
130  
131          string::size_type begin = agent.find('(') + 1, end = agent.find(')',
132                  begin);
133          string platform = agent.substr(begin, end - begin);
134  
69        cout << "host=" << host << '\n'
70                << "name=" << name << '\n'
71                << "address=" << address << '\n'
72                << "platform=" << platform << '\n';
73
135          Host client(host, name, address, platform), saved(host);
136  
137          if (client != ++saved) client--;
138 +
139 +        display(client);
140   }
141  
142 < void HostUpdate::display(CgiEnvironment& env)
142 > void HostUpdate::display()
143   {
144          cout << "Content-Type: text/plain\n\n";
145  
146 +        {
147 +                bool request = false;
148 +
149 +                for (multimap<string, string>::iterator itor = cgi.find("host"); itor !=
150 +                        cgi.upper_bound("host"); itor++)
151 +                {
152 +                        if (itor->second != "")
153 +                        {
154 +                                Host host(itor->second);
155 +
156 +                                display(++host);
157 +
158 +                                if (!request) request = true;
159 +                        }
160 +                }
161 +
162 +                if (request) return;
163 +        }
164 +
165          set<Host> hosts;
166 <        DIR* dir = opendir(".");
166 >
167 > #ifndef _WIN32
168 >        DIR* dir = opendir("hosts");
169          struct dirent* ent;
170  
171          while ((ent = readdir(dir)) != NULL)
172          {
173                  string file = ent->d_name;
174  
91                cerr << file << '\n';
92
175                  if (file == "." || file == "..") continue;
176 <                
176 >
177                  Host host(file);
178  
179                  hosts.insert(++host);
180          }
181 <        
181 >
182          closedir(dir);
183 + #else
184 +        WIN32_FIND_DATA found;
185 +        HANDLE find = FindFirstFile("hosts\\*", &found);
186 +
187 +        do
188 +        {
189 +                string file = found.cFileName;
190 +
191 +                if (file == "." || file == "..") continue;
192 +
193 +                Host host(file);
194 +
195 +                hosts.insert(++host);
196 +        }
197 +        while (FindNextFile(find, &found) != 0);
198 +
199 +        FindClose(find);
200 + #endif
201  
202          for (set<Host>::iterator itor = hosts.begin(); itor != hosts.end(); itor++)
203          {
204 <                Host host = *itor;
204 >                display(*itor);
205 >        }
206 > }
207 >
208 > void HostUpdate::display(const Host& host)
209 > {
210 >        if (this->host) cout << "host=" << host.getHost() << '\n';
211 >        if (name) cout << "name=" << host.getName() << '\n';
212 >        if (address) cout << "address=" << host.getAddress() << '\n';
213 >        if (platform) cout << "platform=" << host.getPlatform() << '\n';
214 >
215 >        string name = string("hosts") + slash + host.getHost();
216 >        struct stat file;
217 >
218 >        if (since && stat(name.c_str(), &file) == 0)
219 >        {
220 >                char since[20];
221 >
222 >                strftime(since, 20, "%m/%d/%Y %H:%M:%S", gmtime(&file.st_mtime));
223 >
224 >                cout << "since=" << since << " GMT\n";
225 >        }
226 >        else if (since)
227 >        {
228 >                char since[20];
229 >                time_t* now = new time_t;
230 >
231 >                time(now);
232 >                strftime(since, 20, "%m/%d/%Y %H:%M:%S", gmtime(now));
233 >
234 >                delete now;
235  
236 <                cout << "host=" << host.getHost() << '\n'
107 <                        << "name=" << host.getName() << '\n'
108 <                        << "address=" << host.getAddress() << '\n'
109 <                        << "platform=" << host.getPlatform() << "\n\n";
236 >                cout << "since=" << since << " GMT\n";
237          }
238   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines