6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
11 static char *rcsid_sms_scall_c = "$Header$";
17 #include "sms_server.h"
21 extern char *malloc();
24 extern void clist_delete(), do_auth(), do_shutdown();
28 * Welcome to the (finite state) machine (highest level).
35 if (OP_STATUS(cp->pending_op) == OP_CANCELLED) {
36 com_err(whoami, 0, "Closed connection (now %d client%s, %d new queries, %d old)",
47 /* Start recieving next request */
48 initialize_operation(cp->pending_op, sms_start_recv,
49 (char *)&cp->args, (int (*)())NULL);
50 queue_operation(cp->con, CON_INPUT, cp->pending_op);
51 cp->action = CL_RECEIVE;
54 /* Data is here. Process it & start it heading back */
55 do_call(cp); /* This may block for a while. */
56 sms_destroy_reply(cp->args);
58 initialize_operation(cp->pending_op, sms_start_send,
59 (char *)&cp->reply, (int (*)())NULL);
60 queue_operation(cp->con, CON_OUTPUT, cp->pending_op);
80 cl->reply.sms_argc = 0;
81 cl->reply.sms_status = 0;
82 cl->reply.sms_version_no = cl->args->sms_version_no;
83 if (((pn = cl->args->sms_procno) < 0) ||
84 (pn > SMS_MAX_PROC)) {
85 com_err(whoami, 0, "procno out of range");
86 cl->reply.sms_status = SMS_UNKNOWN_PROC;
89 if (log_flags & LOG_ARGS)
90 log_args(procnames[pn], cl->args->sms_version_no,
91 cl->args->sms_argc, cl->args->sms_argv);
92 else if (log_flags & LOG_REQUESTS)
93 com_err(whoami, 0, "%s", procnames[pn]);
97 cl->reply.sms_status = 0;
117 trigger_dcm(0, 0, cl);
125 register returned_tuples *temp;
126 for (temp=cp->first; temp && OP_DONE(temp->op); ) {
127 register returned_tuples *t1=temp;
129 if (t1 == cp->last) cp->last = NULL;
131 sms_destroy_reply(t1->retval);
134 register sms_params *p = t1->retval;
135 if (p->sms_flattened)
136 free(p->sms_flattened);
142 delete_operation(t1->op);
148 retr_callback(argc, argv, p_cp)
150 register char **argv;
153 register client *cp = (client *)p_cp;
155 * This takes too much advantage of the fact that
156 * serialization of the data happens during the queue operation.
158 sms_params *arg_tmp = (sms_params *)db_alloc(sizeof(sms_params));
159 returned_tuples *tp = (returned_tuples *)
160 db_alloc(sizeof(returned_tuples));
161 register char **nargv = (char **)malloc(argc * sizeof(char *));
164 OPERATION op_tmp = create_operation();
166 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
167 com_err(whoami, SMS_NO_MEM, "while trimming args");
169 if (log_flags & LOG_RESP)
170 log_args("return: ", cp->args->sms_version_no, argc, argv);
173 tp->retval = arg_tmp;
176 arg_tmp->sms_status = SMS_MORE_DATA;
177 arg_tmp->sms_version_no = cp->args->sms_version_no;
178 arg_tmp->sms_argc = argc;
179 arg_tmp->sms_argv = nargv;
180 for (i = 0; i < argc; i++) {
181 register int len = strlen(argv[i]) + 1;
182 nargv[i] = malloc(len);
183 bcopy(argv[i], nargv[i], len);
185 arg_tmp->sms_flattened = (char *)NULL;
186 arg_tmp->sms_argl = (int *)NULL;
192 cp->last = cp->first = tp;
195 reset_operation(op_tmp);
196 initialize_operation(op_tmp, sms_start_send, (char *)arg_tmp,
198 queue_operation(cp->con, CON_OUTPUT, op_tmp);
201 list_users(callbk, callarg)
209 extern client **clients;
210 extern char *inet_ntoa();
215 for (i = 0; i < nclients; i++) {
216 register client *cl = clients[i];
218 argv[0] = cl->clname;
219 else argv[0] = "unauthenticated";
221 argv[1] = inet_ntoa(cl->haddr.sin_addr);
223 sprintf(buf, "port %d", ntohs(cl->haddr.sin_port));
224 argv[3] = ctime(&cl->last_time_used);
225 cp = index(argv[3], '\n');
228 sprintf(buf1, "[#%d]", cl->id);
229 (*callbk)(5, argv, callarg);
237 register char *queryname;
239 cl->reply.sms_argc = 0;
240 cl->reply.sms_status = 0;
242 queryname = cl->args->sms_argv[0];
244 if (cl->args->sms_version_no == SMS_VERSION_2)
249 if (strcmp(queryname, "_list_users") == 0)
250 cl->reply.sms_status = list_users(retr_callback, (char *)cl);
252 cl->reply.sms_status =
253 sms_process_query(cl,
254 cl->args->sms_argv[0],
255 cl->args->sms_argc-1,
256 cl->args->sms_argv+1,
260 if (log_flags & LOG_RES)
261 com_err(whoami, 0, "Query complete.");
267 cl->reply.sms_argc = 0;
269 cl->reply.sms_status =
271 cl->args->sms_argv[0],
272 cl->args->sms_argc-1,
273 cl->args->sms_argv+1);
275 com_err(whoami, 0, "Access check complete.");
279 /* trigger_dcm is also used as a followup routine to the
280 * set_server_host_override query, hence the two dummy arguments.
283 struct query pseudo_query = {
288 trigger_dcm(dummy0, dummy1, cl)
294 cl->reply.sms_argc = 0;
296 if (cl->reply.sms_status = check_query_access(&pseudo_query, 0, cl) )
297 return(cl->reply.sms_status);
302 execl("/u1/sms/bin/startdcm", "startdcm", 0);
306 cl->reply.sms_status = errno;