* Let the reader beware.
*
* $Log$
- * Revision 1.5 1987-06-03 16:07:17 wesommer
- * Fixes for lint.
+ * Revision 1.9 1987-06-21 16:39:54 wesommer
+ * Performance work, rearrangement of include files.
*
+ * Revision 1.8 87/06/09 18:44:45 wesommer
+ * modified error handling.
+ *
+ * Revision 1.7 87/06/08 02:44:44 wesommer
+ * Minor lint fix.
+ *
+ * Revision 1.6 87/06/03 17:41:00 wesommer
+ * Added startup support.
+ *
+ * Revision 1.5 87/06/03 16:07:17 wesommer
+ * Fixes for lint.
+ *
* Revision 1.4 87/06/02 20:05:11 wesommer
* Bug fixes on memory allocation.
*
#include <strings.h>
#include <sys/errno.h>
#include <sys/signal.h>
-#include "sms_private.h"
#include "sms_server.h"
extern CONNECTION newconn, listencon;
com_err(whoami, 0, "GDB initialization failed.");
exit(1);
}
+ gdb_debug(0); /* this can be patched, if necessary, to enable */
+ /* GDB level debugging .. */
+
+ /*
+ * Database initialization.
+ */
+ if ((status = sms_open_database()) != 0) {
+ com_err(whoami, status, "when trying to open database.");
+ exit(1);
+ }
+
/*
* Set up client array handler.
*/
/*
* Signal handlers
+ * There should probably be a few more of these.
*/
if ((((int)signal (SIGTERM, sigshut)) < 0) ||
* Handle any new connections.
*/
if (OP_DONE(listenop)) {
- if ((status = new_connection()) != 0) {
+ if (OP_STATUS(listenop) == OP_CANCELLED) {
+ com_err(whoami, errno, "Error on listen");
+ exit(1);
+
+ } else if ((status = new_connection()) != 0) {
com_err(whoami, errno,
"Error on listening operation.");
/*
}
}
com_err(whoami, 0, takedown);
+ sms_close_database();
return 0;
}
int
new_connection()
{
- register client *cp = (client *)malloc(sizeof *cp);
+ register client *cp;
static counter = 0;
/*
* Make sure there's been no error
*/
- if(OP_STATUS(listenop) != OP_COMPLETE ||
- newconn == NULL) {
+ if(OP_STATUS(listenop) != OP_COMPLETE) {
return errno;
-#ifdef notdef
- exit(8); /* XXX */
-#endif notdef
+ }
+
+ if (newconn == NULL) {
+ return SMS_NOT_CONNECTED;
}
/*
* Set up the new connection and reply to the client
*/
-
+ cp = (client *)malloc(sizeof *cp);
cp->state = CL_STARTING;
cp->action = CL_ACCEPT;
cp->con = newconn;
free((char *)clients);
clients = clients_n;
clients_n = NULL;
-
+ oplist_delete(op_list, cp->pending_op);
reset_operation(cp->pending_op);
delete_operation(cp->pending_op);
+ sever_connection(cp->con);
free((char *)cp);
}
size_of_list_of_operations((*oplp)->count));
newlist->count++;
newlist->op[count-1] = op;
- db_free((*oplp), size_of_list_of_operations(count-1));
+ db_free((char *)(*oplp), size_of_list_of_operations(count-1));
(*oplp) = newlist;
}
+
+oplist_delete(oplp, op)
+ LIST_OF_OPERATIONS oplp;
+ register OPERATION op;
+{
+ register OPERATION *s;
+ register int c;
+
+ for (s = oplp->op, c=oplp->count; c; --c, ++s) {
+ if (*s == op) {
+ while (c > 0) {
+ *s = *(s+1);
+ ++s;
+ --c;
+ }
+ oplp->count--;
+ return;
+ }
+ }
+ abort();
+}