/* simple google search results extractor, written by aca , anikolic@phearless.org */
/* www.phearless.org */
/* no licence of any kind here :)) you may do with this what ever you want... */

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>

#define MAXBUFF 4096


char *html,*link,*query,*link_list;
int sockfd,i;
int link_size;

void die()
{
free(html);
free(link);
free(link_list);
free(query);
close(sockfd);
exit(0);
}

void parse()
{
char *p;
char *r;
p = html;
for(;;)
    {
    p = strstr(p,"href=\"http");
    if(p == NULL) break;
    p = p + 6;
    r = strstr(p,"\"");
    link_size = r - p;
    link_size++;
    if(link_size >= MAXBUFF/4)
	{
	link_size = MAXBUFF/4;
	}
    (void)snprintf(link,link_size,"%s\n",p);
    link[link_size-1] = '\n';
    if((MAXBUFF*4 - strlen(link_list)) <= link_size) break;
    if((r = strstr(link,"google")) != 0 ) 
	{
	link_size = 0;
	}
    if((r = strstr(link,"cache")) != 0 ) 
	{
	link_size = 0;
	}
	
    strncat(link_list,link,link_size);
    p = p + link_size;
    }

}


int main(int argc, char **argv)
{

struct hostent *search_engine;
struct sockaddr_in servaddr;
char storage[MAXBUFF];
char srchstr[MAXBUFF];
int recved,max = 0;
if(argc!=2)
    {
    printf("He who does not care is one who ...\r");
    printf("Simple google search results extractor\nUsage: %s <search_string> \n",argv[0]);
    exit(0);
    }

html = (char*)malloc(MAXBUFF*4);
link = (char*)malloc(MAXBUFF/4);
query = (char*)malloc(MAXBUFF/4);
link_list = (char*)malloc(MAXBUFF*4);

if((search_engine = gethostbyname("www.google.com")) == 0 )
    {
    perror("gethostbyname");
    die();
    }
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0 )
    {
    perror("socket");
    die();
    }

memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(80);
servaddr.sin_addr = *((struct in_addr*)search_engine->h_addr);

if((connect(sockfd,(struct sockaddr *)&servaddr, sizeof(servaddr))) < 0 )
    {
    perror("connect");
    die();
    }
strncpy(srchstr,argv[1],MAXBUFF-1);
for(i=0;i<strlen(srchstr);i++)
    {
    if((int)srchstr[i] == 0x20)srchstr[i] = '+';
    }


(void)snprintf(query,MAXBUFF/4,"GET /search?&q=%s HTTP/1.1\n\n",srchstr);
(void)send(sockfd,query,strlen(query),0);

for(i=1;i!=0;i++)
    {
    recved = recv(sockfd,storage,MAXBUFF,0);
    if(i==2) max = recved;
    if((MAXBUFF*4 - strlen(html)) <= sizeof(storage)) break;
    strncat(html,storage,MAXBUFF);
    if(recved<max) break;
    }
parse();
printf("%s\n",link_list);
die();


}

