]> andersk Git - moira.git/blob - server/mr_glue.c
make sure we sum up duplicate quotas correctly
[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 = 0;
95     name_to_id(pseudo_client.kname.name, "USER", &pseudo_client.users_id);
96     pseudo_client.client_id = pseudo_client.users_id;
97     strcpy(pseudo_client.entity, prog);
98     pseudo_client.args = (sms_params *) malloc(sizeof(sms_params));
99     pseudo_client.args->sms_version_no = SMS_VERSION_2;
100     return 0;
101 }
102
103 struct hint {
104     int (*proc)();
105     char *hint;
106 };
107
108 callback(argc, argv, arg)
109 int argc;
110 char **argv;
111 struct hint *arg;
112 {
113     if (sms_trim_args(argc, argv) == SMS_NO_MEM) {
114         com_err(whoami, SMS_NO_MEM, "while trimmming args");
115     }
116     (*arg->proc)(argc, argv, arg->hint);
117 }
118
119
120 int sms_query(name, argc, argv, callproc, callarg)
121     char *name;         /* Query name */
122     int argc;           /* Arg count */
123     char **argv;                /* Args */
124     int (*callproc)();  /* Callback procedure */
125     char *callarg;              /* Callback argument */
126 {
127     struct hint hints;
128
129     time(&now);
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     time(&now);
142     return sms_check_access(&pseudo_client, name, argc, argv);
143 }
144
145 int sms_query_internal(argc, argv, callproc, callarg)
146     int argc;
147     char **argv;
148     int (*callproc)();
149     char *callarg;
150 {
151     struct hint hints;
152
153     time(&now);
154     hints.proc = callproc;
155     hints.hint = callarg;
156     return sms_process_query(&pseudo_client, argv[0], argc-1, argv+1,
157                              callback, &hints);
158 }
159
160 int sms_access_internal(argc, argv)
161     int argc;
162     char **argv;
163 {
164     time(&now);
165     return sms_check_access(&pseudo_client, argv[0], argc-1, argv+1);
166 }
167
168 sms_shutdown(why)
169     char *why;
170 {
171     fprintf(stderr, "Sorry, not implemented\n");
172 }
173
174
175 /* trigger_dcm is also used as a followup routine to the 
176  * set_server_host_override query, hence the two dummy arguments.
177  */
178
179 struct query pseudo_query = {
180         "trigger_dcm",
181         "tdcm",
182 };
183
184 trigger_dcm(dummy0, dummy1, cl)
185         int dummy0, dummy1;
186         client *cl;
187 {
188         register int pid, status;
189         char prog[128];
190         
191         if (status = check_query_access(&pseudo_query, 0, cl))
192             return(status);
193
194         sprintf(prog, "%s/startdcm", BIN_DIR);
195         pid = vfork();
196         switch (pid) {
197         case 0:
198                 execl(prog, "startdcm", 0);
199                 exit(1);
200                 
201         case -1:
202                 return(errno);
203
204         default:
205                 return(SMS_SUCCESS);
206         }
207 }
208
209
210 void reapchild()
211 {
212     union wait status;
213     int pid;
214
215     while ((pid = wait3(&status, WNOHANG, (struct rusage *)0)) > 0) {
216         if  (status.w_termsig != 0 || status.w_retcode != 0)
217           com_err(whoami, 0, "%d: child exits with signal %d status %d",
218                   pid, status.w_termsig, status.w_retcode);
219     }
220 }
This page took 0.062492 seconds and 5 git commands to generate.