* Let the reader beware.
*
* $Log$
- * Revision 1.10 1987-06-30 20:02:26 wesommer
- * Added returned tuple chain to client structure.
- * Added local realm global variable.
+ * Revision 1.14 1987-09-12 20:41:50 wesommer
+ * Be paranoid.
*
+ * Revision 1.14 87/09/12 20:08:01 wesommer
+ * Add some defensive programming to defend against people who don't
+ * understand what the contents of the cl struct mean.
+ *
+ * Revision 1.13 87/08/04 02:40:30 wesommer
+ * Do end run around minor hotspot.
+ *
+ * Revision 1.12 87/08/04 01:50:00 wesommer
+ * Rearranged messages.
+ *
+ * Revision 1.11 87/07/29 16:04:54 wesommer
+ * Add keepalive feature.
+ *
+ * Revision 1.10 87/06/30 20:02:26 wesommer
+ * Added returned tuple chain to client structure.
+ * Added local realm global variable.
+ *
* Revision 1.9 87/06/21 16:39:54 wesommer
* Performance work, rearrangement of include files.
*
extern char *malloc();
+extern int free();
extern char *inet_ntoa();
extern void sms_com_err();
extern void do_client();
void oplist_append();
extern u_short ntohs();
+extern time_t now;
+
/*
* Main SMS server loop.
*
char **argv;
{
int status;
+ time_t tardy;
whoami = argv[0];
/*
init_sms_err_tbl();
init_krb_err_tbl();
set_com_err_hook(sms_com_err);
-
+ setlinebuf(stderr);
+
if (argc != 1) {
com_err(whoami, 0, "Usage: smsd");
exit(1);
}
+
+ /* Profiling implies that getting rid of one level of call
+ * indirection here wins us maybe 1% on the VAX.
+ */
+ gdb_amv = malloc;
+ gdb_fmv = free;
/*
* GDB initialization.
op_list = create_list_of_operations(1, listenop);
- (void) sprintf(buf1, "started (pid %d)", getpid());
- com_err(whoami, 0, buf1);
+ com_err(whoami, 0, "started (pid %d)", getpid());
com_err(whoami, 0, rcsid_sms_main_c);
/*
continue;
}
if (takedown) break;
+ time(&now);
#ifdef notdef
fprintf(stderr, " tick\n");
#endif notdef
/*
- * Handle any existing connections.
- */
- for (i=0; i<nclients; i++) {
- if (OP_DONE(clients[i]->pending_op)) {
- cur_client = clients[i];
- do_client(cur_client);
- cur_client = NULL;
- if (takedown) break;
- }
- }
- /*
- * Handle any new connections.
+ * Handle any new connections; this comes first so
+ * errno isn't tromped on.
*/
if (OP_DONE(listenop)) {
if (OP_STATUS(listenop) == OP_CANCELLED) {
- com_err(whoami, errno, "Error on listen");
- exit(1);
-
+ if (errno == EWOULDBLOCK) {
+ do_reset_listen();
+ } else {
+ com_err(whoami, errno,
+ "error on listen");
+ exit(1);
+ }
} else if ((status = new_connection()) != 0) {
com_err(whoami, errno,
"Error on listening operation.");
*/
}
}
+ /*
+ * Handle any existing connections.
+ */
+ tardy = now - 30*60;
+
+ for (i=0; i<nclients; i++) {
+ cur_client = clients[i];
+ if (OP_DONE(clients[i]->pending_op)) {
+ cur_client->last_time_used = now;
+ do_client(cur_client);
+ } else if (clients[i]->last_time_used < tardy) {
+ com_err(whoami, 0, "Shutting down connection due to inactivity");
+ shutdown(cur_client->con->in.fd, 0);
+ }
+ cur_client = NULL;
+ if (takedown) break;
+ }
}
- com_err(whoami, 0, takedown);
+ com_err(whoami, 0, "%s", takedown);
sms_close_database();
return 0;
}
return 0;
}
+
+do_reset_listen()
+{
+ client_addrlen = sizeof(client_addr);
+ start_accepting_client(listencon, listenop, &newconn,
+ (char *)&client_addr,
+ &client_addrlen, &client_tuple);
+}
+
/*
* This routine is called when a new connection comes in.
*
* Set up the new connection and reply to the client
*/
cp = (client *)malloc(sizeof *cp);
+ bzero(cp, sizeof(*cp));
cp->state = CL_STARTING;
cp->action = CL_ACCEPT;
cp->con = newconn;
cp->reply.sms_argv = NULL;
cp->first = NULL;
cp->last = NULL;
-
+ cp->last_time_used = now;
newconn = NULL;
cp->pending_op = create_operation();
* Log new connection.
*/
- (void) sprintf(buf1,
- "New connection from %s port %d (now %d client%s)",
- inet_ntoa(cp->haddr.sin_addr),
- (int)ntohs(cp->haddr.sin_port),
- nclients,
- nclients!=1?"s":"");
- com_err(whoami, 0, buf1);
+ com_err(whoami, 0, "New connection from %s port %d (now %d client%s)",
+ inet_ntoa(cp->haddr.sin_addr),
+ (int)ntohs(cp->haddr.sin_port),
+ nclients,
+ nclients!=1?"s":"");
/*
* Get ready to accept the next connection.