static char * checkin(struct prentry *pre) { struct hash_entry *he, *last; int id; id = pre->id; last = (struct hash_entry *)0; he = hat[IDHash(id)]; while (he) { if (id == he->h_id) return (he->h_name); last = he; he = he->next; } he = malloc(sizeof(struct hash_entry)); if (he == 0) { fprintf(stderr, "pt_util: No Memory for internal hash table.\n"); exit(1); } he->h_id = id; he->next = (struct hash_entry *)0; strncpy(he->h_name, pre->name, PR_MAXNAMELEN); if (last == (struct hash_entry *)0) hat[IDHash(id)] = he; else last->next = he; return (he->h_name); }
afs_int32 AddToIDHash(struct ubik_trans *tt, afs_int32 aid, afs_int32 loc) { /* add entry at loc designated by aid to id hash table */ afs_int32 code; afs_int32 i; struct prentry tentry; if ((aid == PRBADID) || (aid == 0)) return PRINCONSISTENT; i = IDHash(aid); memset(&tentry, 0, sizeof(tentry)); code = pr_ReadEntry(tt, 0, loc, &tentry); if (code) return PRDBFAIL; tentry.nextID = ntohl(cheader.idHash[i]); cheader.idHash[i] = htonl(loc); code = pr_WriteEntry(tt, 0, loc, &tentry); if (code) return PRDBFAIL; code = pr_Write(tt, 0, 72 + HASHSIZE * 4 + i * 4, (char *)&cheader.idHash[i], sizeof(cheader.idHash[i])); if (code) return PRDBFAIL; return PRSUCCESS; }
afs_int32 FindByID(struct ubik_trans *at, afs_int32 aid) { /* returns address of entry if found, 0 otherwise */ afs_int32 code; afs_int32 i; struct prentry tentry; afs_int32 entry; if ((aid == PRBADID) || (aid == 0)) return 0; i = IDHash(aid); entry = ntohl(cheader.idHash[i]); if (entry == 0) return entry; memset(&tentry, 0, sizeof(tentry)); code = pr_ReadEntry(at, 0, entry, &tentry); if (code != 0) return 0; if (aid == tentry.id) return entry; osi_Assert(entry != tentry.nextID); entry = tentry.nextID; while (entry != 0) { memset(&tentry, 0, sizeof(tentry)); code = pr_ReadEntry(at, 0, entry, &tentry); if (code != 0) return 0; if (aid == tentry.id) return entry; osi_Assert(entry != tentry.nextID); entry = tentry.nextID; } return 0; }
static char * id_to_name(int id) { int offset; static struct prentry pre; char *name; name = check_core(id); if (name) return (name); offset = ntohl(prh.idHash[IDHash(id)]); while (offset) { lseek(dbase_fd, offset + HDRSIZE, L_SET); if (read(dbase_fd, &pre, sizeof(struct prentry)) < 0) { fprintf(stderr, "pt_util: read i/o error: %s\n", strerror(errno)); exit(1); } pre.id = ntohl(pre.id); if (pre.id == id) { name = checkin(&pre); return (name); } offset = ntohl(pre.nextID); } return 0; }
afs_int32 RemoveFromIDHash(struct ubik_trans *tt, afs_int32 aid, afs_int32 *loc) /* ??? in case ID hashed twice ??? */ { /* remove entry designated by aid from id hash table */ afs_int32 code; afs_int32 current, trail, i; struct prentry tentry; struct prentry bentry; if ((aid == PRBADID) || (aid == 0)) return PRINCONSISTENT; i = IDHash(aid); current = ntohl(cheader.idHash[i]); memset(&tentry, 0, sizeof(tentry)); memset(&bentry, 0, sizeof(bentry)); trail = 0; if (current == 0) return PRSUCCESS; /* already gone */ code = pr_ReadEntry(tt, 0, current, &tentry); if (code) return PRDBFAIL; while (aid != tentry.id) { osi_Assert(trail != current); trail = current; current = tentry.nextID; if (current == 0) break; code = pr_ReadEntry(tt, 0, current, &tentry); if (code) return PRDBFAIL; } if (current == 0) return PRSUCCESS; /* we didn't find him, so he's already gone */ if (trail == 0) { /* it's the first entry! */ cheader.idHash[i] = htonl(tentry.nextID); code = pr_Write(tt, 0, 72 + HASHSIZE * 4 + i * 4, (char *)&cheader.idHash[i], sizeof(cheader.idHash[i])); if (code) return PRDBFAIL; } else { code = pr_ReadEntry(tt, 0, trail, &bentry); if (code) return PRDBFAIL; bentry.nextID = tentry.nextID; code = pr_WriteEntry(tt, 0, trail, &bentry); if (code) return PRDBFAIL; } *loc = current; return PRSUCCESS; }
static char * check_core(int id) { struct hash_entry *he; he = hat[IDHash(id)]; while (he) { if (id == he->h_id) return (he->h_name); he = he->next; } return 0; }
static void display_group(int id) { int i, offset; int print_grp = 0; offset = ntohl(prh.idHash[IDHash(id)]); while (offset) { lseek(dbase_fd, offset + HDRSIZE, L_SET); if (read(dbase_fd, &pre, sizeof(struct prentry)) < 0) { fprintf(stderr, "pt_util: read i/o error: %s\n", strerror(errno)); exit(1); } fix_pre(&pre); if (pre.id == id) break; offset = pre.nextID; } if (print_id(id)) { fprintf(dfp, FMT_BASE, pre.name, pre.flags, pre.ngroups, pre.id, pre.owner, pre.creator); print_grp = 1; } if ((flags & DO_MEM) == 0) return; for (i = 0; i < PRSIZE; i++) { if ((id = pre.entries[i]) == 0) break; if (id == PRBADID) continue; if (print_id(id) || print_grp == 1) { if (print_grp == 0) { fprintf(dfp, FMT_BASE, pre.name, pre.flags, pre.ngroups, pre.id, pre.owner, pre.creator); print_grp = 2; } fprintf(dfp, FMT_MEM, id_to_name(id), id); } } if (i == PRSIZE) { offset = pre.next; while (offset) { lseek(dbase_fd, offset + HDRSIZE, L_SET); if (read(dbase_fd, &prco, sizeof(struct contentry)) < 0) { fprintf(stderr, "pt_util: read i/o error: %s\n", strerror(errno)); exit(1); } prco.next = ntohl(prco.next); for (i = 0; i < COSIZE; i++) { prco.entries[i] = ntohl(prco.entries[i]); if ((id = prco.entries[i]) == 0) break; if (id == PRBADID) continue; if (print_id(id) || print_grp == 1) { if (print_grp == 0) { fprintf(dfp, FMT_BASE, pre.name, pre.flags, pre.ngroups, pre.id, pre.owner, pre.creator); print_grp = 2; } fprintf(dfp, FMT_MEM, id_to_name(id), id); } } if ((i == COSIZE) && prco.next) offset = prco.next; else offset = 0; } } }