/* * comms.c * * $Id: comms.c,v 1.3 1996/03/29 16:51:01 athan Exp $ * * $Log: comms.c,v $ * Revision 1.3 1996/03/29 16:51:01 athan * Reformatting * Moved #define's to config.h * Now use MAX_CO[3~NNECTIONS not hard-coded 64 * * Revision 1.2 1996/03/28 20:02:07 athan * General cleanups * * */ #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/time.h> #include <sys/ioctl.h> #include <malloc.h> #include <sys/socket.h> #include <unistd.h> #if defined(SOLARIS) #include <sys/filio.h> #endif /* SOLARIS */ #include "comms.h" #include "config.h" #include "file.h" /* Extern Function Prototypes */ /* Extern Variables */ extern struct afile thefile; extern int timeout; /* Local Function Prototypes */ int check_timeout(long thistime, int *count); void closec(struct connection *c); void do_login(int newfd, long ltime); void init_comms(void); void write_all(char *s); /* Local Variables */ int mainsock; struct connection *firstc; int cons = 0; char buffer[4096]; const char fullmsg[]="Connections full, sorry!\n"; void init_comms(void) { firstc = NULL; } void do_login(int newfd, long ltime) { struct connection *newc, *tc=firstc; if (cons == MAX_CONNECTIONS) { write(newfd, fullmsg, strlen(fullmsg)); shutdown(newfd, 2); close(newfd); } if (tc != NULL) { while (tc->next != NULL) { tc = tc->next; } } if (NULL == (newc = (struct connection*) malloc(sizeof(struct connection)))) { write(newfd, fullmsg, strlen(fullmsg)); shutdown(newfd, 2); close(newfd); } if (firstc != NULL) { tc->next = newc; } else { firstc = newc; } if (firstc != tc) { newc->prev = tc; } else { newc->prev = NULL; } newc->next = NULL; newc->fd = newfd; newc->login_time = ltime; newc->count = ltime; cons++; write(newfd, thefile.what, thefile.len); } /* Check all current connections for timeout and act upon it if necessary */ int check_timeout(long thistime, int *count) { struct connection *i, *n; char cnt[64]; long toread; if (firstc != NULL) { for(i = firstc ; i != NULL ; i = n) { n = i->next; if (-1 == ioctl(i->fd, FIONREAD, (caddr_t)&toread)) { closec(i); count--; } else if ((i->login_time + timeout + 1) <= thistime) { closec(i); count--; } else if ((thistime - i->count ) > 0) { sprintf(cnt, "%2d ", (int)(timeout - (i->count - i->login_time))); write(i->fd, &cnt, strlen(cnt)); i->count = thistime; } } } return 0; } void closec(struct connection *c) { if ( c->next != NULL ) { c->next->prev=c->prev; } if ( c->prev != NULL ) { c->prev->next=c->next; } if ( c == firstc ) { firstc = firstc->next; } write(c->fd, " Bye!\n", 7); shutdown(c->fd, 2); close(c->fd); free(c); cons--; }