+free_rtn_tuples(cp)
+ client *cp;
+{
+ register returned_tuples *temp;
+ for (temp=cp->first; temp && OP_DONE(temp->op); ) {
+ register returned_tuples *t1=temp;
+ temp = t1->next;
+ if (t1 == cp->last) cp->last = NULL;
+
+ mr_destroy_reply(t1->retval);
+ delete_operation(t1->op);
+ free(t1);
+ }
+ cp->first = temp;
+}
+
+retr_callback(argc, argv, p_cp)
+ register int argc;
+ register char **argv;
+ char *p_cp;
+{
+ register client *cp = (client *)p_cp;
+ mr_params *arg_tmp;
+ returned_tuples *tp;
+ OPERATION op_tmp;
+ register char **nargv;
+ register int i;
+
+ if (row_count++ >= max_row_count) {
+ ingres_errno = mr_errcode = MR_NO_MEM;
+ return;
+ }
+
+ /*
+ * This takes too much advantage of the fact that
+ * serialization of the data happens during the queue operation.
+ */
+ arg_tmp = (mr_params *)db_alloc(sizeof(mr_params));
+ tp = (returned_tuples *)db_alloc(sizeof(returned_tuples));
+ nargv = (char **)malloc(argc * sizeof(char *));
+
+ op_tmp = create_operation();
+
+ if (mr_trim_args(argc, argv) == MR_NO_MEM) {
+ com_err(whoami, MR_NO_MEM, "while trimming args");
+ }
+ if (log_flags & LOG_RESP)
+ log_args("return: ", cp->args->mr_version_no, argc, argv);
+
+ tp->op = op_tmp;
+ tp->retval = arg_tmp;
+ tp->next = NULL;
+
+ arg_tmp->mr_status = MR_MORE_DATA;
+ arg_tmp->mr_version_no = cp->args->mr_version_no;
+ arg_tmp->mr_argc = argc;
+ arg_tmp->mr_argv = nargv;
+ for (i = 0; i < argc; i++) {
+ register int len = strlen(argv[i]) + 1;
+ nargv[i] = malloc(len);
+ bcopy(argv[i], nargv[i], len);
+ }
+ arg_tmp->mr_flattened = (char *)NULL;
+ arg_tmp->mr_argl = (int *)NULL;
+
+ if (cp->last) {
+ cp->last->next = tp;
+ cp->last = tp;
+ } else {
+ cp->last = cp->first = tp;
+ }
+
+ reset_operation(op_tmp);
+ initialize_operation(op_tmp, mr_start_send, (char *)arg_tmp,
+ (int (*)())NULL);
+ queue_operation(cp->con, CON_OUTPUT, op_tmp);
+}
+
+list_users(callbk, callarg)
+ int (*callbk)();
+ char *callarg;
+{
+ char *argv[6];
+ char buf[30];
+ char buf1[30];
+ int i;
+ extern client **clients;
+ extern char *inet_ntoa();
+ char *cp;
+ char *ctime();
+
+ for (i = 0; i < nclients; i++) {
+ register client *cl = clients[i];
+ if (cl->clname)
+ argv[0] = cl->clname;
+ else argv[0] = "unauthenticated";
+
+ argv[1] = inet_ntoa(cl->haddr.sin_addr);
+ argv[2] = buf;
+ sprintf(buf, "port %d", ntohs(cl->haddr.sin_port));
+ argv[3] = ctime(&cl->last_time_used);
+ cp = index(argv[3], '\n');
+ if (cp) *cp = '\0';
+ argv[4] = buf1;
+ sprintf(buf1, "[#%d]", cl->id);
+ (*callbk)(5, argv, callarg);
+ }
+ return 0;
+}
+