]> andersk Git - moira.git/blob - server/mr_glue.c
moved directory definitions
[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 <sys/types.h>
21 #include <sys/signal.h>
22 #include <sys/wait.h>
23 #include <krb_et.h>
24 #include <pwd.h>
25 #include "query.h"
26
27 static int already_connected = 0;
28
29 #define CHECK_CONNECTED { if (!already_connected) return SMS_NOT_CONNECTED; }
30
31 static client pseudo_client;
32 extern int errno;
33 extern char *malloc(), *whoami;
34 extern time_t now;
35 void reapchild();
36
37 sms_connect(server)
38 char *server;
39 {
40     register int status;
41     extern int query_timeout;
42
43     if (already_connected) return SMS_ALREADY_CONNECTED;
44
45     initialize_sms_error_table();
46     initialize_krb_error_table();
47     bzero((char *)&pseudo_client, sizeof(pseudo_client)); /* XXX */
48
49     query_timeout = 0;
50     status =  sms_open_database();
51     if (!status) already_connected = 1;
52
53     signal(SIGCHLD, reapchild);
54     return status;
55 }
56
57 sms_disconnect()
58 {
59     CHECK_CONNECTED;
60     sms_close_database();
61     already_connected = 0;
62     return 0;
63 }
64
65 sms_noop()
66 {
67     CHECK_CONNECTED;
68     return 0;
69 }
70 /*
71  * This routine is rather bogus, as it only fills in who you claim to be.
72  */
73 sms_auth(prog)
74 char *prog;
75 {
76     struct passwd *pw;
77     extern char *krb_realm;
78     char buf[1024], *strsave();
79     
80     CHECK_CONNECTED;
81     pw = getpwuid(getuid());
82     if (!pw) return (KDC_PR_UNKNOWN + ERROR_TABLE_BASE_krb); /* XXX hack (we 
83                                                     * need an extended 
84                                                     * error code table)
85                                                     */
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;
89
90     strcpy(buf, pw->pw_name);
91     strcat(buf, "@");
92     strcat(buf, pseudo_client.kname.realm);
93     strcpy(pseudo_client.clname, buf);
94     pseudo_client.users_id = get_users_id(pseudo_client.kname.name);
95     pseudo_client.client_id = pseudo_client.users_id;
96     strcpy(pseudo_client.entity, prog);
97     pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
98     pseudo_client.args->sms_version_no = SMS_VERSION_2;
99     return 0;
100 }
101
102 struct hint {
103     int (*proc)();
104     char *hint;
105 };
106
107 callback(argc, argv, arg)
108 int argc;
109 char **argv;
110 struct hint *arg;
111 {
112     if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
113         com_err(whoami, SMS_NO_MEM, "while trimmming args");
114     }
115     (*arg->proc)(argc, argv, arg->hint);
116 }
117
118
119 int sms_query(name, argc, argv, callproc, callarg)
120     char *name;         /* Query name */
121     int argc;           /* Arg count */
122     char **argv;                /* Args */
123     int (*callproc)();  /* Callback procedure */
124     char *callarg;              /* Callback argument */
125 {
126     struct hint hints;
127
128     time(&now);
129     hints.proc = callproc;
130     hints.hint = callarg;
131     return sms_process_query(&pseudo_client, name, argc, argv,
132                              callback, &hints);
133 }
134
135 int sms_access(name, argc, argv)
136     char *name;                 /* Query name */
137     int argc;                   /* Arg count */
138     char **argv;                /* Args */
139 {
140     time(&now);
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     time(&now);
153     hints.proc = callproc;
154     hints.hint = callarg;
155     return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
156                              callback, &hints);
157 }
158
159 int sms_access_internal(argc, argv)
160     int argc;
161     char **argv;
162 {
163     time(&now);
164     return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
165 }
166
167 sms_shutdown(why)
168     char *why;
169 {
170     fprintf(stderr, "Sorry, not implemented\n");
171 }
172
173
174 /* trigger_dcm is also used as a followup routine to the 
175  * set_server_host_override query, hence the two dummy arguments.
176  */
177
178 struct query pseudo_query = {
179         "trigger_dcm",
180         "tdcm",
181 };
182
183 trigger_dcm(dummy0, dummy1, cl)
184         int dummy0, dummy1;
185         client *cl;
186 {
187         register int pid, status;
188         char prog[128];
189         
190         if (status = check_query_access(&pseudo_query, 0, cl))
191             return(status);
192
193         sprintf(prog, "%s/startdcm", BIN_DIR);
194         pid = vfork();
195         switch (pid) {
196         case 0:
197                 execl(prog, "startdcm", 0);
198                 exit(1);
199                 
200         case -1:
201                 return(errno);
202
203         default:
204                 return(SMS_SUCCESS);
205         }
206 }
207
208
209 void reapchild()
210 {
211     union wait status;
212     int pid;
213
214     while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
215         if  (status.w_termsig != 0 || status.w_retcode != 0)
216           com_err(whoami, 0, "%d: child exits with signal %d status %d",
217                   pid, status.w_termsig, status.w_retcode);
218     }
219 }
This page took 0.083277 seconds and 5 git commands to generate.