Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 468910 | Differences between
and this patch

Collapse All | Expand All

(-)kde-workspace-4.10.2/CMakeLists.txt.kdm_logind (+3 lines)
Lines 76-81 if(Q_WS_X11) Link Here
76
  endif(NOT X11_Xcursor_FOUND)
76
  endif(NOT X11_Xcursor_FOUND)
77
endif(Q_WS_X11)
77
endif(Q_WS_X11)
78
78
79
macro_optional_find_package(Systemd)
80
macro_log_feature(SYSTEMD_FOUND "systemd" "Init and service manager for Linux" "http://www.freedesktop.org/wiki/Software/systemd" FALSE "" "Provides automatic multi-seat, session and power management features")
81
79
macro_optional_find_package(GLIB2)
82
macro_optional_find_package(GLIB2)
80
macro_log_feature(GLIB2_FOUND "glib2" "Low-level core library for data structure handling, portability wrappers, etc." "http://www.gtk.org" FALSE "2.x" "Needed to build the kxkb keyboard map control program and provide XMMS support in the Now Playing Plasma data engine")
83
macro_log_feature(GLIB2_FOUND "glib2" "Low-level core library for data structure handling, portability wrappers, etc." "http://www.gtk.org" FALSE "2.x" "Needed to build the kxkb keyboard map control program and provide XMMS support in the Now Playing Plasma data engine")
81
84
(-)kde-workspace-4.10.2/cmake/modules/CMakeLists.txt.kdm_logind (+1 lines)
Lines 9-14 set(cmakeFiles FindCkConnector.cmake Link Here
9
               FindOpenGLES.cmake
9
               FindOpenGLES.cmake
10
               FindPAM.cmake
10
               FindPAM.cmake
11
               FindSensors.cmake
11
               FindSensors.cmake
12
               FindSystemd.cmake
12
               PkgConfigGetVar.cmake
13
               PkgConfigGetVar.cmake
13
               UnixAuth.cmake )
14
               UnixAuth.cmake )
14
15
(-)kde-workspace-4.10.2/cmake/modules/FindSystemd.cmake.kdm_logind (+39 lines)
Line 0 Link Here
1
# Finds systemd and its libraries
2
# Not a huge module but sufficient for now
3
# Uses the same semantics as pkg_check_modules, i.e. ${LIB}{_FOUND,_INCLUDE_DIR,_LIBRARIES}
4
# where ${LIB} can be one of the following:
5
#     LIBSYSTEMD_JOURNAL, SYSTEMD, LIBSYSTEMD_DAEMON, LIBSYSTEMD_LOGIN, LIBSYSTEMD_ID128
6
#
7
# Copyright: Red Hat, Inc. 2013
8
# Author: Martin Briza <mbriza@redhat.com>
9
#
10
# Distributed under the BSD license. See COPYING-CMAKE-SCRIPTS for details.
11
12
#defining any of these disables systemd support
13
if (NOT LIBSYSTEMD_JOURNAL_FOUND AND
14
    NOT SYSTEMD_FOUND AND
15
    NOT LIBSYSTEMD_DAEMON_FOUND AND
16
    NOT LIBSYSTEMD_LOGIN_FOUND AND
17
    NOT LIBSYSTEMD_ID128_FOUND)
18
find_package(PkgConfig)
19
if (PKG_CONFIG_FOUND)
20
    pkg_check_modules(LIBSYSTEMD_JOURNAL QUIET "libsystemd-journal")
21
    pkg_check_modules(SYSTEMD QUIET "systemd")
22
    pkg_check_modules(LIBSYSTEMD_DAEMON QUIET "libsystemd-daemon")
23
    pkg_check_modules(LIBSYSTEMD_LOGIN QUIET "libsystemd-login")
24
    pkg_check_modules(LIBSYSTEMD_ID128 QUIET "libsystemd-id128")
25
endif (PKG_CONFIG_FOUND)
26
27
if (SYSTEMD_FOUND)
28
    message(STATUS "Found systemd")
