]> andersk Git - moira.git/blob - lib/mr_query.c
don't overwrite existing '\0' with '\0' in strtrim. (lets us strtrim
[moira.git] / lib / mr_query.c
1 /*
2  *      $Source$
3  *      $Author$
4  *      $Header$
5  *
6  *      Copyright (C) 1987 by the Massachusetts Institute of Technology
7  *      For copying and distribution information, please see the file
8  *      <mit-copyright.h>.
9  * 
10  */
11
12 #ifndef lint
13 static char *rcsid_sms_query_c = "$Header$";
14 #endif
15
16 #include <mit-copyright.h>
17 #include "mr_private.h"
18 #include <string.h>
19 #include <stdlib.h>
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(name, argc, argv, callproc, callarg)
30     char *name;         /* Query name */
31     int argc;           /* Arg count */
32     char **argv;                /* Args */
33     int (*callproc)();  /* Callback procedure */
34     char *callarg;              /* Callback argument */
35 {
36     register char **nargv = (char **)malloc(sizeof(char *) * (argc+1));
37     register int status = 0;
38     nargv[0] = name;
39     memcpy((char *)(nargv+1), (char *)argv, sizeof(char *) * argc);
40     status = mr_query_internal(argc+1, nargv, callproc, callarg);
41     free(nargv);
42     return status;
43 }
44 /*
45  * This routine makes an MR query.
46  *
47  * argv[0] is the query name.
48  * argv[1..argc-1] are the query arguments.
49  *
50  * callproc is called once for each returned value, with arguments
51  * argc, argv, and callarg.
52  * If it returns a non-zero value, further calls to it are not done, and
53  * all future data from the server is ignored (there should be some
54  * way to send it a quench..)
55  */
56
57 int mr_query_internal(argc, argv, callproc, callarg)
58     int argc;           /* Arg count */
59     char **argv;                /* Args */
60     int (*callproc)();  /* Callback procedure */
61     char *callarg;              /* Callback argument */
62 {
63     int status;
64     mr_params params_st;
65     register mr_params *params = NULL;
66     mr_params *reply = NULL;
67     int stopcallbacks = 0;
68
69     if (level) return MR_QUERY_NOT_REENTRANT;
70     
71     CHECK_CONNECTED;
72     level++;
73
74     params = &params_st; 
75     params->mr_version_no = sending_version_no;
76     params->mr_procno = MR_QUERY;
77     params->mr_argc = argc;
78     params->mr_argl = NULL;
79     params->mr_argv = argv;
80         
81     if ((status = mr_do_call(params, &reply)))
82         goto punt;
83
84     while ((status = reply->mr_status) == MR_MORE_DATA) {
85         if (!stopcallbacks) 
86             stopcallbacks =
87                 (*callproc)(reply->mr_argc, reply->mr_argv, callarg);
88         mr_destroy_reply(reply);
89         reply = NULL;
90
91         initialize_operation(_mr_recv_op, mr_start_recv, &reply,
92                              (int (*)())NULL);
93         queue_operation(_mr_conn, CON_INPUT, _mr_recv_op);
94
95         mr_complete_operation(_mr_recv_op);
96         if (OP_STATUS(_mr_recv_op) != OP_COMPLETE) {
97             mr_disconnect();
98             status = MR_ABORTED;
99             goto punt_1;
100         }
101     }   
102 punt:
103     mr_destroy_reply(reply);
104 punt_1:
105     level--;
106     return status;
107 }
This page took 0.041751 seconds and 5 git commands to generate.