#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);

}