6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
7 * For copying and distribution information, please see the file
10 * Glue routines to allow the database stuff to be linked in to
11 * a program expecting a library level interface.
15 static char *rcsid_mr_glue_c = "$Header$";
18 #include <mit-copyright.h>
19 #include <sys/types.h>
20 #include <sys/signal.h>
24 #include "mr_server.h"
27 static int already_connected = 0;
29 #define CHECK_CONNECTED { if (!already_connected) return MR_NOT_CONNECTED; }
31 static client pseudo_client;
37 int mr_connect(char *server)
40 extern int query_timeout;
41 struct sigaction action;
43 if (already_connected)
44 return MR_ALREADY_CONNECTED;
46 initialize_sms_error_table();
47 initialize_krb_error_table();
48 memset(&pseudo_client, 0, sizeof(pseudo_client));
51 status = mr_open_database();
53 already_connected = 1;
56 sigemptyset(&action.sa_mask);
57 sigaddset(&action.sa_mask, SIGCHLD);
58 action.sa_handler = reapchild;
59 if (sigaction(SIGCHLD, &action, NULL) < 0)
61 com_err(whoami, errno, "Unable to establish signal handlers.");
67 int mr_disconnect(void)
71 already_connected = 0;
82 * This routine is rather bogus, as it only fills in who you claim to be.
84 int mr_auth(char *prog)
87 extern char *krb_realm;
88 char buf[1024], *strsave();
91 pw = getpwuid(getuid());
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;
98 strcpy(buf, pw->pw_name);
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;
116 callback(int argc, char **argv, struct hint *arg)
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);
124 int mr_query(char *name, int argc, char **argv, int (*callproc)(), char *callarg)
129 hints.proc = callproc;
130 hints.hint = callarg;
132 return mr_process_query(&pseudo_client, name, argc,
133 mr_copy_args(argv, argc), callback,
137 int mr_access(char *name, int argc, char **argv)
140 return mr_check_access(&pseudo_client, name, argc,
141 mr_copy_args(argv, argc));
144 int mr_query_internal(int argc, char **argv, int (*callproc)(), char *callarg)
149 hints.proc = callproc;
150 hints.hint = callarg;
152 return mr_process_query(&pseudo_client, argv[0], argc - 1,
153 mr_copy_args(argv + 1, argc - 1), callback,
157 int mr_access_internal(int argc, char **argv)
160 return mr_check_access(&pseudo_client, argv[0], argc - 1,
161 mr_copy_args(argv + 1, argc - 1));
164 mr_shutdown(char *why)
166 fprintf(stderr, "Sorry, not implemented\n");
170 /* trigger_dcm is also used as a followup routine to the
171 * set_server_host_override query, hence the two dummy arguments.
174 struct query pseudo_query = {
179 int trigger_dcm(int dummy0, int dummy1, client *cl)
184 if ((status = check_query_access(&pseudo_query, 0, cl)))
187 sprintf(prog, "%s/startdcm", BIN_DIR);
192 execl(prog, "startdcm", 0);
208 while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
215 if (WTERMSIG(status) != 0 || WEXITSTATUS(status) != 0)
217 com_err(whoami, 0, "%d: child exits with signal %d status %d",
218 pid, WTERMSIG(status), WEXITSTATUS(status));