3 * (c) Copyright 1988 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
8 #include <mit-copyright.h>
12 EXEC SQL INCLUDE sqlca;
14 static char phase2_qc_rcsid[] = "$Header$";
20 EXEC SQL BEGIN DECLARE SECTION;
21 int iid = id, found = 1;
23 EXEC SQL END DECLARE SECTION;
25 /* retrieve (name = cluster.#name) where cluster.clu_id = mcmap.clu_id
26 * and mcmap.mach_id = iid { */
27 EXEC SQL DECLARE csr201 CURSOR FOR
28 SELECT cluster.name FROM cluster, mcmap
29 WHERE cluster.clu_id=mcmap.clu_id AND mcmap.mach_id = :iid;
32 EXEC SQL FETCH csr201 INTO :name;
33 if(sqlca.sqlcode != 0) break;
37 printf("Clusqter %s, non-existant machine %d in cluster map\n", name, id);
39 EXEC SQL CLOSE csr201;
46 EXEC SQL BEGIN DECLARE SECTION;
47 int iid = id, found = 1;
49 EXEC SQL END DECLARE SECTION;
51 /* retrieve (name = machine.#name) where machine.mach_id = mcmap.mach_id
52 * and mcmap.clu_id = iid { */
53 EXEC SQL DECLARE csr202 CURSOR FOR
54 SELECT machine.name FROM machine, mcmap
55 WHERE machine.mach_id=mcmap.mach_id AND mcmap.clu_id=:iid;
58 EXEC SQL FETCH csr202 INTO :name;
59 if(sqlca.sqlcode != 0) break;
63 printf("Machine %s, non-existant cluster %d in cluster map\n", name, id);
65 EXEC SQL CLOSE csr202;
69 pobox_check(id, u, hint)
76 if (!hash_lookup(machines, u->pobox_id)) {
77 printf("User %s(%s) has P.O.Box on non-existant machine %d\n",
78 u->login, u->fullname, u->pobox_id);
79 if (single_fix("Delete", 0)) {
80 remove_pobox(u->users_id);
86 if (!string_check(u->pobox_id)) {
87 printf("User %s(%s) has P.O.Box with non-existant string %d\n",
88 u->login, u->fullname, u->pobox_id);
89 if (single_fix("Delete", 0)) {
90 remove_pobox(u->users_id);
104 EXEC SQL BEGIN DECLARE SECTION;
105 int rowcount, iid = id;
106 EXEC SQL END DECLARE SECTION;
107 /* replace users (potype = "NONE") where users.users_id = iid */
108 EXEC SQL UPDATE users SET potype='NONE' WHERE users.users_id = :iid;
109 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
111 printf("%d entr%s removed\n", rowcount, rowcount==1?"y":"ies");
113 printf("Not removed\n");
120 EXEC SQL BEGIN DECLARE SECTION;
121 int iid = id, found = 1;
122 char label[17], data[33];
123 EXEC SQL END DECLARE SECTION;
125 /* retrieve (label = svc.serv_label, data = svc.serv_cluster)
126 * where svc.clu_id = iid { */
127 EXEC SQL DECLARE csr203 CURSOR FOR
128 SELECT serv_label, serv_cluster FROM svc
130 EXEC SQL OPEN csr203;
132 EXEC SQL FETCH csr203 INTO :label, :data;
133 if(sqlca.sqlcode != 0) break;
138 printf("Cluster data [%s] %s for non-existant cluster %d\n",
141 EXEC SQL CLOSE csr203;
145 list_check(id, l, hint)
150 switch (l->acl_type) {
152 if (!hash_lookup(lists, l->acl_id)) {
153 printf("List %s has bad LIST acl %d\n", l->name, l->acl_id);
154 if (single_fix("Patch", 1)) {
155 fix_list_acl(l->list_id);
160 if (!hash_lookup(users, l->acl_id)) {
161 printf("List %s has bad USER acl %d\n", l->name, l->acl_id);
162 if (single_fix("Patch", 1)) {
163 fix_list_acl(l->list_id);
173 EXEC SQL BEGIN DECLARE SECTION;
174 int rowcount, iid = id;
175 EXEC SQL END DECLARE SECTION;
177 /* replace list (acl_id = iid, acl_type = "LIST") where list.list_id = iid */
178 EXEC SQL UPDATE list SET acl_id = :iid, acl_type='LIST'
179 WHERE list_id = :iid;
180 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
182 printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
184 printf("Not fixed\n");
192 EXEC SQL BEGIN DECLARE SECTION;
193 int mid, iid = id, found = 1;
194 char mtype[9], *name = "";
195 EXEC SQL END DECLARE SECTION;
197 /* retrieve (mtype = imembers.member_type, mid = imembers.member_id)
198 * where imembers.list_id = iid and imembers.direct = 1 { */
199 EXEC SQL DECLARE csr204 CURSOR FOR
200 SELECT member_type, member_id FROM imembers
201 WHERE list_id = :iid AND direct=1;
202 EXEC SQL OPEN csr204;
204 EXEC SQL FETCH csr204 INTO :mtype, :mid;
205 if(sqlca.sqlcode != 0) break;
210 name = ((struct list *) hash_lookup(lists, mid))->name;
211 else if (mtype[0] == 'U')
212 name = ((struct user *) hash_lookup(users, mid))->login;
213 else if (mtype[0] == 'S' || mtype[0] == 'K')
214 name = ((struct string *) hash_lookup(strings, mid))->name;
215 printf("Non-existant list %d has member %s %s\n", iid, mtype, name);
217 EXEC SQL CLOSE csr204;
224 EXEC SQL BEGIN DECLARE SECTION;
225 int lid, iid = id, found = 1;
227 EXEC SQL END DECLARE SECTION;
229 /* retrieve (lid = imembers.list_id)
230 * where imembers.member_id = iid and imembers.member_type = "USER" and
231 * imembers.direct = 1 { */
232 EXEC SQL DECLARE csr205 CURSOR FOR
233 SELECT list_id FROM imembers
234 WHERE member_id = :iid AND member_type='USER' AND direct=1;
235 EXEC SQL OPEN csr205;
237 EXEC SQL FETCH csr205 INTO :lid;
238 if(sqlca.sqlcode != 0) break;
241 printf("List %s has non-existant user member, id %d\n",
242 ((struct list *)hash_lookup(lists, lid))->name, iid);
244 EXEC SQL CLOSE csr205;
251 EXEC SQL BEGIN DECLARE SECTION;
252 int lid, iid = id, found = 1;
254 EXEC SQL END DECLARE SECTION;
256 /* retrieve (lid = imembers.list_id)
257 * where imembers.member_id = iid and imembers.member_type = "LIST" and
258 * imembers.direct = 1 { */
259 EXEC SQL DECLARE csr206 CURSOR FOR
260 SELECT list_id FROM imembers
261 WHERE member_id = :iid AND member_type='LIST' AND direct=1;
262 EXEC SQL OPEN csr206;
264 EXEC SQL FETCH csr206 INTO :lid;
265 if(sqlca.sqlcode != 0) break;
268 printf("List %s has non-existant list member, id %d\n",
269 ((struct list *)hash_lookup(lists, lid))->name, iid);
271 EXEC SQL CLOSE csr206;
278 EXEC SQL BEGIN DECLARE SECTION;
279 int lid, iid = id, found = 1;
281 EXEC SQL END DECLARE SECTION;
283 /* retrieve (lid = imembers.list_id)
284 * where imembers.member_id = iid and imembers.member_type = "STRING" and
285 * imembers.direct = 1 { */
286 EXEC SQL DECLARE csr207 CURSOR FOR
287 SELECT list_id FROM imembers
288 WHERE member_id = :iid AND member_type='STRING' AND direct=1;
289 EXEC SQL OPEN csr207;
291 EXEC SQL FETCH csr207 INTO :lid;
292 if(sqlca.sqlcode != 0) break;
295 printf("List %s has non-existant string member, id %d\n",
296 ((struct list *)hash_lookup(lists, lid))->name, iid);
298 EXEC SQL CLOSE csr207;
306 EXEC SQL BEGIN DECLARE SECTION;
307 int lid, iid = id, found = 1;
309 EXEC SQL END DECLARE SECTION;
311 /* retrieve (lid = imembers.list_id)
312 * where imembers.member_id = iid and imembers.member_type = "KERBEROS" and
313 * imembers.direct = 1 { */
314 EXEC SQL DECLARE csr208 CURSOR FOR
315 SELECT list_id FROM imembers
316 WHERE member_id = :iid AND member_type='KERBEROS' AND direct=1;
317 EXEC SQL OPEN csr208;
319 EXEC SQL FETCH csr208 INTO :lid;
320 if(sqlca.sqlcode != 0) break;
323 printf("List %s has non-existant kerberos member, id %d\n",
324 ((struct list *)hash_lookup(lists, lid))->name, iid);
326 EXEC SQL CLOSE csr208;
332 EXEC SQL BEGIN DECLARE SECTION;
334 EXEC SQL END DECLARE SECTION;
336 EXEC SQL BEGIN DECLARE SECTION;
338 EXEC SQL END DECLARE SECTION;
340 /* delete imembers where imembers.member_type = "USER" and
341 * imembers.member_id = id and imembers.direct = 1 */
342 EXEC SQL DELETE FROM imembers WHERE member_type='USER' AND
343 member_id = :id AND direct = 1;
344 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
346 printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
348 printf("Not deleted\n");
349 modified("imembers");
353 EXEC SQL BEGIN DECLARE SECTION;
355 EXEC SQL END DECLARE SECTION;
357 EXEC SQL BEGIN DECLARE SECTION;
359 EXEC SQL END DECLARE SECTION;
361 /* delete imembers where imembers.member_type = "LIST" and
362 * imembers.member_id = id and imembers.direct = 1 */
363 EXEC SQL DELETE FROM imembers WHERE member_type='LIST' AND
364 member_id = :id AND direct=1;
365 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
367 printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
369 printf("Not deleted\n");
370 modified("imembers");
374 EXEC SQL BEGIN DECLARE SECTION;
376 EXEC SQL END DECLARE SECTION;
378 EXEC SQL BEGIN DECLARE SECTION;
380 EXEC SQL END DECLARE SECTION;
382 /* delete imembers where imembers.member_type = "STRING" and
383 * imembers.member_id = id and imembers.direct = 1 */
384 EXEC SQL DELETE FROM imembers WHERE member_type='STRING' AND
385 member_id = :id AND direct=1;
386 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
388 printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
390 printf("Not deleted\n");
391 modified("imembers");
396 EXEC SQL BEGIN DECLARE SECTION;
398 EXEC SQL END DECLARE SECTION;
400 EXEC SQL BEGIN DECLARE SECTION;
402 EXEC SQL END DECLARE SECTION;
404 /* delete imembers where imembers.member_type = "KERBEROS" and
405 * imembers.member_id = id and imembers.direct = 1 */
406 EXEC SQL DELETE FROM imembers WHERE member_type='KERBEROS' AND
407 member_id = :id AND direct=1;
408 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
410 printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
412 printf("Not deleted\n");
413 modified("imembers");
418 EXEC SQL BEGIN DECLARE SECTION;
420 EXEC SQL END DECLARE SECTION;
422 EXEC SQL BEGIN DECLARE SECTION;
424 EXEC SQL END DECLARE SECTION;
427 /* retrieve (name = serverhosts.service) where serverhosts.mach_id = id { */
428 EXEC SQL DECLARE csr209 CURSOR FOR
429 SELECT service FROM serverhosts
431 EXEC SQL OPEN csr209;
433 EXEC SQL FETCH csr209 INTO :name;
434 if(sqlca.sqlcode != 0) break;
437 printf("ServerHost entry for service %s non-existant host %d\n",
440 EXEC SQL CLOSE csr209;
445 EXEC SQL BEGIN DECLARE SECTION;
447 EXEC SQL END DECLARE SECTION;
449 EXEC SQL BEGIN DECLARE SECTION;
451 EXEC SQL END DECLARE SECTION;
453 /* delete serverhosts where serverhosts.mach_id = id */
454 EXEC SQL DELETE FROM serverhosts WHERE mach_id = :id;
455 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
457 printf("%d entr%s deleted\n", rowcount, rowcount==1?"y":"ies");
459 printf("Not deleted\n");
460 modified("serverhosts");
464 static int fnchecklen;
471 if (n->mach_id == f->mach_id &&
472 !strncmp(f->dir, n->dir, strlen(n->dir)) &&
473 strlen(n->dir) > fnchecklen) {
475 fnchecklen = strlen(n->dir);
480 check_fs(id, f, hint)
481 EXEC SQL BEGIN DECLARE SECTION;
483 EXEC SQL END DECLARE SECTION;
484 register struct filesys *f;
487 EXEC SQL BEGIN DECLARE SECTION;
488 int id1, id2, id3, rowcount;
490 EXEC SQL END DECLARE SECTION;
494 if (!hash_lookup(machines, f->mach_id)) {
495 printf("Filesys %s with bad machine %d\n", f->name, f->mach_id);
496 if (single_fix("Fix", 0)) {
497 /* replace filesys (mach_id = 0) where filesys.filsys_id = id */
498 EXEC SQL UPDATE filesys SET mach_id = 0 WHERE filsys_id = :id;
499 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
501 printf("%d entr%s fixed\n",rowcount, rowcount==1?"y":"ies");
503 printf("Not fixed\n");
509 if (!hash_lookup(users, f->owner)) {
510 printf("Filesys %s with bad owning user %d\n", f->name, f->owner);
511 if (single_fix("Fix", 1)) {
512 zero_fix("filesys", "owner", "filsys_id", f->filsys_id);
516 if (!hash_lookup(lists, f->owners)) {
517 printf("Filesys %s with bad owning group %d\n", f->name, f->owners);
518 if (single_fix("Fix", 1)) {
519 zero_fix("filesys", "owners", "filsys_id", f->filsys_id);
524 if (f->type == 'N') {
525 if (!hash_lookup(nfsphys, f->phys_id)) {
526 m = (struct machine *)hash_lookup(machines, f->mach_id);
527 printf("Filesys %s with bad phys_id %d\n", f->name, f->phys_id);
528 if (single_fix("Fix", 1)) {
530 hash_step(nfsphys, fsmatch, f);
531 if (fnchecklen != 0) {
535 /* replace filesys (phys_id = id1) where filesys.filsys_id = id2 */
536 EXEC SQL UPDATE filesys SET phys_id = :id1 WHERE filsys_id = :id2;
537 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
539 printf("%d entr%s fixed\n",rowcount, rowcount==1?"y":"ies");
541 printf("Not fixed\n");
544 printf("No NFSphys exsits for %s:%s\n", m->name, f->dir);
545 if (single_fix("Create", 0)) {
550 if (set_next_object_id("nfsphys_id", "nfsphys") !=
552 printf("Unable to assign unique ID\n");
555 /* retrieve (id1 = values.value)
556 * where values.name = "nfsphys_id"
557 * inquire_equel(rowcount = "rowcount")
559 EXEC SQL SELECT COUNT(*) INTO :rowcount FROM numvalues
560 WHERE name='nfsphys_id';
562 printf("Unable to retrieve unique ID\n");
565 /* append nfsphys (nfsphys_id = id1, mach_id = id3,
566 * device = "???", #dir = dir, status = 0,
567 * allocated = 0, size = 0,
568 * modtime = "now", modby = 0,
571 EXEC SQL INSERT INTO mfsphys (mfsphys_id, mach_id,
572 device, dir, status, allocated, size, modtime,
573 modby, modwith) VALUES (:id1, :id3, '???', :dir,
574 0, 0, 0, 'now', 0, 'dbck');
575 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
577 printf("%d entr%s created\n", rowcount,
578 rowcount==1?"y":"ies");
580 printf("Not created\n");
582 n = (struct nfsphys *)malloc(sizeof(struct nfsphys));
584 out_of_mem("storing new nfsphys");
590 hash_store(nfsphys, id1, n);
591 /* replace filesys (phys_id = id1)
592 * where filesys.filsys_id = id2 */
593 EXEC SQL UPDATE filesys SET phys_id = :id1
594 WHERE filsys_id = :id2;
595 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
597 printf("%d filesys entr%s fixed\n", rowcount,
598 rowcount==1?"y":"ies");
600 printf("Not fixed\n");
610 check_nfsphys(id, n, hint)
615 if (!hash_lookup(machines, n->mach_id)) {
616 printf("NFSphys %d(%s) on non-existant machine %d\n",
617 id, n->dir, n->mach_id);
618 if (single_fix("Delete", 0))
619 single_delete("nfsphys", "nfsphys_id", id);
624 EXEC SQL BEGIN DECLARE SECTION;
626 EXEC SQL END DECLARE SECTION;
628 EXEC SQL BEGIN DECLARE SECTION;
630 EXEC SQL END DECLARE SECTION;
633 /* retrieve (id1 = fsgroup.filsys_id) where fsgroup.group_id = id { */
634 EXEC SQL DECLARE csr210 CURSOR FOR
635 SELECT filsys_id FROM fsgroup
636 WHERE group_id = :id;
637 EXEC SQL OPEN csr210;
639 EXEC SQL FETCH csr210 INTO :id1;
640 if(sqlca.sqlcode != 0) break;
643 if (f = (struct filesys *) hash_lookup(filesys, id1))
644 printf("Missing fsgroup %d has member filesystem %s\n", id, f->name);
646 printf("Missing fsgroup %d has member filesystem %d\n", id, id1);
648 EXEC SQL CLOSE csr210;
679 printf("FSGroup %s has type %s instead of FSGROUP\n", f->name, t);
686 EXEC SQL BEGIN DECLARE SECTION;
687 int rowcount, id = f->filsys_id;
688 EXEC SQL END DECLARE SECTION;
690 /* replace filesys (type = "FSGROUP") where filesys.filsys_id = id */
691 EXEC SQL UPDATE filesys SET type='FSGROUP' WHERE filsys_id = :id;
692 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
694 printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
696 printf("Not fixed\n");
700 show_fsg_nomember(id)
701 EXEC SQL BEGIN DECLARE SECTION;
703 EXEC SQL END DECLARE SECTION;
705 EXEC SQL BEGIN DECLARE SECTION;
707 EXEC SQL END DECLARE SECTION;
710 /* retrieve (id1 = fsgroup.group_id) where fsgroup.filsys_id = id { */
711 EXEC SQL DECLARE csr211 CURSOR FOR
712 SELECT group_id FROM fsgroup
713 WHERE filsys_id = :id;
714 EXEC SQL OPEN csr211;
716 EXEC SQL FETCH csr211 INTO :id1;
717 if(sqlca.sqlcode != 0) break;
720 if (f = (struct filesys *) hash_lookup(filesys, id1))
721 printf("FSGroup %s has missing member %d\n", f->name, id);
723 printf("FSGroup %d has missing member %d\n", id1, id);
725 EXEC SQL CLOSE csr211;
729 show_quota_nouser(id)
730 EXEC SQL BEGIN DECLARE SECTION;
732 EXEC SQL END DECLARE SECTION;
734 EXEC SQL BEGIN DECLARE SECTION;
736 EXEC SQL END DECLARE SECTION;
738 /* retrieve (id1 = quota.filsys_id) where quota.entity_id = id and
739 * quota.type = "USER" { */
740 EXEC SQL DECLARE csr212 CURSOR FOR
741 SELECT filsys_id FROM quota
742 WHERE entity_id = :id AND type='USER';
743 EXEC SQL OPEN csr212;
745 EXEC SQL FETCH csr212 INTO :id1;
746 if(sqlca.sqlcode != 0) break;
749 printf("Quota on fs %d for non-existant user %d\n", id1, id);
751 EXEC SQL CLOSE csr212;
755 show_quota_nolist(id)
756 EXEC SQL BEGIN DECLARE SECTION;
758 EXEC SQL END DECLARE SECTION;
760 EXEC SQL BEGIN DECLARE SECTION;
762 EXEC SQL END DECLARE SECTION;
764 /* retrieve (id1 = quota.filsys_id) where quota.entity_id = id and
765 * quota.type = "GROUP" { */
766 EXEC SQL DECLARE csr213 CURSOR FOR
767 SELECT filsys_id FROM quota
768 WHERE entity_id = :id AND type='GROUP';
769 EXEC SQL OPEN csr213;
771 EXEC SQL FETCH csr213 INTO :id1;
772 if(sqlca.sqlcode != 0) break;
775 printf("Quota on fs %d for non-existant list %d\n", id1, id);
777 EXEC SQL CLOSE csr213;
782 EXEC SQL BEGIN DECLARE SECTION;
784 EXEC SQL END DECLARE SECTION;
786 EXEC SQL BEGIN DECLARE SECTION;
788 EXEC SQL END DECLARE SECTION;
790 id1 = ((struct filesys *)hash_lookup(filesys, id))->phys_id;
791 /* delete quota where quota.entity_id = id and quota.type = "USER" */
792 EXEC SQL DELETE FROM quota
793 WHERE entity_id = :id AND type = 'USER';
794 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
796 printf("%d entr%s deleted\n",rowcount, rowcount==1?"y":"ies");
798 printf("Not deleted\n");
803 EXEC SQL BEGIN DECLARE SECTION;
805 EXEC SQL END DECLARE SECTION;
807 EXEC SQL BEGIN DECLARE SECTION;
809 EXEC SQL END DECLARE SECTION;
811 id1 = ((struct filesys *)hash_lookup(filesys, id))->phys_id;
812 /* delete quota where quota.entity_id = id and quota.type = "GROUP" */
813 EXEC SQL DELETE FROM quota WHERE entity_id = :id AND type='GROUP';
814 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
816 printf("%d entr%s deleted\n",rowcount, rowcount==1?"y":"ies");
818 printf("Not deleted\n");
823 EXEC SQL BEGIN DECLARE SECTION;
825 EXEC SQL END DECLARE SECTION;
827 EXEC SQL BEGIN DECLARE SECTION;
830 EXEC SQL END DECLARE SECTION;
832 /* retrieve (id1 = quota.entity_id, type = quota.#type)
833 * where quota.filsys_id = id { */
834 EXEC SQL DECLARE csr214 CURSOR FOR
835 SELECT entity_id, type FROM quota
836 WHERE filsys_id = :id;
837 EXEC SQL OPEN csr214;
839 EXEC SQL FETCH csr214 INTO :id1, :type;
840 if(sqlca.sqlcode != 0) break;
843 printf("Quota for %s %d on non-existant filesys %d\n", type, id1, id);
845 EXEC SQL CLOSE csr214;
851 single_delete("quota", "filsys_id", id);
854 show_quota_wrongpid(id)
855 EXEC SQL BEGIN DECLARE SECTION;
857 EXEC SQL END DECLARE SECTION;
859 EXEC SQL BEGIN DECLARE SECTION;
862 EXEC SQL END DECLARE SECTION;
866 f = (struct filesys *)hash_lookup(filesys, id);
867 /* retrieve (id1 = quota.entity_id, type = quota.#type)
868 * where quota.filsys_id = id { */
869 EXEC SQL DECLARE csr215 CURSOR FOR
870 SELECT entity_id, type FROM quota
871 WHERE filsys_id = :id;
872 EXEC SQL OPEN csr215;
874 EXEC SQL FETCH csr215 INTO :id1, :type;
875 if(sqlca.sqlcode != 0) break;
878 printf("Quota for %s %d on filesys %s has wrong phys_id %d\n",
879 type, id1, f->name, id);
881 EXEC SQL CLOSE csr215;
886 EXEC SQL BEGIN DECLARE SECTION;
888 EXEC SQL END DECLARE SECTION;
890 EXEC SQL BEGIN DECLARE SECTION;
892 EXEC SQL END DECLARE SECTION;
894 id1 = ((struct filesys *)hash_lookup(filesys, id))->phys_id;
895 /* replace quota (phys_id = id1) where quota.filsys_id = id and
896 * quota.phys_id != id1 */
897 EXEC SQL UPDATE quota SET phys_id = :id1
898 WHERE filsys_id = :id AND phys_id != :id1;
899 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
901 printf("%d entr%s fixed\n",rowcount, rowcount==1?"y":"ies");
903 printf("Not fixed\n");
908 EXEC SQL BEGIN DECLARE SECTION;
910 EXEC SQL END DECLARE SECTION;
912 EXEC SQL BEGIN DECLARE SECTION;
914 EXEC SQL END DECLARE SECTION;
917 /* retrieve (name = s.#name) where s.acl_type = "USER" and s.acl_id = id { */
918 EXEC SQL DECLARE csr216 CURSOR FOR
919 SELECT name FROM servers
920 WHERE acl_type='USER' and acl_id = :id;
921 EXEC SQL OPEN csr216;
923 EXEC SQL FETCH csr216 INTO :name;
924 if(sqlca.sqlcode != 0) break;
927 printf("Service %s has acl non-existant user %d\n", name, id);
930 EXEC SQL CLOSE csr216;
935 EXEC SQL BEGIN DECLARE SECTION;
937 EXEC SQL END DECLARE SECTION;
939 EXEC SQL BEGIN DECLARE SECTION;
941 EXEC SQL END DECLARE SECTION;
944 /* retrieve (name = s.#name) where s.acl_type = "LIST" and s.acl_id = id { */
945 EXEC SQL DECLARE csr217 CURSOR FOR
946 SELECT name FROM servers
947 WHERE acl_type='LIST' AND acl_id = :id;
948 EXEC SQL OPEN csr217;
950 EXEC SQL FETCH csr217 INTO :name;
951 if(sqlca.sqlcode != 0) break;
954 printf("Service %s has acl non-existant list %d\n", name, id);
957 EXEC SQL CLOSE csr217;
962 EXEC SQL BEGIN DECLARE SECTION;
964 EXEC SQL END DECLARE SECTION;
966 EXEC SQL BEGIN DECLARE SECTION;
968 EXEC SQL END DECLARE SECTION;
970 /* replace servers (acl_id = 0) where servers.acl_id = id and
971 * servers.acl_type = "USER" */
972 EXEC SQL UPDATE servers SET acl_id=0 WHERE acl_id = :id AND
974 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
976 printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
978 printf("Not fixed\n");
983 EXEC SQL BEGIN DECLARE SECTION;
985 EXEC SQL END DECLARE SECTION;
987 EXEC SQL BEGIN DECLARE SECTION;
989 EXEC SQL END DECLARE SECTION;
991 /* replace servers (acl_id = 0) where servers.acl_id = id and
992 * servers.acl_type = "LIST" */
993 EXEC SQL UPDATE servers SET acl_id=0 WHERE acl_id = :id AND
995 EXEC SQL INQUIRE_SQL(:rowcount = rowcount);
997 printf("%d entr%s fixed\n", rowcount, rowcount==1?"y":"ies");
999 printf("Not fixed\n");
1000 modified("servers");
1005 EXEC SQL BEGIN DECLARE SECTION;
1007 EXEC SQL END DECLARE SECTION;
1009 EXEC SQL BEGIN DECLARE SECTION;
1011 EXEC SQL END DECLARE SECTION;
1015 /* retrieve (id1 = krbmap.string_id) where krbmap.users_id = id { */
1016 EXEC SQL DECLARE csr218 CURSOR FOR
1017 SELECT string_id FROM krbmap
1018 WHERE users_id = :id ;
1019 EXEC SQL OPEN csr218;
1021 EXEC SQL FETCH csr218 INTO :id1;
1022 if(sqlca.sqlcode != 0) break;
1024 if (s = ((struct string *)hash_lookup(strings, id1)))
1029 printf("Kerberos map for non-existant user %d to principal %s\n",
1032 EXEC SQL CLOSE csr218;
1038 EXEC SQL BEGIN DECLARE SECTION;
1040 EXEC SQL END DECLARE SECTION;
1042 EXEC SQL BEGIN DECLARE SECTION;
1044 EXEC SQL END DECLARE SECTION;
1048 /* retrieve (id1 = krbmap.users_id) where krbmap.string_id = id { */
1049 EXEC SQL DECLARE csr219 CURSOR FOR
1050 SELECT users_id FROM krbmap
1051 WHERE string_id = :id;
1052 EXEC SQL OPEN csr219;
1054 EXEC SQL FETCH csr219 INTO :id1;
1055 if(sqlca.sqlcode != 0) break;
1057 if (u = ((struct user *)hash_lookup(users, id1)))
1062 printf("Kerberos map for user %s (%d) to non-existant string %d\n",
1065 EXEC SQL CLOSE csr219;
1071 EXEC SQL BEGIN DECLARE SECTION;
1073 EXEC SQL END DECLARE SECTION;
1075 EXEC SQL BEGIN DECLARE SECTION;
1077 EXEC SQL END DECLARE SECTION;
1080 /* retrieve (name = palladium.#name) where palladium.mach_id = id { */
1081 EXEC SQL DECLARE csr220 CURSOR FOR
1082 SELECT name FROM palladium
1083 WHERE mach_id = :id;
1084 EXEC SQL OPEN csr220;
1086 EXEC SQL FETCH csr220 INTO :name;
1087 if(sqlca.sqlcode != 0) break;
1090 printf("Palladium server/supervisor %s is on non-existant machine %d\n",
1094 EXEC SQL CLOSE csr220;
1101 EXEC SQL BEGIN DECLARE SECTION;
1102 int id1, id2, id3, id4, id5;
1103 char type[9], name[33];
1104 EXEC SQL END DECLARE SECTION;
1105 struct save_queue *sq, *sq1, *sq2, *sq3, *sq4, *sq5;
1111 printf("Phase 2 - Checking references\n");
1113 dprintf("Checking users...\n");
1114 hash_step(users, pobox_check, NULL);
1116 dprintf("Checking mcmap...\n");
1119 /* retrieve (id1 = mcmap.mach_id, id2 = mcmap.clu_id) { */
1120 EXEC SQL DECLARE csr221 CURSOR FOR
1121 SELECT mach_id, clu_id FROM mcmap;
1122 EXEC SQL OPEN csr221;
1124 EXEC SQL FETCH csr221 INTO :id1, :id2;
1125 if(sqlca.sqlcode != 0) break;
1127 if (!(m = (struct machine *)hash_lookup(machines, id1)))
1128 sq_save_unique_data(sq1, id1);
1129 if (!hash_lookup(clusters, id2))
1130 sq_save_unique_data(sq2, id2);
1131 if (m) m->clucount++;
1133 EXEC SQL CLOSE csr221;
1134 generic_delete(sq1, show_mcm_mach, "mcmap", "mach_id", 1);
1135 generic_delete(sq2, show_mcm_clu, "mcmap", "clu_id", 1);
1137 dprintf("Checking service clusters...\n");
1139 /* retrieve (id1 = svc.clu_id) { */
1140 EXEC SQL DECLARE csr222 CURSOR FOR
1141 SELECT clu_id FROM svc;
1142 EXEC SQL OPEN csr222;
1144 EXEC SQL FETCH csr222 INTO :id1;
1145 if(sqlca.sqlcode != 0) break;
1147 if (!hash_lookup(clusters, id1))
1148 sq_save_unique_data(sq1, id1);
1150 EXEC SQL CLOSE csr222;
1151 generic_delete(sq1, show_svc, "svc", "clu_id", 1);
1153 dprintf("Checking lists...\n");
1154 hash_step(lists, list_check, NULL);
1156 dprintf("Checking members...\n");
1163 EXEC SQL DECLARE csr223 CURSOR FOR
1164 SELECT list_id, member_type, member_id, ref_count, direct
1165 FROM imembers ORDER BY list_id;
1166 EXEC SQL OPEN csr223;
1168 EXEC SQL FETCH csr223 INTO :id1, :type, :id2, :id3, :id4;
1169 if(sqlca.sqlcode != 0) break;
1171 if ((l = (struct list *) hash_lookup(lists, id1)) == NULL)
1172 sq_save_unique_data(sq1, id1);
1173 else if (type[0] == 'U' && !hash_lookup(users, id2))
1174 sq_save_unique_data(sq2, id2);
1175 else if (type[0] == 'L' && !hash_lookup(lists, id2))
1176 sq_save_unique_data(sq3, id2);
1177 else if (type[0] == 'S' && !string_check(id2))
1178 sq_save_unique_data(sq4, id2);
1179 else if (type[0] == 'K' && !string_check(id2))
1180 sq_save_unique_data(sq5, id2);
1184 EXEC SQL CLOSE csr223;
1185 generic_delete(sq1, show_member_list, "imembers", "list_id", 1);
1186 generic_fix(sq2, show_mem_user, "Delete", del_mem_user, 1);
1187 generic_fix(sq3, show_mem_list, "Delete", del_mem_list, 1);
1188 generic_fix(sq4, show_mem_str, "Delete", del_mem_str, 1);
1189 generic_fix(sq5, show_mem_krb, "Delete", del_mem_krb, 1);
1191 dprintf("Checking servers...\n");
1194 /* range of s is servers
1195 * retrieve (name = s.#name, type = s.acl_type, id1 = s.acl_id) { */
1196 EXEC SQL DECLARE csr224 CURSOR FOR
1197 SELECT name, acl_type, acl_id FROM servers;
1198 EXEC SQL OPEN csr224;
1200 EXEC SQL FETCH csr224 INTO :name, :type, :id1;
1201 if(sqlca.sqlcode != 0) break;
1204 if (!strcmp(type, "USER") && !hash_lookup(users, id1)) {
1205 sq_save_data(sq1, id1);
1206 } else if (!strcmp(type, "LIST") && !hash_lookup(lists, id1)) {
1207 sq_save_data(sq2, id1);
1210 EXEC SQL CLOSE csr224;
1211 generic_fix(sq1, show_srv_user, "Fix", zero_srv_user, 1);
1212 generic_fix(sq2, show_srv_list, "Fix", zero_srv_list, 1);
1214 dprintf("Checking servershosts...\n");
1216 /* retrieve (id1 = serverhosts.mach_id) { */
1217 EXEC SQL DECLARE csr225 CURSOR FOR
1218 SELECT mach_id FROM servrhosts;
1219 EXEC SQL OPEN csr225;
1221 EXEC SQL FETCH csr225 INTO :id1;
1222 if(sqlca.sqlcode != 0) break;
1224 if (!hash_lookup(machines, id1))
1225 sq_save_data(sq, id1);
1227 EXEC SQL CLOSE csr225;
1228 generic_fix(sq, show_sh, "Delete", del_sh_mach, 0);
1230 dprintf("Checking nfsphys...\n");
1231 hash_step(nfsphys, check_nfsphys, NULL);
1233 dprintf("Checking filesys...\n");
1234 hash_step(filesys, check_fs, NULL);
1236 dprintf("Checking filesystem groups...\n");
1240 /* retrieve (id1 = fsgroup.group_id, id2 = fsgroup.filsys_id) { */
1241 EXEC SQL DECLARE csr226 CURSOR FOR
1242 SELECT group_id, filsys_id FROM fsgroup;
1243 EXEC SQL OPEN csr226;
1245 EXEC SQL FETCH csr226 INTO :id1, :id2;
1246 if(sqlca.sqlcode != 0) break;
1248 if (!(f = (struct filesys *) hash_lookup(filesys, id1)))
1249 sq_save_data(sq1, id1);
1250 if (!hash_lookup(filesys, id2))
1251 sq_save_data(sq3, id2);
1253 EXEC SQL CLOSE csr226;
1254 generic_delete(sq1, show_fsg_missing, "fsgroup", "group_id", 0);
1255 generic_delete(sq3, show_fsg_nomember, "fsgroup", "filsys_id", 1);
1257 dprintf("Checking quotas...\n");
1262 /* retrieve (id1 = quota.entity_id, type = quota.#type, id2 = quota.filsys_id,
1263 * id3 = quota.phys_id, id4 = quota.quota) { */
1264 EXEC SQL DECLARE csr227 CURSOR FOR
1265 SELECT entity_id, type, filsys_id, phys_id, quota FROM quota;
1266 EXEC SQL OPEN csr227;
1268 EXEC SQL FETCH csr227 INTO :id1, :type, :id2, :id3, :id4;
1269 if(sqlca.sqlcode != 0) break;
1271 if (type[0] == 'U' && id1 != 0 && !hash_lookup(users, id1))
1272 sq_save_data(sq1, id1);
1273 else if (type[0] == 'G' && !hash_lookup(lists, id1))
1274 sq_save_data(sq4, id1);
1275 else if (!(f = (struct filesys *) hash_lookup(filesys, id2)))
1276 sq_save_data(sq2, id2);
1277 else if (id3 != f->phys_id ||
1278 ((n = (struct nfsphys*) hash_lookup(nfsphys, id3)) ==
1279 (struct nfsphys *)NULL))
1280 sq_save_data(sq3, id2);
1284 EXEC SQL CLOSE csr227;
1285 generic_fix(sq1, show_quota_nouser, "Delete", fix_quota_nouser, 1);
1286 generic_fix(sq2, show_quota_nofs, "Delete", fix_quota_nofs, 0);
1287 generic_fix(sq3, show_quota_wrongpid, "Fix", fix_quota_physid, 1);
1288 generic_fix(sq4, show_quota_nolist, "Delete", fix_quota_nolist, 1);
1290 dprintf("Not checking zephyr.\n");
1292 dprintf("Checking hostaccess...\n");
1293 /* range of h is hostaccess
1294 * retrieve (id1 = h.mach_id, type = h.acl_type, id2 = h.acl_id) { */
1295 EXEC SQL DECLARE csr228 CURSOR FOR
1296 SELECT mach_id, acl_type, acl_id FROM hostaccess;
1297 EXEC SQL OPEN csr228;
1299 EXEC SQL FETCH csr228 INTO :id1, :type, :id2;
1300 if(sqlca.sqlcode != 0) break;
1303 if (!hash_lookup(machines, id1)) {
1304 printf("Hostaccess for non-existant host %d\n", id1);
1305 printf("Not fixing this error\n");
1307 if (!strcmp(type, "USER") && !hash_lookup(users, id2)) {
1308 printf("Hostaccess for %d is non-existant user %d\n", id1, id2);
1309 printf("Not fixing this error\n");
1310 } else if (!strcmp(type, "LIST") && !hash_lookup(lists, id2)) {
1311 printf("Hostaccess for %d is non-existant list %d\n", id1, id2);
1312 printf("Not fixing this error\n");
1315 EXEC SQL CLOSE csr228;
1317 dprintf("Checking palladium...\n");
1319 /* range of p is palladium
1320 * retrieve (id1 = p.mach_id) { */
1321 EXEC SQL DECLARE csr229 CURSOR FOR
1322 SELECT mach_id FROM palladium;
1323 EXEC SQL OPEN csr229;
1325 EXEC SQL FETCH csr229 INTO :id1;
1326 if(sqlca.sqlcode != 0) break;
1328 if (!hash_lookup(machines, id1)) {
1329 sq_save_unique_data(sq1, id1);
1332 EXEC SQL CLOSE csr229;
1333 generic_delete(sq1, show_pdm_mach, "palladium", "mach_id", 1);
1335 dprintf("Checking krbmap...\n");
1338 /* range of k is krbmap
1339 * retrieve (id1 = k.users_id, id2 = k.string_id) { */
1340 EXEC SQL DECLARE csr230 CURSOR FOR
1341 SELECT users_id, string_id FROM krbmap;
1342 EXEC SQL OPEN csr230;
1344 EXEC SQL FETCH csr230 INTO :id1, :id2;
1345 if(sqlca.sqlcode != 0) break;
1347 if (!hash_lookup(users, id1))
1348 sq_save_unique_data(sq1, id1);
1349 if (!string_check(id2))
1350 sq_save_unique_data(sq2, id2);
1352 EXEC SQL CLOSE csr230;
1353 generic_delete(sq1, show_krb_usr, "krbmap", "users_id", 1);
1354 generic_delete(sq2, show_krb_str, "krbmap", "string_id", 1);
1356 dprintf("Checking capacls...\n");
1357 /* retrieve (id1 = capacls.list_id, name = capacls.tag) { */
1358 EXEC SQL DECLARE csr231 CURSOR FOR
1359 SELECT list_id, tag FROM capacls;
1360 EXEC SQL OPEN csr231;
1362 EXEC SQL FETCH csr231 INTO :id1, :name;
1363 if(sqlca.sqlcode != 0) break;
1365 if (!hash_lookup(lists, id1)) {
1366 printf("Capacl for %s is non-existant list %d\n", name, id1);
1367 printf("Not fixing this error\n");
1370 EXEC SQL CLOSE csr231;