#include "apache-version.h" /* Copyright (c) 2003 Michael Coulter */ /* connection timeout to server */ #define TIMEOUT 5 void usage(const char *cmd) { fprintf(stderr, "%s: \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); }