The kernel guarantees that the MST path property blob of a connector has a certain format and this property is immutable - can't be changed from user space. With that in mind, reduce the parsing code to a minimum matching the format criteria.
(Preparation to fold the parsing into output name creation function.) Signed-off-by: Daniel Martin <consume.no...@gmail.com> --- hw/xfree86/drivers/modesetting/drmmode_display.c | 41 +++++++++--------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/hw/xfree86/drivers/modesetting/drmmode_display.c b/hw/xfree86/drivers/modesetting/drmmode_display.c index 404bb1dc2..7ff55ef24 100644 --- a/hw/xfree86/drivers/modesetting/drmmode_display.c +++ b/hw/xfree86/drivers/modesetting/drmmode_display.c @@ -1636,48 +1636,37 @@ static xf86OutputPtr find_output(ScrnInfoPtr pScrn, int id) return NULL; } -static int parse_path_blob(drmModePropertyBlobPtr path_blob, int *conn_base_id, char **path) +static Bool +parse_path_blob(drmModePropertyBlobPtr path_blob, + int *conn_base_id, char **extra_path) { - char *conn; - char conn_id[5]; - int id, len; - char *blob_data; + char *colon, *dash; if (!path_blob) - return -1; + return FALSE; - blob_data = path_blob->data; - /* we only handle MST paths for now */ - if (strncmp(blob_data, "mst:", 4)) - return -1; + colon = strchr(path_blob->data, ':'); + dash = strchr(path_blob->data, '-'); - conn = strchr(blob_data + 4, '-'); - if (!conn) - return -1; - len = conn - (blob_data + 4); - if (len + 1> 5) - return -1; - memcpy(conn_id, blob_data + 4, len); - conn_id[len + 1] = '\0'; - id = strtoul(conn_id, NULL, 10); + if (colon && dash) { + *conn_base_id = strtoul(colon + 1, NULL, 10); + *extra_path = dash + 1; - *conn_base_id = id; + return TRUE; + } - *path = conn + 1; - return 0; + return FALSE; } static void drmmode_create_name(ScrnInfoPtr pScrn, drmModeConnectorPtr koutput, char *name, - drmModePropertyBlobPtr path_blob) + drmModePropertyBlobPtr path_blob) { - int ret; char *extra_path; int conn_id; xf86OutputPtr output; - ret = parse_path_blob(path_blob, &conn_id, &extra_path); - if (ret == -1) + if (!parse_path_blob(path_blob, &conn_id, &extra_path)) goto fallback; output = find_output(pScrn, conn_id); -- 2.13.6 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: https://lists.x.org/mailman/listinfo/xorg-devel