29
endif(SYSTEMD_FOUND)
30
31
mark_as_advanced(LIBSYSTEMD_JOURNAL_FOUND       SYSTEMD_FOUND       LIBSYSTEMD_DAEMON_FOUND       LIBSYSTEMD_LOGIN_FOUND       LIBSYSTEMD_ID128_FOUND)
32
mark_as_advanced(LIBSYSTEMD_JOURNAL_INCLUDE_DIR SYSTEMD_INCLUDE_DIR LIBSYSTEMD_DAEMON_INCLUDE_DIR LIBSYSTEMD_LOGIN_INCLUDE_DIR LIBSYSTEMD_ID128_INCLUDE_DIR)
33
mark_as_advanced(LIBSYSTEMD_JOURNAL_LIBRARIES   SYSTEMD_LIBRARIES   LIBSYSTEMD_DAEMON_LIBRARIES   LIBSYSTEMD_LOGIN_LIBRARIES   LIBSYSTEMD_ID128_LIBRARIES)
34
35
endif (NOT LIBSYSTEMD_JOURNAL_FOUND AND
36
       NOT SYSTEMD_FOUND AND
37
       NOT LIBSYSTEMD_DAEMON_FOUND AND
38
       NOT LIBSYSTEMD_LOGIN_FOUND AND
39
       NOT LIBSYSTEMD_ID128_FOUND)
(-)kde-workspace-4.10.2/kdm/backend/dm.c.kdm_logind (+179 lines)
Lines 50-55 from the copyright holder. Link Here
50
# include <sys/vt.h>
50
# include <sys/vt.h>
51
#endif
51
#endif
52
52
53
#ifdef WITH_SYSTEMD
54
# include <systemd/sd-login.h>
55
# include <systemd/sd-daemon.h>
56
57
#define SYSTEMD_FAILURE_LIMIT 25
58
59
 static int systemdMonitorInit(void);
60
 static void systemdMonitorDeinit();
61
 static int systemdStartDisplay(char *);
62
 static void systemdCheckAdded(char **);
63
 static void systemdCheckRemoved(char **);
64
 static void systemdHandleChange();
65
66
 sd_login_monitor *systemd_monitor = NULL;
67
 int systemd_monitor_fd = -1;
68
#endif
69
53
static void sigHandler(int n);
70
static void sigHandler(int n);
54
static int scanConfigs(int force);
71
static int scanConfigs(int force);
55
static void startDisplay(struct display *d);
72
static void startDisplay(struct display *d);
Lines 308-314 main(int argc, char **argv) Link Here
308
#ifdef XDMCP
325
#ifdef XDMCP
309
    updateListenSockets();
326
    updateListenSockets();
310
#endif
327
#endif
328
329
#ifdef WITH_SYSTEMD
330
    if (systemdMonitorInit())
331
        systemdHandleChange();
332
#endif
333
311
    mainLoop();
334
    mainLoop();
335
#ifdef WITH_SYSTEMD
336
    systemdMonitorDeinit();
337
#endif
312
    closeCtrl(0);
338
    closeCtrl(0);
313
    if (sdRec.how) {
339
    if (sdRec.how) {
314
        int pid;
340
        int pid;
Lines 1280-1285 mainLoop(void) Link Here
1280
                }
1306
                }
1281
                continue;
1307
                continue;
1282
            }
1308
            }
1309
                logError("STARTING");
1310
#ifdef WITH_SYSTEMD
1311
            if (systemd_monitor_fd >= 0 && FD_ISSET(systemd_monitor_fd, &reads)) {
1312
                systemdHandleChange();
1313
                sd_login_monitor_flush(systemd_monitor);
1314
                continue;
1315
            }
1316
#endif
1283
#ifdef XDMCP
1317
#ifdef XDMCP
1284
            if (processListenSockets(&reads))
1318
            if (processListenSockets(&reads))
1285
                continue;
1319
                continue;
Lines 1304-1309 mainLoop(void) Link Here
1304
    }
1338
    }
