]>
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 | |
5eaef520 | 37 | int 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 | 67 | int mr_disconnect(void) |
083d87de | 68 | { |
5eaef520 | 69 | CHECK_CONNECTED; |
70 | mr_close_database(); | |
71 | already_connected = 0; | |
72 | return 0; | |
083d87de | 73 | } |
74 | ||
5eaef520 | 75 | int 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 | 84 | int 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 | 111 | struct hint { |
5eaef520 | 112 | int (*proc)(); |
113 | char *hint; | |
53db4098 | 114 | }; |
115 | ||
5eaef520 | 116 | callback(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 | 124 | int 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 | 137 | int 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 | 144 | int 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 | 157 | int 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 | 164 | mr_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 | ||
174 | struct query pseudo_query = { | |
5eaef520 | 175 | "trigger_dcm", |
176 | "tdcm", | |
53db4098 | 177 | }; |
178 | ||
5eaef520 | 179 | int 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 | 204 | void 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 | } |