]> andersk Git - moira.git/blame - server/mr_glue.c
POSIX, ANSI, sanity fixes
[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,
142 mr_copy_args(argv, argc), callback, &hints);
cf9d1cae 143
083d87de 144}
145
d548a4e7 146int mr_access(name, argc, argv)
083d87de 147 char *name; /* Query name */
148 int argc; /* Arg count */
149 char **argv; /* Args */
150{
674fd273 151 time(&now);
762e2625 152 return mr_check_access(&pseudo_client, name, argc,
153 mr_copy_args(argv, argc));
083d87de 154}
155
d548a4e7 156int mr_query_internal(argc, argv, callproc, callarg)
083d87de 157 int argc;
158 char **argv;
159 int (*callproc)();
160 char *callarg;
161{
53db4098 162 struct hint hints;
163
674fd273 164 time(&now);
53db4098 165 hints.proc = callproc;
166 hints.hint = callarg;
cf9d1cae 167 next_incremental();
762e2625 168 return mr_process_query(&pseudo_client, argv[0], argc-1,
169 mr_copy_args(argv+1, argc-1), callback, &hints);
083d87de 170}
171
d548a4e7 172int mr_access_internal(argc, argv)
083d87de 173 int argc;
174 char **argv;
175{
674fd273 176 time(&now);
762e2625 177 return mr_check_access(&pseudo_client, argv[0], argc-1,
178 mr_copy_args(argv+1, argc-1));
083d87de 179}
180
d548a4e7 181mr_shutdown(why)
083d87de 182 char *why;
183{
184 fprintf(stderr, "Sorry, not implemented\n");
185}
186
53db4098 187
188/* trigger_dcm is also used as a followup routine to the
189 * set_server_host_override query, hence the two dummy arguments.
190 */
191
192struct query pseudo_query = {
193 "trigger_dcm",
194 "tdcm",
195};
196
197trigger_dcm(dummy0, dummy1, cl)
198 int dummy0, dummy1;
199 client *cl;
200{
201 register int pid, status;
185f76ce 202 char prog[128];
53db4098 203
204 if (status = check_query_access(&pseudo_query, 0, cl))
205 return(status);
206
185f76ce 207 sprintf(prog, "%s/startdcm", BIN_DIR);
53db4098 208 pid = vfork();
209 switch (pid) {
210 case 0:
185f76ce 211 execl(prog, "startdcm", 0);
53db4098 212 exit(1);
213
214 case -1:
215 return(errno);
216
217 default:
d548a4e7 218 return(MR_SUCCESS);
53db4098 219 }
220}
cba4da55 221
222
223void reapchild()
224{
03c05291 225 int status, pid;
cba4da55 226
03c05291 227 while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
65b73e9d 228 if (pid == inc_pid) {
229 inc_running = 0;
230 next_incremental();
231 }
03c05291 232 if (WTERMSIG(status) != 0 || WEXITSTATUS(status) != 0)
cba4da55 233 com_err(whoami, 0, "%d: child exits with signal %d status %d",
03c05291 234 pid, WTERMSIG(status), WEXITSTATUS(status));
cba4da55 235 }
236}
This page took 0.126416 seconds and 5 git commands to generate.