00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00029 #include <cstdlib>
00030 #include <new>
00031 #include <vector>
00032 #include <stdexcept>
00033 #include <iostream>
00034
00035 #include "cgicc/CgiDefs.h"
00036 #include "cgicc/Cgicc.h"
00037 #include "cgicc/HTTPHTMLHeader.h"
00038 #include "cgicc/HTMLClasses.h"
00039
00040 #if HAVE_UNAME
00041 # include <sys/utsname.h>
00042 #endif
00043
00044 #if HAVE_SYS_TIME_H
00045 # include <sys/time.h>
00046 #endif
00047
00048 #ifdef WIN32
00049 # include <winsock2.h>
00050 #else
00051 # include <sys/types.h>
00052 # include <sys/socket.h>
00053 # include <netinet/in.h>
00054 # include <arpa/inet.h>
00055 # include <netdb.h>
00056 #endif
00057
00058
00059
00060 #if DEBUG
00061 STDNS ofstream gLogFile( "/change_this_path/cgicc.log", STDNS ios::app );
00062 #endif
00063
00064 #if CGICC_USE_NAMESPACES
00065 using namespace std;
00066 using namespace cgicc;
00067 #else
00068 # define div div_
00069 # define link link_
00070 # define select select_
00071 #endif
00072
00073
00074 int
00075 main(int ,
00076 char ** )
00077 {
00078
00079 try {
00080 #if HAVE_GETTIMEOFDAY
00081 timeval start;
00082 gettimeofday(&start, NULL);
00083 #endif
00084
00085 Cgicc cgi;
00086
00087 cout << HTTPHTMLHeader() << HTMLDoctype(HTMLDoctype::eStrict) << endl;
00088 cout << html().set("lang","en").set("dir","ltr") << endl;
00089
00090
00091
00092
00093 cout << head() << endl;
00094
00095
00096 cout << style() << comment() << endl;
00097 cout << "body { color: black; background-color: white; }" << endl;
00098 cout << "hr.half { width: 60%; align: center; }" << endl;
00099 cout << "span.red, strong.red { color: red; }" << endl;
00100 cout << "div.smaller { font-size: small; }" << endl;
00101 cout << "div.dns { border: solid thin; margin: 1em 0; "
00102 << "background: #ddd; text-align: center; }" << endl;
00103 cout << "span.blue { color: blue; }" << endl;
00104 cout << "col.title { color: white; background-color: black; ";
00105 cout << "font-weight: bold; text-align: center; }" << endl;
00106 cout << "col.data { background-color: #ddd; text-align: left; }" << endl;
00107 cout << comment() << style() << endl;
00108
00109 cout << title("DNS Gateway") << endl;
00110 cout << head() << endl;
00111
00112 cout << h1() << "GNU cgi" << span("cc").set("class","red")
00113 << " DNS Gateway" << h1() << endl;
00114
00115 form_iterator ip = cgi.getElement("ip");
00116 form_iterator name = cgi.getElement("hostname");
00117
00118 if(ip != (*cgi).end()) {
00119 cout << h3() << "Query results for " << **ip << h3() << endl;
00120
00121 u_long addr;
00122 struct hostent *hp;
00123 char **p;
00124
00125 if((int)(addr = inet_addr((**ip).c_str())) == -1) {
00126 cout << CGICCNS div().set("class", "dns") << endl
00127 << strong(span("ERROR").set("class","red"))
00128 << " - IP address must be of the form x.x.x.x"
00129 << endl << CGICCNS div() << endl;
00130 }
00131 else {
00132 hp = gethostbyaddr((char*)&addr, sizeof (addr), AF_INET);
00133 if(hp == NULL) {
00134 cout << CGICCNS div().set("class", "dns") << endl
00135 << strong(span("ERROR").set("class","red"))
00136 << " - Host information for " << em((**ip)) << " not found."
00137 << endl << CGICCNS div() << endl;
00138 }
00139 else {
00140 for(p = hp->h_addr_list; *p != 0; p++) {
00141 struct in_addr in;
00142
00143
00144 (void) memcpy(&in.s_addr, *p, sizeof(in.s_addr));
00145
00146 cout << CGICCNS div().set("class", "dns") << endl
00147 << span(inet_ntoa(in)).set("class","blue")
00148 << " - " << ' ' << hp->h_name;
00149
00150
00151 cout << endl << CGICCNS div() << endl;
00152 }
00153 }
00154 }
00155 }
00156
00157
00158 if(name != (*cgi).end()) {
00159 cout << h3() << "Query results for " << **name << h3() << endl;
00160
00161 struct hostent *hp;
00162 char **p;
00163
00164 hp = gethostbyname((**name).c_str());
00165 if(hp == NULL) {
00166 cout << CGICCNS div().set("class", "dns") << endl
00167 << strong(span("ERROR").set("class","red"))
00168 << " - Host information for " << em(**name) << " not found."
00169 << endl << CGICCNS div() << endl;
00170 }
00171 else {
00172 for(p = hp->h_addr_list; *p != 0; p++) {
00173 struct in_addr in;
00174
00175
00176 (void) memcpy(&in.s_addr, *p, sizeof(in.s_addr));
00177
00178 cout << CGICCNS div().set("class", "dns") << endl
00179 << inet_ntoa(in) << " - " << ' '
00180 << span(hp->h_name).set("class","blue");
00181
00182
00183 cout << endl << CGICCNS div() << endl;
00184 }
00185 }
00186 }
00187
00188 cout << p("Please enter an IP address or a hostname.") << endl;
00189
00190 cout << table().set("border","0")
00191 .set("rules","none")
00192 .set("frame","void")
00193 .set("cellspacing","2").set("cellpadding","2") << endl;
00194 cout << colgroup().set("span","2") << endl;
00195 cout << col().set("align","center")
00196 .set("class","title")
00197 .set("span","1") << endl;
00198 cout << col().set("align","left")
00199 .set("class","data")
00200 .set("span","1") << endl;
00201 cout << colgroup() << endl;
00202
00203 cout << "<form method=\"post\" action=\"http://"
00204 << cgi.getEnvironment().getServerName();
00205 if(cgi.getEnvironment().getServerPort() != 80)
00206 cout << ":" << cgi.getEnvironment().getServerPort();
00207 cout << cgi.getEnvironment().getScriptName() << "\">" << endl;
00208
00209 cout << tr() << endl;
00210 cout << td(strong("IP Address: ")) << endl;
00211 cout << td() << "<input type=\"text\" name=\"ip\"";
00212 if(ip != (*cgi).end())
00213 cout << " value=\"" << **ip << "\">";
00214 else
00215 cout << ">";
00216 cout << td() << tr() << "</form>" << endl;
00217
00218 cout << "<form method=\"post\" action=\"http://"
00219 << cgi.getEnvironment().getServerName();
00220 if(cgi.getEnvironment().getServerPort() != 80)
00221 cout << ":" << cgi.getEnvironment().getServerPort();
00222 cout << cgi.getEnvironment().getScriptName() << "\">" << endl;
00223
00224 cout << tr() << endl;
00225 cout << td(strong("Hostname: ")) << endl;
00226 cout << td() << "<input type=\"text\" name=\"hostname\"";
00227 if(name != (*cgi).end())
00228 cout << " value=\"" << **name << "\">";
00229 else
00230 cout << ">";
00231 cout << td() << tr() << endl;
00232 cout << "</form>" << table() << p() << endl;
00233
00234
00235 cout << hr(set("class","half")) << endl;
00236 cout << CGICCNS div().set("align","center").set("class","smaller") << endl;
00237 cout << "GNU cgi" << span("cc").set("class","red") << " v"
00238 << cgi.getVersion() << br() << endl;
00239 cout << "Compiled at " << cgi.getCompileTime()
00240 << " on " << cgi.getCompileDate() << br() << endl;
00241
00242 cout << "Configured for " << cgi.getHost();
00243
00244 #if HAVE_UNAME
00245 struct utsname info;
00246 if(uname(&info) != -1) {
00247 cout << ". Running on " << info.sysname;
00248 cout << ' ' << info.release << " (";
00249 cout << info.nodename << ')' << endl;
00250 }
00251 #else
00252 cout << '.' << endl;
00253 #endif
00254
00255 #if HAVE_GETTIMEOFDAY
00256
00257 timeval end;
00258 gettimeofday(&end, NULL);
00259 long us = ((end.tv_sec - start.tv_sec) * 1000000)
00260 + (end.tv_usec - start.tv_usec);
00261
00262 cout << br() << "Total time for request = " << us << " us";
00263 cout << " (" << (double) (us/1000000.0) << " s)";
00264 #endif
00265
00266
00267 cout << CGICCNS div() << endl;
00268 cout << body() << html() << endl;
00269
00270 return EXIT_SUCCESS;
00271 }
00272
00273 catch(const STDNS exception& e) {
00274 return EXIT_FAILURE;
00275 }
00276 }