/* * $Source$ * $Author$ * $Header$ * * Copyright (C) 1987, 1989, 1990 by the Massachusetts Institute of * Technology * For copying and distribution information, please see the file * . * * This routine is part of the client library. It handles * the protocol operations: invoking an update and getting the * Moira message of the day. */ #ifndef lint static char *rcsid_mr_do_update_c = "$Header$"; #endif #include #include #include "mr_private.h" /* Invoke a DCM update. */ int mr_do_update(void) { int status; mr_params param_st; struct mr_params *params = NULL; struct mr_params *reply = NULL; CHECK_CONNECTED; params = ¶m_st; params->mr_version_no = sending_version_no; params->mr_procno = MR_DO_UPDATE; params->mr_argc = 0; params->mr_argl = NULL; params->mr_argv = NULL; if ((status = mr_do_call(params, &reply)) == 0) status = reply->mr_status; mr_destroy_reply(reply); return status; } /* Get the Moira motd. This returns a Moira status, and motd will either * point to NULL or the motd in a static buffer. */ int mr_motd(char **motd) { int status; mr_params param_st; struct mr_params *params = NULL; struct mr_params *reply = NULL; static char buffer[1024]; *motd = NULL; CHECK_CONNECTED; params = ¶m_st; params->mr_version_no = sending_version_no; params->mr_procno = MR_MOTD; params->mr_argc = 0; params->mr_argl = NULL; params->mr_argv = NULL; if ((status = mr_do_call(params, &reply))) goto punt; while ((status = reply->mr_status) == MR_MORE_DATA) { if (reply->mr_argc > 0) { strncpy(buffer, reply->mr_argv[0], sizeof(buffer)); *motd = buffer; } mr_destroy_reply(reply); reply = NULL; initialize_operation(_mr_recv_op, mr_start_recv, &reply, NULL); queue_operation(_mr_conn, CON_INPUT, _mr_recv_op); mr_complete_operation(_mr_recv_op); if (OP_STATUS(_mr_recv_op) != OP_COMPLETE) { mr_disconnect(); status = MR_ABORTED; return status; } } punt: mr_destroy_reply(reply); /* for backwards compatability */ if (status == MR_UNKNOWN_PROC) return 0; else return status; } /* Tell the library to take care of another input source while it is * processing a query. For instance, an X toolkit application would * do something like * mr_set_alternate_input(ConnectionNumber(XtDisplay(widget)), doxinput); * where doxinput is defined as: * doxinput() { * extern Widget toplevel; * XEvent event; * while (XPending(XtDisplay(toplevel))) { * XNextEvent(XtDisplay(toplevel), &event); * XtDispatchEvent(&event); * } * XFlush(XtDisplay(toplevel)); * } */ static int mr_alternate_input = 0; static int (*mr_alternate_handler)(); int mr_set_alternate_input(int fd, int (*proc)()) { if (mr_alternate_input != 0) return MR_ALREADY_CONNECTED; mr_alternate_input = fd; mr_alternate_handler = proc; return MR_SUCCESS; } /* This is used by the parts of the library that must wait for GDB. It * handles alternate input streams (such as X) as well. */ int mr_complete_operation(OPERATION op) { long infd, outfd, exfd; int rc; gdb_progress(); /* try for an immediate completion */ if (mr_alternate_input == 0) return complete_operation(op); infd = 1 << mr_alternate_input; outfd = exfd = 0; while (op->status != OP_COMPLETE && op->status != OP_CANCELLED) { rc = con_select(mr_alternate_input, (fd_set *)&infd, (fd_set *)&outfd, (fd_set *)&exfd, NULL); if (rc > 0 && mr_alternate_handler) (*mr_alternate_handler)(); } return op->status; }