]> andersk Git - moira.git/blame - server/mr_glue.c
fixed name section
[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"
20#include <krb.h> /* XXX for error codes */
21#include <pwd.h>
53db4098 22#include "query.h"
23
083d87de 24static int already_connected = 0;
25
26#define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
27
28static client pseudo_client;
53db4098 29extern int krb_err_base, errno;
30extern char *malloc(), *whoami;
674fd273 31extern time_t now;
083d87de 32
33sms_connect()
34{
35 register int status;
36
37 if (already_connected) return SMS_ALREADY_CONNECTED;
38
39 init_sms_err_tbl();
40 init_krb_err_tbl();
41 bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
42
43 status = sms_open_database();
44 if (!status) already_connected = 1;
45 return status;
46}
47
48sms_disconnect()
49{
50 CHECK_CONNECTED;
51 sms_close_database();
52 already_connected = 0;
53 return 0;
54}
55
56sms_noop()
57{
58 CHECK_CONNECTED;
59 return 0;
60}
61/*
62 * This routine is rather bogus, as it only fills in who you claim to be.
63 */
53db4098 64sms_auth(prog)
65char *prog;
083d87de 66{
67 struct passwd *pw;
fe8a06f8 68 extern char *krb_realm;
53db4098 69 char buf[1024], *strsave();
0ed584c8 70
083d87de 71 CHECK_CONNECTED;
72 pw = getpwuid(getuid());
73 if (!pw) return (KDC_PR_UNKNOWN + krb_err_base); /* XXX hack (we
74 * need an extended
75 * error code table)
76 */
77 strcpy(pseudo_client.kname.name, pw->pw_name);
78 get_krbrlm(pseudo_client.kname.realm, 1);
fe8a06f8 79 krb_realm = pseudo_client.kname.realm;
0ed584c8 80
81 strcpy(buf, pw->pw_name);
82 strcat(buf, "@");
83 strcat(buf, pseudo_client.kname.realm);
84 pseudo_client.clname = malloc(strlen(buf)+1);
85 strcpy(pseudo_client.clname, buf);
53db4098 86 pseudo_client.users_id = get_users_id(pseudo_client.kname.name);
87 pseudo_client.entity = strsave(prog);
674fd273 88 pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
89 pseudo_client.args->sms_version_no = SMS_VERSION_2;
28d7ad92 90 return 0;
083d87de 91}
92
53db4098 93struct hint {
94 int (*proc)();
95 char *hint;
96};
97
98callback(argc, argv, arg)
99int argc;
100char **argv;
101struct hint *arg;
102{
103 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
104 com_err(whoami, SMS_NO_MEM, "while trimmming args");
105 }
106 (*arg->proc)(argc, argv, arg->hint);
107}
108
109
083d87de 110int sms_query(name, argc, argv, callproc, callarg)
111 char *name; /* Query name */
112 int argc; /* Arg count */
113 char **argv; /* Args */
114 int (*callproc)(); /* Callback procedure */
115 char *callarg; /* Callback argument */
116{
53db4098 117 struct hint hints;
118
674fd273 119 time(&now);
53db4098 120 hints.proc = callproc;
121 hints.hint = callarg;
083d87de 122 return sms_process_query(&pseudo_client, name, argc, argv,
53db4098 123 callback, &hints);
083d87de 124}
125
126int sms_access(name, argc, argv)
127 char *name; /* Query name */
128 int argc; /* Arg count */
129 char **argv; /* Args */
130{
674fd273 131 time(&now);
083d87de 132 return sms_check_access(&pseudo_client, name, argc, argv);
133}
134
135int sms_query_internal(argc, argv, callproc, callarg)
136 int argc;
137 char **argv;
138 int (*callproc)();
139 char *callarg;
140{
53db4098 141 struct hint hints;
142
674fd273 143 time(&now);
53db4098 144 hints.proc = callproc;
145 hints.hint = callarg;
083d87de 146 return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
53db4098 147 callback, &hints);
083d87de 148}
149
150int sms_access_internal(argc, argv)
151 int argc;
152 char **argv;
153{
674fd273 154 time(&now);
083d87de 155 return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
156}
157
158sms_shutdown(why)
159 char *why;
160{
161 fprintf(stderr, "Sorry, not implemented\n");
162}
163
53db4098 164
165/* trigger_dcm is also used as a followup routine to the
166 * set_server_host_override query, hence the two dummy arguments.
167 */
168
169struct query pseudo_query = {
170 "trigger_dcm",
171 "tdcm",
172};
173
174trigger_dcm(dummy0, dummy1, cl)
175 int dummy0, dummy1;
176 client *cl;
177{
178 register int pid, status;
179
180 if (status = check_query_access(&pseudo_query, 0, cl))
181 return(status);
182
183 pid = vfork();
184 switch (pid) {
185 case 0:
186 execl("/u1/sms/bin/startdcm", "startdcm", 0);
187 exit(1);
188
189 case -1:
190 return(errno);
191
192 default:
193 return(SMS_SUCCESS);
194 }
195}
196
197
083d87de 198/*
199 * Local Variables:
200 * mode: c
201 * c-indent-level: 4
202 * c-continued-statement-offset: 4
203 * c-brace-offset: -4
204 * c-argdecl-indent: 4
205 * c-label-offset: -4
206 * End:
207 */
This page took 0.132303 seconds and 5 git commands to generate.