summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2014-02-15 14:55:09 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2014-02-15 15:33:47 +0000
commit3d629c91cfa98b75c6685c2a2003e64fd1b612c4 (patch)
treec21f94455edfa9fe266c66e1f9329762b0a53dce /tools
parenta01548ccf192a5b1fa1f4a3e31e1634db39f6b39 (diff)
intel: Add a helper for setting backlight without root rights
Once the xserver stops running as root on kms capabable systems, we will need some other way to access the backlight. The approach taken in this patch moves most of the heavy lifting to a helper that runs with root privileges and pipes our requested brightness into the sysfs backlight interface. Where required, we use pkexec to launch the helper with the elevated privilege. v2: Amalgamate much more of the duplicate code. Keep the daemon and pipe alive for the lifetime of the backlight interface. Provide an alternative for systems without PolicyKit. Signed-off-by: Hans de Goede <hdegoede@redhat.com> [v1] Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tools')
-rw-r--r--tools/.gitignore2
-rw-r--r--tools/Makefile.am30
-rw-r--r--tools/backlight_helper.c51
-rw-r--r--tools/org.x.xf86-video-intel.backlight-helper.policy.in19
4 files changed, 98 insertions, 4 deletions
diff --git a/tools/.gitignore b/tools/.gitignore
index 72150ff9..36868c69 100644
--- a/tools/.gitignore
+++ b/tools/.gitignore
@@ -1 +1,3 @@
intel-virtual-output
+xf86-video-intel-backlight-helper
+org.x.xf86-video-intel.backlight-helper.policy
diff --git a/tools/Makefile.am b/tools/Makefile.am
index d294e2ad..a5667f34 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -20,23 +20,45 @@
AM_CFLAGS = \
@CWARNFLAGS@ \
- $(TOOL_CFLAGS) \
@NOWARNFLAGS@ \
$(NULL)
drivermandir = $(DRIVER_MAN_DIR)
+backlight_helperdir = $(prefix)/libexec
+policydir = $(datarootdir)/polkit-1/actions
+if BUILD_TOOLS
bin_PROGRAMS = intel-virtual-output
driverman_DATA = intel-virtual-output.$(DRIVER_MAN_SUFFIX)
+endif
+
+if BUILD_BACKLIGHT_HELPER
+backlight_helper_PROGRAMS = xf86-video-intel-backlight-helper
+nodist_policy_DATA = org.x.xf86-video-intel.backlight-helper.policy
+
+backlight_helper = $(backlight_helperdir)/xf86-video-intel-backlight-helper
+install-data-hook:
+ -chown root $(backlight_helper) && chmod u+s $(backlight_helper)
+endif
+intel_virtual_output_CFLAGS = \
+ @CWARNFLAGS@ \
+ $(TOOL_CFLAGS) \
+ @NOWARNFLAGS@ \
+ $(NULL)
intel_virtual_output_SOURCES = \
virtual.c \
$(NULL)
+intel_virtual_output_LDADD = \
+ $(TOOL_LIBS) \
+ $(NULL)
-intel_virtual_output_LDADD = $(TOOL_LIBS)
+xf86_video_intel_backlight_helper_SOURCES = \
+ backlight_helper.c \
+ $(NULL)
-EXTRA_DIST = intel-virtual-output.man
-CLEANFILES = $(driverman_DATA)
+EXTRA_DIST = intel-virtual-output.man org.x.xf86-video-intel.backlight-helper.policy.in
+CLEANFILES = $(driverman_DATA) $(nodist_policy_DATA)
# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure
SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man
diff --git a/tools/backlight_helper.c b/tools/backlight_helper.c
new file mode 100644
index 00000000..fc16fcea
--- /dev/null
+++ b/tools/backlight_helper.c
@@ -0,0 +1,51 @@
+#include <stdio.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+
+int main(int argc, char *argv[])
+{
+ struct stat st;
+ char buf[1024], *b = buf;
+ int len, fd;
+
+ if (argc != 2) {
+ fprintf(stderr, "Usage: %s <iface>\n", argv[0]);
+ return 1;
+ }
+
+ snprintf(buf, sizeof(buf), "/sys/class/backlight/%s/brightness", argv[1]);
+ fd = open(buf, O_RDWR);
+ if (fd < 0 || fstat(fd, &st) || major(st.st_dev)) {
+ fprintf(stderr, "Cannot access backlight interface '%s'\n", argv[1]);
+ return 1;
+ }
+
+ while ((len = read(0, b, sizeof(buf) - (b - buf) - 1)) > 0) {
+ len += b - buf;
+ buf[len] = '\0';
+
+ b = buf;
+ do {
+ char *end = strchr(b, '\n');
+ if (end == NULL)
+ break;
+
+ ++end;
+ if (write(fd, b, end - b) != end - b) {
+ fprintf(stderr, "Failed to update backlight interface '%s'\n", argv[1]);
+ return 2;
+ }
+
+ b = end;
+ } while (1);
+
+ memmove(buf, b, len = buf + len - b);
+ b = buf + len;
+ }
+
+ return 0;
+}
diff --git a/tools/org.x.xf86-video-intel.backlight-helper.policy.in b/tools/org.x.xf86-video-intel.backlight-helper.policy.in
new file mode 100644
index 00000000..37e96226
--- /dev/null
+++ b/tools/org.x.xf86-video-intel.backlight-helper.policy.in
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE policyconfig PUBLIC
+ "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd">
+<policyconfig>
+ <vendor>The X.Org project</vendor>
+ <vendor_url>https://01.org/linuxgraphics/community/xf86-video-intel</vendor_url>
+ <icon_name>brightness</icon_name>
+ <action id="org.x.xf86-video-intel.backlight-helper">
+ <description>Modify lcd panel brightness</description>
+ <message>Authentication is required to modify the lcd panel brightness</message>
+ <defaults>
+ <allow_any>no</allow_any>
+ <allow_inactive>no</allow_inactive>
+ <allow_active>yes</allow_active>
+ </defaults>
+ <annotate key="org.freedesktop.policykit.exec.path">@prefix@/libexec/xf86-video-intel-backlight-helper</annotate>
+ </action>
+</policyconfig>