]> andersk Git - moira.git/blob - lib/mr_ops.c
Command line printer manipulation client, and build goo.
[moira.git] / lib / mr_ops.c
1 /* $Id$
2  *
3  * This routine is part of the client library.  It handles
4  * the protocol operations: invoking an update and getting the
5  * Moira message of the day.
6  *
7  * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology
8  * For copying and distribution information, please see the file
9  * <mit-copyright.h>.
10  */
11
12 #include <mit-copyright.h>
13 #include <moira.h>
14 #include "mr_private.h"
15
16 #include <errno.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20
21 RCSID("$Header$");
22
23 /* Invoke a DCM update. */
24
25 int mr_do_update(void)
26 {
27   int status;
28   mr_params params, reply;
29
30   CHECK_CONNECTED;
31   params.u.mr_procno = MR_DO_UPDATE;
32   params.mr_argc = 0;
33   params.mr_argl = NULL;
34   params.mr_argv = NULL;
35
36   if ((status = mr_do_call(&params, &reply)) == MR_SUCCESS)
37     status = reply.u.mr_status;
38
39   mr_destroy_reply(reply);
40
41   return status;
42 }
43
44
45 /* Get the Moira motd.  This returns a Moira status, and motd will either
46  * point to NULL or the motd in a static buffer.
47  */
48
49 int mr_motd(char **motd)
50 {
51   int status;
52   mr_params params, reply;
53   static char *buffer = NULL;
54
55   *motd = NULL;
56   CHECK_CONNECTED;
57   params.u.mr_procno = MR_MOTD;
58   params.mr_argc = 0;
59   params.mr_argl = NULL;
60   params.mr_argv = NULL;
61
62   if ((status = mr_do_call(&params, &reply)))
63     goto punt;
64
65   while ((status = reply.u.mr_status) == MR_MORE_DATA)
66     {
67       if (reply.mr_argc > 0)
68         {
69           buffer = realloc(buffer, reply.mr_argl[0] + 1);
70           if (!buffer)
71             {
72               mr_disconnect();
73               return ENOMEM;
74             }
75           strcpy(buffer, reply.mr_argv[0]);
76           *motd = buffer;
77         }
78       mr_destroy_reply(reply);
79       if (mr_receive(_mr_conn, &reply) != MR_SUCCESS)
80         {
81           mr_disconnect();
82           return MR_ABORTED;
83         }
84     }
85 punt:
86   mr_destroy_reply(reply);
87
88   return status;
89 }
90
91 /* Exchange query version info with the server. */
92
93 int mr_version(int version)
94 {
95   int status;
96   mr_params params, reply;
97   char vbuf[10], *arg;
98
99   CHECK_CONNECTED;
100
101   sprintf(vbuf, "%d", version);
102   arg = strdup(vbuf);
103   params.u.mr_procno = MR_SETVERSION;
104   params.mr_argc = 1;
105   params.mr_argl = NULL;
106   params.mr_argv = &arg;
107
108   status = mr_do_call(&params, &reply);
109   free(arg);
110
111   if (status == MR_SUCCESS)
112     {
113       status = reply.u.mr_status;
114
115       if (status == MR_VERSION_LOW && getenv("MOIRA_LOW_VERSION_WARNING"))
116         fprintf(stderr, "Warning: This client is out of date.\n");
117     }
118   mr_destroy_reply(reply);
119
120   return status;
121 }
This page took 0.327965 seconds and 5 git commands to generate.