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)
538 if (!hash_lookup(machines, u->pobox_id))
540 printf("User %s(%s) has P.O.Box on non-existant machine %d\n",
541 u->login, u->fullname, u->pobox_id);
542 if (single_fix("Delete", 0))
544 remove_pobox(u->users_id);
551 if (hash_lookup(string_dups, u->pobox_id))
553 printf("User %s(%s) has P.O.Box with duplicate string %d\n",
554 u->login, u->fullname, u->pobox_id);
555 if (single_fix("Update", 0))
557 printf("Replacing box_id dup string ID %d with %d\n",
559 (int)hash_lookup(string_dups, u->pobox_id));
560 u->pobox_id = (int)hash_lookup(string_dups, u->pobox_id);
561 fix_smtp_pobox(u->users_id, u->pobox_id);
562 string_check(u->pobox_id);
565 else if (!string_check(u->pobox_id))
567 printf("User %s(%s) has P.O.Box with non-existant string %d\n",
568 u->login, u->fullname, u->pobox_id);
569 if (single_fix("Delete", 0))
571 remove_pobox(u->users_id);
578 fs = hash_lookup(filesys, u->pobox_id);
581 printf("User %s(%s) has P.O.Box on non-existant filesystem %d\n",
582 u->login, u->fullname, u->pobox_id);
583 if (single_fix("Delete", 0))
585 remove_pobox(u->users_id);
589 else if (fs->type != 'I')
591 printf("User %s(%s) has IMAP P.O.Box on non-IMAP filesystem %s\n",
592 u->login, u->fullname, fs->name);
593 if (single_fix("Delete", 0))
595 remove_pobox(u->users_id);
607 void remove_pobox(int id)
609 EXEC SQL BEGIN DECLARE SECTION;
610 int rowcount, iid = (int)id;
611 EXEC SQL END DECLARE SECTION;
613 EXEC SQL UPDATE users SET potype = 'NONE' WHERE users.users_id = :iid;
614 rowcount = sqlca.sqlerrd[2];
616 printf("%d entr%s removed\n", rowcount, rowcount == 1 ? "y" : "ies");
618 printf("Not removed\n");
622 void fix_smtp_pobox(int id, int sid)
624 EXEC SQL BEGIN DECLARE SECTION;
625 int rowcount, iid = id, isid = sid;
626 EXEC SQL END DECLARE SECTION;
628 EXEC SQL UPDATE users SET box_id = :isid WHERE users.users_id = :iid;
629 rowcount = sqlca.sqlerrd[2];
631 printf("%d entr%s updated\n", rowcount, rowcount == 1 ? "y" : "ies");
633 printf("Not updated\n");
637 void mach_check(int id, void *machine, void *hint)
639 struct machine *m = machine;
641 if (!hash_lookup(subnets, m->snet_id))
643 printf("Machine %s is on a non-existant subnet %d\n",
644 m->name, m->snet_id);
645 if (single_fix("Move to null-subnet", 1))
647 EXEC SQL BEGIN DECLARE SECTION;
648 int rowcount, iid = id;
649 EXEC SQL END DECLARE SECTION;
651 EXEC SQL UPDATE machine SET snet_id = 0 WHERE mach_id = :iid;
652 rowcount = sqlca.sqlerrd[2];
654 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
656 printf("Not fixed\n");
661 switch (m->owner_type)
664 if (!hash_lookup(users, m->owner_id))
666 printf("Machine %s has non-existant USER owner %d\n",
667 m->name, m->owner_id);
668 if (single_fix("Set to no owner", 1))
673 if (!hash_lookup(lists, m->owner_id))
675 printf("Machine %s has non-existant LIST owner %d\n",
676 m->name, m->owner_id);
677 if (single_fix("Set to no owner", 1))
684 m->owner_id = maybe_fixup_unref_string(m->owner_id, id, m->name,
685 "machine", "owner_id",
687 if (m->owner_id == 0)
692 m->acomment = maybe_fixup_unref_string(m->acomment, id, m->name,
693 "machine", "acomment", "mach_id");
695 m->ocomment = maybe_fixup_unref_string(m->ocomment, id, m->name,
696 "machine", "ocomment", "mach_id");
698 m->creator = maybe_fixup_modby(m->creator, id, m->name, "machine",
699 "creator", "mach_id");
700 m->modby = maybe_fixup_modby(m->modby, id, m->name, "machine",
704 void subnet_check(int id, void *subnet, void *hint)
706 struct subnet *s = subnet;
708 switch (s->owner_type)
711 if (!hash_lookup(users, s->owner_id))
713 printf("Subnet %s has non-existant USER owner %d\n",
714 s->name, s->owner_id);
715 if (single_fix("Set to no owner", 1))
716 clear_subnet_owner(s);
720 if (!hash_lookup(lists, s->owner_id))
722 printf("Machine %s has non-existant LIST owner %d\n",
723 s->name, s->owner_id);
724 if (single_fix("Set to no owner", 1))
725 clear_subnet_owner(s);
731 s->owner_id = maybe_fixup_unref_string(s->owner_id, id, s->name,
732 "machine", "owner_id",
734 if (s->owner_id == 0)
735 clear_subnet_owner(s);
738 s->modby = maybe_fixup_modby(s->modby, id, s->name, "subnet",
742 void clear_subnet_owner(struct subnet *s)
744 EXEC SQL BEGIN DECLARE SECTION;
745 int rowcount, id = s->snet_id;
746 EXEC SQL END DECLARE SECTION;
748 EXEC SQL UPDATE subnet SET owner_type = 'NONE', owner_id = 0
750 rowcount = sqlca.sqlerrd[2];
752 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
754 printf("Not fixed\n");
758 void clear_mach_owner(struct machine *m)
760 EXEC SQL BEGIN DECLARE SECTION;
761 int rowcount, id = m->mach_id;
762 EXEC SQL END DECLARE SECTION;
764 EXEC SQL UPDATE machine SET owner_type = 'NONE', owner_id = 0
766 rowcount = sqlca.sqlerrd[2];
768 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
770 printf("Not fixed\n");
774 void cluster_check(int id, void *cluster, void *hint)
776 struct cluster *c = cluster;
778 c->modby = maybe_fixup_modby(c->modby, id, c->name, "clusters",
782 int show_svc(void *id)
784 EXEC SQL BEGIN DECLARE SECTION;
785 int iid = (int)id, found = 1;
786 char label[SVC_SERV_LABEL_SIZE], data[SVC_SERV_CLUSTER_SIZE];
787 EXEC SQL END DECLARE SECTION;
789 EXEC SQL DECLARE csr203 CURSOR FOR
790 SELECT serv_label, serv_cluster FROM svc
792 EXEC SQL OPEN csr203;
795 EXEC SQL FETCH csr203 INTO :label, :data;
802 printf("Cluster data [%s] %s for non-existant cluster %d\n",
805 EXEC SQL CLOSE csr203;
809 void list_check(int id, void *list, void *hint)
811 struct list *l = list;
813 l->modby = maybe_fixup_modby(l->modby, id, l->name, "list",
819 if (!hash_lookup(lists, l->acl_id))
821 printf("List %s has bad LIST acl %d\n", l->name, l->acl_id);
822 if (single_fix("Patch", 1))
823 fix_list_acl(l->list_id);
827 if (!hash_lookup(users, l->acl_id))
829 printf("List %s has bad USER acl %d\n", l->name, l->acl_id);
830 if (single_fix("Patch", 1))
831 fix_list_acl(l->list_id);
835 l->acl_id = maybe_fixup_unref_string(l->acl_id, id, l->name,
836 "list", "acl_id", "list_id");
839 printf("List %s has bad KERBEROS acl %d\n", l->name, l->acl_id);
840 if (single_fix("Patch", 1))
841 fix_list_acl(l->list_id);
847 void fix_list_acl(int id)
849 EXEC SQL BEGIN DECLARE SECTION;
850 int rowcount, iid = (int)id;
851 EXEC SQL END DECLARE SECTION;
853 EXEC SQL UPDATE list SET acl_id = :iid, acl_type = 'LIST'
854 WHERE list_id = :iid;
855 rowcount = sqlca.sqlerrd[2];
857 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
859 printf("Not fixed\n");
863 int show_member_list(void *id)
865 EXEC SQL BEGIN DECLARE SECTION;
866 int mid, iid = (int)id, found = 1;
867 char mtype[IMEMBERS_MEMBER_TYPE_SIZE], *name = NULL;
868 EXEC SQL END DECLARE SECTION;
870 EXEC SQL DECLARE csr204 CURSOR FOR
871 SELECT member_type, member_id FROM imembers
872 WHERE list_id = :iid;
873 EXEC SQL OPEN csr204;
876 EXEC SQL FETCH csr204 INTO :mtype, :mid;
884 struct list *l = hash_lookup(lists, mid);
888 else if (mtype[0] == 'U')
890 struct user *u = hash_lookup(users, mid);
894 else if (mtype[0] == 'S' || mtype[0] == 'K')
896 struct string *s = hash_lookup(strings, mid);
901 printf("Non-existant list %d has member %s %s\n", iid, mtype, name);
904 printf("Non-existant list %d has non-existent member %s %d\n",
908 EXEC SQL CLOSE csr204;
912 int show_mem_user(void *id)
914 EXEC SQL BEGIN DECLARE SECTION;
915 int lid, iid = (int)id, found = 1;
916 EXEC SQL END DECLARE SECTION;
919 EXEC SQL DECLARE csr205 CURSOR FOR
920 SELECT list_id FROM imembers
921 WHERE member_id = :iid AND member_type = 'USER';
922 EXEC SQL OPEN csr205;
925 EXEC SQL FETCH csr205 INTO :lid;
928 l = hash_lookup(lists, lid);
933 printf("List %s has non-existant user member, id %d\n", l->name, iid);
935 EXEC SQL CLOSE csr205;
939 int show_mem_list(void *id)
941 EXEC SQL BEGIN DECLARE SECTION;
942 int lid, iid = (int)id, found = 1;
943 EXEC SQL END DECLARE SECTION;
946 EXEC SQL DECLARE csr206 CURSOR FOR
947 SELECT list_id FROM imembers
948 WHERE member_id = :iid AND member_type = 'LIST';
949 EXEC SQL OPEN csr206;
952 EXEC SQL FETCH csr206 INTO :lid;
955 l = hash_lookup(lists, lid);
960 printf("List %s has non-existant list member, id %d\n", l->name, iid);
962 EXEC SQL CLOSE csr206;
966 int show_mem_str(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 csr207 CURSOR FOR
974 SELECT list_id FROM imembers
975 WHERE member_id = :iid AND member_type = 'STRING';
976 EXEC SQL OPEN csr207;
979 EXEC SQL FETCH csr207 INTO :lid;
982 l = hash_lookup(lists, lid);
987 printf("List %s has non-existant string member, id %d\n", l->name, iid);
989 EXEC SQL CLOSE csr207;
994 int show_mem_krb(void *id)
996 EXEC SQL BEGIN DECLARE SECTION;
997 int lid, iid = (int)id, found = 1;
998 EXEC SQL END DECLARE SECTION;
1001 EXEC SQL DECLARE csr208 CURSOR FOR
1002 SELECT list_id FROM imembers
1003 WHERE member_id = :iid AND member_type = 'KERBEROS';
1004 EXEC SQL OPEN csr208;
1007 EXEC SQL FETCH csr208 INTO :lid;
1010 l = hash_lookup(lists, lid);
1015 printf("List %s has non-existant kerberos member, id %d\n",
1018 EXEC SQL CLOSE csr208;
1023 void del_mem_user(void *id)
1025 EXEC SQL BEGIN DECLARE SECTION;
1026 int iid = (int)id, rowcount;
1027 EXEC SQL END DECLARE SECTION;
1029 EXEC SQL DELETE FROM imembers WHERE member_type = 'USER' AND
1031 rowcount = sqlca.sqlerrd[2];
1033 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1035 printf("Not deleted\n");
1036 modified("imembers");
1039 void del_mem_list(void *id)
1041 EXEC SQL BEGIN DECLARE SECTION;
1042 int iid = (int)id, rowcount;
1043 EXEC SQL END DECLARE SECTION;
1045 EXEC SQL DELETE FROM imembers WHERE member_type = 'LIST' AND
1047 rowcount = sqlca.sqlerrd[2];
1049 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1051 printf("Not deleted\n");
1052 modified("imembers");
1055 void del_mem_str(void *id)
1057 EXEC SQL BEGIN DECLARE SECTION;
1058 int iid = (int)id, rowcount;
1059 EXEC SQL END DECLARE SECTION;
1061 EXEC SQL DELETE FROM imembers WHERE member_type = 'STRING' AND
1063 rowcount = sqlca.sqlerrd[2];
1065 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1067 printf("Not deleted\n");
1068 modified("imembers");
1072 void del_mem_krb(void *id)
1074 EXEC SQL BEGIN DECLARE SECTION;
1075 int iid = (int)id, rowcount;
1076 EXEC SQL END DECLARE SECTION;
1078 EXEC SQL DELETE FROM imembers WHERE member_type = 'KERBEROS' AND
1080 rowcount = sqlca.sqlerrd[2];
1082 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1084 printf("Not deleted\n");
1085 modified("imembers");
1089 int show_sh(void *id)
1091 EXEC SQL BEGIN DECLARE SECTION;
1092 char name[SERVERHOSTS_SERVICE_SIZE];
1094 EXEC SQL END DECLARE SECTION;
1097 EXEC SQL DECLARE csr209 CURSOR FOR
1098 SELECT service FROM serverhosts
1099 WHERE mach_id = :iid;
1100 EXEC SQL OPEN csr209;
1103 EXEC SQL FETCH csr209 INTO :name;
1108 printf("ServerHost entry for service %s non-existant host %d\n",
1111 EXEC SQL CLOSE csr209;
1115 void del_sh_mach(void *id)
1117 EXEC SQL BEGIN DECLARE SECTION;
1118 int iid = (int)id, rowcount;
1119 EXEC SQL END DECLARE SECTION;
1121 EXEC SQL DELETE FROM serverhosts WHERE mach_id = :iid;
1122 rowcount = sqlca.sqlerrd[2];
1124 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1126 printf("Not deleted\n");
1127 modified("serverhosts");
1131 static int fnchecklen;
1133 void fsmatch(int id, void *nfsphys, void *filesys)
1135 struct nfsphys *n = nfsphys;
1136 struct filesys *f = filesys;
1138 if (n->mach_id == f->mach_id &&
1139 !strncmp(f->dir, n->dir, strlen(n->dir)) &&
1140 strlen(n->dir) > fnchecklen)
1143 fnchecklen = strlen(n->dir);
1148 void check_fs(int id, void *filesys, void *hint)
1150 EXEC SQL BEGIN DECLARE SECTION;
1151 int iid = id, id1, id2, id3, rowcount;
1153 EXEC SQL END DECLARE SECTION;
1154 struct filesys *f = filesys;
1158 if (!hash_lookup(machines, f->mach_id))
1160 printf("Filesys %s with bad machine %d\n", f->name, f->mach_id);
1161 if (single_fix("Fix", 0))
1163 EXEC SQL UPDATE filesys SET mach_id = 0 WHERE filsys_id = :iid;
1164 rowcount = sqlca.sqlerrd[2];
1166 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1168 printf("Not fixed\n");
1169 modified("filesys");
1174 if (!hash_lookup(users, f->owner))
1176 printf("Filesys %s with bad owning user %d\n", f->name, f->owner);
1177 if (single_fix("Fix", 1))
1179 zero_fix("filesys", "owner", "filsys_id", f->filsys_id);
1183 if (!hash_lookup(lists, f->owners))
1185 printf("Filesys %s with bad owning group %d\n", f->name, f->owners);
1186 if (single_fix("Fix", 1))
1188 zero_fix("filesys", "owners", "filsys_id", f->filsys_id);
1193 if (f->type == 'N' || f->type == 'I')
1195 if (!hash_lookup(nfsphys, f->phys_id))
1197 m = hash_lookup(machines, f->mach_id);
1198 printf("Filesys %s with bad phys_id %d\n", f->name, f->phys_id);
1199 if (single_fix("Fix", 1))
1202 hash_step(nfsphys, fsmatch, f);
1203 if (fnchecklen != 0)
1208 EXEC SQL UPDATE filesys SET phys_id = :id1
1209 WHERE filsys_id = :id2;
1210 rowcount = sqlca.sqlerrd[2];
1212 printf("%d entr%s fixed\n", rowcount,
1213 rowcount == 1 ? "y" : "ies");
1215 printf("Not fixed\n");
1216 modified("filesys");
1220 printf("No NFSphys exsits for %s:%s\n", m->name, f->dir);
1221 if (single_fix("Create", 0))
1227 if (set_next_object_id("nfsphys_id", "nfsphys") !=
1230 printf("Unable to assign unique ID\n");
1233 EXEC SQL SELECT COUNT(*) INTO :rowcount FROM numvalues
1234 WHERE name = 'nfsphys_id';
1237 printf("Unable to retrieve unique ID\n");
1240 EXEC SQL INSERT INTO nfsphys
1241 (nfsphys_id, mach_id, device, dir, status, allocated,
1242 size, modtime, modby, modwith) VALUES
1243 (:id1, :id3, '\?\?\?', :dir, 0, 0, 0, SYSDATE, 0,
1245 rowcount = sqlca.sqlerrd[2];
1248 printf("%d entr%s created\n", rowcount,
1249 rowcount == 1 ? "y" : "ies");
1252 printf("Not created\n");
1253 modified("nfsphys");
1254 n = malloc(sizeof(struct nfsphys));
1256 out_of_mem("storing new nfsphys");
1257 strcpy(n->dir, dir);
1259 n->nfsphys_id = id1;
1262 if (hash_store(nfsphys, id1, n) == -1)
1263 out_of_mem("storing nfsphys in hash table");
1264 EXEC SQL UPDATE filesys SET phys_id = :id1
1265 WHERE filsys_id = :id2;
1266 rowcount = sqlca.sqlerrd[2];
1269 printf("%d filesys entr%s fixed\n", rowcount,
1270 rowcount == 1 ? "y" : "ies");
1273 printf("Not fixed\n");
1274 modified("filesys");
1282 void check_nfsphys(int id, void *nfsphys, void *hint)
1284 struct nfsphys *n = nfsphys;
1286 n->modby = maybe_fixup_modby(n->modby, id, n->dir, "nfsphys",
1287 "modby", "nfsphys_id");
1289 if (!hash_lookup(machines, n->mach_id))
1291 printf("NFSphys %d(%s) on non-existant machine %d\n",
1292 id, n->dir, n->mach_id);
1293 if (single_fix("Delete", 0))
1294 single_delete("nfsphys", "nfsphys_id", id);
1298 int show_fsg_missing(void *id)
1300 EXEC SQL BEGIN DECLARE SECTION;
1301 int iid = (int)id, id1, found = 1;
1302 EXEC SQL END DECLARE SECTION;
1305 EXEC SQL DECLARE csr210 CURSOR FOR
1306 SELECT filsys_id FROM fsgroup
1307 WHERE group_id = :iid;
1308 EXEC SQL OPEN csr210;
1311 EXEC SQL FETCH csr210 INTO :id1;
1316 if ((f = hash_lookup(filesys, id1)))
1317 printf("Missing fsgroup %d has member filesystem %s\n", iid, f->name);
1319 printf("Missing fsgroup %d has member filesystem %d\n", iid, id1);
1321 EXEC SQL CLOSE csr210;
1325 int show_fsg_type(void *filesys)
1327 struct filesys *f = filesys;
1353 printf("FSGroup %s has type %s instead of FSGROUP\n", f->name, t);
1357 void fix_fsg_type(void *filesys)
1359 struct filesys *f = filesys;
1360 EXEC SQL BEGIN DECLARE SECTION;
1361 int rowcount, id = f->filsys_id;
1362 EXEC SQL END DECLARE SECTION;
1364 EXEC SQL UPDATE filesys SET type = 'FSGROUP' WHERE filsys_id = :id;
1365 rowcount = sqlca.sqlerrd[2];
1367 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1369 printf("Not fixed\n");
1370 modified("filesys");
1373 int show_fsg_nomember(void *id)
1375 EXEC SQL BEGIN DECLARE SECTION;
1376 int iid = (int)id, id1, found = 1;
1377 EXEC SQL END DECLARE SECTION;
1380 EXEC SQL DECLARE csr211 CURSOR FOR
1381 SELECT group_id FROM fsgroup
1382 WHERE filsys_id = :iid;
1383 EXEC SQL OPEN csr211;
1386 EXEC SQL FETCH csr211 INTO :id1;
1391 if ((f = hash_lookup(filesys, id1)))
1392 printf("FSGroup %s has missing member %d\n", f->name, iid);
1394 printf("FSGroup %d has missing member %d\n", id1, iid);
1396 EXEC SQL CLOSE csr211;
1400 int show_quota_nouser(void *id)
1402 EXEC SQL BEGIN DECLARE SECTION;
1403 int iid = (int)id, id1, found = 1;
1404 EXEC SQL END DECLARE SECTION;
1406 EXEC SQL DECLARE csr212 CURSOR FOR
1407 SELECT filsys_id FROM quota
1408 WHERE entity_id = :iid AND type = 'USER';
1409 EXEC SQL OPEN csr212;
1412 EXEC SQL FETCH csr212 INTO :id1;
1417 printf("Quota on fs %d for non-existant user %d\n", id1, iid);
1419 EXEC SQL CLOSE csr212;
1423 int show_quota_nolist(void *id)
1425 EXEC SQL BEGIN DECLARE SECTION;
1426 int iid = (int)id, id1, found = 1;
1427 EXEC SQL END DECLARE SECTION;
1429 EXEC SQL DECLARE csr213 CURSOR FOR
1430 SELECT filsys_id FROM quota
1431 WHERE entity_id = :iid AND type = 'GROUP';
1432 EXEC SQL OPEN csr213;
1435 EXEC SQL FETCH csr213 INTO :id1;
1440 printf("Quota on fs %d for non-existant list %d\n", id1, iid);
1442 EXEC SQL CLOSE csr213;
1446 void fix_quota_nouser(void *id)
1448 EXEC SQL BEGIN DECLARE SECTION;
1449 int iid = (int)id, rowcount;
1450 EXEC SQL END DECLARE SECTION;
1452 EXEC SQL DELETE FROM quota
1453 WHERE entity_id = :iid AND type = 'USER';
1454 rowcount = sqlca.sqlerrd[2];
1456 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1458 printf("Not deleted\n");
1462 void fix_quota_nolist(void *id)
1464 EXEC SQL BEGIN DECLARE SECTION;
1465 int iid = (int)id, rowcount;
1466 EXEC SQL END DECLARE SECTION;
1468 EXEC SQL DELETE FROM quota WHERE entity_id = :iid AND type = 'GROUP';
1469 rowcount = sqlca.sqlerrd[2];
1471 printf("%d entr%s deleted\n", rowcount, rowcount == 1 ? "y" : "ies");
1473 printf("Not deleted\n");
1477 int show_quota_nofs(void *id)
1479 EXEC SQL BEGIN DECLARE SECTION;
1480 int iid = (int)id, id1, found = 1;
1481 char type[QUOTA_TYPE_SIZE];
1482 EXEC SQL END DECLARE SECTION;
1484 EXEC SQL DECLARE csr214 CURSOR FOR
1485 SELECT entity_id, type FROM quota
1486 WHERE filsys_id = :iid;
1487 EXEC SQL OPEN csr214;
1490 EXEC SQL FETCH csr214 INTO :id1, :type;
1495 printf("Quota for %s %d on non-existant filesys %d\n", type, id1, iid);
1497 EXEC SQL CLOSE csr214;
1501 void fix_quota_nofs(void *id)
1503 single_delete("quota", "filsys_id", (int)id);
1506 int show_quota_wrongpid(void *id)
1508 EXEC SQL BEGIN DECLARE SECTION;
1509 int iid = (int)id, id1, found = 1;
1510 char type[QUOTA_TYPE_SIZE];
1511 EXEC SQL END DECLARE SECTION;
1514 f = hash_lookup(filesys, iid);
1515 EXEC SQL DECLARE csr215 CURSOR FOR
1516 SELECT entity_id, type FROM quota
1517 WHERE filsys_id = :iid;
1518 EXEC SQL OPEN csr215;
1521 EXEC SQL FETCH csr215 INTO :id1, :type;
1526 printf("Quota for %s %d on filesys %s has wrong phys_id %d\n",
1527 type, id1, f->name, iid);
1529 EXEC SQL CLOSE csr215;
1533 void fix_quota_physid(void *id)
1535 EXEC SQL BEGIN DECLARE SECTION;
1536 int iid = (int)id, rowcount, id1;
1537 EXEC SQL END DECLARE SECTION;
1539 id1 = ((struct filesys *)hash_lookup(filesys, iid))->phys_id;
1540 EXEC SQL UPDATE quota SET phys_id = :id1
1541 WHERE filsys_id = :iid AND phys_id != :id1;
1542 rowcount = sqlca.sqlerrd[2];
1544 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1546 printf("Not fixed\n");
1550 int show_srv_user(void *id)
1552 EXEC SQL BEGIN DECLARE SECTION;
1553 char name[SERVERS_NAME_SIZE];
1555 EXEC SQL END DECLARE SECTION;
1558 EXEC SQL DECLARE csr216 CURSOR FOR
1559 SELECT name FROM servers
1560 WHERE acl_type = 'USER' and acl_id = :iid;
1561 EXEC SQL OPEN csr216;
1564 EXEC SQL FETCH csr216 INTO :name;
1569 printf("Service %s has acl non-existant user %d\n", name, iid);
1572 EXEC SQL CLOSE csr216;
1576 int show_srv_list(void *id)
1578 EXEC SQL BEGIN DECLARE SECTION;
1579 char name[SERVERS_NAME_SIZE];
1581 EXEC SQL END DECLARE SECTION;
1584 EXEC SQL DECLARE csr217 CURSOR FOR
1585 SELECT name FROM servers
1586 WHERE acl_type = 'LIST' AND acl_id = :iid;
1587 EXEC SQL OPEN csr217;
1590 EXEC SQL FETCH csr217 INTO :name;
1595 printf("Service %s has acl non-existant list %d\n", name, iid);
1598 EXEC SQL CLOSE csr217;
1602 void zero_srv_user(void *id)
1604 EXEC SQL BEGIN DECLARE SECTION;
1605 int iid = (int)id, rowcount;
1606 EXEC SQL END DECLARE SECTION;
1608 EXEC SQL UPDATE servers SET acl_id = 0 WHERE acl_id = :iid AND
1610 rowcount = sqlca.sqlerrd[2];
1612 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1614 printf("Not fixed\n");
1615 modified("servers");
1618 void zero_srv_list(void *id)
1620 EXEC SQL BEGIN DECLARE SECTION;
1621 int iid = (int)id, rowcount;
1622 EXEC SQL END DECLARE SECTION;
1624 EXEC SQL UPDATE servers SET acl_id = 0 WHERE acl_id = :iid AND
1626 rowcount = sqlca.sqlerrd[2];
1628 printf("%d entr%s fixed\n", rowcount, rowcount == 1 ? "y" : "ies");
1630 printf("Not fixed\n");
1631 modified("servers");
1634 int show_krb_usr(void *id)
1636 EXEC SQL BEGIN DECLARE SECTION;
1637 int iid = (int)id, found = 1, id1;
1638 EXEC SQL END DECLARE SECTION;
1642 EXEC SQL DECLARE csr218 CURSOR FOR
1643 SELECT string_id FROM krbmap
1644 WHERE users_id = :iid;
1645 EXEC SQL OPEN csr218;
1648 EXEC SQL FETCH csr218 INTO :id1;
1652 if ((s = hash_lookup(strings, id1)))
1657 printf("Kerberos map for non-existant user %d to principal %s\n",
1660 EXEC SQL CLOSE csr218;
1664 int show_krb_str(void *id)
1666 EXEC SQL BEGIN DECLARE SECTION;
1667 int iid = (int)id, found = 1, id1;
1668 EXEC SQL END DECLARE SECTION;
1672 EXEC SQL DECLARE csr219 CURSOR FOR
1673 SELECT users_id FROM krbmap
1674 WHERE string_id = :iid;
1675 EXEC SQL OPEN csr219;
1678 EXEC SQL FETCH csr219 INTO :id1;
1682 if ((u = hash_lookup(users, id1)))
1687 printf("Kerberos map for user %s (%d) to non-existant string %d\n",
1690 EXEC SQL CLOSE csr219;
1696 struct save_queue *sq, *sq1, *sq2, *sq3, *sq4, *sq5;
1703 printf("Phase 2 - Checking references\n");
1705 dprintf("Checking users...\n");
1706 hash_step(users, user_check, NULL);
1708 dprintf("Checking machines...\n");
1709 hash_step(machines, mach_check, NULL);
1711 dprintf("Checking subnets...\n");
1712 hash_step(subnets, subnet_check, NULL);
1714 dprintf("Checking clusters...\n");
1715 hash_step(clusters, cluster_check, NULL);
1717 dprintf("Checking mcmap...\n");
1720 EXEC SQL DECLARE csr221 CURSOR FOR
1721 SELECT mach_id, clu_id FROM mcmap;
1722 EXEC SQL OPEN csr221;
1725 EXEC SQL BEGIN DECLARE SECTION;
1726 int mach_id, clu_id;
1727 EXEC SQL END DECLARE SECTION;
1729 EXEC SQL FETCH csr221 INTO :mach_id, :clu_id;
1733 if (!(m = hash_lookup(machines, mach_id)))
1734 sq_save_unique_data(sq1, (void *)mach_id);
1735 else if (!hash_lookup(clusters, clu_id))
1736 sq_save_unique_data(sq2, (void *)clu_id);
1740 EXEC SQL CLOSE csr221;
1741 generic_delete(sq1, show_mcm_mach, "mcmap", "mach_id", 1);
1742 generic_delete(sq2, show_mcm_clu, "mcmap", "clu_id", 1);
1744 dprintf("Checking service clusters...\n");
1746 EXEC SQL DECLARE csr222 CURSOR FOR
1747 SELECT clu_id FROM svc;
1748 EXEC SQL OPEN csr222;
1751 EXEC SQL BEGIN DECLARE SECTION;
1753 EXEC SQL END DECLARE SECTION;
1755 EXEC SQL FETCH csr222 INTO :clu_id;
1759 if (!hash_lookup(clusters, clu_id))
1760 sq_save_unique_data(sq1, (void *)clu_id);
1762 EXEC SQL CLOSE csr222;
1763 generic_delete(sq1, show_svc, "svc", "clu_id", 1);
1765 dprintf("Checking lists...\n");
1766 hash_step(lists, list_check, NULL);
1768 dprintf("Checking members...\n");
1775 EXEC SQL DECLARE csr223 CURSOR FOR
1776 SELECT list_id, member_type, member_id, ref_count, direct, rowid
1777 FROM imembers FOR UPDATE OF member_id;
1778 EXEC SQL OPEN csr223;
1781 EXEC SQL BEGIN DECLARE SECTION;
1782 int list_id, id, ref_count, direct;
1783 char type[IMEMBERS_MEMBER_TYPE_SIZE];
1784 EXEC SQL END DECLARE SECTION;
1786 EXEC SQL FETCH csr223 INTO :list_id, :type, :id,
1787 :ref_count, :direct, :rowid;
1791 if (!(l = hash_lookup(lists, list_id)))
1792 sq_save_unique_data(sq1, (void *)list_id);
1793 else if (type[0] == 'U' && !hash_lookup(users, id))
1794 sq_save_unique_data(sq2, (void *)id);
1795 else if (type[0] == 'L' && !hash_lookup(lists, id))
1796 sq_save_unique_data(sq3, (void *)id);
1797 else if (type[0] == 'S' && !maybe_fixup_unref_string2("imembers", "member_id", strtrim(rowid), id))
1798 sq_save_unique_data(sq4, (void *)id);
1799 else if (type[0] == 'K' && !maybe_fixup_unref_string2("imembers", "member_id", strtrim(rowid), id))
1800 sq_save_unique_data(sq5, (void *)id);
1804 EXEC SQL CLOSE csr223;
1805 generic_delete(sq1, show_member_list, "imembers", "list_id", 1);
1806 generic_fix(sq2, show_mem_user, "Delete", del_mem_user, 1);
1807 generic_fix(sq3, show_mem_list, "Delete", del_mem_list, 1);
1808 generic_fix(sq4, show_mem_str, "Delete", del_mem_str, 1);
1809 generic_fix(sq5, show_mem_krb, "Delete", del_mem_krb, 1);
1811 dprintf("Checking servers...\n");
1814 EXEC SQL DECLARE csr224 CURSOR FOR
1815 SELECT name, acl_type, acl_id, modby, rowid FROM servers
1816 FOR UPDATE of modby;
1817 EXEC SQL OPEN csr224;
1820 EXEC SQL BEGIN DECLARE SECTION;
1822 char name[SERVERS_NAME_SIZE], acl_type[SERVERS_ACL_TYPE_SIZE];
1823 EXEC SQL END DECLARE SECTION;
1825 EXEC SQL FETCH csr224 INTO :name, :acl_type, :acl_id, :modby, :rowid;
1829 maybe_fixup_modby2("servers", "modby", strtrim(rowid), modby);
1831 if (!strcmp(acl_type, "USER") && !hash_lookup(users, acl_id))
1832 sq_save_data(sq1, (void *)acl_id);
1833 else if (!strcmp(acl_type, "LIST") && !hash_lookup(lists, acl_id))
1834 sq_save_data(sq2, (void *)acl_id);
1836 EXEC SQL CLOSE csr224;
1837 generic_fix(sq1, show_srv_user, "Fix", zero_srv_user, 1);
1838 generic_fix(sq2, show_srv_list, "Fix", zero_srv_list, 1);
1840 dprintf("Checking serverhosts...\n");
1842 EXEC SQL DECLARE csr225 CURSOR FOR
1843 SELECT mach_id, modby, rowid FROM serverhosts
1844 FOR UPDATE OF modby;
1845 EXEC SQL OPEN csr225;
1848 EXEC SQL BEGIN DECLARE SECTION;
1850 EXEC SQL END DECLARE SECTION;
1852 EXEC SQL FETCH csr225 INTO :mach_id, :modby, :rowid;
1856 maybe_fixup_modby2("serverhosts", "modby", strtrim(rowid), modby);
1857 if (!hash_lookup(machines, mach_id))
1858 sq_save_data(sq, (void *)mach_id);
1860 EXEC SQL CLOSE csr225;
1861 generic_fix(sq, show_sh, "Delete", del_sh_mach, 0);
1863 dprintf("Checking nfsphys...\n");
1864 hash_step(nfsphys, check_nfsphys, NULL);
1866 dprintf("Checking filesys...\n");
1867 hash_step(filesys, check_fs, NULL);
1869 dprintf("Checking filesystem groups...\n");
1873 EXEC SQL DECLARE csr226 CURSOR FOR
1874 SELECT group_id, filsys_id FROM fsgroup;
1875 EXEC SQL OPEN csr226;
1878 EXEC SQL BEGIN DECLARE SECTION;
1879 int group_id, filsys_id;
1880 EXEC SQL END DECLARE SECTION;
1882 EXEC SQL FETCH csr226 INTO :group_id, :filsys_id;
1886 if (!(f = hash_lookup(filesys, group_id)))
1887 sq_save_data(sq1, (void *)group_id);
1888 if (!hash_lookup(filesys, filsys_id))
1889 sq_save_data(sq3, (void *)filsys_id);
1891 EXEC SQL CLOSE csr226;
1892 generic_delete(sq1, show_fsg_missing, "fsgroup", "group_id", 0);
1893 generic_delete(sq3, show_fsg_nomember, "fsgroup", "filsys_id", 1);
1895 dprintf("Checking quotas...\n");
1900 EXEC SQL DECLARE csr227 CURSOR FOR
1901 SELECT entity_id, type, filsys_id, phys_id, quota, modby, rowid
1902 FROM quota FOR UPDATE OF modby;
1903 EXEC SQL OPEN csr227;
1906 EXEC SQL BEGIN DECLARE SECTION;
1907 int entity_id, filsys_id, phys_id, quota, modby;
1908 char type[QUOTA_TYPE_SIZE];
1909 EXEC SQL END DECLARE SECTION;
1911 EXEC SQL FETCH csr227 INTO :entity_id, :type, :filsys_id,
1912 :phys_id, :quota, :modby, :rowid;
1916 maybe_fixup_modby2("quota", "modby", strtrim(rowid), modby);
1917 if (type[0] == 'U' && entity_id != 0 && !hash_lookup(users, entity_id))
1918 sq_save_data(sq1, (void *)entity_id);
1919 else if (type[0] == 'G' && !hash_lookup(lists, entity_id))
1920 sq_save_data(sq4, (void *)entity_id);
1921 else if (!(f = hash_lookup(filesys, filsys_id)))
1922 sq_save_data(sq2, (void *)filsys_id);
1923 else if (phys_id != f->phys_id || !(n = hash_lookup(nfsphys, phys_id)))
1924 sq_save_data(sq3, (void *)phys_id);
1928 EXEC SQL CLOSE csr227;
1929 generic_fix(sq1, show_quota_nouser, "Delete", fix_quota_nouser, 1);
1930 generic_fix(sq2, show_quota_nofs, "Delete", fix_quota_nofs, 0);
1931 generic_fix(sq3, show_quota_wrongpid, "Fix", fix_quota_physid, 1);
1932 generic_fix(sq4, show_quota_nolist, "Delete", fix_quota_nolist, 1);
1934 dprintf("Not checking zephyr.\n");
1936 dprintf("Checking hostaccess...\n");
1937 EXEC SQL DECLARE csr228 CURSOR FOR
1938 SELECT mach_id, acl_type, acl_id, modby, rowid FROM hostaccess
1939 FOR UPDATE OF modby;
1940 EXEC SQL OPEN csr228;
1943 EXEC SQL BEGIN DECLARE SECTION;
1944 int mach_id, acl_id, modby;
1945 char acl_type[HOSTACCESS_ACL_TYPE_SIZE];
1946 EXEC SQL END DECLARE SECTION;
1948 EXEC SQL FETCH csr228 INTO :mach_id, :acl_type, :acl_id, :modby, :rowid;
1952 maybe_fixup_modby2("hostaccess", "modby", strtrim(rowid), modby);
1954 if (!hash_lookup(machines, mach_id))
1956 printf("Hostaccess for non-existant host %d\n", mach_id);
1957 printf("Not fixing this error\n");
1959 if (!strcmp(acl_type, "USER") && !hash_lookup(users, acl_id))
1961 printf("Hostaccess for %d is non-existant user %d\n", mach_id, acl_id);
1962 printf("Not fixing this error\n");
1964 else if (!strcmp(acl_type, "LIST") && !hash_lookup(lists, acl_id))
1966 printf("Hostaccess for %d is non-existant list %d\n", mach_id, acl_id);
1967 printf("Not fixing this error\n");
1970 EXEC SQL CLOSE csr228;
1972 dprintf("Checking krbmap...\n");
1975 EXEC SQL DECLARE csr230 CURSOR FOR
1976 SELECT users_id, string_id, rowid FROM krbmap
1977 FOR UPDATE OF string_id;
1978 EXEC SQL OPEN csr230;
1981 EXEC SQL BEGIN DECLARE SECTION;
1982 int users_id, string_id;
1983 EXEC SQL END DECLARE SECTION;
1985 EXEC SQL FETCH csr230 INTO :users_id, :string_id, :rowid;
1989 if (!hash_lookup(users, users_id))
1990 sq_save_unique_data(sq1, (void *)users_id);
1991 else if (!maybe_fixup_unref_string2("krbmap", "string_id", strtrim(rowid), string_id))
1992 sq_save_unique_data(sq2, (void *)string_id);
1994 EXEC SQL CLOSE csr230;
1995 generic_delete(sq1, show_krb_usr, "krbmap", "users_id", 1);
1996 generic_delete(sq2, show_krb_str, "krbmap", "string_id", 1);
1998 dprintf("Checking capacls...\n");
1999 EXEC SQL DECLARE csr231 CURSOR FOR
2000 SELECT list_id, tag FROM capacls;
2001 EXEC SQL OPEN csr231;
2004 EXEC SQL BEGIN DECLARE SECTION;
2006 char tag[CAPACLS_TAG_SIZE];
2007 EXEC SQL END DECLARE SECTION;
2009 EXEC SQL FETCH csr231 INTO :list_id, :tag;
2013 if (!hash_lookup(lists, list_id))
2015 printf("Capacl for %s is non-existant list %d\n", tag, list_id);
2016 printf("Not fixing this error\n");
2019 EXEC SQL CLOSE csr231;
2021 dprintf("Checking hostaliases\n");
2023 EXEC SQL DECLARE csr232 CURSOR FOR
2024 SELECT mach_id FROM hostalias;
2025 EXEC SQL OPEN csr232;
2028 EXEC SQL BEGIN DECLARE SECTION;
2030 EXEC SQL END DECLARE SECTION;
2032 EXEC SQL FETCH csr232 INTO :mach_id;
2036 if (!hash_lookup(machines, mach_id))
2037 sq_save_unique_data(sq1, (void *)mach_id);
2039 EXEC SQL CLOSE csr232;
2040 generic_delete(sq1, show_hostalias, "hostalias", "mach_id", 1);
2042 dprintf("Checking printers\n");
2048 EXEC SQL DECLARE csr233 CURSOR FOR
2049 SELECT mach_id, loghost, rm, rq, ac, lpc_acl, modby, rowid FROM printers;
2050 EXEC SQL OPEN csr233;
2053 EXEC SQL BEGIN DECLARE SECTION;
2054 int mach_id, loghost, rm, rq, ac, lpc_acl, modby;
2055 EXEC SQL END DECLARE SECTION;
2057 EXEC SQL FETCH csr233 INTO :mach_id, :loghost, :rm, :rq, :ac,
2058 :lpc_acl, :modby, :rowid;
2062 maybe_fixup_modby2("printers", "modby", strtrim(rowid), modby);
2063 if (!hash_lookup(machines, mach_id))
2064 sq_save_unique_data(sq1, (void *)mach_id);
2065 else if (!hash_lookup(machines, rm))
2066 sq_save_unique_data(sq2, (void *)rm);
2067 else if (!hash_lookup(machines, rq))
2068 sq_save_unique_data(sq3, (void *)rq);
2070 if (!hash_lookup(lists, ac))
2071 sq_save_unique_data(sq4, (void *)ac);
2072 if (!hash_lookup(lists, lpc_acl))
2073 sq_save_unique_data(sq5, (void *)lpc_acl);
2074 if (!hash_lookup(machines, loghost))
2076 show_printer_loghost((void *)loghost);
2081 EXEC SQL CLOSE csr233;
2082 generic_delete(sq1, show_printer_mach, "printers", "mach_id", 1);
2083 generic_delete(sq2, show_printer_spool, "printers", "rm", 1);
2084 generic_delete(sq3, show_printer_quota, "printers", "rq", 1);
2085 generic_fix(sq4, show_printer_ac, "Clear", fix_printer_ac, 1);
2086 generic_fix(sq5, show_printer_lpc_acl, "Clear", fix_printer_lpc_acl, 1);