]>
Commit | Line | Data |
---|---|---|
1 | /* $Id$ | |
2 | * | |
3 | * Perform a Moira query | |
4 | * | |
5 | * Copyright (C) 1987-1998 by the Massachusetts Institute of Technology | |
6 | * For copying and distribution information, please see the file | |
7 | * <mit-copyright.h>. | |
8 | * | |
9 | */ | |
10 | ||
11 | #include <mit-copyright.h> | |
12 | #include <moira.h> | |
13 | #include "mr_private.h" | |
14 | ||
15 | #include <errno.h> | |
16 | #include <stdlib.h> | |
17 | #include <string.h> | |
18 | ||
19 | RCSID("$Header$"); | |
20 | ||
21 | /* | |
22 | * This routine is the primary external interface to the mr library. | |
23 | * | |
24 | * It builds a new argument vector with the query handle prepended, | |
25 | * and calls mr_query_internal. | |
26 | */ | |
27 | static int level = 0; | |
28 | ||
29 | int mr_query(char *name, int argc, char **argv, | |
30 | int (*callproc)(int, char **, void *), void *callarg) | |
31 | { | |
32 | int status, stopcallbacks = 0; | |
33 | mr_params params, reply; | |
34 | ||
35 | CHECK_CONNECTED; | |
36 | if (level) | |
37 | return MR_QUERY_NOT_REENTRANT; | |
38 | ||
39 | params.u.mr_procno = MR_QUERY; | |
40 | params.mr_argc = argc + 1; | |
41 | params.mr_argl = NULL; | |
42 | params.mr_argv = malloc(sizeof(char *) * (argc + 1)); | |
43 | if (!params.mr_argv) | |
44 | return ENOMEM; | |
45 | params.mr_argv[0] = name; | |
46 | memcpy(params.mr_argv + 1, argv, sizeof(char *) * argc); | |
47 | ||
48 | level++; | |
49 | if ((status = mr_do_call(¶ms, &reply))) | |
50 | goto punt; | |
51 | ||
52 | while ((status = reply.u.mr_status) == MR_MORE_DATA) | |
53 | { | |
54 | if (callproc && !stopcallbacks) | |
55 | stopcallbacks = (*callproc)(reply.mr_argc, reply.mr_argv, callarg); | |
56 | mr_destroy_reply(reply); | |
57 | ||
58 | if (mr_receive(_mr_conn, &reply) != MR_SUCCESS) | |
59 | { | |
60 | mr_disconnect(); | |
61 | status = MR_ABORTED; | |
62 | goto punt_1; | |
63 | } | |
64 | } | |
65 | ||
66 | punt: | |
67 | mr_destroy_reply(reply); | |
68 | punt_1: | |
69 | level--; | |
70 | free(params.mr_argv); | |
71 | ||
72 | return status; | |
73 | } |