]> andersk Git - moira.git/blob - server/mr_glue.c
fixed name section
[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  *      For copying and distribution information, please see the file
8  *      <mit-copyright.h>.
9  *
10  *      Glue routines to allow the database stuff to be linked in to
11  *      a program expecting a library level interface.
12  */
13
14 #ifndef lint
15 static char *rcsid_sms_glue_c = "$Header$";
16 #endif lint
17
18 #include <mit-copyright.h>
19 #include "sms_server.h"
20 #include <krb.h>                /* XXX for error codes */
21 #include <pwd.h>
22 #include "query.h"
23
24 static int already_connected = 0;
25
26 #define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
27
28 static client pseudo_client;
29 extern int krb_err_base, errno;
30 extern char *malloc(), *whoami;
31 extern time_t now;
32
33 sms_connect()
34 {
35     register int status;
36
37     if (already_connected) return SMS_ALREADY_CONNECTED;
38
39     init_sms_err_tbl();
40     init_krb_err_tbl();
41     bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
42
43     status =  sms_open_database();
44     if (!status) already_connected = 1;
45     return status;
46 }
47
48 sms_disconnect()
49 {
50     CHECK_CONNECTED;
51     sms_close_database();
52     already_connected = 0;
53     return 0;
54 }
55
56 sms_noop()
57 {
58     CHECK_CONNECTED;
59     return 0;
60 }
61 /*
62  * This routine is rather bogus, as it only fills in who you claim to be.
63  */
64 sms_auth(prog)
65 char *prog;
66 {
67     struct passwd *pw;
68     extern char *krb_realm;
69     char buf[1024], *strsave();
70     
71     CHECK_CONNECTED;
72     pw = getpwuid(getuid());
73     if (!pw) return (KDC_PR_UNKNOWN + krb_err_base); /* XXX hack (we 
74                                                     * need an extended 
75                                                     * error code table)
76                                                     */
77     strcpy(pseudo_client.kname.name, pw->pw_name);
78     get_krbrlm(pseudo_client.kname.realm, 1);
79     krb_realm = pseudo_client.kname.realm;
80
81     strcpy(buf, pw->pw_name);
82     strcat(buf, "@");
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;
90     return 0;
91 }
92
93 struct hint {
94     int (*proc)();
95     char *hint;
96 };
97
98 callback(argc, argv, arg)
99 int argc;
100 char **argv;
101 struct hint *arg;
102 {
103     if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
104         com_err(whoami, SMS_NO_MEM, "while trimmming args");
105     }
106     (*arg->proc)(argc, argv, arg->hint);
107 }
108
109
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 */
116 {
117     struct hint hints;
118
119     time(&now);
120     hints.proc = callproc;
121     hints.hint = callarg;
122     return sms_process_query(&pseudo_client, name, argc, argv,
123                              callback, &hints);
124 }
125
126 int sms_access(name, argc, argv)
127     char *name;                 /* Query name */
128     int argc;                   /* Arg count */
129     char **argv;                /* Args */
130 {
131     time(&now);
132     return sms_check_access(&pseudo_client, name, argc, argv);
133 }
134
135 int sms_query_internal(argc, argv, callproc, callarg)
136     int argc;
137     char **argv;
138     int (*callproc)();
139     char *callarg;
140 {
141     struct hint hints;
142
143     time(&now);
144     hints.proc = callproc;
145     hints.hint = callarg;
146     return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
147                              callback, &hints);
148 }
149
150 int sms_access_internal(argc, argv)
151     int argc;
152     char **argv;
153 {
154     time(&now);
155     return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
156 }
157
158 sms_shutdown(why)
159     char *why;
160 {
161     fprintf(stderr, "Sorry, not implemented\n");
162 }
163
164
165 /* trigger_dcm is also used as a followup routine to the 
166  * set_server_host_override query, hence the two dummy arguments.
167  */
168
169 struct query pseudo_query = {
170         "trigger_dcm",
171         "tdcm",
172 };
173
174 trigger_dcm(dummy0, dummy1, cl)
175         int dummy0, dummy1;
176         client *cl;
177 {
178         register int pid, status;
179         
180         if (status = check_query_access(&pseudo_query, 0, cl))
181             return(status);
182
183         pid = vfork();
184         switch (pid) {
185         case 0:
186                 execl("/u1/sms/bin/startdcm", "startdcm", 0);
187                 exit(1);
188                 
189         case -1:
190                 return(errno);
191
192         default:
193                 return(SMS_SUCCESS);
194         }
195 }
196
197
198 /*
199  * Local Variables:
200  * mode: c
201  * c-indent-level: 4
202  * c-continued-statement-offset: 4
203  * c-brace-offset: -4
204  * c-argdecl-indent: 4
205  * c-label-offset: -4
206  * End:
207  */
This page took 0.049483 seconds and 5 git commands to generate.