summaryrefslogtreecommitdiff
path: root/sd_login/logind_seat.go
diff options
context:
space:
mode:
Diffstat (limited to 'sd_login/logind_seat.go')
-rw-r--r--sd_login/logind_seat.go58
1 files changed, 39 insertions, 19 deletions
diff --git a/sd_login/logind_seat.go b/sd_login/logind_seat.go
index a62effc..4879950 100644
--- a/sd_login/logind_seat.go
+++ b/sd_login/logind_seat.go
@@ -21,33 +21,46 @@ import (
"golang.org/x/sys/unix"
)
-// A Seat represents a set of hardware devices for a workspace; i.e. a
+// A SeatName 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
+// Multiple sessions may be associated with a seat (if
+// seat.CanMultiSession()), but only one session may be active on a
+// seat at a time.
+type SeatName string
+
+// A SessionNameWithUID is a just a SessionName with a User ID already
+// associated with it, so that a separate lookup for GetUser isn't
+// necessary.
+type SessionNameWithUID struct {
+ SessionName
+ User UserID
+}
+
+func (sess SessionNameWithUID) GetUser() (UserID, error) {
+ return sess.User, nil
+}
-func (seat Seat) isValid() bool {
+func (seat SeatName) isValid() bool {
return valid_filename(string(seat))
}
// GetSeats returns a list of all currently available local seats.
-func GetSeats() ([]Seat, error) {
+func GetSeats() ([]SeatName, error) {
strs, err := get_files_in_directory("/run/systemd/seats/")
if err != nil {
return nil, err
}
- seats := make([]Seat, len(strs))
+ seats := make([]SeatName, len(strs))
for i := range strs {
- seats[i] = Seat(strs[i])
+ seats[i] = SeatName(strs[i])
}
return seats, nil
}
// 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) {
+func (seat SeatName) GetActive() (sess SessionNameWithUID, err error) {
if !seat.isValid() {
err = unix.EINVAL
return
@@ -71,15 +84,15 @@ func (seat Seat) GetActive() (sess AnnotatedSession, err error) {
if err != nil {
return
}
- sess.Session = Session(strName)
- sess.User = User(intUid)
+ sess.SessionName = SessionName(strName)
+ sess.User = UserID(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) {
+func (seat SeatName) GetSessions() ([]SessionNameWithUID, error) {
if !seat.isValid() {
return nil, unix.EINVAL
}
@@ -102,20 +115,20 @@ func (seat Seat) GetSessions() ([]AnnotatedSession, error) {
if len(arySessions) != len(aryUids) {
return nil, unix.ENXIO
}
- ret := make([]AnnotatedSession, len(arySessions))
+ ret := make([]SessionNameWithUID, 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)
+ ret[i].SessionName = SessionName(arySessions[i])
+ ret[i].User = UserID(uid)
}
return ret, nil
}
-func (seat Seat) can(cap string) (bool, error) {
+func (seat SeatName) can(cap string) (bool, error) {
if !seat.isValid() {
return false, unix.EINVAL
}
@@ -126,14 +139,21 @@ func (seat Seat) can(cap string) (bool, error) {
return parse_boolean(env["CAN_"+cap])
}
-func (seat Seat) CanMultiSession() (bool, error) {
+// CanMultiSession returns whether this seat is capable of
+// multi-session, i.e. login sessions in parallel (with only one being
+// active at a time).
+func (seat SeatName) CanMultiSession() (bool, error) {
return seat.can("MULTI_SESSION")
}
-func (seat Seat) CanTTY() (bool, error) {
+// CanTTY returns whether this seat provides TTY functionality,
+// i.e. is useful as a text console.
+func (seat SeatName) CanTTY() (bool, error) {
return seat.can("TTY")
}
-func (seat Seat) CanGraphical() (bool, error) {
+// CanGraphical returns whether this seat provides graphics
+// functionality, i.e. is useful as a graphics display.
+func (seat SeatName) CanGraphical() (bool, error) {
return seat.can("GRAPHICAL")
}