| The Virtual Braille Display Driver | |
| ---------------------------------- | |
| This is a virtual braille display driver for BRLTTY. It uses a simple | |
| text-based protocol over a socket to transmit information to, and to receive | |
| information from, the virtual braille display application (from now on, "the | |
| display"). The intention of this driver is two-fold: | |
| * Give interested developers the ability to test BRLTTY without requiring | |
| access to a real braille display. | |
| * Enable the implementation of a visual braille display based on this driver | |
| which allows a sighted person to see, and even to experience, how a blind | |
| person uses a braille display to work with a computer. | |
| This driver supports the following devices: | |
| client:[address] | |
| The driver periodically tries to connect to the display at the specified | |
| network address. | |
| server:[address] | |
| The driver waits on the specified network address for a connection | |
| request from the display. | |
| If the network address isn't specified then the driver's default TCP/IP port on | |
| the local host is used. The address may be: | |
| On Unix systems: /path/to/unix-socket-file | |
| If the address starts with a slash (/) then it's interpreted as the path | |
| to a Unix socket file. If the driver is the client then the socket file | |
| must already exist. If the driver is the server then the socket file is | |
| created by the driver and must not already exist. | |
| On Windows NT/2000/XP/2003 systems: \\.\pipe\pipename | |
| If the address starts with a backslash (\) then it's interpreted as the | |
| path to a named pipe. If the driver is the client, then the named pipe | |
| must already exist. If the driver is the server then the named pipe is | |
| created by the driver and must not already exist. Beware of the shell's | |
| interpretation of backslashes. | |
| On all systems: [host][:[port]] | |
| A TCP/IP address. Both the host and port components of the address are | |
| optional. The delimiting colon (:) is only required if the port is being | |
| specified. The host may be a name, an alias, or an IPV4 address (in | |
| dotted-decimal form); if it's omitted then the local host is assumed. The | |
| port may be a service name or a port number; if it's omitted then 35752 | |
| is assumed. | |
| The Protocol | |
| ------------ | |
| After the connection between the driver and the display is complete, data is | |
| exchanged between them via command lines. The driver first waits for a "cells" | |
| command in order to determine the dimensions of the braille window. After this | |
| has been taken care of, commands freely flow in both directions without any | |
| restrictions. The braille window dimensions are appropriately reconfigured | |
| whenever another "cells" command is received. The "quit" command, which is also | |
| recognized during the initial wait for the first "cells" command, instructs the | |
| driver to close its end of the connection and to restart. | |
| The command lines are in plain text. Each is terminated by a line-feed [0X0A] | |
| (usually known on Unix systems as a new-line). A carriage-return [0X0D] may | |
| optionally precede the line-feed. Command lines sent to the display contain a | |
| carriage-return if, and only if, the most recent command line received from the | |
| display contained one. | |
| Command lines are composed of space-delimited words, numbers, and strings. | |
| Space consists of one or more blanks and/or tabs. Case is only significant | |
| within a string. | |
| A "number" may be specified as decimal, octal, or hexadecimal. The usual C | |
| syntax is recognized. If the first digit is 0 then the number is octal. If the | |
| first digit isn't 0 then the number is decimal. If the number begins with | |
| either 0X or 0x then the number is hexadecimal. The following three numbers are | |
| the same: | |
| 15 Decimal | |
| 017 Octal | |
| 0XF Hexadecimal | |
| A "string" is a sequence of characters (including space characters) enclosed | |
| within double quotes ("). Special characters within a string are prefixed with | |
| a backslash (\). The following special characters are supported: | |
| \\ A literal backslash. | |
| \" A literal double quote. | |
| \Xxx Any character specified via its hexadecimal value. | |
| For example: "A \" (double quote) must be escaped with a \\ (backslash)." | |
| A "dots" is a string which describes a braille character sequence. Space | |
| (blanks and/or tabs) within the string are ignored. The braille characters are | |
| separated from one another by a vertical bar (|). Each braille character | |
| consists of the numbers (1 through 8) of the dots which represent it. For | |
| example, the first three letters of the English alphabet would be "1|12|14". | |
| Commands Recognized by the Driver | |
| --------------------------------- | |
| Cells columns [rows] | |
| The number of columns and rows in the text portion of the display. If the | |
| number of rows isn't supplied then 1 is assumed. This is the first command | |
| which the display must send to the driver. It may be sent at any other time | |
| as well to notify the driver that the dimensions of the text portion of the | |
| display have changed. | |
| Quit | |
| Upon receipt of this command, the driver closes its end of the connection | |
| and then restarts. It's recognized at any time, including during the initial | |
| wait for the first "cells" command from the display. | |
| <basic-command> [state] | |
| A basic command for the BRLTTY core. It may be any of the BRL_CMD_ constants | |
| (without the BRL_CMD_ prefix) defined within "brldefs.h", e.g. LnDn. The | |
| optional <state> operand (which may be either on or off), when applied to an | |
| attribute toggling command, forces that attribute to the specified state. | |
| <cell-command> number | |
| A cell command for the BRLTTY core. It may be any of the BRL_BLK_ constants | |
| (without the BRL_BLK_ prefix) defined within "brldefs.h", e.g. Route. The cell | |
| number, starting at 1 for the leftmost cell, must be supplied. If the | |
| display has more than one row then the cells for the top row are counted | |
| first, e.g. if the display has 32 columns and 2 rows then 35 refers to the | |
| third cell on the second row. | |
| <key-command> [number] | |
| A key command for the BRLTTY core. It may be any of the VPK_ constants | |
| (without the VPK_ prefix) defined within "brldefs.h", e.g. Return. The | |
| Function command requires that the function key number, starting at 1, be | |
| supplied. All the other commands in this set don't accept a number operand. | |
| Commands Sent to the Display | |
| ---------------------------- | |
| Braille dots | |
| Cells to be presented on the text portion of the display. Excess cells in | |
| the data should be ignored. Excess cells on the display should be blank. | |
| Visual string | |
| Characters to be presented on the visual portion of the display. Excess | |
| characters in the data should be ignored. Excess characters on the display | |
| should be blank. | |
| Status dots | |
| Cells to be presented on the status portion of the display. Excess cells in | |
| the data should be ignored. Excess cells on the display should be blank. | |
| <attribute> <setting> | |
| The current setting of any of several attributes within the BRLTTY core. | |
| These are only sent if "Status Style" is set to "Generic". <attribute> is | |
| the name of any of the STAT_ constants (without the STAT_ prefix) defined | |
| within "brldefs.h", e.g. BrlRow. <setting> is a number. Rows and columns | |
| start at 1. Flags use 0 for "off" and 1 for "on". | |
| Security Implications | |
| --------------------- | |
| Please be aware that this driver, when used carelessly, might open severe | |
| security holes. Connections to or from this driver are in no way authenticated | |
| so you yourself need to take care of protecting access to a BRLTTY instance | |
| which uses it. In particular, by sending out information about the currently | |
| active virtual console, this driver might expose valuable information about | |
| your system to a potential attacker. The attacker might also use the | |
| <key-command> family of commands to directly manipulate, possibly even | |
| inputting data to, your current, or even another, virtual console. In effect, | |
| this driver could be used to completely remote-control your system. | |
| Please be aware of these implications when experimenting with this driver. If | |
| you're using TCP/IP, be sure to protect access to the used host and port via | |
| facilities such as firewalls. You should take special precautions on multi-user | |
| systems where untrusted people could use unprotected access to this driver to | |
| gain root access to the machine. | |
| -- Mario Lang <mlang@delysid.org> |