#include #include #include #include #include #include #include #include #include #include #define DATA "You got it from me" struct cookiedata { char host[20]; char name[40]; int pref1; int pref2; int pref3; int pref4; int pref5; }; struct cookiedata recentcookie[200]; int rccounter; int getcookie(int number, char *name, char *host) { int x,y,z; int size; int handle; struct cookiedata cookie; printf("Getcookie routine. number: %d name: .%s. host: .%s.\n",number,name,host); if(number > 0) { printf("Number is greater than 0.\n"); handle = open("cookies.dat",O_RDWR); if(handle == -1) { handle = open("cookies.dat",O_CREAT); close(handle); handle = open("cookies.dat",O_RDONLY); } size=lseek(handle,0,2) / sizeof cookie; lseek(handle,number * sizeof cookie,0); read(handle, &cookie, sizeof cookie); if(name[0] != 0 && name[0] != '#') strncpy(cookie.name,name,39); if(host[0] != 0) strncpy(cookie.host,host,19); strncpy(name,cookie.name,39); strncpy(host,cookie.host,19); lseek(handle,number * sizeof cookie,0); write(handle, &cookie, sizeof cookie); close(handle); return(number); } else if(number == -1) { printf("cookie -1.\n"); handle = open("cookies.dat",O_RDWR); size=lseek(handle,0,2) / sizeof cookie; sprintf(cookie.name,"Anonymous_User%d",size); strncpy(cookie.host,host,19); write(handle,&cookie, sizeof cookie); close(handle); strncpy(name,cookie.name,39); return(size); } else if(number == -2) { printf("cookie -2\n"); for(x=0;x<200;x++) { if(strncmp(recentcookie[x].name,name,39) == 0) { strncpy(host,recentcookie[x].host,19); number = recentcookie[x].pref1; break; } } return(number); } else if(number == -3) { int found; printf("Cookie -3\n"); found=0; printf("Rccounter: %d\n",rccounter); for(x=(rccounter-1) % 200;x >= 0;x--) { if(strncmp(recentcookie[x].host,host,39) == 0) { strncpy(name,recentcookie[x].name,39); number = recentcookie[x].pref1; found=1; break; } } printf("About to check found.\n"); if(found) return(number); printf("After checking found.\n"); for(x=199;x>=(rccounter % 200);x--) { if(strncmp(recentcookie[x].host,host,39) == 0) { strncpy(name,recentcookie[x].name,39); number = recentcookie[x].pref1; found=1; break; } } printf("Done.\n"); return(number); } } main(argc, argv) int argc; char *argv[]; { int x,y,z; int sock; int length; struct sockaddr_in server; int msgsock; char buf[1024]; char s[1024],t[1024]; char fn[100]; char datestr[30]; char filename[30]; int rval; int i; time_t lt; struct tm *tim; FILE *output; int number; char name[40]; char host[20]; for(x=0;x<200;x++) { recentcookie[x].pref1=0; strcpy(recentcookie[x].name,""); strcpy(recentcookie[x].host,""); } rccounter=0; sock = socket(AF_INET, SOCK_STREAM, 0); if(sock < 0) { perror("Opening steram socket"); exit(1); } server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons((u_short )5202); if (bind(sock, &server, sizeof(server))) { perror("binding stream socket"); exit(1); } length = sizeof (server); if(getsockname(sock, &server, &length)) { perror("getting socket name"); exit(1); } printf("Socket has port #%d\n",ntohs(server.sin_port)); listen(sock, 5); do { msgsock = accept(sock, 0,0); printf("\nGot a connection.\n"); if(msgsock == -1) perror("accept"); else do { bzero(buf, sizeof(buf)); if((rval = read(msgsock, buf, 1024)) < 0) perror("Reading stream message"); i = 0; printf("rval=%d. Buf = .%s.\n",rval,buf); if(rval != 0) { strcpy(name,""); strcpy(host,""); sscanf(buf,"%d %s %s",&number,name,host); printf("Number: %d Name: .%s. Host: .%s.\n",number, name, host); if(name[0] != '#') printf("!!!!!!!!!!!WARNING!!!!!!!!!!!!!\n"); x = getcookie(number,name,host); number = x; recentcookie[rccounter % 200].pref1 = number; strncpy(recentcookie[rccounter % 200].host,host,19); strncpy(recentcookie[rccounter % 200].name,name,39); rccounter++; sprintf(s,"%d %s %s",number,name,host); printf(".%d. .%s. .%s.\n",number,name,host); printf("Returned string: .%s.\n",s); write(msgsock,s,strlen(s) + 1); rval=0; } } while (rval != 0); close(msgsock); } while (1); }