X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/8937141744246214fb6cd38993ac68f2e87fb890..refs/heads/LOCKING:/lib/mr_ops.c?ds=sidebyside diff --git a/lib/mr_ops.c b/lib/mr_ops.c index eed894e3..25ea8597 100644 --- a/lib/mr_ops.c +++ b/lib/mr_ops.c @@ -3,48 +3,161 @@ * $Author$ * $Header$ * - * Copyright (C) 1987 by the Massachusetts Institute of Technology + * 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 - * creating a connection to the sms server. + * the protocol operations: invoking an update and getting the + * MR message of the day. */ #ifndef lint static char *rcsid_sms_do_update_c = "$Header$"; #endif lint -#include "sms_private.h" +#include +#include +#include "mr_private.h" -int sms_do_update() + +/* Invoke a DCM update. */ + +int mr_do_update() { int status; - sms_params param_st; - struct sms_params *params = NULL; - struct sms_params *reply = NULL; + mr_params param_st; + struct mr_params *params = NULL; + struct mr_params *reply = NULL; CHECK_CONNECTED; params = ¶m_st; - params->sms_version_no = sending_version_no; - params->sms_procno = SMS_DO_UPDATE; - params->sms_argc = 0; - params->sms_argl = NULL; - params->sms_argv = NULL; + 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 = sms_do_call(params, &reply)) == 0) - status = reply->sms_status; + if ((status = mr_do_call(params, &reply)) == 0) + status = reply->mr_status; - sms_destroy_reply(reply); + mr_destroy_reply(reply); return status; } -/* - * Local Variables: - * mode: c - * c-indent-level: 4 - * c-continued-statement-offset: 4 - * c-brace-offset: -4 - * c-argdecl-indent: 4 - * c-label-offset: -4 - * End: + +/* Get the MR motd. This returns an MR status, and motd will either + * point to NULL or the motd in a static buffer. + */ + +int mr_motd(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, + (int (*)())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(fd, proc) +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. */ + +mr_complete_operation(op) +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<status != OP_COMPLETE && op->status != OP_CANCELLED) { + rc = con_select(mr_alternate_input, (fd_set *)&infd, (fd_set *)&outfd, + (fd_set *)&exfd, (struct timeval *)NULL); + if (rc > 0 && mr_alternate_handler) { + (*mr_alternate_handler)(); + } + } + return(op->status); +} +