Listing 1: Webhead main program

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void getURL(char **argv, char *hostName,
            char *resource, int *httpPort);
int openSock(char *hostName, int httpPort);
int recvStr(int fd, char *cptr, int *len);
int sendStr(int fd, char *cptr);

main(int argc, char **argv)
{
  char buf[512];
  char hostName[512];
  char resource[512];
  int skt;
  int cont;
  int len;
  int state;
  int rc;
  char *cp;
  int httpPort = 80;

  if (argc < 2)
  { fprintf(stderr, "Usage: %s URL\n", argv[0]);
    exit(0);
  }

  getURL(argv, hostName, resource, &httpPort);
  skt = openSock(hostName, httpPort);

  /* send message to server - note CRLF line termination */
  sprintf(buf, "GET %s HTTP/1.0\r\n",resource);
  sendStr(skt, buf);
  sprintf(buf, "\r\n");
  sendStr(skt, buf);

  /* read and print response */
  cont = 1;
  state = 0;
  while (cont && recvStr(skt, buf, &len))
  { switch (state)
    { case 0: printf("%s\n",buf);          /* initial state */
              sscanf(buf, "%*s %d", &rc);
              if (rc >= 300)
                state = 1;
              else
                state = 2;
              break;
      case 1: printf("%s\n",buf);          /* error condition */
              break;
      case 2: printf("%s\n",buf);          /* OK - getting header */
              if (len == 0)
                state = 3;
              break;
      case 4:
      case 3: cp = strtok(buf, "< \t");  /* OK - search for title */
              while (cp)
              { if (!strncasecmp(cp, "title>", 6))
                { state = 4;
                  printf("TITLE: %s ",cp+6);
                }
                else if (!strncasecmp(cp, "/title>", 7) ||
                         !strncasecmp(cp, "/head>", 6)  ||
                         !strncasecmp(cp, "body>", 5))
                { cont = 0;
                  break;
                }
                else if (state == 4)
                  printf("%s ", cp);
                cp = strtok(NULL, "< \t");
              }
              break;
    }
  }
  printf("\n");
  close(skt);
}

/* End of File */