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_sms_glue_c = "$Header$";
18 #include <mit-copyright.h>
19 #include "sms_server.h"
20 #include <sys/types.h>
21 #include <sys/signal.h>
27 static int already_connected = 0;
29 #define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
31 static client pseudo_client;
33 extern char *malloc(), *whoami;
41 extern int query_timeout;
43 if (already_connected) return SMS_ALREADY_CONNECTED;
45 initialize_sms_error_table();
46 initialize_krb_error_table();
47 bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
50 status = sms_open_database();
51 if (!status) already_connected = 1;
53 signal(SIGCHLD, reapchild);
61 already_connected = 0;
71 * This routine is rather bogus, as it only fills in who you claim to be.
77 extern char *krb_realm;
78 char buf[1024], *strsave();
81 pw = getpwuid(getuid());
82 if (!pw) return (KDC_PR_UNKNOWN + ERROR_TABLE_BASE_krb); /* XXX hack (we
86 strcpy(pseudo_client.kname.name, pw->pw_name);
87 krb_get_lrealm(pseudo_client.kname.realm, 1);
88 krb_realm = pseudo_client.kname.realm;
90 strcpy(buf, pw->pw_name);
92 strcat(buf, pseudo_client.kname.realm);
93 strcpy(pseudo_client.clname, buf);
94 pseudo_client.users_id = 0;
95 name_to_id(pseudo_client.kname.name, "USER", &pseudo_client.users_id);
96 pseudo_client.client_id = pseudo_client.users_id;
97 strcpy(pseudo_client.entity, prog);
98 pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
99 pseudo_client.args->sms_version_no = SMS_VERSION_2;
108 callback(argc, argv, arg)
113 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
114 com_err(whoami, SMS_NO_MEM, "while trimmming args");
116 (*arg->proc)(argc, argv, arg->hint);
120 int sms_query(name, argc, argv, callproc, callarg)
121 char *name; /* Query name */
122 int argc; /* Arg count */
123 char **argv; /* Args */
124 int (*callproc)(); /* Callback procedure */
125 char *callarg; /* Callback argument */
130 hints.proc = callproc;
131 hints.hint = callarg;
132 return sms_process_query(&pseudo_client, name, argc, argv,
136 int sms_access(name, argc, argv)
137 char *name; /* Query name */
138 int argc; /* Arg count */
139 char **argv; /* Args */
142 return sms_check_access(&pseudo_client, name, argc, argv);
145 int sms_query_internal(argc, argv, callproc, callarg)
154 hints.proc = callproc;
155 hints.hint = callarg;
156 return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
160 int sms_access_internal(argc, argv)
165 return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
171 fprintf(stderr, "Sorry, not implemented\n");
175 /* trigger_dcm is also used as a followup routine to the
176 * set_server_host_override query, hence the two dummy arguments.
179 struct query pseudo_query = {
184 trigger_dcm(dummy0, dummy1, cl)
188 register int pid, status;
191 if (status = check_query_access(&pseudo_query, 0, cl))
194 sprintf(prog, "%s/startdcm", BIN_DIR);
198 execl(prog, "startdcm", 0);
215 while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
216 if (status.w_termsig != 0 || status.w_retcode != 0)
217 com_err(whoami, 0, "%d: child exits with signal %d status %d",
218 pid, status.w_termsig, status.w_retcode);