/* A callback to print the path of a vnode. */ static afs_uint32 print_vnode_path(afs_vnode *v, XFILE *X, void *refcon) { afs_uint32 r; char *name = 0; /* Do repair, but only for known vnode types */ if (gendump_path && (!(v->field_mask & F_VNODE_TYPE) || v->type != vFile || v->type != vDirectory || v->type != vSymlink)) { r = repair_vnode_cb(v, X, refcon); if (r) return r; } r = Path_Build(X, &phi, v->vnode, &name, 0); if (!r && name) printf(" Path: %s\n", name); if (name) free(name); return r; }
static afs_uint32 munge_admin_acl(afs_vnode * v, XFILE * X, void *refcon) { struct acl_accessList *acl; int add_entry = 1, remove_entry = -1; int i, o, n; acl = (struct acl_accessList *)(v->acl); o = n = ntohl(acl->positive); for (i = 0; i < n; i++) if (ntohl(acl->entries[i].id) == add_admin) add_entry = 0; n = ntohl(acl->negative); for (i = o; i < n + o; i++) if (ntohl(acl->entries[i].id) == add_admin) remove_entry = i; if (add_entry) { for (i = (remove_entry < 0) ? o + n : remove_entry; i > o; i--) { acl->entries[i].id = acl->entries[i - 1].id; acl->entries[i].rights = acl->entries[i - 1].rights; } acl->entries[o].id = htonl(add_admin); acl->entries[o].rights = htonl((PRSFS_READ | PRSFS_LOOKUP | PRSFS_INSERT | PRSFS_DELETE | PRSFS_WRITE | PRSFS_LOCK | PRSFS_ADMINISTER)); acl->positive = htonl(o + 1); if (remove_entry < 0) acl->total = htonl(o + n + 1); else acl->negative = htonl(n - 1); } else if (remove_entry >= 0) { for (i = remove_entry; i < o + n - 1; i++) { acl->entries[i].id = acl->entries[i + 1].id; acl->entries[i].rights = acl->entries[i + 1].rights; } acl->negative = htonl(n - 1); acl->total = htonl(o + n - 1); } return repair_vnode_cb(v, X, refcon); }