#include "apache-version.h"
/* Copyright (c) 2003 Michael Coulter <
[email protected]> */
/* connection timeout to server */
#define TIMEOUT 5
void
usage(const char *cmd)
{
fprintf(stderr, "%s: <target>\n", cmd);
exit(-1);
}
void
ctimeout(int signal)
{
write(STDOUT_FILENO, "Host unreachable\n", strlen("Host unreachable\n"));
exit(0);
}
void
rtimeout(int signal)
{
write(STDOUT_FILENO, "Port listening, may not be a webserver?\n", strlen("Port listening, may not be a webserver?\n"));
exit(0);
}
int
web_connect(struct webserver * webserver)
{
struct sockaddr_in sa;
struct servent *service;
//for searching
/etc / services
struct hostent *hp;
//for storing
lookups
bzero(&sa, sizeof(sa));
webserver->sockfd = socket(AF_INET, SOCK_STREAM, 0);
//ipv6
fcntl(webserver->sockfd, O_NONBLOCK);
hp = gethostbyname2(webserver->server, AF_INET);
service = getservbyname("www", "tcp");
if (!service)
err(0, "could not locate entry in /etc/services for www");
memcpy(&sa.sin_addr, hp->h_addr, sizeof(struct in_addr));
sa.sin_port = service->s_port;
sa.sin_family = hp->h_addrtype;
signal(SIGALRM, ctimeout);
alarm(TIMEOUT);
if (connect(webserver->sockfd, (struct sockaddr *) & sa, sizeof(struct sockaddr)) < 0) {
printf("No webserver: %s\n", inet_ntoa(sa.sin_addr));
exit(0);
}
alarm(0);
return;
}
int
main(int argc, char *argv[])
{
struct webserver webserver;
char buf[MAXLINE];
char *a, *b;
if (argc != 2)
usage(argv[0]);
webserver.server = strdup(argv[1]);
printf("%s: ", webserver.server);
web_connect(&webserver);
free(webserver.server);
signal(SIGALRM, rtimeout);
alarm(TIMEOUT);
write(webserver.sockfd, "HEAD / HTTP/1.0\r\n\r\n", 19);
while (read(webserver.sockfd, buf, MAXLINE)) {
if (a = strstr(buf, "\nServer: ")) {
b = ++a;
while ((*b != '\0') && (*b != '\r') && (*b != '\n')) {
b++;
}
*b = '\0';
webserver.version = strdup(a + strlen("Server: "));
printf("%s\n", webserver.version);
free(webserver.version);
}
}
alarm(0);
exit(0);
}