3 * (c) Copyright 1988-1998 by the Massachusetts Institute of Technology.
4 * For copying and distribution information, please see the file
8 #include <mit-copyright.h>
16 EXEC SQL INCLUDE sqlca;
20 EXEC SQL WHENEVER SQLERROR DO dbmserr();
22 int show_mcm_mach(void *id);
23 int show_mcm_clu(void *id);
24 int show_hostalias(void *id);
25 int show_printer_mach(void *id);
26 int show_printer_loghost(void *id);
27 int show_printer_spool(void *id);
28 int show_printer_quota(void *id);
29 int show_printer_ac(void *id);
30 int show_printer_lpc_acl(void *id);
31 void fix_printer_ac(void *id);
32 void fix_printer_lpc_acl(void *id);
33 void user_check(int id, void *user, void *hint);
34 int maybe_fixup_unref_string(int sid, int oid, char *oname, char *table,
35 char *field, char *idfield);
36 int maybe_fixup_modby(int sid, int oid, char *oname, char *table,
37 char *field, char *idfield);
38 int maybe_fixup_unref_string2(char *table, char *field, char *rowid, int sid);
39 int maybe_fixup_modby2(char *table, char *field, char *rowid, int id);
40 void pobox_check(int id, struct user *u);
41 void remove_pobox(int id);
42 void fix_smtp_pobox(int id, int sid);
43 void mach_check(int id, void *machine, void *hint);
44 void subnet_check(int id, void *subnet, void *hint);
45 void clear_subnet_owner(struct subnet *s);
46 void clear_mach_owner(struct machine *m);
47 void cluster_check(int id, void *cluster, void *hint);
48 int show_svc(void *id);
49 void list_check(int id, void *list, void *hint);
50 void fix_list_acl(int id);
51 int show_member_list(void *id);
52 int show_mem_user(void *id);
53 int show_mem_list(void *id);
54 int show_mem_str(void *id);
55 int show_mem_krb(void *id);
56 void del_mem_user(void *id);
57 void del_mem_list(void *id);
58 void del_mem_str(void *id);
59 void del_mem_krb(void *id);
60 int show_sh(void *id);
61 void del_sh_mach(void *id);
62 void fsmatch(int id, void *nfsphys, void *filesys);
63 void check_fs(int id, void *filesys, void *hint);
64 void check_nfsphys(int id, void *nfsphys, void *hint);
65 int show_fsg_missing(void *id);
66 int show_fsg_type(void *filesys);
67 void fix_fsg_type(void *filesys);
68 int show_fsg_nomember(void *id);
69 int show_quota_nouser(void *id);
70 int show_quota_nolist(void *id);
71 void fix_quota_nouser(void *id);
72 void fix_quota_nolist(void *id);
73 int show_quota_nofs(void *id);
74 void fix_quota_nofs(void *id);
75 int show_quota_wrongpid(void *id);
76 void fix_quota_physid(void *id);
77 int show_srv_user(void *id);
78 int show_srv_list(void *id);
79 void zero_srv_user(void *id);
80 void zero_srv_list(void *id);
81 int show_krb_usr(void *id);
82 int show_krb_str(void *id);
83 int show_pdm_mach(void *id);
85 int show_mcm_mach(void *id)
87 EXEC SQL BEGIN DECLARE SECTION;
88 int iid = (int)id, found = 1;
89 char name[CLUSTERS_NAME_SIZE];
90 EXEC SQL END DECLARE SECTION;
92 EXEC SQL DECLARE csr201 CURSOR FOR
93 SELECT clusters.name FROM clusters, mcmap
94 WHERE clusters.clu_id = mcmap.clu_id AND mcmap.mach_id = :iid;
98 EXEC SQL FETCH csr201 INTO :name;
104 printf("Cluster %s, non-existant machine %d in cluster map\n",
107 EXEC SQL CLOSE csr201;
111 int show_mcm_clu(void *id)
113 EXEC SQL BEGIN DECLARE SECTION;
114 int iid = (int)id, found = 1;
115 char name[MACHINE_NAME_SIZE];
116 EXEC SQL END DECLARE SECTION;
118 EXEC SQL DECLARE csr202 CURSOR FOR
119 SELECT machine.name FROM machine, mcmap
120 WHERE machine.mach_id = mcmap.mach_id AND mcmap.clu_id = :iid;
121 EXEC SQL OPEN csr202;
124 EXEC SQL FETCH csr202 INTO :name;
131 printf("Machine %s, non-existant cluster %d in cluster map\n",
134 EXEC SQL CLOSE csr202;
138 int show_hostalias(void *id)
140 EXEC SQL BEGIN DECLARE SECTION;
141 int iid = (int)id, found = 1;
142 char name[HOSTALIAS_NAME_SIZE];
143 EXEC SQL END DECLARE SECTION;
145 EXEC SQL DECLARE csr234 CURSOR FOR
146 SELECT name FROM hostalias WHERE mach_id = :iid;
147 EXEC SQL OPEN csr234;
150 EXEC SQL FETCH csr234 INTO :name;
157 printf("Alias %s, non-existant machine %d in hostalias map\n",
160 EXEC SQL CLOSE csr234;
164 int show_printer_mach(void *id)
166 EXEC SQL BEGIN DECLARE SECTION;
167 int iid = (int)id, found = 1;
168 char name[PRINTERS_NAME_SIZE];
169 EXEC SQL END DECLARE SECTION;
171 EXEC SQL DECLARE csr235 CURSOR FOR
172 SELECT name FROM printers WHERE mach_id = :iid;
173 EXEC SQL OPEN csr235;
176 EXEC SQL FETCH csr235 INTO :name;
183 printf("Printer %s, non-existant machine %d in printers table\n",
186 EXEC SQL CLOSE csr235;
190 int show_printer_loghost(void *id)
192 EXEC SQL BEGIN DECLARE SECTION;
193 int iid = (int)id, found = 1;
194 char name[PRINTERS_NAME_SIZE];
195 EXEC SQL END DECLARE SECTION;
197 EXEC SQL DECLARE csr236 CURSOR FOR
198 SELECT name FROM printers WHERE loghost = :iid;
199 EXEC SQL OPEN csr236;
202 EXEC SQL FETCH csr236 INTO :name;
209 printf("Printer %s, non-existant spool machine %d in printers table\n",
212 EXEC SQL CLOSE csr236;
216 int show_printer_spool(void *id)
218 EXEC SQL BEGIN DECLARE SECTION;
219 int iid = (int)id, found = 1;
220 char name[PRINTERS_NAME_SIZE];
221 EXEC SQL END DECLARE SECTION;
223 EXEC SQL DECLARE csr237 CURSOR FOR
224 SELECT name FROM printers WHERE rm = :iid;
225 EXEC SQL OPEN csr237;
228 EXEC SQL FETCH csr237 INTO :name;
235 printf("Printer %s, non-existant spool machine %d in printers table\n",
238 EXEC SQL CLOSE csr237;
242 int show_printer_quota(void *id)
244 EXEC SQL BEGIN DECLARE SECTION;
245 int iid = (int)id, found = 1;
246 char name[PRINTERS_NAME_SIZE];
247 EXEC SQL END DECLARE SECTION;
249 EXEC SQL DECLARE csr238 CURSOR FOR
250 SELECT name FROM printers WHERE rq = :iid;
251 EXEC SQL OPEN csr238;
254 EXEC SQL FETCH csr238 INTO :name;
261 printf("Printer %s, non-existant quota server %d in printers table\n",
264 EXEC SQL CLOSE csr238;
268 int show_printer_ac(void *id)
270 EXEC SQL BEGIN DECLARE SECTION;
271 int iid = (int)id, found = 1;
272 char name[PRINTERS_NAME_SIZE];
273 EXEC SQL END DECLARE SECTION;
275 EXEC SQL DECLARE csr239 CURSOR FOR
276 SELECT name FROM printers WHERE ac = :iid;
277 EXEC SQL OPEN csr239;
280 EXEC SQL FETCH csr239 INTO :name;
287 printf("Printer %s, non-existant restrict list %d in printers table\n",
290 EXEC SQL CLOSE csr239;
294 int show_printer_lpc_acl(void *id)
296 EXEC SQL BEGIN DECLARE SECTION;
297 int iid = (int)id, found = 1;
298 char name[PRINTERS_NAME_SIZE];
299 EXEC SQL END DECLARE SECTION;
301 EXEC SQL DECLARE csr240 CURSOR FOR
302 SELECT name FROM printers WHERE lpc_acl = :iid;
303 EXEC SQL OPEN csr240;
306 EXEC SQL FETCH csr240 INTO :name;
313 printf("Printer %s, non-existant lpc ACL %d in printers table\n",
316 EXEC SQL CLOSE csr240;
320 void fix_printer_ac(void *id)
322 EXEC SQL BEGIN DECLARE SECTION;
323 int rowcount, iid = (int)id;
324 EXEC SQL END DECLARE SECTION;
326 EXEC SQL UPDATE printers SET ac = 0 WHERE ac = :iid;
327 rowcount = sqlca.sqlerrd[2];
329 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
331 printf("Not fixed\n");
332 modified("printers");
335 void fix_printer_lpc_acl(void *id)
337 EXEC SQL BEGIN DECLARE SECTION;
338 int rowcount, iid = (int)id;
339 EXEC SQL END DECLARE SECTION;
341 EXEC SQL UPDATE printers SET lpc_acl = 0 WHERE lpc_acl = :iid;
342 rowcount = sqlca.sqlerrd[2];
344 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
346 printf("Not fixed\n");
347 modified("printers");
350 void user_check(int id, void *user, void *hint)
352 struct user *u = user;
354 u->comment = maybe_fixup_unref_string(u->comment, id, u->login, "users",
355 "comments", "users_id");
357 u->modby = maybe_fixup_modby(u->modby, id, u->login, "users",
358 "modby", "users_id");
360 u->fmodby = maybe_fixup_modby(u->fmodby, id, u->login, "users",
361 "fmodby", "users_id");
363 u->pmodby = maybe_fixup_modby(u->pmodby, id, u->login, "users",
364 "pmodby", "users_id");
366 u->sigwho = maybe_fixup_unref_string(u->sigwho, id, u->login, "users",
367 "sigwho", "users_id");
372 int maybe_fixup_unref_string(int sid, int oid, char *oname, char *table,
373 char *field, char *idfield)
375 int ret = (sid < 0) ? -sid : sid, doit = 0, newid;
376 EXEC SQL BEGIN DECLARE SECTION;
379 EXEC SQL END DECLARE SECTION;
381 if ((newid = (int)hash_lookup(string_dups, ret)))
383 printf("%s entry %s(%d) has a %s with duplicate string %d\n",
384 table, oname, oid, field, ret);
385 if (single_fix("Replace duplicate", 0))
392 else if (!string_check(ret))
394 printf("%s entry %s(%d) has a %s with non-existant string %d\n",
395 table, oname, oid, field, ret);
396 if (single_fix("Delete", 1))
405 sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE %s = %d",
406 table, field, (sid < 0) ? -ret : ret, idfield, oid);
407 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
408 rowcount = sqlca.sqlerrd[2];
412 printf("Not fixed, rowcount = %d\n", rowcount);
416 return (sid < 0) ? -ret : ret;
419 int maybe_fixup_modby(int sid, int oid, char *oname, char *table,
420 char *field, char *idfield)
422 EXEC SQL BEGIN DECLARE SECTION;
425 EXEC SQL END DECLARE SECTION;
428 return maybe_fixup_unref_string(sid, oid, oname, table, field, idfield);
431 if (!hash_lookup(users, sid))
433 printf("%s entry %s(%d) has a %s with non-existant user %d\n",
434 table, oname, oid, field, sid);
435 if (single_fix("Delete", 1))
437 sprintf(stmt_buf, "UPDATE %s SET %s = 0 WHERE %s = %d",
438 table, field, idfield, oid);
439 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
440 rowcount = sqlca.sqlerrd[2];
444 printf("Not fixed, rowcount = %d\n", rowcount);
453 int maybe_fixup_unref_string2(char *table, char *field, char *rowid, int sid)
455 int ret = (sid < 0) ? -sid : sid, doit = 0, newid;
456 EXEC SQL BEGIN DECLARE SECTION;
459 EXEC SQL END DECLARE SECTION;
461 if ((newid = (int)hash_lookup(string_dups, ret)))
463 printf("%s entry has a %s with duplicate string %d\n",
465 if (single_fix("Replace duplicate", 0))
472 else if (!string_check(ret))
474 printf("%s entry has a %s with non-existant string %d\n",
476 if (single_fix("Clear", 1))
485 sprintf(stmt_buf, "UPDATE %s SET %s = %d WHERE rowid = '%s'",
486 table, field, (sid < 0) ? -ret : ret, rowid);
487 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
488 rowcount = sqlca.sqlerrd[2];
492 printf("Not fixed, rowcount = %d\n", rowcount);
495 return (sid < 0) ? -ret : ret;
498 int maybe_fixup_modby2(char *table, char *field, char *rowid, int id)
500 EXEC SQL BEGIN DECLARE SECTION;
503 EXEC SQL END DECLARE SECTION;
506 return maybe_fixup_unref_string2(table, field, rowid, id);
509 if (!hash_lookup(users, id))
511 printf("%s entry has a %s with non-existant user %d\n",
513 if (single_fix("Clear", 1))
515 sprintf(stmt_buf, "UPDATE %s SET %s = 0 WHERE rowid = '%s'",
516 table, field, rowid);
517 EXEC SQL EXECUTE IMMEDIATE :stmt_buf;
518 rowcount = sqlca.sqlerrd[2];
522 printf("Not fixed, rowcount = %d\n", rowcount);
531 void pobox_check(int id, struct user *u)
536 if (!hash_lookup(machines, u->pobox_id))
538 printf("User %s(%s) has P.O.Box on non-existant machine %d\n",
539 u->login, u->fullname, u->pobox_id);
540 if (single_fix("Delete", 0))
542 remove_pobox(u->users_id);
548 if (hash_lookup(string_dups, u->pobox_id))
550 printf("User %s(%s) has P.O.Box with duplicate string %d\n",
551 u->login, u->fullname, u->pobox_id);
552 if (single_fix("Update", 0))
554 printf("Replacing box_id dup string ID %d with %d\n",
556 (int)hash_lookup(string_dups, u->pobox_id));
557 u->pobox_id = (int)hash_lookup(string_dups, u->pobox_id);
558 fix_smtp_pobox(u->users_id, u->pobox_id);
559 string_check(u->pobox_id);
562 else if (!string_check(u->pobox_id))
564 printf("User %s(%s) has P.O.Box with non-existant string %d\n",
565 u->login, u->fullname, u->pobox_id);
566 if (single_fix("Delete", 0))
568 remove_pobox(u->users_id);
579 void remove_pobox(int id)
581 EXEC SQL BEGIN DECLARE SECTION;
582 int rowcount, iid = (int)id;
583 EXEC SQL END DECLARE SECTION;
585 EXEC SQL UPDATE users SET potype = 'NONE' WHERE users.users_id = :iid;
586 rowcount = sqlca.sqlerrd[2];
588 printf("%d entr%s removed\n", rowcount, rowcount == 1 ? "y" : "ies");
590 printf("Not removed\n");
594 void fix_smtp_pobox(int id, int sid)
596 EXEC SQL BEGIN DECLARE SECTION;
597 int rowcount, iid = id, isid = sid;
598 EXEC SQL END DECLARE SECTION;
600 EXEC SQL UPDATE users SET box_id = :isid WHERE users.users_id = :iid;
601 rowcount = sqlca.sqlerrd[2];
603 printf("%d entr%s updated\n", rowcount, rowcount == 1 ? "y" : "ies");
605 printf("Not updated\n");
609 void mach_check(int id, void *machine, void *hint)
611 struct machine *m = machine;
613 if (!hash_lookup(subnets, m->snet_id))
615 printf("Machine %s is on a non-existant subnet %d\n",
616 m->name, m->snet_id);
617 if (single_fix("Move to null-subnet", 1))
619 EXEC SQL BEGIN DECLARE SECTION;
620 int rowcount, iid = id;
621 EXEC SQL END DECLARE SECTION;
623 EXEC SQL UPDATE machine SET snet_id = 0 WHERE mach_id = :iid;
624 rowcount = sqlca.sqlerrd[2];
626 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
628 printf("Not fixed\n");
633 switch (m->owner_type)
636 if (!hash_lookup(users, m->owner_id))
638 printf("Machine %s has non-existant USER owner %d\n",
639 m->name, m->owner_id);
640 if (single_fix("Set to no owner", 1))
645 if (!hash_lookup(lists, m->owner_id))
647 printf("Machine %s has non-existant LIST owner %d\n",
648 m->name, m->owner_id);
649 if (single_fix("Set to no owner", 1))
656 m->owner_id = maybe_fixup_unref_string(m->owner_id, id, m->name,
657 "machine", "owner_id",
659 if (m->owner_id == 0)
664 m->acomment = maybe_fixup_unref_string(m->acomment, id, m->name,
665 "machine", "acomment", "mach_id");
667 m->ocomment = maybe_fixup_unref_string(m->ocomment, id, m->name,
668 "machine", "ocomment", "mach_id");
670 m->creator = maybe_fixup_modby(m->creator, id, m->name, "machine",
671 "creator", "mach_id");
672 m->modby = maybe_fixup_modby(m->modby, id, m->name, "machine",
676 void subnet_check(int id, void *subnet, void *hint)
678 struct subnet *s = subnet;
680 switch (s->owner_type)
683 if (!hash_lookup(users, s->owner_id))
685 printf("Subnet %s has non-existant USER owner %d\n",
686 s->name, s->owner_id);
687 if (single_fix("Set to no owner", 1))
688 clear_subnet_owner(s);
692 if (!hash_lookup(lists, s->owner_id))
694 printf("Machine %s has non-existant LIST owner %d\n",
695 s->name, s->owner_id);
696 if (single_fix("Set to no owner", 1))
697 clear_subnet_owner(s);
703 s->owner_id = maybe_fixup_unref_string(s->owner_id, id, s->name,
704 "machine", "owner_id",
706 if (s->owner_id == 0)
707 clear_subnet_owner(s);
710 s->modby = maybe_fixup_modby(s->modby, id, s->name, "subnet",
714 void clear_subnet_owner(struct subnet *s)
716 EXEC SQL BEGIN DECLARE SECTION;
717 int rowcount, id = s->snet_id;
718 EXEC SQL END DECLARE SECTION;
720 EXEC SQL UPDATE subnet SET owner_type = 'NONE', owner_id = 0
722 rowcount = sqlca.sqlerrd[2];
724 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
726 printf("Not fixed\n");
730 void clear_mach_owner(struct machine *m)
732 EXEC SQL BEGIN DECLARE SECTION;
733 int rowcount, id = m->mach_id;
734 EXEC SQL END DECLARE SECTION;
736 EXEC SQL UPDATE machine SET owner_type = 'NONE', owner_id = 0
738 rowcount = sqlca.sqlerrd[2];
740 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
742 printf("Not fixed\n");
746 void cluster_check(int id, void *cluster, void *hint)
748 struct cluster *c = cluster;
750 c->modby = maybe_fixup_modby(c->modby, id, c->name, "clusters",
754 int show_svc(void *id)
756 EXEC SQL BEGIN DECLARE SECTION;
757 int iid = (int)id, found = 1;
758 char label[SVC_SERV_LABEL_SIZE], data[SVC_SERV_CLUSTER_SIZE];
759 EXEC SQL END DECLARE SECTION;
761 EXEC SQL DECLARE csr203 CURSOR FOR
762 SELECT serv_label, serv_cluster FROM svc
764 EXEC SQL OPEN csr203;
767 EXEC SQL FETCH csr203 INTO :label, :data;
774 printf("Cluster data [%s] %s for non-existant cluster %d\n",
777 EXEC SQL CLOSE csr203;
781 void list_check(int id, void *list, void *hint)
783 struct list *l = list;
785 l->modby = maybe_fixup_modby(l->modby, id, l->name, "list",
791 if (!hash_lookup(lists, l->acl_id))
793 printf("List %s has bad LIST acl %d\n", l->name, l->acl_id);
794 if (single_fix("Patch", 1))
795 fix_list_acl(l->list_id);
799 if (!hash_lookup(users, l->acl_id))
801 printf("List %s has bad USER acl %d\n", l->name, l->acl_id);
802 if (single_fix("Patch", 1))
803 fix_list_acl(l->list_id);
807 l->acl_id = maybe_fixup_unref_string(l->acl_id, id, l->name,
808 "list", "acl_id", "list_id");
811 printf("List %s has bad KERBEROS acl %d\n", l->name, l->acl_id);
812 if (single_fix("Patch", 1))
813 fix_list_acl(l->list_id);
819 void fix_list_acl(int id)
821 EXEC SQL BEGIN DECLARE SECTION;
822 int rowcount, iid = (int)id;
823 EXEC SQL END DECLARE SECTION;
825 EXEC SQL UPDATE list SET acl_id = :iid, acl_type = 'LIST'
826 WHERE list_id = :iid;
827 rowcount = sqlca.sqlerrd[2];
829 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
831 printf("Not fixed\n");
835 int show_member_list(void *id)
837 EXEC SQL BEGIN DECLARE SECTION;
838 int mid, iid = (int)id, found = 1;
839 char mtype[IMEMBERS_MEMBER_TYPE_SIZE], *name = NULL;
840 EXEC SQL END DECLARE SECTION;
842 EXEC SQL DECLARE csr204 CURSOR FOR
843 SELECT member_type, member_id FROM imembers
844 WHERE list_id = :iid;
845 EXEC SQL OPEN csr204;
848 EXEC SQL FETCH csr204 INTO :mtype, :mid;
856 struct list *l = hash_lookup(lists, mid);
860 else if (mtype[0] == 'U')
862 struct user *u = hash_lookup(users, mid);
866 else if (mtype[0] == 'S' || mtype[0] == 'K')
868 struct string *s = hash_lookup(strings, mid);
873 printf("Non-existant list %d has member %s %s\n", iid, mtype, name);
876 printf("Non-existant list %d has non-existent member %s %d\n",
880 EXEC SQL CLOSE csr204;
884 int show_mem_user(void *id)
886 EXEC SQL BEGIN DECLARE SECTION;
887 int lid, iid = (int)id, found = 1;
888 EXEC SQL END DECLARE SECTION;
891 EXEC SQL DECLARE csr205 CURSOR FOR
892 SELECT list_id FROM imembers
893 WHERE member_id = :iid AND member_type = 'USER';
894 EXEC SQL OPEN csr205;
897 EXEC SQL FETCH csr205 INTO :lid;
900 l = hash_lookup(lists, lid);
905 printf("List %s has non-existant user member, id %d\n", l->name, iid);
907 EXEC SQL CLOSE csr205;
911 int show_mem_list(void *id)
913 EXEC SQL BEGIN DECLARE SECTION;
914 int lid, iid = (int)id, found = 1;
915 EXEC SQL END DECLARE SECTION;
918 EXEC SQL DECLARE csr206 CURSOR FOR
919 SELECT list_id FROM imembers
920 WHERE member_id = :iid AND member_type = 'LIST';
921 EXEC SQL OPEN csr206;
924 EXEC SQL FETCH csr206 INTO :lid;
927 l = hash_lookup(lists, lid);
932 printf("List %s has non-existant list member, id %d\n", l->name, iid);
934 EXEC SQL CLOSE csr206;
938 int show_mem_str(void *id)
940 EXEC SQL BEGIN DECLARE SECTION;
941 int lid, iid = (int)id, found = 1;
942 EXEC SQL END DECLARE SECTION;
945 EXEC SQL DECLARE csr207 CURSOR FOR
946 SELECT list_id FROM imembers
947 WHERE member_id = :iid AND member_type = 'STRING';
948 EXEC SQL OPEN csr207;
951 EXEC SQL FETCH csr207 INTO :lid;
954 l = hash_lookup(lists, lid);
959 printf("List %s has non-existant string member, id %d\n", l->name, iid);
961 EXEC SQL CLOSE csr207;
966 int show_mem_krb(void *id)
968 EXEC SQL BEGIN DECLARE SECTION;
969 int lid, iid = (int)id, found = 1;
970 EXEC SQL END DECLARE SECTION;
973 EXEC SQL DECLARE csr208 CURSOR FOR
974 SELECT list_id FROM imembers
975 WHERE member_id = :iid AND member_type = 'KERBEROS';
976 EXEC SQL OPEN csr208;
979 EXEC SQL FETCH csr208 INTO :lid;
982 l = hash_lookup(lists, lid);
987 printf("List %s has non-existant kerberos member, id %d\n",
990 EXEC SQL CLOSE csr208;
995 void del_mem_user(void *id)
997 EXEC SQL BEGIN DECLARE SECTION;
998 int iid = (int)id, rowcount;
999 EXEC SQL END DECLARE SECTION;
1001 EXEC SQL DELETE FROM imembers WHERE member_type = 'USER' AND
1003 rowcount = sqlca.sqlerrd[2];
1005 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1007 printf("Not deleted\n");
1008 modified("imembers");
1011 void del_mem_list(void *id)
1013 EXEC SQL BEGIN DECLARE SECTION;
1014 int iid = (int)id, rowcount;
1015 EXEC SQL END DECLARE SECTION;
1017 EXEC SQL DELETE FROM imembers WHERE member_type = 'LIST' AND
1019 rowcount = sqlca.sqlerrd[2];
1021 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1023 printf("Not deleted\n");
1024 modified("imembers");
1027 void del_mem_str(void *id)
1029 EXEC SQL BEGIN DECLARE SECTION;
1030 int iid = (int)id, rowcount;
1031 EXEC SQL END DECLARE SECTION;
1033 EXEC SQL DELETE FROM imembers WHERE member_type = 'STRING' AND
1035 rowcount = sqlca.sqlerrd[2];
1037 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1039 printf("Not deleted\n");
1040 modified("imembers");
1044 void del_mem_krb(void *id)
1046 EXEC SQL BEGIN DECLARE SECTION;
1047 int iid = (int)id, rowcount;
1048 EXEC SQL END DECLARE SECTION;
1050 EXEC SQL DELETE FROM imembers WHERE member_type = 'KERBEROS' AND
1052 rowcount = sqlca.sqlerrd[2];
1054 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1056 printf("Not deleted\n");
1057 modified("imembers");
1061 int show_sh(void *id)
1063 EXEC SQL BEGIN DECLARE SECTION;
1064 char name[SERVERHOSTS_SERVICE_SIZE];
1066 EXEC SQL END DECLARE SECTION;
1069 EXEC SQL DECLARE csr209 CURSOR FOR
1070 SELECT service FROM serverhosts
1071 WHERE mach_id = :iid;
1072 EXEC SQL OPEN csr209;
1075 EXEC SQL FETCH csr209 INTO :name;
1080 printf("ServerHost entry for service %s non-existant host %d\n",
1083 EXEC SQL CLOSE csr209;
1087 void del_sh_mach(void *id)
1089 EXEC SQL BEGIN DECLARE SECTION;
1090 int iid = (int)id, rowcount;
1091 EXEC SQL END DECLARE SECTION;
1093 EXEC SQL DELETE FROM serverhosts WHERE mach_id = :iid;
1094 rowcount = sqlca.sqlerrd[2];
1096 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1098 printf("Not deleted\n");
1099 modified("serverhosts");
1103 static int fnchecklen;
1105 void fsmatch(int id, void *nfsphys, void *filesys)
1107 struct nfsphys *n = nfsphys;
1108 struct filesys *f = filesys;
1110 if (n->mach_id == f->mach_id &&
1111 !strncmp(f->dir, n->dir, strlen(n->dir)) &&
1112 strlen(n->dir) > fnchecklen)
1115 fnchecklen = strlen(n->dir);
1120 void check_fs(int id, void *filesys, void *hint)
1122 EXEC SQL BEGIN DECLARE SECTION;
1123 int iid = id, id1, id2, id3, rowcount;
1125 EXEC SQL END DECLARE SECTION;
1126 struct filesys *f = filesys;
1130 if (!hash_lookup(machines, f->mach_id))
1132 printf("Filesys %s with bad machine %d\n", f->name, f->mach_id);
1133 if (single_fix("Fix", 0))
1135 EXEC SQL UPDATE filesys SET mach_id = 0 WHERE filsys_id = :iid;
1136 rowcount = sqlca.sqlerrd[2];
1138 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1140 printf("Not fixed\n");
1141 modified("filesys");
1146 if (!hash_lookup(users, f->owner))
1148 printf("Filesys %s with bad owning user %d\n", f->name, f->owner);
1149 if (single_fix("Fix", 1))
1151 zero_fix("filesys", "owner", "filsys_id", f->filsys_id);
1155 if (!hash_lookup(lists, f->owners))
1157 printf("Filesys %s with bad owning group %d\n", f->name, f->owners);
1158 if (single_fix("Fix", 1))
1160 zero_fix("filesys", "owners", "filsys_id", f->filsys_id);
1167 if (!hash_lookup(nfsphys, f->phys_id))
1169 m = hash_lookup(machines, f->mach_id);
1170 printf("Filesys %s with bad phys_id %d\n", f->name, f->phys_id);
1171 if (single_fix("Fix", 1))
1174 hash_step(nfsphys, fsmatch, f);
1175 if (fnchecklen != 0)
1180 EXEC SQL UPDATE filesys SET phys_id = :id1
1181 WHERE filsys_id = :id2;
1182 rowcount = sqlca.sqlerrd[2];
1184 printf("%d entr%s fixed\n", rowcount,
1185 rowcount == 1 ? "y" : "ies");
1187 printf("Not fixed\n");
1188 modified("filesys");
1192 printf("No NFSphys exsits for %s:%s\n", m->name, f->dir);
1193 if (single_fix("Create", 0))
1199 if (set_next_object_id("nfsphys_id", "nfsphys") !=
1202 printf("Unable to assign unique ID\n");
1205 EXEC SQL SELECT COUNT(*) INTO :rowcount FROM numvalues
1206 WHERE name = 'nfsphys_id';
1209 printf("Unable to retrieve unique ID\n");
1212 EXEC SQL INSERT INTO nfsphys
1213 (nfsphys_id, mach_id, device, dir, status, allocated,
1214 size, modtime, modby, modwith) VALUES
1215 (:id1, :id3, '\?\?\?', :dir, 0, 0, 0, SYSDATE, 0,
1217 rowcount = sqlca.sqlerrd[2];
1220 printf("%d entr%s created\n", rowcount,
1221 rowcount == 1 ? "y" : "ies");
1224 printf("Not created\n");
1225 modified("nfsphys");
1226 n = malloc(sizeof(struct nfsphys));
1228 out_of_mem("storing new nfsphys");
1229 strcpy(n->dir, dir);
1231 n->nfsphys_id = id1;
1234 if (hash_store(nfsphys, id1, n) == -1)
1235 out_of_mem("storing nfsphys in hash table");
1236 EXEC SQL UPDATE filesys SET phys_id = :id1
1237 WHERE filsys_id = :id2;
1238 rowcount = sqlca.sqlerrd[2];
1241 printf("%d filesys entr%s fixed\n", rowcount,
1242 rowcount == 1 ? "y" : "ies");
1245 printf("Not fixed\n");
1246 modified("filesys");
1254 void check_nfsphys(int id, void *nfsphys, void *hint)
1256 struct nfsphys *n = nfsphys;
1258 n->modby = maybe_fixup_modby(n->modby, id, n->dir, "nfsphys",
1259 "modby", "nfsphys_id");
1261 if (!hash_lookup(machines, n->mach_id))
1263 printf("NFSphys %d(%s) on non-existant machine %d\n",
1264 id, n->dir, n->mach_id);
1265 if (single_fix("Delete", 0))
1266 single_delete("nfsphys", "nfsphys_id", id);
1270 int show_fsg_missing(void *id)
1272 EXEC SQL BEGIN DECLARE SECTION;
1273 int iid = (int)id, id1, found = 1;
1274 EXEC SQL END DECLARE SECTION;
1277 EXEC SQL DECLARE csr210 CURSOR FOR
1278 SELECT filsys_id FROM fsgroup
1279 WHERE group_id = :iid;
1280 EXEC SQL OPEN csr210;
1283 EXEC SQL FETCH csr210 INTO :id1;
1288 if ((f = hash_lookup(filesys, id1)))
1289 printf("Missing fsgroup %d has member filesystem %s\n", iid, f->name);
1291 printf("Missing fsgroup %d has member filesystem %d\n", iid, id1);
1293 EXEC SQL CLOSE csr210;
1297 int show_fsg_type(void *filesys)
1299 struct filesys *f = filesys;
1325 printf("FSGroup %s has type %s instead of FSGROUP\n", f->name, t);
1329 void fix_fsg_type(void *filesys)
1331 struct filesys *f = filesys;
1332 EXEC SQL BEGIN DECLARE SECTION;
1333 int rowcount, id = f->filsys_id;
1334 EXEC SQL END DECLARE SECTION;
1336 EXEC SQL UPDATE filesys SET type = 'FSGROUP' WHERE filsys_id = :id;
1337 rowcount = sqlca.sqlerrd[2];
1339 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1341 printf("Not fixed\n");
1342 modified("filesys");
1345 int show_fsg_nomember(void *id)
1347 EXEC SQL BEGIN DECLARE SECTION;
1348 int iid = (int)id, id1, found = 1;
1349 EXEC SQL END DECLARE SECTION;
1352 EXEC SQL DECLARE csr211 CURSOR FOR
1353 SELECT group_id FROM fsgroup
1354 WHERE filsys_id = :iid;
1355 EXEC SQL OPEN csr211;
1358 EXEC SQL FETCH csr211 INTO :id1;
1363 if ((f = hash_lookup(filesys, id1)))
1364 printf("FSGroup %s has missing member %d\n", f->name, iid);
1366 printf("FSGroup %d has missing member %d\n", id1, iid);
1368 EXEC SQL CLOSE csr211;
1372 int show_quota_nouser(void *id)
1374 EXEC SQL BEGIN DECLARE SECTION;
1375 int iid = (int)id, id1, found = 1;
1376 EXEC SQL END DECLARE SECTION;
1378 EXEC SQL DECLARE csr212 CURSOR FOR
1379 SELECT filsys_id FROM quota
1380 WHERE entity_id = :iid AND type = 'USER';
1381 EXEC SQL OPEN csr212;
1384 EXEC SQL FETCH csr212 INTO :id1;
1389 printf("Quota on fs %d for non-existant user %d\n", id1, iid);
1391 EXEC SQL CLOSE csr212;
1395 int show_quota_nolist(void *id)
1397 EXEC SQL BEGIN DECLARE SECTION;
1398 int iid = (int)id, id1, found = 1;
1399 EXEC SQL END DECLARE SECTION;
1401 EXEC SQL DECLARE csr213 CURSOR FOR
1402 SELECT filsys_id FROM quota
1403 WHERE entity_id = :iid AND type = 'GROUP';
1404 EXEC SQL OPEN csr213;
1407 EXEC SQL FETCH csr213 INTO :id1;
1412 printf("Quota on fs %d for non-existant list %d\n", id1, iid);
1414 EXEC SQL CLOSE csr213;
1418 void fix_quota_nouser(void *id)
1420 EXEC SQL BEGIN DECLARE SECTION;
1421 int iid = (int)id, rowcount;
1422 EXEC SQL END DECLARE SECTION;
1424 EXEC SQL DELETE FROM quota
1425 WHERE entity_id = :iid AND type = 'USER';
1426 rowcount = sqlca.sqlerrd[2];
1428 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1430 printf("Not deleted\n");
1434 void fix_quota_nolist(void *id)
1436 EXEC SQL BEGIN DECLARE SECTION;
1437 int iid = (int)id, rowcount;
1438 EXEC SQL END DECLARE SECTION;
1440 EXEC SQL DELETE FROM quota WHERE entity_id = :iid AND type = 'GROUP';
1441 rowcount = sqlca.sqlerrd[2];
1443 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1445 printf("Not deleted\n");
1449 int show_quota_nofs(void *id)
1451 EXEC SQL BEGIN DECLARE SECTION;
1452 int iid = (int)id, id1, found = 1;
1453 char type[QUOTA_TYPE_SIZE];
1454 EXEC SQL END DECLARE SECTION;
1456 EXEC SQL DECLARE csr214 CURSOR FOR
1457 SELECT entity_id, type FROM quota
1458 WHERE filsys_id = :iid;
1459 EXEC SQL OPEN csr214;
1462 EXEC SQL FETCH csr214 INTO :id1, :type;
1467 printf("Quota for %s %d on non-existant filesys %d\n", type, id1, iid);
1469 EXEC SQL CLOSE csr214;
1473 void fix_quota_nofs(void *id)
1475 single_delete("quota", "filsys_id", (int)id);
1478 int show_quota_wrongpid(void *id)
1480 EXEC SQL BEGIN DECLARE SECTION;
1481 int iid = (int)id, id1, found = 1;
1482 char type[QUOTA_TYPE_SIZE];
1483 EXEC SQL END DECLARE SECTION;
1486 f = hash_lookup(filesys, iid);
1487 EXEC SQL DECLARE csr215 CURSOR FOR
1488 SELECT entity_id, type FROM quota
1489 WHERE filsys_id = :iid;
1490 EXEC SQL OPEN csr215;
1493 EXEC SQL FETCH csr215 INTO :id1, :type;
1498 printf("Quota for %s %d on filesys %s has wrong phys_id %d\n",
1499 type, id1, f->name, iid);
1501 EXEC SQL CLOSE csr215;
1505 void fix_quota_physid(void *id)
1507 EXEC SQL BEGIN DECLARE SECTION;
1508 int iid = (int)id, rowcount, id1;
1509 EXEC SQL END DECLARE SECTION;
1511 id1 = ((struct filesys *)hash_lookup(filesys, iid))->phys_id;
1512 EXEC SQL UPDATE quota SET phys_id = :id1
1513 WHERE filsys_id = :iid AND phys_id != :id1;
1514 rowcount = sqlca.sqlerrd[2];
1516 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1518 printf("Not fixed\n");
1522 int show_srv_user(void *id)
1524 EXEC SQL BEGIN DECLARE SECTION;
1525 char name[SERVERS_NAME_SIZE];
1527 EXEC SQL END DECLARE SECTION;
1530 EXEC SQL DECLARE csr216 CURSOR FOR
1531 SELECT name FROM servers
1532 WHERE acl_type = 'USER' and acl_id = :iid;
1533 EXEC SQL OPEN csr216;
1536 EXEC SQL FETCH csr216 INTO :name;
1541 printf("Service %s has acl non-existant user %d\n", name, iid);
1544 EXEC SQL CLOSE csr216;
1548 int show_srv_list(void *id)
1550 EXEC SQL BEGIN DECLARE SECTION;
1551 char name[SERVERS_NAME_SIZE];
1553 EXEC SQL END DECLARE SECTION;
1556 EXEC SQL DECLARE csr217 CURSOR FOR
1557 SELECT name FROM servers
1558 WHERE acl_type = 'LIST' AND acl_id = :iid;
1559 EXEC SQL OPEN csr217;
1562 EXEC SQL FETCH csr217 INTO :name;
1567 printf("Service %s has acl non-existant list %d\n", name, iid);
1570 EXEC SQL CLOSE csr217;
1574 void zero_srv_user(void *id)
1576 EXEC SQL BEGIN DECLARE SECTION;
1577 int iid = (int)id, rowcount;
1578 EXEC SQL END DECLARE SECTION;
1580 EXEC SQL UPDATE servers SET acl_id = 0 WHERE acl_id = :iid AND
1582 rowcount = sqlca.sqlerrd[2];
1584 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1586 printf("Not fixed\n");
1587 modified("servers");
1590 void zero_srv_list(void *id)
1592 EXEC SQL BEGIN DECLARE SECTION;
1593 int iid = (int)id, rowcount;
1594 EXEC SQL END DECLARE SECTION;
1596 EXEC SQL UPDATE servers SET acl_id = 0 WHERE acl_id = :iid AND
1598 rowcount = sqlca.sqlerrd[2];
1600 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1602 printf("Not fixed\n");
1603 modified("servers");
1606 int show_krb_usr(void *id)
1608 EXEC SQL BEGIN DECLARE SECTION;
1609 int iid = (int)id, found = 1, id1;
1610 EXEC SQL END DECLARE SECTION;
1614 EXEC SQL DECLARE csr218 CURSOR FOR
1615 SELECT string_id FROM krbmap
1616 WHERE users_id = :iid;
1617 EXEC SQL OPEN csr218;
1620 EXEC SQL FETCH csr218 INTO :id1;
1624 if ((s = hash_lookup(strings, id1)))
1629 printf("Kerberos map for non-existant user %d to principal %s\n",
1632 EXEC SQL CLOSE csr218;
1636 int show_krb_str(void *id)
1638 EXEC SQL BEGIN DECLARE SECTION;
1639 int iid = (int)id, found = 1, id1;
1640 EXEC SQL END DECLARE SECTION;
1644 EXEC SQL DECLARE csr219 CURSOR FOR
1645 SELECT users_id FROM krbmap
1646 WHERE string_id = :iid;
1647 EXEC SQL OPEN csr219;
1650 EXEC SQL FETCH csr219 INTO :id1;
1654 if ((u = hash_lookup(users, id1)))
1659 printf("Kerberos map for user %s (%d) to non-existant string %d\n",
1662 EXEC SQL CLOSE csr219;
1668 struct save_queue *sq, *sq1, *sq2, *sq3, *sq4, *sq5;
1675 printf("Phase 2 - Checking references\n");
1677 dprintf("Checking users...\n");
1678 hash_step(users, user_check, NULL);
1680 dprintf("Checking machines...\n");
1681 hash_step(machines, mach_check, NULL);
1683 dprintf("Checking subnets...\n");
1684 hash_step(subnets, subnet_check, NULL);
1686 dprintf("Checking clusters...\n");
1687 hash_step(clusters, cluster_check, NULL);
1689 dprintf("Checking mcmap...\n");
1692 EXEC SQL DECLARE csr221 CURSOR FOR
1693 SELECT mach_id, clu_id FROM mcmap;
1694 EXEC SQL OPEN csr221;
1697 EXEC SQL BEGIN DECLARE SECTION;
1698 int mach_id, clu_id;
1699 EXEC SQL END DECLARE SECTION;
1701 EXEC SQL FETCH csr221 INTO :mach_id, :clu_id;
1705 if (!(m = hash_lookup(machines, mach_id)))
1706 sq_save_unique_data(sq1, (void *)mach_id);
1707 else if (!hash_lookup(clusters, clu_id))
1708 sq_save_unique_data(sq2, (void *)clu_id);
1712 EXEC SQL CLOSE csr221;
1713 generic_delete(sq1, show_mcm_mach, "mcmap", "mach_id", 1);
1714 generic_delete(sq2, show_mcm_clu, "mcmap", "clu_id", 1);
1716 dprintf("Checking service clusters...\n");
1718 EXEC SQL DECLARE csr222 CURSOR FOR
1719 SELECT clu_id FROM svc;
1720 EXEC SQL OPEN csr222;
1723 EXEC SQL BEGIN DECLARE SECTION;
1725 EXEC SQL END DECLARE SECTION;
1727 EXEC SQL FETCH csr222 INTO :clu_id;
1731 if (!hash_lookup(clusters, clu_id))
1732 sq_save_unique_data(sq1, (void *)clu_id);
1734 EXEC SQL CLOSE csr222;
1735 generic_delete(sq1, show_svc, "svc", "clu_id", 1);
1737 dprintf("Checking lists...\n");
1738 hash_step(lists, list_check, NULL);
1740 dprintf("Checking members...\n");
1747 EXEC SQL DECLARE csr223 CURSOR FOR
1748 SELECT list_id, member_type, member_id, ref_count, direct, rowid
1749 FROM imembers FOR UPDATE OF member_id;
1750 EXEC SQL OPEN csr223;
1753 EXEC SQL BEGIN DECLARE SECTION;
1754 int list_id, id, ref_count, direct;
1755 char type[IMEMBERS_MEMBER_TYPE_SIZE];
1756 EXEC SQL END DECLARE SECTION;
1758 EXEC SQL FETCH csr223 INTO :list_id, :type, :id,
1759 :ref_count, :direct, :rowid;
1763 if (!(l = hash_lookup(lists, list_id)))
1764 sq_save_unique_data(sq1, (void *)list_id);
1765 else if (type[0] == 'U' && !hash_lookup(users, id))
1766 sq_save_unique_data(sq2, (void *)id);
1767 else if (type[0] == 'L' && !hash_lookup(lists, id))
1768 sq_save_unique_data(sq3, (void *)id);
1769 else if (type[0] == 'S' && !maybe_fixup_unref_string2("imembers", "member_id", strtrim(rowid), id))
1770 sq_save_unique_data(sq4, (void *)id);
1771 else if (type[0] == 'K' && !maybe_fixup_unref_string2("imembers", "member_id", strtrim(rowid), id))
1772 sq_save_unique_data(sq5, (void *)id);
1776 EXEC SQL CLOSE csr223;
1777 generic_delete(sq1, show_member_list, "imembers", "list_id", 1);
1778 generic_fix(sq2, show_mem_user, "Delete", del_mem_user, 1);
1779 generic_fix(sq3, show_mem_list, "Delete", del_mem_list, 1);
1780 generic_fix(sq4, show_mem_str, "Delete", del_mem_str, 1);
1781 generic_fix(sq5, show_mem_krb, "Delete", del_mem_krb, 1);
1783 dprintf("Checking servers...\n");
1786 EXEC SQL DECLARE csr224 CURSOR FOR
1787 SELECT name, acl_type, acl_id, modby, rowid FROM servers
1788 FOR UPDATE of modby;
1789 EXEC SQL OPEN csr224;
1792 EXEC SQL BEGIN DECLARE SECTION;
1794 char name[SERVERS_NAME_SIZE], acl_type[SERVERS_ACL_TYPE_SIZE];
1795 EXEC SQL END DECLARE SECTION;
1797 EXEC SQL FETCH csr224 INTO :name, :acl_type, :acl_id, :modby, :rowid;
1801 maybe_fixup_modby2("servers", "modby", strtrim(rowid), modby);
1803 if (!strcmp(acl_type, "USER") && !hash_lookup(users, acl_id))
1804 sq_save_data(sq1, (void *)acl_id);
1805 else if (!strcmp(acl_type, "LIST") && !hash_lookup(lists, acl_id))
1806 sq_save_data(sq2, (void *)acl_id);
1808 EXEC SQL CLOSE csr224;
1809 generic_fix(sq1, show_srv_user, "Fix", zero_srv_user, 1);
1810 generic_fix(sq2, show_srv_list, "Fix", zero_srv_list, 1);
1812 dprintf("Checking serverhosts...\n");
1814 EXEC SQL DECLARE csr225 CURSOR FOR
1815 SELECT mach_id, modby, rowid FROM serverhosts
1816 FOR UPDATE OF modby;
1817 EXEC SQL OPEN csr225;
1820 EXEC SQL BEGIN DECLARE SECTION;
1822 EXEC SQL END DECLARE SECTION;
1824 EXEC SQL FETCH csr225 INTO :mach_id, :modby, :rowid;
1828 maybe_fixup_modby2("serverhosts", "modby", strtrim(rowid), modby);
1829 if (!hash_lookup(machines, mach_id))
1830 sq_save_data(sq, (void *)mach_id);
1832 EXEC SQL CLOSE csr225;
1833 generic_fix(sq, show_sh, "Delete", del_sh_mach, 0);
1835 dprintf("Checking nfsphys...\n");
1836 hash_step(nfsphys, check_nfsphys, NULL);
1838 dprintf("Checking filesys...\n");
1839 hash_step(filesys, check_fs, NULL);
1841 dprintf("Checking filesystem groups...\n");
1845 EXEC SQL DECLARE csr226 CURSOR FOR
1846 SELECT group_id, filsys_id FROM fsgroup;
1847 EXEC SQL OPEN csr226;
1850 EXEC SQL BEGIN DECLARE SECTION;
1851 int group_id, filsys_id;
1852 EXEC SQL END DECLARE SECTION;
1854 EXEC SQL FETCH csr226 INTO :group_id, :filsys_id;
1858 if (!(f = hash_lookup(filesys, group_id)))
1859 sq_save_data(sq1, (void *)group_id);
1860 if (!hash_lookup(filesys, filsys_id))
1861 sq_save_data(sq3, (void *)filsys_id);
1863 EXEC SQL CLOSE csr226;
1864 generic_delete(sq1, show_fsg_missing, "fsgroup", "group_id", 0);
1865 generic_delete(sq3, show_fsg_nomember, "fsgroup", "filsys_id", 1);
1867 dprintf("Checking quotas...\n");
1872 EXEC SQL DECLARE csr227 CURSOR FOR
1873 SELECT entity_id, type, filsys_id, phys_id, quota, modby, rowid
1874 FROM quota FOR UPDATE OF modby;
1875 EXEC SQL OPEN csr227;
1878 EXEC SQL BEGIN DECLARE SECTION;
1879 int entity_id, filsys_id, phys_id, quota, modby;
1880 char type[QUOTA_TYPE_SIZE];
1881 EXEC SQL END DECLARE SECTION;
1883 EXEC SQL FETCH csr227 INTO :entity_id, :type, :filsys_id,
1884 :phys_id, :quota, :modby, :rowid;
1888 maybe_fixup_modby2("quota", "modby", strtrim(rowid), modby);
1889 if (type[0] == 'U' && entity_id != 0 && !hash_lookup(users, entity_id))
1890 sq_save_data(sq1, (void *)entity_id);
1891 else if (type[0] == 'G' && !hash_lookup(lists, entity_id))
1892 sq_save_data(sq4, (void *)entity_id);
1893 else if (!(f = hash_lookup(filesys, filsys_id)))
1894 sq_save_data(sq2, (void *)filsys_id);
1895 else if (phys_id != f->phys_id || !(n = hash_lookup(nfsphys, phys_id)))
1896 sq_save_data(sq3, (void *)phys_id);
1900 EXEC SQL CLOSE csr227;
1901 generic_fix(sq1, show_quota_nouser, "Delete", fix_quota_nouser, 1);
1902 generic_fix(sq2, show_quota_nofs, "Delete", fix_quota_nofs, 0);
1903 generic_fix(sq3, show_quota_wrongpid, "Fix", fix_quota_physid, 1);
1904 generic_fix(sq4, show_quota_nolist, "Delete", fix_quota_nolist, 1);
1906 dprintf("Not checking zephyr.\n");
1908 dprintf("Checking hostaccess...\n");
1909 EXEC SQL DECLARE csr228 CURSOR FOR
1910 SELECT mach_id, acl_type, acl_id, modby, rowid FROM hostaccess
1911 FOR UPDATE OF modby;
1912 EXEC SQL OPEN csr228;
1915 EXEC SQL BEGIN DECLARE SECTION;
1916 int mach_id, acl_id, modby;
1917 char acl_type[HOSTACCESS_ACL_TYPE_SIZE];
1918 EXEC SQL END DECLARE SECTION;
1920 EXEC SQL FETCH csr228 INTO :mach_id, :acl_type, :acl_id, :modby, :rowid;
1924 maybe_fixup_modby2("hostaccess", "modby", strtrim(rowid), modby);
1926 if (!hash_lookup(machines, mach_id))
1928 printf("Hostaccess for non-existant host %d\n", mach_id);
1929 printf("Not fixing this error\n");
1931 if (!strcmp(acl_type, "USER") && !hash_lookup(users, acl_id))
1933 printf("Hostaccess for %d is non-existant user %d\n", mach_id, acl_id);
1934 printf("Not fixing this error\n");
1936 else if (!strcmp(acl_type, "LIST") && !hash_lookup(lists, acl_id))
1938 printf("Hostaccess for %d is non-existant list %d\n", mach_id, acl_id);
1939 printf("Not fixing this error\n");
1942 EXEC SQL CLOSE csr228;
1944 dprintf("Checking krbmap...\n");
1947 EXEC SQL DECLARE csr230 CURSOR FOR
1948 SELECT users_id, string_id, rowid FROM krbmap
1949 FOR UPDATE OF string_id;
1950 EXEC SQL OPEN csr230;
1953 EXEC SQL BEGIN DECLARE SECTION;
1954 int users_id, string_id;
1955 EXEC SQL END DECLARE SECTION;
1957 EXEC SQL FETCH csr230 INTO :users_id, :string_id, :rowid;
1961 if (!hash_lookup(users, users_id))
1962 sq_save_unique_data(sq1, (void *)users_id);
1963 else if (!maybe_fixup_unref_string2("krbmap", "string_id", strtrim(rowid), string_id))
1964 sq_save_unique_data(sq2, (void *)string_id);
1966 EXEC SQL CLOSE csr230;
1967 generic_delete(sq1, show_krb_usr, "krbmap", "users_id", 1);
1968 generic_delete(sq2, show_krb_str, "krbmap", "string_id", 1);
1970 dprintf("Checking capacls...\n");
1971 EXEC SQL DECLARE csr231 CURSOR FOR
1972 SELECT list_id, tag FROM capacls;
1973 EXEC SQL OPEN csr231;
1976 EXEC SQL BEGIN DECLARE SECTION;
1978 char tag[CAPACLS_TAG_SIZE];
1979 EXEC SQL END DECLARE SECTION;
1981 EXEC SQL FETCH csr231 INTO :list_id, :tag;
1985 if (!hash_lookup(lists, list_id))
1987 printf("Capacl for %s is non-existant list %d\n", tag, list_id);
1988 printf("Not fixing this error\n");
1991 EXEC SQL CLOSE csr231;
1993 dprintf("Checking hostaliases\n");
1995 EXEC SQL DECLARE csr232 CURSOR FOR
1996 SELECT mach_id FROM hostalias;
1997 EXEC SQL OPEN csr232;
2000 EXEC SQL BEGIN DECLARE SECTION;
2002 EXEC SQL END DECLARE SECTION;
2004 EXEC SQL FETCH csr232 INTO :mach_id;
2008 if (!hash_lookup(machines, mach_id))
2009 sq_save_unique_data(sq1, (void *)mach_id);
2011 EXEC SQL CLOSE csr232;
2012 generic_delete(sq1, show_hostalias, "hostalias", "mach_id", 1);
2014 dprintf("Checking printers\n");
2020 EXEC SQL DECLARE csr233 CURSOR FOR
2021 SELECT mach_id, loghost, rm, rq, ac, lpc_acl, modby, rowid FROM printers;
2022 EXEC SQL OPEN csr233;
2025 EXEC SQL BEGIN DECLARE SECTION;
2026 int mach_id, loghost, rm, rq, ac, lpc_acl, modby;
2027 EXEC SQL END DECLARE SECTION;
2029 EXEC SQL FETCH csr233 INTO :mach_id, :loghost, :rm, :rq, :ac,
2030 :lpc_acl, :modby, :rowid;
2034 maybe_fixup_modby2("printers", "modby", strtrim(rowid), modby);
2035 if (!hash_lookup(machines, mach_id))
2036 sq_save_unique_data(sq1, (void *)mach_id);
2037 else if (!hash_lookup(machines, rm))
2038 sq_save_unique_data(sq2, (void *)rm);
2039 else if (!hash_lookup(machines, rq))
2040 sq_save_unique_data(sq3, (void *)rq);
2042 if (!hash_lookup(lists, ac))
2043 sq_save_unique_data(sq4, (void *)ac);
2044 if (!hash_lookup(lists, lpc_acl))
2045 sq_save_unique_data(sq5, (void *)lpc_acl);
2046 if (!hash_lookup(machines, loghost))
2048 show_printer_loghost((void *)loghost);
2053 EXEC SQL CLOSE csr233;
2054 generic_delete(sq1, show_printer_mach, "printers", "mach_id", 1);
2055 generic_delete(sq2, show_printer_spool, "printers", "rm", 1);
2056 generic_delete(sq3, show_printer_quota, "printers", "rq", 1);
2057 generic_fix(sq4, show_printer_ac, "Clear", fix_printer_ac, 1);
2058 generic_fix(sq5, show_printer_lpc_acl, "Clear", fix_printer_lpc_acl, 1);