#include "include/httpd.h" #include "include/socket.h" int getcon(int s,int y,hash *socket) { int size,g,one=0; struct sockaddr_in remote; int bufnum, n; fd_set fds; struct timeval wait; bufnum = 0; if (y == 128) { y = 1; } size = sizeof(struct sockaddr_in); if (s==-1) { return(-1); } wait.tv_sec = 0L; wait.tv_usec = 2500L; FD_ZERO(&fds); FD_SET(s, &fds); if (select(s+1, &fds, NULL, 0, &wait) > 0) { y++; if ((socket[y].socket = accept (s, (struct sockaddr *)&remote, &size))== -1) { perror ("accept"); exit(1); } if (setsockopt(socket[y].socket, SOL_SOCKET, SO_KEEPALIVE, (char *) &one,sizeof(int)) < 0) { perror("setsockopt"); exit(1); } getpeername(socket[y].socket,(struct sockaddr *)&remote,&size); sprintf(socket[y].peername,inet_ntoa(remote.sin_addr)); printf("Con Sock ID: %i\n",socket[y].socket); } return y; } int serve(conf *cf) { int s,one=1; struct sockaddr_in local; struct linger li; local.sin_family = AF_INET; local.sin_port = htons (cf[1].port); local.sin_addr.s_addr = get_ip(cf[1].servername); li.l_onoff = 1; li.l_linger = 30; if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) { perror("socket"); exit(1); } /* if (setsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(struct linger)) < 0) { perror("setsockopt"); exit(1); } */ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof(int)) < 0) { perror("setsockopt"); exit(1); } if (bind (s, (struct sockaddr *)&local, sizeof(struct sockaddr)) == -1) { perror("bind"); exit(1); } if (listen(s, 5) == -1) { perror("listen"); exit(1); } return s; } int sockread(int s,char *buf) { char inc; int bufnum, n; fd_set fds; struct timeval wait; bufnum = 0; if (s==-1) { return(-1); } wait.tv_sec = 0L; wait.tv_usec = 2500L; FD_ZERO(&fds); FD_SET(s, &fds); if (select(s+1, &fds, NULL, 0, &wait) > 0) { do { n = recv(s, &inc, 1,0); if (n == 0) { return -1; } if (bufnum < BUFFER_SIZE - 1 ) { if (inc != 13) { buf[bufnum++] = inc; } } } while (inc != '\n'); { buf[bufnum] = '\0'; } brx += bufnum; return bufnum; } return 0; } int get_ip(char *host) { struct hostent *hp; struct in_addr *in; int ip; if ((ip = inet_addr(host)) == -1) { hp = gethostbyname(host); if (!hp) return(-1); in = (struct in_addr*)(hp->h_addr_list[0]); ip = (int)(in->s_addr); return(ip); } return(ip); } //int send_to_sock(int socket, const char *fmt, ...) { int send_to_sock(int s,char *string) { /* char *string; va_list args; string = malloc(MAXBUFLENGTH); va_start(args, fmt); vsnprintf(string, MAXBUFLENGTH, fmt, args); va_end(args); */ /* int bufnum, n; fd_set fds; struct timeval wait; bufnum = 0; if (s==-1) { return(-1); } wait.tv_sec = 0L; wait.tv_usec = 2500L; FD_ZERO(&fds); FD_SET(s, &fds); if (select(s+1, NULL, &fds, 0, &wait) > 0) { */ send(s, string, strlen(string), 0); //write(s,string,strlen(string)); // } return(strlen(string)); }