]> andersk Git - moira.git/blame - server/mr_glue.c
Case-insensitive stuff.
[moira.git] / server / mr_glue.c
CommitLineData
083d87de 1/*
2 * $Source$
3 * $Author$
4 * $Header$
5 *
6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
674fd273 7 * For copying and distribution information, please see the file
8 * <mit-copyright.h>.
083d87de 9 *
10 * Glue routines to allow the database stuff to be linked in to
11 * a program expecting a library level interface.
083d87de 12 */
13
14#ifndef lint
d548a4e7 15static char *rcsid_mr_glue_c = "$Header$";
083d87de 16#endif lint
17
674fd273 18#include <mit-copyright.h>
d548a4e7 19#include "mr_server.h"
cba4da55 20#include <sys/types.h>
21#include <sys/signal.h>
22#include <sys/wait.h>
40165bd0 23#include <krb_et.h>
083d87de 24#include <pwd.h>
53db4098 25#include "query.h"
26
083d87de 27static int already_connected = 0;
28
d548a4e7 29#define CHECK_CONNECTED { if (!already_connected) return MR_NOT_CONNECTED; }
083d87de 30
31static client pseudo_client;
40165bd0 32extern int errno;
53db4098 33extern char *malloc(), *whoami;
674fd273 34extern time_t now;
cba4da55 35void reapchild();
083d87de 36
d548a4e7 37mr_connect(server)
9a2d61b0 38char *server;
083d87de 39{
40 register int status;
964ac8c7 41 extern int query_timeout;
083d87de 42
d548a4e7 43 if (already_connected) return MR_ALREADY_CONNECTED;
083d87de 44
40165bd0 45 initialize_sms_error_table();
46 initialize_krb_error_table();
083d87de 47 bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
48
964ac8c7 49 query_timeout = 0;
d548a4e7 50 status = mr_open_database();
083d87de 51 if (!status) already_connected = 1;
cba4da55 52
53 signal(SIGCHLD, reapchild);
083d87de 54 return status;
55}
56
d548a4e7 57mr_disconnect()
083d87de 58{
59 CHECK_CONNECTED;
d548a4e7 60 mr_close_database();
083d87de 61 already_connected = 0;
62 return 0;
63}
64
d548a4e7 65mr_noop()
083d87de 66{
67 CHECK_CONNECTED;
68 return 0;
69}
70/*
71 * This routine is rather bogus, as it only fills in who you claim to be.
72 */
d548a4e7 73mr_auth(prog)
53db4098 74char *prog;
083d87de 75{
76 struct passwd *pw;
fe8a06f8 77 extern char *krb_realm;
53db4098 78 char buf[1024], *strsave();
0ed584c8 79
083d87de 80 CHECK_CONNECTED;
81 pw = getpwuid(getuid());
40165bd0 82 if (!pw) return (KDC_PR_UNKNOWN + ERROR_TABLE_BASE_krb); /* XXX hack (we
083d87de 83 * need an extended
84 * error code table)
85 */
86 strcpy(pseudo_client.kname.name, pw->pw_name);
12f94253 87 krb_get_lrealm(pseudo_client.kname.realm, 1);
fe8a06f8 88 krb_realm = pseudo_client.kname.realm;
0ed584c8 89
90 strcpy(buf, pw->pw_name);
91 strcat(buf, "@");
92 strcat(buf, pseudo_client.kname.realm);
0ed584c8 93 strcpy(pseudo_client.clname, buf);
00e9a31e 94 pseudo_client.users_id = 0;
95 name_to_id(pseudo_client.kname.name, "USER", &pseudo_client.users_id);
cba4da55 96 pseudo_client.client_id = pseudo_client.users_id;
97 strcpy(pseudo_client.entity, prog);
d548a4e7 98 pseudo_client.args = (mr_params *) malloc(sizeof(mr_params));
99 pseudo_client.args->mr_version_no = MR_VERSION_2;
28d7ad92 100 return 0;
083d87de 101}
102
53db4098 103struct hint {
104 int (*proc)();
105 char *hint;
106};
107
108callback(argc, argv, arg)
109int argc;
110char **argv;
111struct hint *arg;
112{
d548a4e7 113 if (mr_trim_args(argc, argv) == MR_NO_MEM) {
114 com_err(whoami, MR_NO_MEM, "while trimmming args");
53db4098 115 }
116 (*arg->proc)(argc, argv, arg->hint);
117}
118
119
d548a4e7 120int mr_query(name, argc, argv, callproc, callarg)
083d87de 121 char *name; /* Query name */
122 int argc; /* Arg count */
123 char **argv; /* Args */
124 int (*callproc)(); /* Callback procedure */
125 char *callarg; /* Callback argument */
126{
53db4098 127 struct hint hints;
128
674fd273 129 time(&now);
53db4098 130 hints.proc = callproc;
131 hints.hint = callarg;
cf9d1cae 132 next_incremental();
762e2625 133 return mr_process_query(&pseudo_client, name, argc,
134 mr_copy_args(argv, argc), callback, &hints);
cf9d1cae 135
083d87de 136}
137
d548a4e7 138int mr_access(name, argc, argv)
083d87de 139 char *name; /* Query name */
140 int argc; /* Arg count */
141 char **argv; /* Args */
142{
674fd273 143 time(&now);
762e2625 144 return mr_check_access(&pseudo_client, name, argc,
145 mr_copy_args(argv, argc));
083d87de 146}
147
d548a4e7 148int mr_query_internal(argc, argv, callproc, callarg)
083d87de 149 int argc;
150 char **argv;
151 int (*callproc)();
152 char *callarg;
153{
53db4098 154 struct hint hints;
155
674fd273 156 time(&now);
53db4098 157 hints.proc = callproc;
158 hints.hint = callarg;
cf9d1cae 159 next_incremental();
762e2625 160 return mr_process_query(&pseudo_client, argv[0], argc-1,
161 mr_copy_args(argv+1, argc-1), callback, &hints);
083d87de 162}
163
d548a4e7 164int mr_access_internal(argc, argv)
083d87de 165 int argc;
166 char **argv;
167{
674fd273 168 time(&now);
762e2625 169 return mr_check_access(&pseudo_client, argv[0], argc-1,
170 mr_copy_args(argv+1, argc-1));
083d87de 171}
172
d548a4e7 173mr_shutdown(why)
083d87de 174 char *why;
175{
176 fprintf(stderr, "Sorry, not implemented\n");
177}
178
53db4098 179
180/* trigger_dcm is also used as a followup routine to the
181 * set_server_host_override query, hence the two dummy arguments.
182 */
183
184struct query pseudo_query = {
185 "trigger_dcm",
186 "tdcm",
187};
188
189trigger_dcm(dummy0, dummy1, cl)
190 int dummy0, dummy1;
191 client *cl;
192{
193 register int pid, status;
185f76ce 194 char prog[128];
53db4098 195
196 if (status = check_query_access(&pseudo_query, 0, cl))
197 return(status);
198
185f76ce 199 sprintf(prog, "%s/startdcm", BIN_DIR);
53db4098 200 pid = vfork();
201 switch (pid) {
202 case 0:
185f76ce 203 execl(prog, "startdcm", 0);
53db4098 204 exit(1);
205
206 case -1:
207 return(errno);
208
209 default:
d548a4e7 210 return(MR_SUCCESS);
53db4098 211 }
212}
cba4da55 213
214
215void reapchild()
216{
217 union wait status;
218 int pid;
219
220 while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
65b73e9d 221 if (pid == inc_pid) {
222 inc_running = 0;
223 next_incremental();
224 }
cba4da55 225 if (status.w_termsig != 0 || status.w_retcode != 0)
226 com_err(whoami, 0, "%d: child exits with signal %d status %d",
227 pid, status.w_termsig, status.w_retcode);
228 }
229}
This page took 0.139879 seconds and 5 git commands to generate.