diff options
Diffstat (limited to 'sd_login/logind_seat.go')
-rw-r--r-- | sd_login/logind_seat.go | 58 |
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") } |