6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
9 * Revision 1.6 1987-06-30 20:04:43 wesommer
10 * Free returned tuples when possible.
12 * Revision 1.5 87/06/26 10:55:53 wesommer
13 * Added sms_access, now paiys attention to return code from
14 * sms_process_query, sms_check_access.
16 * Revision 1.4 87/06/21 16:42:00 wesommer
17 * Performance work, rearrangement of include files.
19 * Revision 1.3 87/06/04 01:35:01 wesommer
20 * Added a working query request handler.
22 * Revision 1.2 87/06/03 16:07:50 wesommer
25 * Revision 1.1 87/06/02 20:07:10 wesommer
31 static char *rcsid_sms_scall_c = "$Header$";
36 #include "sms_server.h"
41 extern void clist_delete(), do_auth(), do_shutdown();
45 * Welcome to the (finite state) machine (highest level).
52 if (OP_STATUS(cp->pending_op) == OP_CANCELLED) {
53 (void) sprintf(buf1, "Closed connection (now %d client%s)",
56 com_err(whoami, 0, buf1);
63 /* Start recieving next request */
64 initialize_operation(cp->pending_op, sms_start_recv,
65 (char *)&cp->args, (int (*)())NULL);
66 queue_operation(cp->con, CON_INPUT, cp->pending_op);
67 cp->action = CL_RECEIVE;
70 /* Data is here. Process it & start it heading back */
71 do_call(cp); /* This may block for a while. */
72 initialize_operation(cp->pending_op, sms_start_send,
73 (char *)&cp->reply, (int (*)())NULL);
74 queue_operation(cp->con, CON_OUTPUT, cp->pending_op);
94 cl->reply.sms_argc = 0;
95 cl->reply.sms_status = 0;
96 if (((pn = cl->args->sms_procno) < 0) ||
97 (pn > SMS_MAX_PROC)) {
98 com_err(whoami, 0, "procno out of range");
99 cl->reply.sms_status = SMS_UNKNOWN_PROC;
103 fprintf(stderr, "[#%d] %s(", cl->id, procnames[pn]);
104 for (i=0; i < cl->args->sms_argc; i++) {
105 if (i) fputc(',', stderr);
106 frequote(stderr,cl->args->sms_argv[i]);
108 fprintf(stderr, ")\n");
113 cl->reply.sms_status = 0;
114 com_err(whoami, 0, "noop");
138 register returned_tuples *temp;
139 for (temp=cp->first; temp && OP_DONE(temp->op); ) {
140 register returned_tuples *t1=temp;
142 if (t1 == cp->last) cp->last = NULL;
144 sms_destroy_reply(t1->retval);
147 register sms_params *p = t1->retval;
148 if (p->sms_flattened)
149 free(p->sms_flattened);
154 delete_operation(t1->op);
160 retr_callback(argc, argv, p_cp)
165 register client *cp = (client *)p_cp;
167 * This takes too much advantage of the fact that
168 * serialization of the data happens during the queue operation.
170 sms_params *arg_tmp = (sms_params *)db_alloc(sizeof(sms_params));
171 returned_tuples *tp = (returned_tuples *)
172 db_alloc(sizeof(returned_tuples));
174 OPERATION op_tmp = create_operation();
176 #ifdef notdef /* We really don't want this logged */
177 com_err(whoami, 0, "Returning next data:");
178 log_args(argc, argv);
181 tp->retval = arg_tmp;
184 arg_tmp->sms_status = SMS_MORE_DATA;
185 arg_tmp->sms_argc = argc;
186 arg_tmp->sms_argv = argv;
187 arg_tmp->sms_flattened = (char *)NULL;
188 arg_tmp->sms_argl = (int *)NULL;
194 cp->last = cp->first = tp;
197 reset_operation(op_tmp);
198 initialize_operation(op_tmp, sms_start_send, (char *)arg_tmp,
200 queue_operation(cp->con, CON_OUTPUT, op_tmp);
207 cl->reply.sms_argc = 0;
208 cl->reply.sms_status = 0;
211 com_err(whoami, 0, "Unauthenticated query rejected");
212 cl->reply.sms_status = EACCES;
216 com_err(whoami, 0, "Processing query: ");
217 log_args(cl->args->sms_argc, cl->args->sms_argv);
219 cl->reply.sms_status =
220 sms_process_query(cl,
221 cl->args->sms_argv[0],
222 cl->args->sms_argc-1,
223 cl->args->sms_argv+1,
227 com_err(whoami, 0, "Query complete.");
233 cl->reply.sms_argc = 0;
234 cl->reply.sms_status = 0;
237 com_err(whoami, 0, "Unauthenticated query rejected");
238 cl->reply.sms_status = EACCES;
242 com_err(whoami, 0, "Checking access: ");
243 log_args(cl->args->sms_argc, cl->args->sms_argv);
245 cl->reply.sms_status =
247 cl->args->sms_argv[0],
248 cl->args->sms_argc-1,
249 cl->args->sms_argv+1);
251 com_err(whoami, 0, "Access check complete.");