]> andersk Git - moira.git/blame - server/mr_glue.c
Remove #define DEBUG. Shouldn't have been there in the first place.
[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
7 *
8 * Glue routines to allow the database stuff to be linked in to
9 * a program expecting a library level interface.
10 *
11 * $Log$
53db4098 12 * Revision 1.5 1988-06-30 14:39:30 mar
13 * argument to sms_auth; trim args before returning them, fix trigger_dcm
083d87de 14 *
53db4098 15 * Revision 1.4 87/09/21 15:17:09 wesommer
16 * Also need to initialize pseudo_client.clname.
17 *
0ed584c8 18 * Revision 1.3 87/08/22 17:31:56 wesommer
19 * Fix a "fall-through".
20 *
28d7ad92 21 * Revision 1.2 87/07/29 16:03:58 wesommer
22 * Initialize krb_realm.
23 *
fe8a06f8 24 * Revision 1.1 87/07/14 00:41:18 wesommer
25 * Initial revision
26 *
083d87de 27 */
28
29#ifndef lint
30static char *rcsid_sms_glue_c = "$Header$";
31#endif lint
32
33#include "sms_server.h"
34#include <krb.h> /* XXX for error codes */
35#include <pwd.h>
53db4098 36#include "query.h"
37
083d87de 38static int already_connected = 0;
39
40#define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
41
42static client pseudo_client;
53db4098 43extern int krb_err_base, errno;
44extern char *malloc(), *whoami;
083d87de 45
46sms_connect()
47{
48 register int status;
49
50 if (already_connected) return SMS_ALREADY_CONNECTED;
51
52 init_sms_err_tbl();
53 init_krb_err_tbl();
54 bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
55
56 status = sms_open_database();
57 if (!status) already_connected = 1;
58 return status;
59}
60
61sms_disconnect()
62{
63 CHECK_CONNECTED;
64 sms_close_database();
65 already_connected = 0;
66 return 0;
67}
68
69sms_noop()
70{
71 CHECK_CONNECTED;
72 return 0;
73}
74/*
75 * This routine is rather bogus, as it only fills in who you claim to be.
76 */
53db4098 77sms_auth(prog)
78char *prog;
083d87de 79{
80 struct passwd *pw;
fe8a06f8 81 extern char *krb_realm;
53db4098 82 char buf[1024], *strsave();
0ed584c8 83
083d87de 84 CHECK_CONNECTED;
85 pw = getpwuid(getuid());
86 if (!pw) return (KDC_PR_UNKNOWN + krb_err_base); /* XXX hack (we
87 * need an extended
88 * error code table)
89 */
90 strcpy(pseudo_client.kname.name, pw->pw_name);
91 get_krbrlm(pseudo_client.kname.realm, 1);
fe8a06f8 92 krb_realm = pseudo_client.kname.realm;
0ed584c8 93
94 strcpy(buf, pw->pw_name);
95 strcat(buf, "@");
96 strcat(buf, pseudo_client.kname.realm);
97 pseudo_client.clname = malloc(strlen(buf)+1);
98 strcpy(pseudo_client.clname, buf);
53db4098 99 pseudo_client.users_id = get_users_id(pseudo_client.kname.name);
100 pseudo_client.entity = strsave(prog);
28d7ad92 101 return 0;
083d87de 102}
103
53db4098 104struct hint {
105 int (*proc)();
106 char *hint;
107};
108
109callback(argc, argv, arg)
110int argc;
111char **argv;
112struct hint *arg;
113{
114 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
115 com_err(whoami, SMS_NO_MEM, "while trimmming args");
116 }
117 (*arg->proc)(argc, argv, arg->hint);
118}
119
120
083d87de 121int sms_query(name, argc, argv, callproc, callarg)
122 char *name; /* Query name */
123 int argc; /* Arg count */
124 char **argv; /* Args */
125 int (*callproc)(); /* Callback procedure */
126 char *callarg; /* Callback argument */
127{
53db4098 128 struct hint hints;
129
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{
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
152 hints.proc = callproc;
153 hints.hint = callarg;
083d87de 154 return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
53db4098 155 callback, &hints);
083d87de 156}
157
158int sms_access_internal(argc, argv)
159 int argc;
160 char **argv;
161{
162 return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
163}
164
165sms_shutdown(why)
166 char *why;
167{
168 fprintf(stderr, "Sorry, not implemented\n");
169}
170
53db4098 171
172/* trigger_dcm is also used as a followup routine to the
173 * set_server_host_override query, hence the two dummy arguments.
174 */
175
176struct query pseudo_query = {
177 "trigger_dcm",
178 "tdcm",
179};
180
181trigger_dcm(dummy0, dummy1, cl)
182 int dummy0, dummy1;
183 client *cl;
184{
185 register int pid, status;
186
187 if (status = check_query_access(&pseudo_query, 0, cl))
188 return(status);
189
190 pid = vfork();
191 switch (pid) {
192 case 0:
193 execl("/u1/sms/bin/startdcm", "startdcm", 0);
194 exit(1);
195
196 case -1:
197 return(errno);
198
199 default:
200 return(SMS_SUCCESS);
201 }
202}
203
204
083d87de 205/*
206 * Local Variables:
207 * mode: c
208 * c-indent-level: 4
209 * c-continued-statement-offset: 4
210 * c-brace-offset: -4
211 * c-argdecl-indent: 4
212 * c-label-offset: -4
213 * End:
214 */
This page took 0.079741 seconds and 5 git commands to generate.