]> andersk Git - moira.git/blame - server/mr_glue.c
make sure we sum up duplicate quotas correctly
[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);
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);
674fd273 98 pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
99 pseudo_client.args->sms_version_no = SMS_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{
113 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
114 com_err(whoami, SMS_NO_MEM, "while trimmming args");
115 }
116 (*arg->proc)(argc, argv, arg->hint);
117}
118
119
083d87de 120int sms_query(name, argc, argv, callproc, callarg)
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;
083d87de 132 return sms_process_query(&pseudo_client, name, argc, argv,
53db4098 133 callback, &hints);
083d87de 134}
135
136int sms_access(name, argc, argv)
137 char *name; /* Query name */
138 int argc; /* Arg count */
139 char **argv; /* Args */
140{
674fd273 141 time(&now);
083d87de 142 return sms_check_access(&pseudo_client, name, argc, argv);
143}
144
145int sms_query_internal(argc, argv, callproc, callarg)
146 int argc;
147 char **argv;
148 int (*callproc)();
149 char *callarg;
150{
53db4098 151 struct hint hints;
152
674fd273 153 time(&now);
53db4098 154 hints.proc = callproc;
155 hints.hint = callarg;
083d87de 156 return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
53db4098 157 callback, &hints);
083d87de 158}
159
160int sms_access_internal(argc, argv)
161 int argc;
162 char **argv;
163{
674fd273 164 time(&now);
083d87de 165 return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
166}
167
168sms_shutdown(why)
169 char *why;
170{
171 fprintf(stderr, "Sorry, not implemented\n");
172}
173
53db4098 174
175/* trigger_dcm is also used as a followup routine to the
176 * set_server_host_override query, hence the two dummy arguments.
177 */
178
179struct query pseudo_query = {
180 "trigger_dcm",
181 "tdcm",
182};
183
184trigger_dcm(dummy0, dummy1, cl)
185 int dummy0, dummy1;
186 client *cl;
187{
188 register int pid, status;
185f76ce 189 char prog[128];
53db4098 190
191 if (status = check_query_access(&pseudo_query, 0, cl))
192 return(status);
193
185f76ce 194 sprintf(prog, "%s/startdcm", BIN_DIR);
53db4098 195 pid = vfork();
196 switch (pid) {
197 case 0:
185f76ce 198 execl(prog, "startdcm", 0);
53db4098 199 exit(1);
200
201 case -1:
202 return(errno);
203
204 default:
205 return(SMS_SUCCESS);
206 }
207}
cba4da55 208
209
210void reapchild()
211{
212 union wait status;
213 int pid;
214
215 while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
216 if (status.w_termsig != 0 || status.w_retcode != 0)
217 com_err(whoami, 0, "%d: child exits with signal %d status %d",
218 pid, status.w_termsig, status.w_retcode);
219 }
220}
This page took 0.35518 seconds and 5 git commands to generate.