* Copyright (c) 1989 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)ttymsg.c 5.8 (Berkeley) 7/1/91";
* Display the contents of a uio structure on a terminal. Used by wall(1)
* and syslogd(8). Forks and finishes in child if write would block, waiting
* at most five minutes. Returns pointer to error string on unexpected error;
* string is not newline-terminated. Various "normal" errors are ignored
* (exclusive-use, lack of permission, etc.).
ttymsg(iov
, iovcnt
, line
)
static char device
[MAXNAMLEN
] = _PATH_DEV
;
static char errbuf
[1024];
register int cnt
, fd
, left
, wret
;
struct iovec localiov
[6];
return ("too many iov's (change code in wall/ttymsg.c)");
* open will fail on slip lines or exclusive-use lines
* if not running as root; not an error.
(void) strcpy(device
+ sizeof(_PATH_DEV
) - 1, line
);
if ((fd
= open(device
, O_WRONLY
|O_NONBLOCK
, 0)) < 0) {
if (errno
== EBUSY
|| errno
== EACCES
)
(void) snprintf(errbuf
, sizeof(errbuf
),
"%s: %s", device
, strerror(errno
));
for (cnt
= left
= 0; cnt
< iovcnt
; ++cnt
)
left
+= iov
[cnt
].iov_len
;
wret
= writev(fd
, iov
, iovcnt
);
iovcnt
* sizeof(struct iovec
));
for (cnt
= 0; wret
>= iov
->iov_len
; ++cnt
) {
if (errno
== EWOULDBLOCK
) {
(void) snprintf(errbuf
, sizeof(errbuf
),
"fork: %s", strerror(errno
));
/* wait at most 5 minutes */
(void) signal(SIGALRM
, SIG_DFL
);
(void) signal(SIGTERM
, SIG_DFL
); /* XXX */
(void) alarm((u_int
)(60 * 5));
(void) fcntl(fd
, O_NONBLOCK
, &off
);
* We get ENODEV on a slip line if we're running as root,
* and EIO if the line just went away.
if (errno
== ENODEV
|| errno
== EIO
)
(void) snprintf(errbuf
, sizeof(errbuf
),
"%s: %s", device
, strerror(errno
));