xref: /OK3568_Linux_fs/external/xserver/config/config.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright © 2006-2007 Daniel Stone
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun  * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun  * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun  * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun  * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * The above copyright notice and this permission notice (including the next
12*4882a593Smuzhiyun  * paragraph) shall be included in all copies or substantial portions of the
13*4882a593Smuzhiyun  * Software.
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*4882a593Smuzhiyun  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*4882a593Smuzhiyun  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*4882a593Smuzhiyun  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*4882a593Smuzhiyun  * DEALINGS IN THE SOFTWARE.
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * Author: Daniel Stone <daniel@fooishbar.org>
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
27*4882a593Smuzhiyun #include <dix-config.h>
28*4882a593Smuzhiyun #endif
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #include <unistd.h>
31*4882a593Smuzhiyun #include "os.h"
32*4882a593Smuzhiyun #include "inputstr.h"
33*4882a593Smuzhiyun #include "hotplug.h"
34*4882a593Smuzhiyun #include "config-backends.h"
35*4882a593Smuzhiyun #include "systemd-logind.h"
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun void
config_pre_init(void)38*4882a593Smuzhiyun config_pre_init(void)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun #ifdef CONFIG_UDEV
41*4882a593Smuzhiyun     if (!config_udev_pre_init())
42*4882a593Smuzhiyun         ErrorF("[config] failed to pre-init udev\n");
43*4882a593Smuzhiyun #endif
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun void
config_init(void)47*4882a593Smuzhiyun config_init(void)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun #ifdef CONFIG_UDEV
50*4882a593Smuzhiyun     if (!config_udev_init())
51*4882a593Smuzhiyun         ErrorF("[config] failed to initialise udev\n");
52*4882a593Smuzhiyun #elif defined(CONFIG_HAL)
53*4882a593Smuzhiyun     if (!config_hal_init())
54*4882a593Smuzhiyun         ErrorF("[config] failed to initialise HAL\n");
55*4882a593Smuzhiyun #elif defined(CONFIG_WSCONS)
56*4882a593Smuzhiyun     if (!config_wscons_init())
57*4882a593Smuzhiyun         ErrorF("[config] failed to initialise wscons\n");
58*4882a593Smuzhiyun #endif
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun void
config_fini(void)62*4882a593Smuzhiyun config_fini(void)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun #if defined(CONFIG_UDEV)
65*4882a593Smuzhiyun     config_udev_fini();
66*4882a593Smuzhiyun #elif defined(CONFIG_HAL)
67*4882a593Smuzhiyun     config_hal_fini();
68*4882a593Smuzhiyun #elif defined(CONFIG_WSCONS)
69*4882a593Smuzhiyun     config_wscons_fini();
70*4882a593Smuzhiyun #endif
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun void
config_odev_probe(config_odev_probe_proc_ptr probe_callback)74*4882a593Smuzhiyun config_odev_probe(config_odev_probe_proc_ptr probe_callback)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun #if defined(CONFIG_UDEV_KMS)
77*4882a593Smuzhiyun     config_udev_odev_probe(probe_callback);
78*4882a593Smuzhiyun #endif
79*4882a593Smuzhiyun }
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun static void
remove_device(const char * backend,DeviceIntPtr dev)82*4882a593Smuzhiyun remove_device(const char *backend, DeviceIntPtr dev)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun     /* this only gets called for devices that have already been added */
85*4882a593Smuzhiyun     LogMessage(X_INFO, "config/%s: removing device %s\n", backend, dev->name);
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun     /* Call PIE here so we don't try to dereference a device that's
88*4882a593Smuzhiyun      * already been removed. */
89*4882a593Smuzhiyun     input_lock();
90*4882a593Smuzhiyun     ProcessInputEvents();
91*4882a593Smuzhiyun     DeleteInputDeviceRequest(dev);
92*4882a593Smuzhiyun     input_unlock();
93*4882a593Smuzhiyun }
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun void
remove_devices(const char * backend,const char * config_info)96*4882a593Smuzhiyun remove_devices(const char *backend, const char *config_info)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun     DeviceIntPtr dev, next;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun     for (dev = inputInfo.devices; dev; dev = next) {
101*4882a593Smuzhiyun         next = dev->next;
102*4882a593Smuzhiyun         if (dev->config_info && strcmp(dev->config_info, config_info) == 0)
103*4882a593Smuzhiyun             remove_device(backend, dev);
104*4882a593Smuzhiyun     }
105*4882a593Smuzhiyun     for (dev = inputInfo.off_devices; dev; dev = next) {
106*4882a593Smuzhiyun         next = dev->next;
107*4882a593Smuzhiyun         if (dev->config_info && strcmp(dev->config_info, config_info) == 0)
108*4882a593Smuzhiyun             remove_device(backend, dev);
109*4882a593Smuzhiyun     }
110*4882a593Smuzhiyun 
111*4882a593Smuzhiyun     RemoveInputDeviceTraces(config_info);
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun BOOL
device_is_duplicate(const char * config_info)115*4882a593Smuzhiyun device_is_duplicate(const char *config_info)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun     DeviceIntPtr dev;
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun     for (dev = inputInfo.devices; dev; dev = dev->next) {
120*4882a593Smuzhiyun         if (dev->config_info && (strcmp(dev->config_info, config_info) == 0))
121*4882a593Smuzhiyun             return TRUE;
122*4882a593Smuzhiyun     }
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun     for (dev = inputInfo.off_devices; dev; dev = dev->next) {
125*4882a593Smuzhiyun         if (dev->config_info && (strcmp(dev->config_info, config_info) == 0))
126*4882a593Smuzhiyun             return TRUE;
127*4882a593Smuzhiyun     }
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun     return FALSE;
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun struct OdevAttributes *
config_odev_allocate_attributes(void)133*4882a593Smuzhiyun config_odev_allocate_attributes(void)
134*4882a593Smuzhiyun {
135*4882a593Smuzhiyun     struct OdevAttributes *attribs =
136*4882a593Smuzhiyun         xnfcalloc(1, sizeof (struct OdevAttributes));
137*4882a593Smuzhiyun     attribs->fd = -1;
138*4882a593Smuzhiyun     return attribs;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun void
config_odev_free_attributes(struct OdevAttributes * attribs)142*4882a593Smuzhiyun config_odev_free_attributes(struct OdevAttributes *attribs)
143*4882a593Smuzhiyun {
144*4882a593Smuzhiyun     if (attribs->fd != -1)
145*4882a593Smuzhiyun         systemd_logind_release_fd(attribs->major, attribs->minor, attribs->fd);
146*4882a593Smuzhiyun     free(attribs->path);
147*4882a593Smuzhiyun     free(attribs->syspath);
148*4882a593Smuzhiyun     free(attribs->busid);
149*4882a593Smuzhiyun     free(attribs->driver);
150*4882a593Smuzhiyun     free(attribs);
151*4882a593Smuzhiyun }
152