/* 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;
}
Exemple #2
0
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);
}