6 * Copyright (C) 1987 by the Massachusetts Institute of Technology
8 * Glue routines to allow the database stuff to be linked in to
9 * a program expecting a library level interface.
12 * Revision 1.5 1988-06-30 14:39:30 mar
13 * argument to sms_auth; trim args before returning them, fix trigger_dcm
15 * Revision 1.4 87/09/21 15:17:09 wesommer
16 * Also need to initialize pseudo_client.clname.
18 * Revision 1.3 87/08/22 17:31:56 wesommer
19 * Fix a "fall-through".
21 * Revision 1.2 87/07/29 16:03:58 wesommer
22 * Initialize krb_realm.
24 * Revision 1.1 87/07/14 00:41:18 wesommer
30 static char *rcsid_sms_glue_c = "$Header$";
33 #include "sms_server.h"
34 #include <krb.h> /* XXX for error codes */
38 static int already_connected = 0;
40 #define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
42 static client pseudo_client;
43 extern int krb_err_base, errno;
44 extern char *malloc(), *whoami;
50 if (already_connected) return SMS_ALREADY_CONNECTED;
54 bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
56 status = sms_open_database();
57 if (!status) already_connected = 1;
65 already_connected = 0;
75 * This routine is rather bogus, as it only fills in who you claim to be.
81 extern char *krb_realm;
82 char buf[1024], *strsave();
85 pw = getpwuid(getuid());
86 if (!pw) return (KDC_PR_UNKNOWN + krb_err_base); /* XXX hack (we
90 strcpy(pseudo_client.kname.name, pw->pw_name);
91 get_krbrlm(pseudo_client.kname.realm, 1);
92 krb_realm = pseudo_client.kname.realm;
94 strcpy(buf, pw->pw_name);
96 strcat(buf, pseudo_client.kname.realm);
97 pseudo_client.clname = malloc(strlen(buf)+1);
98 strcpy(pseudo_client.clname, buf);
99 pseudo_client.users_id = get_users_id(pseudo_client.kname.name);
100 pseudo_client.entity = strsave(prog);
109 callback(argc, argv, arg)
114 if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
115 com_err(whoami, SMS_NO_MEM, "while trimmming args");
117 (*arg->proc)(argc, argv, arg->hint);
121 int sms_query(name, argc, argv, callproc, callarg)
122 char *name; /* Query name */
123 int argc; /* Arg count */
124 char **argv; /* Args */
125 int (*callproc)(); /* Callback procedure */
126 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 */
141 return sms_check_access(&pseudo_client, name, argc, argv);
144 int sms_query_internal(argc, argv, callproc, callarg)
152 hints.proc = callproc;
153 hints.hint = callarg;
154 return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
158 int sms_access_internal(argc, argv)
162 return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
168 fprintf(stderr, "Sorry, not implemented\n");
172 /* trigger_dcm is also used as a followup routine to the
173 * set_server_host_override query, hence the two dummy arguments.
176 struct query pseudo_query = {
181 trigger_dcm(dummy0, dummy1, cl)
185 register int pid, status;
187 if (status = check_query_access(&pseudo_query, 0, cl))
193 execl("/u1/sms/bin/startdcm", "startdcm", 0);
209 * c-continued-statement-offset: 4
211 * c-argdecl-indent: 4