summaryrefslogtreecommitdiffstats
path: root/x11-servers
diff options
context:
space:
mode:
authordumbbell <dumbbell@058c260c-8361-11dd-a0ac-aa2bafec7d09>2014-09-10 05:23:53 +0800
committerdumbbell <dumbbell@058c260c-8361-11dd-a0ac-aa2bafec7d09>2014-09-10 05:23:53 +0800
commit66399ca93b6bf254c194d672af10b39b81ec34e9 (patch)
treef18f74ae3d3550815bedce453fc6f67cd9062581 /x11-servers
parentd7df292dd151659fd8cb5953c2ab2b22fefb5f82 (diff)
downloadxorg-devel-ports-66399ca93b6bf254c194d672af10b39b81ec34e9.tar
xorg-devel-ports-66399ca93b6bf254c194d672af10b39b81ec34e9.tar.gz
xorg-devel-ports-66399ca93b6bf254c194d672af10b39b81ec34e9.tar.bz2
xorg-devel-ports-66399ca93b6bf254c194d672af10b39b81ec34e9.tar.lz
xorg-devel-ports-66399ca93b6bf254c194d672af10b39b81ec34e9.tar.xz
xorg-devel-ports-66399ca93b6bf254c194d672af10b39b81ec34e9.tar.zst
xorg-devel-ports-66399ca93b6bf254c194d672af10b39b81ec34e9.zip
x11-servers/xorg-server: Update devd patch to support sysmouse
git-svn-id: https://trillian.chruetertee.ch/svn/ports/trunk@1511 058c260c-8361-11dd-a0ac-aa2bafec7d09
Diffstat (limited to 'x11-servers')
-rw-r--r--x11-servers/xorg-server/files/extra-new-devd97
1 files changed, 71 insertions, 26 deletions
diff --git a/x11-servers/xorg-server/files/extra-new-devd b/x11-servers/xorg-server/files/extra-new-devd
index c3d54f2..343b409 100644
--- a/x11-servers/xorg-server/files/extra-new-devd
+++ b/x11-servers/xorg-server/files/extra-new-devd
@@ -1,9 +1,11 @@
-Index: config/devd.c
-@@ -0,0 +1,388 @@
+--- config/devd.c.orig 2014-09-09 21:28:03.646653866 +0200
++++ config/devd.c 2014-09-09 22:39:39.978360587 +0200
+@@ -0,0 +1,432 @@
+/*
+ * Copyright (c) 2012 Baptiste Daroussin
+ * Copyright (c) 2013, 2014 Alex Kozlov
+ * Copyright (c) 2014 Robert Millan
++ * Copyright (c) 2014 Jean-Sébastien Pédron
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
@@ -33,6 +35,7 @@ Index: config/devd.c
+
+#include <sys/types.h>
+#include <sys/socket.h>
++#include <sys/stat.h>
+#include <sys/sysctl.h>
+#include <sys/un.h>
+
@@ -67,6 +70,7 @@ Index: config/devd.c
+static struct hw_type hw_types[] = {
+ { "ukbd", ATTR_KEYBOARD, "kbd" },
+ { "atkbd", ATTR_KEYBOARD, "kbd" },
++ { "sysmouse", ATTR_POINTER, "mouse" },
+ { "ums", ATTR_POINTER, "mouse" },
+ { "psm", ATTR_POINTER, "mouse" },
+ { "uhid", ATTR_POINTER, "mouse" },
@@ -77,27 +81,57 @@ Index: config/devd.c
+};
+
+static bool
-+sysctl_exists(const char *format, ...)
++sysctl_exists(const struct hw_type *device, int unit,
++ char *devname, size_t devname_len)
+{
-+ va_list args;
-+ char *name = NULL;
-+ size_t len;
-+ int ret;
++ char *sysctlname;
++ size_t len;
++ int ret;
+
-+ if (format == NULL)
-+ return false;
++ if (device == NULL || device->driver == NULL)
++ return false;
+
-+ va_start(args, format);
-+ vasprintf(&name, format, args);
-+ va_end(args);
++ /* Check if a sysctl exists. */
++ asprintf(&sysctlname, "dev.%s.%i.%%desc", device->driver, unit);
++ if (sysctlname == NULL)
++ return (0);
+
-+ ret = sysctlbyname(name, NULL, &len, NULL, 0);
++ ret = sysctlbyname(sysctlname, NULL, &len, NULL, 0);
++ free(sysctlname);
+
-+ if (ret == -1)
-+ len = 0;
++ if (ret == 0 && len > 0) {
++ snprintf(devname, devname_len, "%s%i", device->driver, unit);
++ return (1);
++ }
+
-+ free(name);
-+ return (len > 0);
++ return (0);
++}
++
++static bool
++devpath_exists(const struct hw_type *device,
++ char *devname, size_t devname_len)
++{
++ char *devpath;
++ struct stat st;
++ int ret;
++
++ if (device == NULL || device->driver == NULL)
++ return false;
++
++ /* Check if /dev/$driver exists. */
++ asprintf(&devpath, "/dev/%s", device->driver);
++ if (devpath == NULL)
++ return (0);
++
++ ret = stat(devpath, &st);
++ free(devpath);
++
++ if (ret == 0) {
++ strncpy(devname, device->driver, devname_len);
++ return (1);
++ }
++
++ return (0);
+}
+
+static char *
@@ -147,9 +181,12 @@ Index: config/devd.c
+ int fd;
+
+ for (i = 0; hw_types[i].driver != NULL; i++) {
-+ if (strncmp(devname, hw_types[i].driver,
-+ strlen(hw_types[i].driver)) == 0 &&
-+ isdigit(*(devname + strlen(hw_types[i].driver)))) {
++ size_t len;
++
++ len = strlen(hw_types[i].driver);
++ if (strcmp(devname, hw_types[i].driver) == 0 ||
++ (strncmp(devname, hw_types[i].driver, len) == 0 &&
++ isnumber(*(devname + len)))) {
+ attrs.flags |= hw_types[i].flag;
+ break;
+ }
@@ -176,6 +213,7 @@ Index: config/devd.c
+ if (vendor == NULL) {
+ attrs.vendor = strdup("(unnamed)");
+ attrs.product = strdup("(unnamed)");
++ options = input_option_new(options, "name", devname);
+ }
+ else {
+ if ((walk = strchr(vendor, ' ')) != NULL) {
@@ -344,19 +382,26 @@ Index: config/devd.c
+{
+ struct sockaddr_un devd;
+ char devicename[1024];
-+ int i, j;
++ int i, j, ret;
+
+ /* first scan the sysctl to determine the hardware if needed */
-+
+ for (i = 0; hw_types[i].driver != NULL; i++) {
-+ for (j = 0; sysctl_exists("dev.%s.%i.%%desc", hw_types[i].driver, j);
-+ j++) {
-+ snprintf(devicename, sizeof(devicename), "%s%i", hw_types[i].driver,
-+ j);
++ for (j = 0; j < 16; j++) {
++ ret = sysctl_exists(&hw_types[i], j,
++ devicename, sizeof(devicename));
++ if (!ret)
++ continue;
++
+ device_added(devicename);
+ }
+
++ ret = devpath_exists(&hw_types[i], devicename, sizeof(devicename));
++ if (!ret)
++ continue;
++
++ device_added(devicename);
+ }
++
+ sock_devd = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock_devd < 0) {
+ ErrorF("config/devd: Fail opening stream socket");