summaryrefslogtreecommitdiff
path: root/dix/resource.c
diff options
context:
space:
mode:
Diffstat (limited to 'dix/resource.c')
-rw-r--r--dix/resource.c39
1 files changed, 34 insertions, 5 deletions
diff --git a/dix/resource.c b/dix/resource.c
index ec1d8cf4c..dc6945dd1 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -844,11 +844,10 @@ LegalNewID(XID id, ClientPtr client)
}
int
-dixLookupResource(pointer *result, XID id, RESTYPE rtype,
- ClientPtr client, Mask mode)
+dixLookupResourceByType(pointer *result, XID id, RESTYPE rtype,
+ ClientPtr client, Mask mode)
{
int cid = CLIENT_ID(id);
- int istype = (rtype & TypeMask) && (rtype != RC_ANY);
ResourcePtr res = NULL;
*result = NULL;
@@ -857,8 +856,38 @@ dixLookupResource(pointer *result, XID id, RESTYPE rtype,
res = clientTable[cid].resources[Hash(cid, id)];
for (; res; res = res->next)
- if ((res->id == id) && ((istype && res->type == rtype) ||
- (!istype && res->type & rtype)))
+ if (res->id == id && res->type == rtype)
+ break;
+ }
+ if (!res)
+ return BadValue;
+
+ if (client) {
+ client->errorValue = id;
+ cid = XaceHook(XACE_RESOURCE_ACCESS, client, id, res->type,
+ res->value, RT_NONE, NULL, mode);
+ if (cid != Success)
+ return cid;
+ }
+
+ *result = res->value;
+ return Success;
+}
+
+int
+dixLookupResourceByClass(pointer *result, XID id, RESTYPE rclass,
+ ClientPtr client, Mask mode)
+{
+ int cid = CLIENT_ID(id);
+ ResourcePtr res = NULL;
+
+ *result = NULL;
+
+ if ((cid < MAXCLIENTS) && clientTable[cid].buckets) {
+ res = clientTable[cid].resources[Hash(cid, id)];
+
+ for (; res; res = res->next)
+ if (res->id == id && (res->type & rclass))
break;
}
if (!res)