6 * Copyright (C) 1989 by the Massachusetts Institute of Technology
7 * For copying and distribution information, please see the file
13 static char *rcsid_qrtn_qc = "$Header$";
16 #include <mit-copyright.h>
19 #include "sms_server.h"
25 /* structures to save before args */
26 static char beforeb[MAXARGC][ARGLEN];
27 static char *before[MAXARGC];
28 ##char *barg0, *barg1, *barg2, *barg3, *barg4;
29 ##char *barg5, *barg6, *barg7, *barg8, *barg9;
30 ##char *barg10, *barg11, *barg12, *barg13, *barg14;
32 static char *beforetable;
34 /* structures to save after args */
35 static char afterb[MAXARGC][ARGLEN];
36 static char *after[MAXARGC];
37 ##char *aarg0, *aarg1, *aarg2, *aarg3, *aarg4;
38 ##char *aarg5, *aarg6, *aarg7, *aarg8, *aarg9;
39 ##char *aarg10, *aarg11, *aarg12, *aarg13, *aarg14;
42 /* structures to save entire sets of incremental changes */
43 struct save_queue *incremental_sq;
57 for (i = 0; i < MAXARGC; i++) {
58 before[i] = &beforeb[i][0];
59 after[i] = &afterb[i][0];
91 incremental_sq = sq_create();
95 ##incremental_before(table, qual, argv)
105 if (!strcmp(table, "users")) {
106 ## retrieve (barg0 = u.login, barg1 = text(u.uid),
107 ## barg2 = u.shell, barg3 = u.last, barg4 = u.first,
108 ## barg5 = u.middle, barg6 = text(u.status),
109 ## barg7 = u.mit_id, barg8 = u.mit_year)
112 } else if (!strcmp(table, "machine")) {
113 ## retrieve (barg0 = m.name, barg1 = m.type) where qual
115 } else if (!strcmp(table, "cluster")) {
116 ## retrieve (barg0 = c.name, barg1 = c.desc, barg2 = c.location)
119 } else if (!strcmp(table, "mcmap")) {
120 strcpy(barg0, argv[0]);
121 strcpy(barg1, argv[1]);
123 } else if (!strcmp(table, "svc")) {
124 strcpy(barg0, argv[0]);
125 strcpy(barg1, argv[1]);
126 strcpy(barg2, argv[2]);
128 } else if (!strcmp(table, "filesys")) {
129 ## range of fs is filesys
130 ## retrieve (barg0 = fs.label, barg1 = fs.type, barg2 = text(fs.mach_id),
131 ## barg3 = fs.name, barg4 = fs.mount, barg5 = fs.access,
132 ## barg6 = fs.comments, barg7 = text(fs.owner),
133 ## barg8 = text(fs.owners), barg9 = text(fs.createflg),
134 ## barg10 = fs.lockertype)
137 } else if (!strcmp(table, "nfsquota")) {
138 strcpy(barg0, argv[0]);
139 strcpy(barg1, argv[1]);
140 sprintf(buffer, "%s and filesys.filsys_id = nq.filsys_id", qual);
142 ## range of nq is nfsquota
143 ## retrieve (barg2 = text(nq.quota), barg3 = filesys.name) where qual
145 } else if (!strcmp(table, "list")) {
146 ## retrieve (barg0 = l.name, barg1 = text(l.active),
147 ## barg2 = text(l.public), barg3 = text(l.hidden),
148 ## barg4 = text(l.maillist), barg5 = text(l.group),
149 ## barg6 = text(l.gid), barg7 = l.acl_type,
150 ## barg8 = text(l.acl_id), barg9 = l.desc)
153 } else if (!strcmp(table, "members")) {
155 ## repeat retrieve (barg0 = list.name) where list.list_id = @id
156 strcpy(barg1, argv[1]);
158 if (!strcmp(barg1, "USER")) {
159 ## repeat retrieve (barg2 = users.login) where users.users_id = @id
160 } else if (!strcmp(barg1, "LIST")) {
161 ## repeat retrieve (barg2 = list.name) where list.list_id = @id
162 } else if (!strcmp(barg1, "STRING")) {
163 ## repeat retrieve (barg2 = strings.string)
164 ## where strings.string_id = @id
165 } else if (!strcmp(barg1, "KERBEROS")) {
166 ## repeat retrieve (barg2 = strings.string)
167 ## where strings.string_id = @id
171 com_err(whoami, 0, "unknown table in incremental_before"); */
175 incremental_clear_before()
180 incremental_clear_after()
182 incremental_after("clear", 0);
187 ##incremental_after(table, qual, argv)
197 if (!strcmp(table, "users")) {
198 ## retrieve (aarg0 = u.login, aarg1 = text(u.uid),
199 ## aarg2 = u.shell, aarg3 = u.last, aarg4 = u.first,
200 ## aarg5 = u.middle, aarg6 = text(u.status),
201 ## aarg7 = u.mit_id, aarg8 = u.mit_year)
204 } else if (!strcmp(table, "machine")) {
205 ## retrieve (aarg0 = m.name, aarg1 = m.type) where qual
207 } else if (!strcmp(table, "cluster")) {
208 ## retrieve (aarg0 = c.name, aarg1 = c.desc, aarg2 = c.location)
211 } else if (!strcmp(table, "mcmap")) {
212 strcpy(aarg0, argv[0]);
213 strcpy(aarg1, argv[1]);
215 } else if (!strcmp(table, "svc")) {
216 strcpy(aarg0, argv[0]);
217 strcpy(aarg1, argv[1]);
218 strcpy(aarg2, argv[2]);
220 } else if (!strcmp(table, "filesys")) {
221 ## range of fs is filesys
222 ## retrieve (aarg0 = fs.label, aarg1 = fs.type,
223 ## aarg2 = text(fs.mach_id),
224 ## aarg3 = fs.name, aarg4 = fs.mount, aarg5 = fs.access,
225 ## aarg6 = fs.comments, aarg7 = text(fs.owner),
226 ## aarg8 = text(fs.owners), aarg9 = text(fs.createflg),
227 ## aarg10 = fs.lockertype)
230 } else if (!strcmp(table, "nfsquota")) {
231 strcpy(aarg0, argv[0]);
232 strcpy(aarg1, argv[1]);
233 sprintf(buffer, "%s and filesys.filsys_id = nq.filsys_id", qual);
235 ## range of nq is nfsquota
236 ## retrieve (aarg2 = text(nq.quota), aarg3 = filesys.name) where qual
238 } else if (!strcmp(table, "list")) {
239 ## retrieve (aarg0 = l.name, aarg1 = text(l.active),
240 ## aarg2 = text(l.public), aarg3 = text(l.hidden),
241 ## aarg4 = text(l.maillist), aarg5 = text(l.group),
242 ## aarg6 = text(l.gid), aarg7 = l.acl_type,
243 ## aarg8 = text(l.acl_id), aarg9 = l.desc)
246 } else if (!strcmp(table, "members")) {
248 ## repeat retrieve (aarg0 = list.name) where list.list_id = @id
249 strcpy(aarg1, argv[1]);
251 if (!strcmp(aarg1, "USER")) {
252 ## repeat retrieve (aarg2 = users.login) where users.users_id = @id
253 } else if (!strcmp(aarg1, "LIST")) {
254 ## repeat retrieve (aarg2 = list.name) where list.list_id = @id
255 } else if (!strcmp(aarg1, "STRING")) {
256 ## repeat retrieve (aarg2 = strings.string)
257 ## where strings.string_id = @id
258 } else if (!strcmp(aarg1, "KERBEROS")) {
259 ## repeat retrieve (aarg2 = strings.string)
260 ## where strings.string_id = @id
263 } else if (!strcmp(table, "clear")) {
267 com_err(whoami, 0, "unknown table in incremental_after"); */
269 iu = (struct iupdate *) malloc(sizeof(struct iupdate));
271 iu->beforec = beforec;
272 iu->before = copy_argv(before, beforec);
274 iu->after = copy_argv(after, afterc);
275 sq_save_data(incremental_sq, iu);
278 sprintf(buffer, "INCREMENTAL(%s, [", table);
279 for (i = 0; i < beforec; i++) {
281 strcat(buffer, strtrim(before[0]));
283 strcat(buffer, ", ");
284 strcat(buffer, strtrim(before[i]));
287 strcat(buffer, "], [");
288 for (i = 0; i < afterc; i++) {
290 strcat(buffer, strtrim(after[0]));
292 strcat(buffer, ", ");
293 strcat(buffer, strtrim(after[i]));
296 strcat(buffer, "])");
297 com_err(whoami, 0, buffer);
302 /* Called when the current transaction is committed to start any queued
303 * incremental updates
309 char *argv[MAXARGC * 2 + 4], cafter[3], cbefore[3];
312 while (sq_get_data(incremental_sq, &iu)) {
314 sprintf(cbefore, "%d", iu->beforec);
316 sprintf(cafter, "%d", iu->afterc);
318 for (i = 0; i < iu->beforec; i++)
319 argv[4 + i] = before[i];
320 for (i = 0; i < iu->afterc; i++)
321 argv[4 + iu->beforec + i] = after[i];
322 invoke_updates(argv, 4 + iu->beforec + iu->afterc);
323 free_argv(iu->before, iu->beforec);
324 free_argv(iu->after, iu->afterc);
327 sq_destroy(incremental_sq);
328 incremental_sq = sq_create();
332 /* THIS IS WRONG. We should keep a table of services getting incremental
333 * updates. But for now, just assume AFS
336 invoke_updates(argv, argc)
343 prog = "/u1/sms/bin/afs.incr";
349 for (i = getdtablesize() - 1; i > 2; i--)
354 com_err(whoami, 0, "Failed to start incremental update");
362 /* Called when the current transaction is aborted to throw away any queued
363 * incremental updates
370 while (sq_get_data(incremental_sq, &iu)) {
371 free_argv(iu->before, iu->beforec);
372 free_argv(iu->after, iu->afterc);
375 sq_destroy(incremental_sq);
376 incremental_sq = sq_create();
380 char **copy_argv(argv, argc)
384 char **ret = (char **)malloc(sizeof(char *) * argc);
386 ret[argc] = strsave(strtrim(argv[argc]));
390 free_argv(argv, argc)