summaryrefslogtreecommitdiff
path: root/dix/resource.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2008-08-06 15:26:24 -0700
committerKeith Packard <keithp@keithp.com>2009-03-09 13:08:09 -0700
commitf8dd80d13bb5313a11b38b280f8ad3e22f0a6300 (patch)
treee0aea0e92304c050bb9eda0b7e4b71ad1d242e90 /dix/resource.c
parent0d9a42dc0380d1583889b6b6521bd5a2451735d4 (diff)
Replace dixLookupResource by dixLookupResourceBy{Type,Class}
dixLookupResource attempted to automatically detect whether the caller wanted a lookup by-type or by-class, unfortunately, it guessed wrong for RT_NONE. Instead of trying to make the guess better, this patch just reverts the unification and creates separate functions for each operation.
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)