#include "include/ircd.h" #include "include/socket.h" int StartSS(Conf cf) { int s,one=1; struct sockaddr_in local; struct linger li; memset(&local,0,sizeof(local)); local.sin_family = AF_INET; local.sin_addr.s_addr = inet_addr(cf->ip); local.sin_port = htons(cf->port); li.l_onoff = 1; li.l_linger = 30; if ((s=socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("socket"); } if (setsockopt(s,SOL_SOCKET,SO_LINGER,(char *)&li,sizeof(struct linger)) < 0) { perror("setsockopt"); } if (setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char *)&one,sizeof(int)) < 0) { perror("setsockopt"); } if (bind(s,(struct sockaddr *)&local,sizeof(local)) == -1) { perror("bind"); } if (listen(s,5) == -1) { perror("listen"); } return(s); } int GetConnection(int s,Conf cf) { int size,one=0,y=0; struct sockaddr_in remote; int bufnum; fd_set fds; struct timeval wait; bufnum = 0; 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) { if ((y = accept (s, (struct sockaddr *)&remote, &size))== -1) { perror ("accept"); } if (setsockopt(y, SOL_SOCKET, SO_KEEPALIVE, (char *) &one,sizeof(int)) < 0) { perror("setsockopt"); } } return(y); } int SendSock(int s,const char *fmt, ...) { int len; char *string = malloc(sizeof(char)); va_list args; va_start(args, fmt); vsprintf(string,fmt,args); va_end(args); if (string) { send(s, string, strlen(string), 0); len = strlen(string); } else { len = 0; } free(string); return(len); } int ReadSock(Sock socket) { char inc; int bufnum, n; u_long brx = 0; fd_set fds; struct timeval wait; bufnum = 0; if (socket->socket==-1) { return(-1); } wait.tv_sec = 0L; wait.tv_usec = 2500L; FD_ZERO(&fds); FD_SET(socket->socket, &fds); socket->b = 0; if (select(socket->socket+1, &fds, NULL, 0, &wait) > 0) { do { n = recv(socket->socket, &inc, 1,0); if (n == 0) { socket->socket = -1; return -1; } if ((bufnum == 0) && (inc == ':')) { socket->b = 1; } else { if (bufnum < BUFFER_SIZE - 1 ) { if ((inc != 13) & (inc != '\n')) { socket->data[bufnum++] = inc; } } if (bufnum >= 1024) { SendSock(socket->socket,"Reached Max Input\n"); close(socket->socket); socket->socket=-1; return(0); } } } while (inc != '\n'); { socket->data[bufnum] = '\0'; } brx += bufnum; return bufnum; } return 0; } void AddSock(int val,struct slist *tmp) { struct slist head; Sock node; head = *tmp; if ((node=(Sock)calloc(1,sizeof(SocketNode)))!=NULL) { node->socket=val; node->b=1; node->id = head.lid++; node->next=head.sockets; head.sockets = node; } else { printf("Val: %i not inserted - not enough mem!\n",val); } *tmp = head; } void DeleteSock(Sock *head,int val) { Sock temp,previous,current; if (val==(*head)->id) { temp=*head; *head=(*head)->next; free(temp); return; } else { previous=*head; current=(*head)->next; while((current!=NULL)&(current->id!=val)) { previous=current; current=current->next; } if (current!=NULL) { temp=current; previous->next=current->next; free(temp); return; } } return; } int GetHost(char *host, char *ip) { struct in_addr a; struct hostent *h; if (inet_aton(ip, &a) == 0) { perror(ip); return(1); } if ((h = gethostbyaddr((char *)&a, sizeof(a), AF_INET)) == NULL) { herror(ip); return(1); } sprintf(host,"%s",h->h_name); return 0; }