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 <krb.h> /* XXX for error codes */
24 static int already_connected = 0;
26 #define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
28 static client pseudo_client;
29 extern int krb_err_base, errno;
30 extern char *malloc(), *whoami;
37 if (already_connected) return SMS_ALREADY_CONNECTED;
41 bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
43 status = sms_open_database();
44 if (!status) already_connected = 1;
52 already_connected = 0;
62 * This routine is rather bogus, as it only fills in who you claim to be.
68 extern char *krb_realm;
69 char buf[1024], *strsave();
72 pw = getpwuid(getuid());
73 if (!pw) return (KDC_PR_UNKNOWN + krb_err_base); /* XXX hack (we
77 strcpy(pseudo_client.kname.name, pw->pw_name);
78 get_krbrlm(pseudo_client.kname.realm, 1);
79 krb_realm = pseudo_client.kname.realm;
81 strcpy(buf, pw->pw_name);
83 strcat(buf, pseudo_client.kname.realm);
84 pseudo_client.clname = malloc(strlen(buf)+1);
85 strcpy(pseudo_client.clname, buf);
86 pseudo_client.users_id = get_users_id(pseudo_client.kname.name);
87 pseudo_client.entity = strsave(prog);
88 pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
89 pseudo_client.args->sms_version_no = SMS_VERSION_2;
98 callback(argc, argv, arg)
103 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
104 com_err(whoami, SMS_NO_MEM, "while trimmming args");
106 (*arg->proc)(argc, argv, arg->hint);
110 int sms_query(name, argc, argv, callproc, callarg)
111 char *name; /* Query name */
112 int argc; /* Arg count */
113 char **argv; /* Args */
114 int (*callproc)(); /* Callback procedure */
115 char *callarg; /* Callback argument */
120 hints.proc = callproc;
121 hints.hint = callarg;
122 return sms_process_query(&pseudo_client, name, argc, argv,
126 int sms_access(name, argc, argv)
127 char *name; /* Query name */
128 int argc; /* Arg count */
129 char **argv; /* Args */
132 return sms_check_access(&pseudo_client, name, argc, argv);
135 int sms_query_internal(argc, argv, callproc, callarg)
144 hints.proc = callproc;
145 hints.hint = callarg;
146 return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
150 int sms_access_internal(argc, argv)
155 return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
161 fprintf(stderr, "Sorry, not implemented\n");
165 /* trigger_dcm is also used as a followup routine to the
166 * set_server_host_override query, hence the two dummy arguments.
169 struct query pseudo_query = {
174 trigger_dcm(dummy0, dummy1, cl)
178 register int pid, status;
180 if (status = check_query_access(&pseudo_query, 0, cl))
186 execl("/u1/sms/bin/startdcm", "startdcm", 0);
202 * c-continued-statement-offset: 4
204 * c-argdecl-indent: 4