1305
}
1339
}
1306
1340
1341
#ifdef WITH_SYSTEMD
1342
static int
1343
systemdMonitorInit(void)
1344
{
1345
    if (sd_booted() <= 0) {
1346
        logError("Didn't boot with systemd, automatic multiseat won't be enabled\n");
1347
        return False;
1348
    }
1349
1350
    int check = sd_login_monitor_new("seat", &systemd_monitor);
1351
    if (check < 0) {
1352
        logError("Can't get systemd monitor: %d, automatic multiseat won't be enabled\n", check);
1353
        return False;
1354
    }
1355
1356
    systemd_monitor_fd = sd_login_monitor_get_fd(systemd_monitor);
1357
    if (systemd_monitor_fd < 0) {
1358
        logError("Can't retrieve file descriptor from the systemd monitor: %d, automatic multiseat won't be enabled\n", systemd_monitor_fd);
1359
        sd_login_monitor_unref(systemd_monitor);
1360
        systemd_monitor_fd = -1;
1361
        return False;
1362
    }
1363
1364
    registerInput(systemd_monitor_fd);
1365
    return True;
1366
}
1367
1368
static void
1369
systemdMonitorDeinit(void)
1370
{
1371
    if (systemd_monitor) {
1372
        sd_login_monitor_unref(systemd_monitor);
1373
    }
1374
    systemd_monitor_fd = -1;
1375
}
1376
1377
static int
1378
systemdStartDisplay(char *seat)
1379
{
1380
    struct display *link = NULL;
1381
    for (link = displays; link; link = link-> next) {
1382
        if (link->status == reserve)
1383
            break;
1384
    }
1385
    if (!link) {
1386
        logError("There's not enough reserve displays for all your seats/sessions");
1387
        return False;
1388
    }
1389
    if (!strDup((&link->systemd_seat), seat)) {
1390
        return False;
1391
    }
1392
#ifdef HAVE_VTS
1393
    link->serverVT = 0;
1394
#endif
1395
    link->status = notRunning;
1396
    link->stillThere = True;
1397
    link->authorize = True;
1398
    link->displayType = dLocal | dPermanent;
1399
    link->reqSrvVT = -1;
1400
    link->serverPid = -1;
1401
    return True;
1402
}
1403
1404
static void
1405
systemdCheckAdded(char **seat_names) 
1406
{
1407
    char **iter_name;
1408
    struct display *link;
1409
    for (iter_name = seat_names; *iter_name; iter_name++) {
1410
        if (strcmp(*iter_name, "seat0") == 0)
1411
            continue; /* ignore the main seat */
1412
        int can_graphical = sd_seat_can_graphical(*iter_name);
1413
        for (link = displays; link; link = link->next) {
1414
            if (!link->systemd_seat)
1415
                continue;
1416
            /* see if the can_graphical property didn't change */
1417
            if (strcmp(*iter_name, link->systemd_seat)) {
1418
                if (!can_graphical) {
1419
                    free(link->systemd_seat);
1420
                    link->systemd_seat = NULL;
1421
                    rStopDisplay(link, DS_RESERVE);
1422
                }
1423
                break;
1424
            }
1425
        }
1426
        /* the display wasn't found */
1427
        if (!link) {
1428
            if (can_graphical) {
1429
                /* if starting the display failed, skip this round until the next change */
1430
                if (!systemdStartDisplay(*iter_name))
1431
                    break;
1432
            }
1433
        }
1434
    }
1435
}
1436
1437
static void
1438
systemdCheckRemoved(char **seat_names)
1439
{
1440
    char **iter_name;
1441
    struct display *link;
1442
    for (link = displays; link; link = link->next) {
1443
        for (iter_name = seat_names; *iter_name; iter_name++) {
1444
            if (strcmp(*iter_name, "seat0") == 0)
1445
                continue; /* ignore the main seat */
1446
            if (link->systemd_seat && strcmp(*iter_name, link->systemd_seat) == 0)
1447
                break;
1448
        }
1449
        if (!(*iter_name) && link->systemd_seat) { /* was not found, stop this one */
1450
            free(link->systemd_seat);
1451
            link->systemd_seat = NULL;
1452
            rStopDisplay(link, DS_RESERVE);
1453
        }
1454
    }
1455
}
1456
1457
static void
1458
systemdHandleChange(void)
1459
{
1460
    static int failures = 0;
1461
    char **seat_names;
1462
    char **iter_name;
1463
    int check;
1464
    if ((check = sd_get_seats(&seat_names)) < 0) {
1465
        logError("Can't obtain systemd seats, error %d\n", -check);
1466
        failures++;
1467
        if (failures >= SYSTEMD_FAILURE_LIMIT) {
1468
            logError("%u failed calls to sd_get_seats, disabling systemd multi-seat support\n", SYSTEMD_FAILURE_LIMIT);
1469
            systemdMonitorDeinit();
1470
        }
1471
        return;
1472
    }
1473
1474
    if (!check)
1475
        return;
1476
1477
    systemdCheckAdded(seat_names);
1478
    systemdCheckRemoved(seat_names);
1479
1480
    for (iter_name = seat_names; *iter_name; iter_name++)
1481
        free(*iter_name);
1482
    free(seat_names);
1483
}
1484
#endif
1485
1307
static void
1486
static void
1308
checkDisplayStatus(struct display *d)
1487
checkDisplayStatus(struct display *d)
1309
{
1488
{
(-)kde-workspace-4.10.2/kdm/backend/dm.h.kdm_logind (+3 lines)
Lines 306-311 struct display { Link Here
306
    char *greeterAuthFile;      /* file to store authorization for greeter in */
306
    char *greeterAuthFile;      /* file to store authorization for greeter in */
307
    
307
    
308
    int plymouth_is_running;    /* Plymouth's status */
308
    int plymouth_is_running;    /* Plymouth's status */
309
#ifdef WITH_SYSTEMD
310
    char *systemd_seat;
311
#endif
309
};
312
};
310
313
311
#define d_location   1
314
#define d_location   1
(-)kde-workspace-4.10.2/kdm/backend/CMakeLists.txt.kdm_logind (+5 lines)
Lines 45-50 if (SECURE_RPC) Link Here
45
		rpcauth.c
45
		rpcauth.c
46
	)
