]> andersk Git - moira.git/blame - server/mr_glue.c
Remove `delete_user_by_uid' since it's never been used in any logs we have,
[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>
cba4da55 19#include <sys/types.h>
20#include <sys/signal.h>
21#include <sys/wait.h>
40165bd0 22#include <krb_et.h>
083d87de 23#include <pwd.h>
e448f08d 24#include "mr_server.h"
03c05291 25#include "query.h"
53db4098 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;
e448f08d 33extern char *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;
03c05291 42 struct sigaction action;
083d87de 43
d548a4e7 44 if (already_connected) return MR_ALREADY_CONNECTED;
083d87de 45
40165bd0 46 initialize_sms_error_table();
47 initialize_krb_error_table();
03c05291 48 memset((char *)&pseudo_client, 0, sizeof(pseudo_client)); /* XXX */
083d87de 49
964ac8c7 50 query_timeout = 0;
d548a4e7 51 status = mr_open_database();
083d87de 52 if (!status) already_connected = 1;
cba4da55 53
03c05291 54 action.sa_flags = 0;
55 sigemptyset(&action.sa_mask);
56 sigaddset(&action.sa_mask, SIGCHLD);
57 action.sa_handler = reapchild;
58 if (sigaction(SIGCHLD, &action, NULL) < 0) {
59 com_err(whoami, errno, "Unable to establish signal handlers.");
60 exit(1);
61 }
083d87de 62 return status;
63}
64
d548a4e7 65mr_disconnect()
083d87de 66{
67 CHECK_CONNECTED;
d548a4e7 68 mr_close_database();
083d87de 69 already_connected = 0;
70 return 0;
71}
72
d548a4e7 73mr_noop()
083d87de 74{
75 CHECK_CONNECTED;
76 return 0;
77}
78/*
79 * This routine is rather bogus, as it only fills in who you claim to be.
80 */
d548a4e7 81mr_auth(prog)
53db4098 82char *prog;
083d87de 83{
84 struct passwd *pw;
fe8a06f8 85 extern char *krb_realm;
53db4098 86 char buf[1024], *strsave();
0ed584c8 87
083d87de 88 CHECK_CONNECTED;
89 pw = getpwuid(getuid());
40165bd0 90 if (!pw) return (KDC_PR_UNKNOWN + ERROR_TABLE_BASE_krb); /* XXX hack (we
083d87de 91 * need an extended
92 * error code table)
93 */
94 strcpy(pseudo_client.kname.name, pw->pw_name);
12f94253 95 krb_get_lrealm(pseudo_client.kname.realm, 1);
fe8a06f8 96 krb_realm = pseudo_client.kname.realm;
0ed584c8 97
98 strcpy(buf, pw->pw_name);
99 strcat(buf, "@");
100 strcat(buf, pseudo_client.kname.realm);
0ed584c8 101 strcpy(pseudo_client.clname, buf);
00e9a31e 102 pseudo_client.users_id = 0;
03c05291 103 name_to_id(pseudo_client.kname.name, USERS_TABLE, &pseudo_client.users_id);
cba4da55 104 pseudo_client.client_id = pseudo_client.users_id;
03c05291 105 strncpy(pseudo_client.entity, prog, 8);
d548a4e7 106 pseudo_client.args = (mr_params *) malloc(sizeof(mr_params));
107 pseudo_client.args->mr_version_no = MR_VERSION_2;
28d7ad92 108 return 0;
083d87de 109}
110
53db4098 111struct hint {
112 int (*proc)();
113 char *hint;
114};
115
116callback(argc, argv, arg)
117int argc;
118char **argv;
119struct hint *arg;
120{
d548a4e7 121 if (mr_trim_args(argc, argv) == MR_NO_MEM) {
122 com_err(whoami, MR_NO_MEM, "while trimmming args");
53db4098 123 }
124 (*arg->proc)(argc, argv, arg->hint);
125}
126
127
d548a4e7 128int mr_query(name, argc, argv, callproc, callarg)
083d87de 129 char *name; /* Query name */
130 int argc; /* Arg count */
131 char **argv; /* Args */
132 int (*callproc)(); /* Callback procedure */
133 char *callarg; /* Callback argument */
134{
53db4098 135 struct hint hints;
136
674fd273 137 time(&now);
53db4098 138 hints.proc = callproc;
139 hints.hint = callarg;
cf9d1cae 140 next_incremental();
762e2625 141 return mr_process_query(&pseudo_client, name, argc,
960b073b 142 mr_copy_args(argv, argc), callback,
143 (char *)&hints);
cf9d1cae 144
083d87de 145}
146
d548a4e7 147int mr_access(name, argc, argv)
083d87de 148 char *name; /* Query name */
149 int argc; /* Arg count */
150 char **argv; /* Args */
151{
674fd273 152 time(&now);
762e2625 153 return mr_check_access(&pseudo_client, name, argc,
154 mr_copy_args(argv, argc));
083d87de 155}
156
d548a4e7 157int mr_query_internal(argc, argv, callproc, callarg)
083d87de 158 int argc;
159 char **argv;
160 int (*callproc)();
161 char *callarg;
162{
53db4098 163 struct hint hints;
164
674fd273 165 time(&now);
53db4098 166 hints.proc = callproc;
167 hints.hint = callarg;
cf9d1cae 168 next_incremental();
762e2625 169 return mr_process_query(&pseudo_client, argv[0], argc-1,
960b073b 170 mr_copy_args(argv+1, argc-1), callback,
171 (char *)&hints);
083d87de 172}
173
d548a4e7 174int mr_access_internal(argc, argv)
083d87de 175 int argc;
176 char **argv;
177{
674fd273 178 time(&now);
762e2625 179 return mr_check_access(&pseudo_client, argv[0], argc-1,
180 mr_copy_args(argv+1, argc-1));
083d87de 181}
182
d548a4e7 183mr_shutdown(why)
083d87de 184 char *why;
185{
186 fprintf(stderr, "Sorry, not implemented\n");
187}
188
53db4098 189
190/* trigger_dcm is also used as a followup routine to the
191 * set_server_host_override query, hence the two dummy arguments.
192 */
193
194struct query pseudo_query = {
195 "trigger_dcm",
196 "tdcm",
197};
198
199trigger_dcm(dummy0, dummy1, cl)
200 int dummy0, dummy1;
201 client *cl;
202{
203 register int pid, status;
185f76ce 204 char prog[128];
53db4098 205
206 if (status = check_query_access(&pseudo_query, 0, cl))
207 return(status);
208
185f76ce 209 sprintf(prog, "%s/startdcm", BIN_DIR);
53db4098 210 pid = vfork();
211 switch (pid) {
212 case 0:
185f76ce 213 execl(prog, "startdcm", 0);
53db4098 214 exit(1);
215
216 case -1:
217 return(errno);
218
219 default:
d548a4e7 220 return(MR_SUCCESS);
53db4098 221 }
222}
cba4da55 223
224
225void reapchild()
226{
03c05291 227 int status, pid;
cba4da55 228
03c05291 229 while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
65b73e9d 230 if (pid == inc_pid) {
231 inc_running = 0;
232 next_incremental();
233 }
03c05291 234 if (WTERMSIG(status) != 0 || WEXITSTATUS(status) != 0)
cba4da55 235 com_err(whoami, 0, "%d: child exits with signal %d status %d",
03c05291 236 pid, WTERMSIG(status), WEXITSTATUS(status));
cba4da55 237 }
238}
This page took 0.135079 seconds and 5 git commands to generate.