| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| /// A PTY (pseudoterminal) emulates terminal devices, with a "server" side |
| /// (which represents the keyboard+monitor side of the terminal and is obtained |
| /// by opening /dev/misc/ptmx) and a number of "client" sides which are obtained |
| /// by calling `OpenClient`. |
| /// |
| /// Client PTYs are identified by the `id` used in the `OpenClient` call. The |
| /// first Client PTY *must* be 0, and it is the only Client PTY that is allowed |
| /// to create additional Client PTYs, receive Events, etc. It is the |
| /// Controlling PTY. |
| @available(added=7) |
| library fuchsia.hardware.pty; |
| |
| using fuchsia.device; |
| using fuchsia.io; |
| using zx; |
| |
| /// When Feature Raw is enabled, OOB Events like ^c, ^z, etc are not generated. |
| /// Instead the character is read from the read() input path. |
| const FEATURE_RAW uint32 = 1; |
| |
| type WindowSize = struct { |
| width uint32; |
| height uint32; |
| }; |
| |
| /// The terminal has no active client. |
| const EVENT_HANGUP uint32 = 1; |
| /// The terminal received a ^C control character. |
| const EVENT_INTERRUPT uint32 = 2; |
| /// The terminal received a ^Z control character. |
| const EVENT_SUSPEND uint32 = 4; |
| /// The terminal window has resized. |
| const EVENT_WINDOW_SIZE uint32 = 8; |
| |
| /// All events |
| const EVENT_MASK uint32 = 15; |
| |
| /// When an event is pending, this signal is asserted on the Controlling PTY. |
| const SIGNAL_EVENT fuchsia.device.DeviceSignal = fuchsia.device.DeviceSignal.OOB; |
| |
| @discoverable |
| protocol Device { |
| // Compose from fuchsia.io.File so we can support Read/Write and export |
| // a "Tty" type node info |
| compose fuchsia.io.File; |
| |
| /// Open a client PTY device with a unique `id`. `client` should be a handle |
| /// to one endpoint of a channel that (on success) will become an open |
| /// connection to the newly created device. On failure, the channel will be |
| /// closed. Closing the channel will close the connection and release the |
| /// device. If the provided `id` is 0, then the new client is a controlling |
| /// client and has the capability to open additional clients. If the |
| /// current device is not a controlling client, `ZX_ERR_ACCESS_DENIED` will be |
| /// returned. If `id` is not unique, `ZX_ERR_INVALID_ARGS` will be returned. |
| /// Otherwise the status code from `device_add` is passed on. |
| OpenClient(resource struct { |
| id uint32; |
| client server_end:Device; |
| }) -> (struct { |
| s zx.status; |
| }); |
| |
| /// allowed on Client PTYs |
| /// ----------------------------- |
| /// Clear and/or Set PTY Features |
| ClrSetFeature(struct { |
| clr uint32; |
| set uint32; |
| }) -> (struct { |
| status zx.status; |
| features uint32; |
| }); |
| |
| /// Obtain the window size (in character cells) |
| GetWindowSize() -> (struct { |
| status zx.status; |
| size WindowSize; |
| }); |
| |
| /// allowed on the Controlling PTY |
| /// ------------------------------------- |
| /// Select which Client PTY receives input. |
| /// Reads will simply block on non-active PTYs. |
| MakeActive(struct { |
| client_pty_id uint32; |
| }) -> (struct { |
| status zx.status; |
| }); |
| |
| /// Returns pending OOB events, simultaneously clearing them |
| ReadEvents() -> (struct { |
| status zx.status; |
| events uint32; |
| }); |
| |
| /// allowed on the Server PTY |
| /// -------------------------------- |
| /// Sets the window size |
| SetWindowSize(struct { |
| size WindowSize; |
| }) -> (struct { |
| status zx.status; |
| }); |
| }; |