- Not a typewriter
-
This article is about the UNIX error code. For the Robin Williams book The Mac is not a Typewriter, see Robin Williams (writer).
In computer science "Not a typewriter" or ENOTTY is an error code defined in the errno.h found on many Unix systems. This code is used to indicate that an attempt has been made to use a non-TTY device as a TTY device.
Details
"Typewriter" was what early UNIX systems called a terminal. This usage goes all the way back to the First Edition of the Unix Programmer's Manual, dated November 3, 1971. For example, the description of the "hup" command was "hup hangs up the phone on the typewriter which uses it." The abbreviation TTY, which occurs widely even in modern UNIX systems, stood for "Teletype." The generic term "typewriter" was probably used because "Teletype" was a registered trademark of AT&T subsidiary Teletype Corporation and was too specific. The name "Teletype" was derived from the more general term, "teletypewriter"; using "typewriter" was a different contraction of the same original term.
If this error code is returned, then at some point a diagnostic message may be output. Because some people consider "Not a typewriter" to be a confusing message some systems display a different confusing message such as "Inappropriate ioctl [input/output control] for device" instead. The real source of these confusing messages is, alas, often more subtle.
This message is usually not the result of an error related to the I/O device, but was due to the way the isatty() library routine works. The error code errno is only set when a system call fails. One of the first system calls made by the C standard I/O library is in an isatty() call used to determine if the program is being run interactively by a human (in which case isatty() will succeed and the library will write its output a line at a time so the user sees a regular flow of text) or as part of a pipeline (in which case it writes a block at a time for efficiency). If a library routine fails for some reason unrelated to a system call (for example, because a user name wasn't found in the password file) and a naive programmer blindly calls the normal error reporting routine perror() on every failure, the leftover ENOTTY will result in an utterly inappropriate "Not a typewriter" (or "Not a teletype", or "Inappropriate ioctl for device") being delivered to the user.
For many years the UNIX mail program sendmail[1] contained this bug: when mail was delivered from another system, the mail program was (of course) being run non-interactively. If the destination address was local, but referred to a user name not found in the local password file, the message sent back to the originator of the email was the announcement that the person they were attempting to communicate with was not a typewriter.
References
- ^ A/UX: mail and "not a typewriter" (2/95) article TA31349 on support.apple.com (February 27, 1995)
Categories:- POSIX error codes
Wikimedia Foundation. 2010.