[RFC xserver 1/2] xfree86: move systemd-logind ifdefs to call sites
Alex Suykov
alex.suykov at gmail.com
Tue Feb 13 17:22:02 UTC 2018
The original implementation had systemd_logind*() declared either
as prototypes or as inline stubs in the header depending on whether
SYSTEMD_LOGIND was defined. At the call sites, there were no
explicit #ifdefs.
This approach does not work well if there is any other option for
accessing devices beside logind. This patch moves #ifdefs to the call
sites, leaving systemd_logind*() as just unconditional prototypes.
Signed-off-by: Alex Suykov <alex.suykov at gmail.com>
---
config/config.c | 5 +++
config/udev.c | 2 ++
hw/xfree86/common/xf86Events.c | 5 +++
hw/xfree86/common/xf86Init.c | 4 +++
hw/xfree86/common/xf86Xinput.c | 23 +++++++++++---
hw/xfree86/common/xf86platformBus.c | 4 +++
hw/xfree86/os-support/linux/lnx_platform.c | 50 +++++++++++++++---------------
include/systemd-logind.h | 7 -----
8 files changed, 63 insertions(+), 37 deletions(-)
diff --git a/config/config.c b/config/config.c
index fb60295ae..bfb0a450e 100644
--- a/config/config.c
+++ b/config/config.c
@@ -142,7 +142,12 @@ void
config_odev_free_attributes(struct OdevAttributes *attribs)
{
if (attribs->fd != -1)
+#ifdef SYSTEMD_LOGIND
systemd_logind_release_fd(attribs->major, attribs->minor, attribs->fd);
+#else
+ close(attribs->fd);
+#endif
+
free(attribs->path);
free(attribs->syspath);
free(attribs->busid);
diff --git a/config/udev.c b/config/udev.c
index 3a73189e2..ff099d7bd 100644
--- a/config/udev.c
+++ b/config/udev.c
@@ -324,8 +324,10 @@ device_removed(struct udev_device *device)
syspath, path);
config_udev_odev_setup_attribs(path, syspath, major(devnum),
minor(devnum), DeleteGPUDeviceRequest);
+#ifdef SYSTEMD_LOGIND
/* Retry vtenter after a drm node removal */
systemd_logind_vtenter();
+#endif
return;
}
#endif
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 8a800bd8f..48394cd5e 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -526,8 +526,13 @@ xf86VTSwitch(void)
*/
if (xf86VTOwner())
xf86VTLeave();
+#ifdef SYSTEMD_LOGIND
else if (!systemd_logind_controls_session())
xf86VTEnter();
+#else
+ else
+ xf86VTEnter();
+#endif
}
/* Input handler registration */
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index f9843c719..5fbcb2869 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -443,7 +443,9 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
DoShowOptions();
dbus_core_init();
+#ifdef SYSTEMD_LOGIND
systemd_logind_init();
+#endif
/* Do a general bus probe. This will be a PCI probe for x86 platforms */
xf86BusProbe();
@@ -960,7 +962,9 @@ ddxGiveUp(enum ExitCode error)
if (xorgHWOpenConsole)
xf86CloseConsole();
+#ifdef SYSTEMD_LOGIND
systemd_logind_fini();
+#endif
dbus_core_fini();
xf86CloseLog(error);
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 136bf50ff..4f0ab3661 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -84,6 +84,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
+#include <fcntl.h>
#ifdef HAVE_SYS_SYSMACROS_H
#include <sys/sysmacros.h>
#endif
@@ -788,7 +789,11 @@ xf86DeleteInput(InputInfoPtr pInp, int flags)
FreeInputAttributes(pInp->attrs);
if (pInp->flags & XI86_SERVER_FD)
+#ifdef SYSTEMD_LOGIND
systemd_logind_release_fd(pInp->major, pInp->minor, pInp->fd);
+#else
+ close(pInp->fd);
+#endif
/* Remove the entry from the list. */
if (pInp == xf86InputDevs)
@@ -874,9 +879,11 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
{
InputDriverPtr drv = NULL;
DeviceIntPtr dev = NULL;
- Bool paused;
- int rval;
+ int fd, rval = 0;
char *path = NULL;
+#ifdef SYSTEMD_LOGIND
+ Bool paused;
+#endif
drv = xf86LoadInputDriver(pInfo->driver);
if (!drv) {
@@ -909,13 +916,18 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
}
path = xf86CheckStrOption(pInfo->options, "Device", NULL);
+
if (path && pInfo->major == 0 && pInfo->minor == 0)
xf86stat(path, &pInfo->major, &pInfo->minor);
- if (path && (drv->capabilities & XI86_DRV_CAP_SERVER_FD)){
- int fd = systemd_logind_take_fd(pInfo->major, pInfo->minor,
- path, &paused);
+ if (path && drv->capabilities & XI86_DRV_CAP_SERVER_FD){
+#ifdef SYSTEMD_LOGIND
+ fd = systemd_logind_take_fd(pInfo->major, pInfo->minor, path, &paused);
+#else
+ fd = open(path, O_RDONLY | O_CLOEXEC);
+#endif
if (fd != -1) {
+#ifdef SYSTEMD_LOGIND
if (paused) {
/* Put on new_input_devices list for delayed probe */
PausedInputDevicePtr new_device = xnfalloc(sizeof *new_device);
@@ -926,6 +938,7 @@ xf86NewInputDevice(InputInfoPtr pInfo, DeviceIntPtr *pdev, BOOL enable)
free(path);
return BadMatch;
}
+#endif
pInfo->fd = fd;
pInfo->flags |= XI86_SERVER_FD;
pInfo->options = xf86ReplaceIntOption(pInfo->options, "fd", fd);
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index cef47da03..8352e23bc 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -470,7 +470,11 @@ static Bool doPlatformProbe(struct xf86_platform_device *dev, DriverPtr drvp,
if (entity != -1) {
if ((dev->flags & XF86_PDEV_SERVER_FD) && (!drvp->driverFunc ||
!drvp->driverFunc(NULL, SUPPORTS_SERVER_FDS, NULL))) {
+#ifdef SYSTEMD_LOGIND
systemd_logind_release_fd(dev->attribs->major, dev->attribs->minor, dev->attribs->fd);
+#else
+ close(dev->attribs->fd);
+#endif
dev->attribs->fd = -1;
dev->flags &= ~XF86_PDEV_SERVER_FD;
}
diff --git a/hw/xfree86/os-support/linux/lnx_platform.c b/hw/xfree86/os-support/linux/lnx_platform.c
index 11af52c46..fe1af0049 100644
--- a/hw/xfree86/os-support/linux/lnx_platform.c
+++ b/hw/xfree86/os-support/linux/lnx_platform.c
@@ -26,28 +26,32 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
drmSetVersion sv;
drmVersionPtr v;
char *buf;
- int fd;
- int err = 0;
- Bool paused, server_fd = FALSE;
-
- fd = systemd_logind_take_fd(attribs->major, attribs->minor, path, &paused);
- if (fd != -1) {
- if (paused) {
- LogMessage(X_ERROR,
- "Error systemd-logind returned paused fd for drm node\n");
- systemd_logind_release_fd(attribs->major, attribs->minor, -1);
- return FALSE;
- }
- attribs->fd = fd;
- server_fd = TRUE;
- }
+ int fd, err = 0;
- if (fd == -1)
- fd = open(path, O_RDWR, O_CLOEXEC);
+#ifdef SYSTEMD_LOGIND
+ Bool paused;
+ int major = attribs->major;
+ int minor = attribs->minor;
+
+ fd = systemd_logind_take_fd(major, minor, path, &paused);
+#else
+ fd = open(path, O_RDWR | O_CLOEXEC);
+#endif
if (fd == -1)
return FALSE;
+#ifdef SYSTEMD_LOGIND
+ if (paused) {
+ LogMessage(X_ERROR,
+ "Error systemd-logind returned paused fd for drm node\n");
+ systemd_logind_release_fd(major, minor, fd);
+ return FALSE;
+ }
+#endif
+
+ attribs->fd = fd; /* caller will close attribs->fd whenever necessary */
+
sv.drm_di_major = 1;
sv.drm_di_minor = 4;
sv.drm_dd_major = -1; /* Don't care */
@@ -57,7 +61,7 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
if (err) {
xf86Msg(X_ERROR, "%s: failed to set DRM interface version 1.4: %s\n",
path, strerror(-err));
- goto out;
+ return FALSE;
}
/* for a delayed probe we've already added the device */
@@ -66,8 +70,7 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
delayed_index = xf86_num_platform_devices - 1;
}
- if (server_fd)
- xf86_platform_devices[delayed_index].flags |= XF86_PDEV_SERVER_FD;
+ xf86_platform_devices[delayed_index].flags |= XF86_PDEV_SERVER_FD;
buf = drmGetBusid(fd);
xf86_platform_odev_attributes(delayed_index)->busid = XNFstrdup(buf);
@@ -76,16 +79,13 @@ get_drm_info(struct OdevAttributes *attribs, char *path, int delayed_index)
v = drmGetVersion(fd);
if (!v) {
xf86Msg(X_ERROR, "%s: failed to query DRM version\n", path);
- goto out;
+ return FALSE;
}
xf86_platform_odev_attributes(delayed_index)->driver = XNFstrdup(v->name);
drmFreeVersion(v);
-out:
- if (!server_fd)
- close(fd);
- return (err == 0);
+ return TRUE;
}
Bool
diff --git a/include/systemd-logind.h b/include/systemd-logind.h
index a4067d097..f348f0a44 100644
--- a/include/systemd-logind.h
+++ b/include/systemd-logind.h
@@ -33,13 +33,6 @@ int systemd_logind_take_fd(int major, int minor, const char *path, Bool *paus);
void systemd_logind_release_fd(int major, int minor, int fd);
int systemd_logind_controls_session(void);
void systemd_logind_vtenter(void);
-#else
-#define systemd_logind_init()
-#define systemd_logind_fini()
-#define systemd_logind_take_fd(major, minor, path, paus) -1
-#define systemd_logind_release_fd(major, minor, fd) close(fd)
-#define systemd_logind_controls_session() 0
-#define systemd_logind_vtenter()
#endif
#endif
--
2.16.1
More information about the xorg-devel
mailing list