X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/e728c1a2758e45abbb615ee512cae28e70023ae5..5f9f27e4cca3f2aa872f3d852425afc86c698c38:/lib/mr_ops.c diff --git a/lib/mr_ops.c b/lib/mr_ops.c index 3c82f5a1..2930937b 100644 --- a/lib/mr_ops.c +++ b/lib/mr_ops.c @@ -3,12 +3,13 @@ * $Author$ * $Header$ * - * Copyright (C) 1987 by the Massachusetts Institute of Technology + * Copyright (C) 1987, 1989 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 + * SMS message of the day. */ #ifndef lint @@ -18,6 +19,9 @@ static char *rcsid_sms_do_update_c = "$Header$"; #include #include "sms_private.h" + +/* Invoke a DCM update. */ + int sms_do_update() { int status; @@ -41,13 +45,52 @@ int sms_do_update() 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 SMS motd. This returns an SMS status, and motd will either + * point to NULL or the motd in a static buffer. */ + +int sms_motd(motd) +char **motd; +{ + int status; + sms_params param_st; + struct sms_params *params = NULL; + struct sms_params *reply = NULL; + static char buffer[1024]; + + *motd = NULL; + CHECK_CONNECTED; + params = ¶m_st; + params->sms_version_no = sending_version_no; + params->sms_procno = SMS_MOTD; + params->sms_argc = 0; + params->sms_argl = NULL; + params->sms_argv = NULL; + + if ((status = sms_do_call(params, &reply))) + goto punt; + + while ((status = reply->sms_status) == SMS_MORE_DATA) { + if (reply->sms_argc > 0) { + strncpy(buffer, reply->sms_argv[0], sizeof(buffer)); + *motd = buffer; + } + sms_destroy_reply(reply); + reply = NULL; + + initialize_operation(_sms_recv_op, sms_start_recv, &reply, + (int (*)())NULL); + queue_operation(_sms_conn, CON_INPUT, _sms_recv_op); + + complete_operation(_sms_recv_op); + if (OP_STATUS(_sms_recv_op) != OP_COMPLETE) { + sms_disconnect(); + status = SMS_ABORTED; + return(status); + } + } + punt: + sms_destroy_reply(reply); + return(status); +}