46
	)
47
endif (SECURE_RPC)
47
endif (SECURE_RPC)
48
if(LIBSYSTEMD_LOGIN_FOUND AND LIBSYSTEMD_DAEMON_FOUND)
49
    add_definitions( -DWITH_SYSTEMD=1 )
50
    set(KDM_SYSTEMD_LIBRARIES ${LIBSYSTEMD_DAEMON_LIBRARIES} ${LIBSYSTEMD_LOGIN_LIBRARIES} )
51
endif(LIBSYSTEMD_LOGIN_FOUND AND LIBSYSTEMD_DAEMON_FOUND)
48
macro_add_file_dependencies(dm.h ${confci})
52
macro_add_file_dependencies(dm.h ${confci})
49
macro_add_file_dependencies(error.c ${CMAKE_CURRENT_SOURCE_DIR}/printf.c)
53
macro_add_file_dependencies(error.c ${CMAKE_CURRENT_SOURCE_DIR}/printf.c)
50
kde4_add_executable(kdm NOGUI ${kdm_SRCS})
54
kde4_add_executable(kdm NOGUI ${kdm_SRCS})
Lines 60-65 target_link_libraries( kdm Link Here
60
	${NSL_LIBRARIES}
64
	${NSL_LIBRARIES}
61
	${RESOLV_LIBRARIES}
65
	${RESOLV_LIBRARIES}
62
	${SOCKET_LIBRARIES}
66
	${SOCKET_LIBRARIES}
67
	${KDM_SYSTEMD_LIBRARIES}
63
)
68
)
64
if (CKCONNECTOR_FOUND)
69
if (CKCONNECTOR_FOUND)
65
	include_directories(${CKCONNECTOR_INCLUDE_DIR} ${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
70
	include_directories(${CKCONNECTOR_INCLUDE_DIR} ${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
(-)kde-workspace-4.10.2/kdm/backend/server.c.kdm_logind (+15 lines)
Lines 70-75 prepareServerArgv(struct display *d, con Link Here
70
    if (!changeUser(d->serverUID, d->authFile))
70
    if (!changeUser(d->serverUID, d->authFile))
71
        exit(47);
71
        exit(47);
72
72
73
#ifdef WITH_SYSTEMD
74
    if (d->systemd_seat) {
75
        if (!(argv = parseArgs(argv, "-seat")))
76
            exit(47);
77
        if (!(argv = parseArgs(argv, d->systemd_seat)))
78
            exit(47);
79
    }
80
    else {
81
        if (!(argv = parseArgs(argv, "-seat")))
82
            exit(47);
83
        if (!(argv = parseArgs(argv, "seat0")))
84
            exit(47);
85
    }
86
#endif
87
73
    return argv;
88
    return argv;
74
}
89
}
75
90

Return to bug 468910