]> andersk Git - moira.git/blame - server/mr_glue.c
Code style cleanup. (No functional changes)
[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
d548a4e7 15static char *rcsid_mr_glue_c = "$Header$";
083d87de 16#endif lint
17
674fd273 18#include <mit-copyright.h>
cba4da55 19#include <sys/types.h>
20#include <sys/signal.h>
21#include <sys/wait.h>
40165bd0 22#include <krb_et.h>
083d87de 23#include <pwd.h>
e448f08d 24#include "mr_server.h"
03c05291 25#include "query.h"
53db4098 26
083d87de 27static int already_connected = 0;
28
d548a4e7 29#define CHECK_CONNECTED { if (!already_connected) return MR_NOT_CONNECTED; }
083d87de 30
31static client pseudo_client;
40165bd0 32extern int errno;
e448f08d 33extern char *whoami;
674fd273 34extern time_t now;
cba4da55 35void reapchild();
083d87de 36
5eaef520 37int mr_connect(char *server)
083d87de 38{
5eaef520 39 register int status;
40 extern int query_timeout;
41 struct sigaction action;
42
43 if (already_connected)
44 return MR_ALREADY_CONNECTED;
45
46 initialize_sms_error_table();
47 initialize_krb_error_table();
48 memset(&pseudo_client, 0, sizeof(pseudo_client));
49
50 query_timeout = 0;
51 status = mr_open_database();
52 if (!status)
53 already_connected = 1;
54
55 action.sa_flags = 0;
56 sigemptyset(&action.sa_mask);
57 sigaddset(&action.sa_mask, SIGCHLD);
58 action.sa_handler = reapchild;
59 if (sigaction(SIGCHLD, &action, NULL) < 0)
60 {
03c05291 61 com_err(whoami, errno, "Unable to establish signal handlers.");
62 exit(1);
63 }
5eaef520 64 return status;
083d87de 65}
66
5eaef520 67int mr_disconnect(void)
083d87de 68{
5eaef520 69 CHECK_CONNECTED;
70 mr_close_database();
71 already_connected = 0;
72 return 0;
083d87de 73}
74
5eaef520 75int mr_noop(void)
083d87de 76{
5eaef520 77 CHECK_CONNECTED;
78 return 0;
083d87de 79}
5eaef520 80
083d87de 81/*
82 * This routine is rather bogus, as it only fills in who you claim to be.
83 */
5eaef520 84int mr_auth(char *prog)
083d87de 85{
5eaef520 86 struct passwd *pw;
87 extern char *krb_realm;
88 char buf[1024], *strsave();
89
90 CHECK_CONNECTED;
91 pw = getpwuid(getuid());
92 if (!pw)
93 return KDC_PR_UNKNOWN + ERROR_TABLE_BASE_krb;
94 strcpy(pseudo_client.kname.name, pw->pw_name);
95 krb_get_lrealm(pseudo_client.kname.realm, 1);
96 krb_realm = pseudo_client.kname.realm;
97
98 strcpy(buf, pw->pw_name);
99 strcat(buf, "@");
100 strcat(buf, pseudo_client.kname.realm);
101 strcpy(pseudo_client.clname, buf);
102 pseudo_client.users_id = 0;
103 name_to_id(pseudo_client.kname.name, USERS_TABLE, &pseudo_client.users_id);
104 pseudo_client.client_id = pseudo_client.users_id;
105 strncpy(pseudo_client.entity, prog, 8);
106 pseudo_client.args = malloc(sizeof(mr_params));
107 pseudo_client.args->mr_version_no = MR_VERSION_2;
108 return 0;
083d87de 109}
110
53db4098 111struct hint {
5eaef520 112 int (*proc)();
113 char *hint;
53db4098 114};
115
5eaef520 116callback(int argc, char **argv, struct hint *arg)
53db4098 117{
5eaef520 118 if (mr_trim_args(argc, argv) == MR_NO_MEM)
119 com_err(whoami, MR_NO_MEM, "while trimmming args");
120 (*arg->proc)(argc, argv, arg->hint);
53db4098 121}
122
123
5eaef520 124int mr_query(char *name, int argc, char **argv, int (*callproc)(), char *callarg)
083d87de 125{
5eaef520 126 struct hint hints;
127
128 time(&now);
129 hints.proc = callproc;
130 hints.hint = callarg;
131 next_incremental();
132 return mr_process_query(&pseudo_client, name, argc,
133 mr_copy_args(argv, argc), callback,
134 (char *)&hints);
083d87de 135}
136
5eaef520 137int mr_access(char *name, int argc, char **argv)
083d87de 138{
5eaef520 139 time(&now);
140 return mr_check_access(&pseudo_client, name, argc,
141 mr_copy_args(argv, argc));
083d87de 142}
143
5eaef520 144int mr_query_internal(int argc, char **argv, int (*callproc)(), char *callarg)
083d87de 145{
5eaef520 146 struct hint hints;
147
148 time(&now);
149 hints.proc = callproc;
150 hints.hint = callarg;
151 next_incremental();
152 return mr_process_query(&pseudo_client, argv[0], argc - 1,
153 mr_copy_args(argv + 1, argc - 1), callback,
154 (char *)&hints);
083d87de 155}
156
5eaef520 157int mr_access_internal(int argc, char **argv)
083d87de 158{
5eaef520 159 time(&now);
160 return mr_check_access(&pseudo_client, argv[0], argc - 1,
161 mr_copy_args(argv + 1, argc - 1));
083d87de 162}
163
5eaef520 164mr_shutdown(char *why)
083d87de 165{
5eaef520 166 fprintf(stderr, "Sorry, not implemented\n");
083d87de 167}
168
53db4098 169
5eaef520 170/* trigger_dcm is also used as a followup routine to the
53db4098 171 * set_server_host_override query, hence the two dummy arguments.
172 */
173
174struct query pseudo_query = {
5eaef520 175 "trigger_dcm",
176 "tdcm",
53db4098 177};
178
5eaef520 179int trigger_dcm(int dummy0, int dummy1, client *cl)
53db4098 180{
5eaef520 181 register int pid, status;
182 char prog[128];
183
184 if ((status = check_query_access(&pseudo_query, 0, cl)))
185 return status;
186
187 sprintf(prog, "%s/startdcm", BIN_DIR);
188 pid = vfork();
189 switch (pid)
190 {
191 case 0:
192 execl(prog, "startdcm", 0);
193 exit(1);
194
195 case -1:
196 return errno;
197
198 default:
199 return MR_SUCCESS;
200 }
53db4098 201}
cba4da55 202
203
5eaef520 204void reapchild(void)
cba4da55 205{
5eaef520 206 int status, pid;
207
208 while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
209 {
210 if (pid == inc_pid)
211 {
212 inc_running = 0;
213 next_incremental();
65b73e9d 214 }
5eaef520 215 if (WTERMSIG(status) != 0 || WEXITSTATUS(status) != 0)
216 {
cba4da55 217 com_err(whoami, 0, "%d: child exits with signal %d status %d",
03c05291 218 pid, WTERMSIG(status), WEXITSTATUS(status));
5eaef520 219 }
cba4da55 220 }
221}
This page took 0.656467 seconds and 5 git commands to generate.