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