diff options
author | Luke Shumaker <lukeshu@lukeshu.com> | 2017-04-16 01:27:45 -0400 |
---|---|---|
committer | Luke Shumaker <lukeshu@lukeshu.com> | 2017-05-15 19:09:20 -0400 |
commit | 131b228ee70abffea7ca8580af7b5efe2cd36ead (patch) | |
tree | cb2c0c7fb0ff558bf33742761f43a7388c984211 /sd_login/type_seat.go | |
parent | 16143217c55e70b592c8df72b3315c6bc3dbdfd6 (diff) |
sd_login: work on it
Diffstat (limited to 'sd_login/type_seat.go')
-rw-r--r-- | sd_login/type_seat.go | 116 |
1 files changed, 109 insertions, 7 deletions
diff --git a/sd_login/type_seat.go b/sd_login/type_seat.go index fd86663..a62effc 100644 --- a/sd_login/type_seat.go +++ b/sd_login/type_seat.go @@ -1,4 +1,4 @@ -// Copyright (C) 2016 Luke Shumaker <lukeshu@sbcglobal.net> +// Copyright (C) 2016-2017 Luke Shumaker <lukeshu@sbcglobal.net> // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,9 +14,25 @@ package sd_login +import ( + "strconv" + "strings" + + "golang.org/x/sys/unix" +) + +// A Seat represents a set of hardware devices for a workspace; i.e. a +// screen and keyboard. +// +// Multiple sessions may be associated with a seat, but only one +// session may be active on a seat at a time. type Seat string -// GetSeats returns a list of all currently avialable local seats. +func (seat Seat) isValid() bool { + return valid_filename(string(seat)) +} + +// GetSeats returns a list of all currently available local seats. func GetSeats() ([]Seat, error) { strs, err := get_files_in_directory("/run/systemd/seats/") if err != nil { @@ -29,9 +45,95 @@ func GetSeats() ([]Seat, error) { return seats, nil } -func (seat Seat) GetActive() (Session, User, error) -func (seat Seat) GetSessions() ([]Session, []User, error) +// GetActive returns which session is currently active on this seat, +// or nil if there is no currently active session. +func (seat Seat) GetActive() (sess AnnotatedSession, err error) { + if !seat.isValid() { + err = unix.EINVAL + return + } + env, err := parse_env_file("/run/systemd/seats/" + string(seat)) + if err != nil { + return + } + + strName, ok := env["ACTIVE"] + if !ok { + err = unix.ENXIO + return + } + strUid, ok := env["ACTIVE_UID"] + if !ok { + err = unix.ENXIO + return + } + intUid, err := strconv.Atoi(strUid) + if err != nil { + return + } + sess.Session = Session(strName) + sess.User = User(intUid) + + return +} + +// GetSessions returns a list of all sessions associated with the +// seat, whether they are active or not. +func (seat Seat) GetSessions() ([]AnnotatedSession, error) { + if !seat.isValid() { + return nil, unix.EINVAL + } + env, err := parse_env_file("/run/systemd/seats/" + string(seat)) + if err != nil { + return nil, err + } + + strSessions, ok := env["SESSIONS"] + if !ok { + return nil, unix.ENXIO + } + strUids, ok := env["UIDS"] + if !ok { + return nil, unix.ENXIO + } + + arySessions := strings.Fields(strSessions) + aryUids := strings.Fields(strUids) + if len(arySessions) != len(aryUids) { + return nil, unix.ENXIO + } + ret := make([]AnnotatedSession, len(arySessions)) + for i := 0; i < len(arySessions); i++ { + uid, err := strconv.Atoi(aryUids[i]) + if err != nil { + return nil, err + } + ret[i].Session = Session(arySessions[i]) + ret[i].User = User(uid) + } + + return ret, nil +} + +func (seat Seat) can(cap string) (bool, error) { + if !seat.isValid() { + return false, unix.EINVAL + } + env, err := parse_env_file("/run/systemd/seats/" + string(seat)) + if err != nil { + return false, err + } + return parse_boolean(env["CAN_"+cap]) +} -func (seat Seat) CanMultiSession() bool -func (seat Seat) CanTTY() bool -func (seat Seat) CanGraphical() bool +func (seat Seat) CanMultiSession() (bool, error) { + return seat.can("MULTI_SESSION") +} + +func (seat Seat) CanTTY() (bool, error) { + return seat.can("TTY") +} + +func (seat Seat) CanGraphical() (bool, error) { + return seat.can("GRAPHICAL") +} |