]>
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 | |
15 | static char *rcsid_sms_glue_c = "$Header$"; | |
16 | #endif lint | |
17 | ||
674fd273 | 18 | #include <mit-copyright.h> |
083d87de | 19 | #include "sms_server.h" |
cba4da55 | 20 | #include <sys/types.h> |
21 | #include <sys/signal.h> | |
22 | #include <sys/wait.h> | |
40165bd0 | 23 | #include <krb_et.h> |
083d87de | 24 | #include <pwd.h> |
53db4098 | 25 | #include "query.h" |
26 | ||
083d87de | 27 | static int already_connected = 0; |
28 | ||
29 | #define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; } | |
30 | ||
31 | static client pseudo_client; | |
40165bd0 | 32 | extern int errno; |
53db4098 | 33 | extern char *malloc(), *whoami; |
674fd273 | 34 | extern time_t now; |
cba4da55 | 35 | void reapchild(); |
083d87de | 36 | |
9a2d61b0 | 37 | sms_connect(server) |
38 | char *server; | |
083d87de | 39 | { |
40 | register int status; | |
964ac8c7 | 41 | extern int query_timeout; |
083d87de | 42 | |
43 | if (already_connected) return SMS_ALREADY_CONNECTED; | |
44 | ||
40165bd0 | 45 | initialize_sms_error_table(); |
46 | initialize_krb_error_table(); | |
083d87de | 47 | bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */ |
48 | ||
964ac8c7 | 49 | query_timeout = 0; |
083d87de | 50 | status = sms_open_database(); |
51 | if (!status) already_connected = 1; | |
cba4da55 | 52 | |
53 | signal(SIGCHLD, reapchild); | |
083d87de | 54 | return status; |
55 | } | |
56 | ||
57 | sms_disconnect() | |
58 | { | |
59 | CHECK_CONNECTED; | |
60 | sms_close_database(); | |
61 | already_connected = 0; | |
62 | return 0; | |
63 | } | |
64 | ||
65 | sms_noop() | |
66 | { | |
67 | CHECK_CONNECTED; | |
68 | return 0; | |
69 | } | |
70 | /* | |
71 | * This routine is rather bogus, as it only fills in who you claim to be. | |
72 | */ | |
53db4098 | 73 | sms_auth(prog) |
74 | char *prog; | |
083d87de | 75 | { |
76 | struct passwd *pw; | |
fe8a06f8 | 77 | extern char *krb_realm; |
53db4098 | 78 | char buf[1024], *strsave(); |
0ed584c8 | 79 | |
083d87de | 80 | CHECK_CONNECTED; |
81 | pw = getpwuid(getuid()); | |
40165bd0 | 82 | if (!pw) return (KDC_PR_UNKNOWN + ERROR_TABLE_BASE_krb); /* XXX hack (we |
083d87de | 83 | * need an extended |
84 | * error code table) | |
85 | */ | |
86 | strcpy(pseudo_client.kname.name, pw->pw_name); | |
12f94253 | 87 | krb_get_lrealm(pseudo_client.kname.realm, 1); |
fe8a06f8 | 88 | krb_realm = pseudo_client.kname.realm; |
0ed584c8 | 89 | |
90 | strcpy(buf, pw->pw_name); | |
91 | strcat(buf, "@"); | |
92 | strcat(buf, pseudo_client.kname.realm); | |
0ed584c8 | 93 | strcpy(pseudo_client.clname, buf); |
53db4098 | 94 | pseudo_client.users_id = get_users_id(pseudo_client.kname.name); |
cba4da55 | 95 | pseudo_client.client_id = pseudo_client.users_id; |
96 | strcpy(pseudo_client.entity, prog); | |
674fd273 | 97 | pseudo_client.args = (sms_params *) malloc(sizeof(sms_params)); |
98 | pseudo_client.args->sms_version_no = SMS_VERSION_2; | |
28d7ad92 | 99 | return 0; |
083d87de | 100 | } |
101 | ||
53db4098 | 102 | struct hint { |
103 | int (*proc)(); | |
104 | char *hint; | |
105 | }; | |
106 | ||
107 | callback(argc, argv, arg) | |
108 | int argc; | |
109 | char **argv; | |
110 | struct hint *arg; | |
111 | { | |
112 | if (sms_trim_args(argc, argv) == SMS_NO_MEM) { | |
113 | com_err(whoami, SMS_NO_MEM, "while trimmming args"); | |
114 | } | |
115 | (*arg->proc)(argc, argv, arg->hint); | |
116 | } | |
117 | ||
118 | ||
083d87de | 119 | int sms_query(name, argc, argv, callproc, callarg) |
120 | char *name; /* Query name */ | |
121 | int argc; /* Arg count */ | |
122 | char **argv; /* Args */ | |
123 | int (*callproc)(); /* Callback procedure */ | |
124 | char *callarg; /* Callback argument */ | |
125 | { | |
53db4098 | 126 | struct hint hints; |
127 | ||
674fd273 | 128 | time(&now); |
53db4098 | 129 | hints.proc = callproc; |
130 | hints.hint = callarg; | |
083d87de | 131 | return sms_process_query(&pseudo_client, name, argc, argv, |
53db4098 | 132 | callback, &hints); |
083d87de | 133 | } |
134 | ||
135 | int sms_access(name, argc, argv) | |
136 | char *name; /* Query name */ | |
137 | int argc; /* Arg count */ | |
138 | char **argv; /* Args */ | |
139 | { | |
674fd273 | 140 | time(&now); |
083d87de | 141 | return sms_check_access(&pseudo_client, name, argc, argv); |
142 | } | |
143 | ||
144 | int 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 | ||
674fd273 | 152 | time(&now); |
53db4098 | 153 | hints.proc = callproc; |
154 | hints.hint = callarg; | |
083d87de | 155 | return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1, |
53db4098 | 156 | callback, &hints); |
083d87de | 157 | } |
158 | ||
159 | int sms_access_internal(argc, argv) | |
160 | int argc; | |
161 | char **argv; | |
162 | { | |
674fd273 | 163 | time(&now); |
083d87de | 164 | return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1); |
165 | } | |
166 | ||
167 | sms_shutdown(why) | |
168 | char *why; | |
169 | { | |
170 | fprintf(stderr, "Sorry, not implemented\n"); | |
171 | } | |
172 | ||
53db4098 | 173 | |
174 | /* trigger_dcm is also used as a followup routine to the | |
175 | * set_server_host_override query, hence the two dummy arguments. | |
176 | */ | |
177 | ||
178 | struct query pseudo_query = { | |
179 | "trigger_dcm", | |
180 | "tdcm", | |
181 | }; | |
182 | ||
183 | trigger_dcm(dummy0, dummy1, cl) | |
184 | int dummy0, dummy1; | |
185 | client *cl; | |
186 | { | |
187 | register int pid, status; | |
185f76ce | 188 | char prog[128]; |
53db4098 | 189 | |
190 | if (status = check_query_access(&pseudo_query, 0, cl)) | |
191 | return(status); | |
192 | ||
185f76ce | 193 | sprintf(prog, "%s/startdcm", BIN_DIR); |
53db4098 | 194 | pid = vfork(); |
195 | switch (pid) { | |
196 | case 0: | |
185f76ce | 197 | execl(prog, "startdcm", 0); |
53db4098 | 198 | exit(1); |
199 | ||
200 | case -1: | |
201 | return(errno); | |
202 | ||
203 | default: | |
204 | return(SMS_SUCCESS); | |
205 | } | |
206 | } | |
cba4da55 | 207 | |
208 | ||
209 | void reapchild() | |
210 | { | |
211 | union wait status; | |
212 | int pid; | |
213 | ||
214 | while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) { | |
215 | if (status.w_termsig != 0 || status.w_retcode != 0) | |
216 | com_err(whoami, 0, "%d: child exits with signal %d status %d", | |
217 | pid, status.w_termsig, status.w_retcode); | |
218 | } | |
219 | } |