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