]> andersk Git - moira.git/blob - server/mr_glue.c
Divided into three files (adding requests.c and reg_svr.h).
[moira.git] / server / mr_glue.c
1 /*
2  *      $Source$
3  *      $Author$
4  *      $Header$
5  *
6  *      Copyright (C) 1987 by the Massachusetts Institute of Technology
7  *
8  *      Glue routines to allow the database stuff to be linked in to
9  *      a program expecting a library level interface.
10  * 
11  *      $Log$
12  *      Revision 1.5  1988-06-30 14:39:30  mar
13  *      argument to sms_auth; trim args before returning them, fix trigger_dcm
14  *
15  * Revision 1.4  87/09/21  15:17:09  wesommer
16  * Also need to initialize pseudo_client.clname.
17  * 
18  * Revision 1.3  87/08/22  17:31:56  wesommer
19  * Fix a "fall-through".
20  * 
21  * Revision 1.2  87/07/29  16:03:58  wesommer
22  * Initialize krb_realm.
23  * 
24  * Revision 1.1  87/07/14  00:41:18  wesommer
25  * Initial revision
26  * 
27  */
28
29 #ifndef lint
30 static char *rcsid_sms_glue_c = "$Header$";
31 #endif lint
32
33 #include "sms_server.h"
34 #include <krb.h>                /* XXX for error codes */
35 #include <pwd.h>
36 #include "query.h"
37
38 static int already_connected = 0;
39
40 #define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
41
42 static client pseudo_client;
43 extern int krb_err_base, errno;
44 extern char *malloc(), *whoami;
45
46 sms_connect()
47 {
48     register int status;
49
50     if (already_connected) return SMS_ALREADY_CONNECTED;
51
52     init_sms_err_tbl();
53     init_krb_err_tbl();
54     bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
55
56     status =  sms_open_database();
57     if (!status) already_connected = 1;
58     return status;
59 }
60
61 sms_disconnect()
62 {
63     CHECK_CONNECTED;
64     sms_close_database();
65     already_connected = 0;
66     return 0;
67 }
68
69 sms_noop()
70 {
71     CHECK_CONNECTED;
72     return 0;
73 }
74 /*
75  * This routine is rather bogus, as it only fills in who you claim to be.
76  */
77 sms_auth(prog)
78 char *prog;
79 {
80     struct passwd *pw;
81     extern char *krb_realm;
82     char buf[1024], *strsave();
83     
84     CHECK_CONNECTED;
85     pw = getpwuid(getuid());
86     if (!pw) return (KDC_PR_UNKNOWN + krb_err_base); /* XXX hack (we 
87                                                     * need an extended 
88                                                     * error code table)
89                                                     */
90     strcpy(pseudo_client.kname.name, pw->pw_name);
91     get_krbrlm(pseudo_client.kname.realm, 1);
92     krb_realm = pseudo_client.kname.realm;
93
94     strcpy(buf, pw->pw_name);
95     strcat(buf, "@");
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);
101     return 0;
102 }
103
104 struct hint {
105     int (*proc)();
106     char *hint;
107 };
108
109 callback(argc, argv, arg)
110 int argc;
111 char **argv;
112 struct hint *arg;
113 {
114     if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
115         com_err(whoami, SMS_NO_MEM, "while trimmming args");
116     }
117     (*arg->proc)(argc, argv, arg->hint);
118 }
119
120
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 */
127 {
128     struct hint hints;
129
130     hints.proc = callproc;
131     hints.hint = callarg;
132     return sms_process_query(&pseudo_client, name, argc, argv,
133                              callback, &hints);
134 }
135
136 int sms_access(name, argc, argv)
137     char *name;                 /* Query name */
138     int argc;                   /* Arg count */
139     char **argv;                /* Args */
140 {
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 {
150     struct hint hints;
151
152     hints.proc = callproc;
153     hints.hint = callarg;
154     return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
155                              callback, &hints);
156 }
157
158 int sms_access_internal(argc, argv)
159     int argc;
160     char **argv;
161 {
162     return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
163 }
164
165 sms_shutdown(why)
166     char *why;
167 {
168     fprintf(stderr, "Sorry, not implemented\n");
169 }
170
171
172 /* trigger_dcm is also used as a followup routine to the 
173  * set_server_host_override query, hence the two dummy arguments.
174  */
175
176 struct query pseudo_query = {
177         "trigger_dcm",
178         "tdcm",
179 };
180
181 trigger_dcm(dummy0, dummy1, cl)
182         int dummy0, dummy1;
183         client *cl;
184 {
185         register int pid, status;
186         
187         if (status = check_query_access(&pseudo_query, 0, cl))
188             return(status);
189
190         pid = vfork();
191         switch (pid) {
192         case 0:
193                 execl("/u1/sms/bin/startdcm", "startdcm", 0);
194                 exit(1);
195                 
196         case -1:
197                 return(errno);
198
199         default:
200                 return(SMS_SUCCESS);
201         }
202 }
203
204
205 /*
206  * Local Variables:
207  * mode: c
208  * c-indent-level: 4
209  * c-continued-statement-offset: 4
210  * c-brace-offset: -4
211  * c-argdecl-indent: 4
212  * c-label-offset: -4
213  * End:
214  */
This page took 0.06031 seconds and 5 git commands to generate.