]> andersk Git - moira.git/blame - server/mr_glue.c
moved directory definitions
[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
15static char *rcsid_sms_glue_c = "$Header$";
16#endif lint
17
674fd273 18#include <mit-copyright.h>
083d87de 19#include "sms_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
29#define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
30
31static client pseudo_client;
40165bd0 32extern int errno;
53db4098 33extern char *malloc(), *whoami;
674fd273 34extern time_t now;
cba4da55 35void reapchild();
083d87de 36
9a2d61b0 37sms_connect(server)
38char *server;
083d87de 39{
40 register int status;
964ac8c7 41 extern int query_timeout;
083d87de 42
43 if (already_connected) return SMS_ALREADY_CONNECTED;
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;
083d87de 50 status = sms_open_database();
51 if (!status) already_connected = 1;
cba4da55 52
53 signal(SIGCHLD, reapchild);
083d87de 54 return status;
55}
56
57sms_disconnect()
58{
59 CHECK_CONNECTED;
60 sms_close_database();
61 already_connected = 0;
62 return 0;
63}
64
65sms_noop()
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 */
53db4098 73sms_auth(prog)
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);
53db4098 94 pseudo_client.users_id = get_users_id(pseudo_client.kname.name);
cba4da55 95 pseudo_client.client_id = pseudo_client.users_id;
96 strcpy(pseudo_client.entity, prog);
674fd273 97 pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
98 pseudo_client.args->sms_version_no = SMS_VERSION_2;
28d7ad92 99 return 0;
083d87de 100}
101
53db4098 102struct hint {
103 int (*proc)();
104 char *hint;
105};
106
107callback(argc, argv, arg)
108int argc;
109char **argv;
110struct hint *arg;
111{
112 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
113 com_err(whoami, SMS_NO_MEM, "while trimmming args");
114 }
115 (*arg->proc)(argc, argv, arg->hint);
116}
117
118
083d87de 119int sms_query(name, argc, argv, callproc, callarg)
120 char *name; /* Query name */
121 int argc; /* Arg count */
122 char **argv; /* Args */
123 int (*callproc)(); /* Callback procedure */
124 char *callarg; /* Callback argument */
125{
53db4098 126 struct hint hints;
127
674fd273 128 time(&now);
53db4098 129 hints.proc = callproc;
130 hints.hint = callarg;
083d87de 131 return sms_process_query(&pseudo_client, name, argc, argv,
53db4098 132 callback, &hints);
083d87de 133}
134
135int sms_access(name, argc, argv)
136 char *name; /* Query name */
137 int argc; /* Arg count */
138 char **argv; /* Args */
139{
674fd273 140 time(&now);
083d87de 141 return sms_check_access(&pseudo_client, name, argc, argv);
142}
143
144int sms_query_internal(argc, argv, callproc, callarg)
145 int argc;
146 char **argv;
147 int (*callproc)();
148 char *callarg;
149{
53db4098 150 struct hint hints;
151
674fd273 152 time(&now);
53db4098 153 hints.proc = callproc;
154 hints.hint = callarg;
083d87de 155 return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
53db4098 156 callback, &hints);
083d87de 157}
158
159int sms_access_internal(argc, argv)
160 int argc;
161 char **argv;
162{
674fd273 163 time(&now);
083d87de 164 return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
165}
166
167sms_shutdown(why)
168 char *why;
169{
170 fprintf(stderr, "Sorry, not implemented\n");
171}
172
53db4098 173
174/* trigger_dcm is also used as a followup routine to the
175 * set_server_host_override query, hence the two dummy arguments.
176 */
177
178struct query pseudo_query = {
179 "trigger_dcm",
180 "tdcm",
181};
182
183trigger_dcm(dummy0, dummy1, cl)
184 int dummy0, dummy1;
185 client *cl;
186{
187 register int pid, status;
185f76ce 188 char prog[128];
53db4098 189
190 if (status = check_query_access(&pseudo_query, 0, cl))
191 return(status);
192
185f76ce 193 sprintf(prog, "%s/startdcm", BIN_DIR);
53db4098 194 pid = vfork();
195 switch (pid) {
196 case 0:
185f76ce 197 execl(prog, "startdcm", 0);
53db4098 198 exit(1);
199
200 case -1:
201 return(errno);
202
203 default:
204 return(SMS_SUCCESS);
205 }
206}
cba4da55 207
208
209void reapchild()
210{
211 union wait status;
212 int pid;
213
214 while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
215 if (status.w_termsig != 0 || status.w_retcode != 0)
216 com_err(whoami, 0, "%d: child exits with signal %d status %d",
217 pid, status.w_termsig, status.w_retcode);
218 }
219}
This page took 0.186016 seconds and 5 git commands to generate.