int pr_ListOwned(afs_int32 oid, namelist *lnames, afs_int32 *moreP) { afs_int32 code; prlist alist; idlist *lids; alist.prlist_len = 0; alist.prlist_val = 0; code = ubik_PR_ListOwned(pruclient, 0, oid, &alist, moreP); if (code) return code; if (*moreP == 1) { /* Remain backwards compatible when moreP was a T/F bit */ fprintf(stderr, "membership list for id %d exceeds display limit\n", oid); *moreP = 0; } lids = (idlist *) &alist; code = pr_IdToName(lids, lnames); xdr_free((xdrproc_t) xdr_prlist, &alist); if (code) return code; return PRSUCCESS; }
int pr_IDListMembers(afs_int32 gid, namelist *lnames) { afs_int32 code; prlist alist; idlist *lids; afs_int32 over; alist.prlist_len = 0; alist.prlist_val = 0; code = ubik_PR_ListElements(pruclient, 0, gid, &alist, &over); if (code) return code; if (over) { fprintf(stderr, "membership list for id %d exceeds display limit\n", gid); } lids = (idlist *) &alist; code = pr_IdToName(lids, lnames); xdr_free((xdrproc_t) xdr_prlist, &alist); if (code) return code; return PRSUCCESS; }
int pr_SIdToName(afs_int32 id, prname name) { namelist lnames; idlist lids; afs_int32 code; lids.idlist_len = 1; lids.idlist_val = malloc(sizeof(afs_int32)); *lids.idlist_val = id; lnames.namelist_len = 0; lnames.namelist_val = 0; code = pr_IdToName(&lids, &lnames); if (lnames.namelist_val) strncpy(name, lnames.namelist_val[0], PR_MAXNAMELEN); else if (code == 0) code = PRINTERNAL; if (lids.idlist_val) free(lids.idlist_val); xdr_free((xdrproc_t) xdr_namelist, &lnames); return code; }
int pr_ListSuperGroups(afs_int32 gid, namelist * lnames) { afs_int32 code; prlist alist; idlist *lids; afs_int32 over; alist.prlist_len = 0; alist.prlist_val = 0; code = ubik_PR_ListSuperGroups(pruclient, 0, gid, &alist, &over); if (code) return code; if (over) { fprintf(stderr, "supergroup list for id %d exceeds display limit\n", gid); } lids = (idlist *) & alist; code = pr_IdToName(lids, lnames); xdr_free((xdrproc_t) xdr_prlist, &alist); return code; }
int pr_IDListExpandedMembers(afs_int32 aid, namelist * lnames) { afs_int32 code; afs_int32 gid; idlist lids; prlist alist; afs_int32 over; struct idhash *members = NULL; afs_int32 *stack = NULL; afs_int32 maxstack = ID_STACK_SIZE; int n = 0; /* number of ids stacked */ int i; int firstpass = 1; code = AllocateIdHash(&members); if (code) { return code; } stack = (afs_int32 *) malloc(sizeof(afs_int32) * maxstack); if (!stack) { code = ENOMEM; goto done; } stack[n++] = aid; while (n) { gid = stack[--n]; /* pop next group id */ alist.prlist_len = 0; alist.prlist_val = NULL; if (firstpass || aid < 0) { firstpass = 0; code = ubik_PR_ListElements(pruclient, 0, gid, &alist, &over); } else { code = ubik_PR_ListSuperGroups(pruclient, 0, gid, &alist, &over); if (code == RXGEN_OPCODE) { alist.prlist_len = 0; alist.prlist_val = NULL; code = 0; /* server does not support supergroups. */ } } if (code) goto done; if (over) { fprintf(stderr, "membership list for id %d exceeds display limit\n", gid); } for (i = 0; i < alist.prlist_len; i++) { afs_int32 found; afs_int32 id; id = alist.prlist_val[i]; found = FindId(members, id); if (found < 0) { code = found; xdr_free((xdrproc_t) xdr_prlist, &alist); goto done; } if (found == 0 && id < 0) { if (n == maxstack) { /* need more stack space */ afs_int32 *tmp; maxstack += n; tmp = (afs_int32 *) realloc(stack, maxstack * sizeof(afs_int32)); if (!tmp) { code = ENOMEM; xdr_free((xdrproc_t) xdr_prlist, &alist); goto done; } stack = tmp; } stack[n++] = id; /* push group id */ } } xdr_free((xdrproc_t) xdr_prlist, &alist); } code = CreateIdList(members, &lids, (aid < 0 ? PRUSERS : PRGROUPS)); if (code) { goto done; } code = pr_IdToName(&lids, lnames); if (lids.idlist_len) free(lids.idlist_val); done: if (stack) free(stack); if (members) FreeIdHash(members); return code; }