6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
9 * Revision 1.10 1987-08-19 18:39:04 wesommer
10 * Added list_users query.
12 * Revision 1.9 87/08/04 02:41:22 wesommer
15 * Revision 1.8 87/07/16 15:43:19 wesommer
16 * Fixed bug where the argv was not copied to private storage
17 * (it got changed out from under us before it got sent..).
19 * Revision 1.7 87/07/14 00:39:01 wesommer
22 * Revision 1.6 87/06/30 20:04:43 wesommer
23 * Free returned tuples when possible.
25 * Revision 1.5 87/06/26 10:55:53 wesommer
26 * Added sms_access, now paiys attention to return code from
27 * sms_process_query, sms_check_access.
29 * Revision 1.4 87/06/21 16:42:00 wesommer
30 * Performance work, rearrangement of include files.
32 * Revision 1.3 87/06/04 01:35:01 wesommer
33 * Added a working query request handler.
35 * Revision 1.2 87/06/03 16:07:50 wesommer
38 * Revision 1.1 87/06/02 20:07:10 wesommer
44 static char *rcsid_sms_scall_c = "$Header$";
49 #include "sms_server.h"
53 extern char *malloc();
55 extern void clist_delete(), do_auth(), do_shutdown();
59 * Welcome to the (finite state) machine (highest level).
66 if (OP_STATUS(cp->pending_op) == OP_CANCELLED) {
67 com_err(whoami, 0, "Closed connection (now %d client%s)",
76 /* Start recieving next request */
77 initialize_operation(cp->pending_op, sms_start_recv,
78 (char *)&cp->args, (int (*)())NULL);
79 queue_operation(cp->con, CON_INPUT, cp->pending_op);
80 cp->action = CL_RECEIVE;
83 /* Data is here. Process it & start it heading back */
84 do_call(cp); /* This may block for a while. */
85 sms_destroy_reply(cp->args);
87 initialize_operation(cp->pending_op, sms_start_send,
88 (char *)&cp->reply, (int (*)())NULL);
89 queue_operation(cp->con, CON_OUTPUT, cp->pending_op);
109 cl->reply.sms_argc = 0;
110 cl->reply.sms_status = 0;
111 if (((pn = cl->args->sms_procno) < 0) ||
112 (pn > SMS_MAX_PROC)) {
113 com_err(whoami, 0, "procno out of range");
114 cl->reply.sms_status = SMS_UNKNOWN_PROC;
117 if (log_flags & LOG_ARGS)
118 log_args(procnames[pn], cl->args->sms_argc,
120 else if (log_flags & LOG_REQUESTS)
121 com_err(whoami, 0, "%s", procnames[pn]);
125 cl->reply.sms_status = 0;
149 register returned_tuples *temp;
150 for (temp=cp->first; temp && OP_DONE(temp->op); ) {
151 register returned_tuples *t1=temp;
153 if (t1 == cp->last) cp->last = NULL;
155 sms_destroy_reply(t1->retval);
158 register sms_params *p = t1->retval;
159 if (p->sms_flattened)
160 free(p->sms_flattened);
166 delete_operation(t1->op);
172 retr_callback(argc, argv, p_cp)
174 register char **argv;
177 register client *cp = (client *)p_cp;
179 * This takes too much advantage of the fact that
180 * serialization of the data happens during the queue operation.
182 sms_params *arg_tmp = (sms_params *)db_alloc(sizeof(sms_params));
183 returned_tuples *tp = (returned_tuples *)
184 db_alloc(sizeof(returned_tuples));
185 register char **nargv = (char **)malloc(argc * sizeof(char *));
188 OPERATION op_tmp = create_operation();
190 if (log_flags & LOG_RESP)
191 log_args("return: ", argc, argv);
194 tp->retval = arg_tmp;
197 arg_tmp->sms_status = SMS_MORE_DATA;
198 arg_tmp->sms_argc = argc;
199 arg_tmp->sms_argv = nargv;
200 for (i = 0; i < argc; i++) {
201 register int len = strlen(argv[i]) + 1;
202 nargv[i] = malloc(len);
203 bcopy(argv[i], nargv[i], len);
205 arg_tmp->sms_flattened = (char *)NULL;
206 arg_tmp->sms_argl = (int *)NULL;
212 cp->last = cp->first = tp;
215 reset_operation(op_tmp);
216 initialize_operation(op_tmp, sms_start_send, (char *)arg_tmp,
218 queue_operation(cp->con, CON_OUTPUT, op_tmp);
221 list_users(callbk, callarg)
229 extern client **clients;
230 extern char *inet_ntoa();
235 for (i = 0; i < nclients; i++) {
236 register client *cl = clients[i];
238 argv[0] = cl->clname;
239 else argv[0] = "unauthenticated";
241 argv[1] = inet_ntoa(cl->haddr.sin_addr);
243 sprintf(buf, "port %d", ntohs(cl->haddr.sin_port));
244 argv[3] = ctime(&cl->last_time_used);
245 cp = index(argv[3], '\n');
248 sprintf(buf1, "[#%d]", cl->id);
249 (*callbk)(5, argv, callarg);
257 register char *queryname;
259 cl->reply.sms_argc = 0;
260 cl->reply.sms_status = 0;
262 queryname = cl->args->sms_argv[0];
264 if (strcmp(queryname, "_list_users") == 0)
265 cl->reply.sms_status = list_users(retr_callback, (char *)cl);
267 cl->reply.sms_status =
268 sms_process_query(cl,
269 cl->args->sms_argv[0],
270 cl->args->sms_argc-1,
271 cl->args->sms_argv+1,
275 if (log_flags & LOG_RES)
276 com_err(whoami, 0, "Query complete.");
282 cl->reply.sms_argc = 0;
284 cl->reply.sms_status =
286 cl->args->sms_argv[0],
287 cl->args->sms_argc-1,
288 cl->args->sms_argv+1);
290 com_err(whoami, 0, "Access check complete.");