Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 17 May 2000 19:45:34 +0100
From:      Ben Smithurst <ben@scientia.demon.co.uk>
To:        Sys Admin <abeaupre@chemcomp.com>
Cc:        freebsd-questions@freebsd.org, beaupran@iro.umontreal.ca
Subject:   Re: Display the time on ttyv7
Message-ID:  <20000517194534.D21557@strontium.scientia.demon.co.uk>
In-Reply-To: <3922C8EA.11CBC702@chemcomp.com>
References:  <3922C8EA.11CBC702@chemcomp.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--45Z9DzgjV8m4Oswq
Content-Type: text/plain; charset=us-ascii

Sys Admin wrote:

> In a rather naive attempt, I tried to make a handy clock always
> available on ttyv7. I've put the following line in /etc/ttys:
> 
> ttyv7 "/usr/gamges/grdc" cons25 on secure
              ^^^^^^

> It did not work. The tty was simply not accessible, giving me a nice
> -beep!- when I tried Alt-F8.

If that typo was present in /etc/ttys I'm not surprised. :-) OTOH, I've
just tried it myself and it looks as if the terminal isn't being opened
on FDs 0, 1 and 2.  I think getty does that itself.  (You did send
SIGHUP to init, didn't you?  I don't think it would work anyway.)

If you can't get it to work, try the attached program, which can
run a specified program on a specified tty (e.g. 'runontty ttyv7
/usr/games/grdc' could go in /etc/rc.local).  This has the disadvantage
that the clock won't get restarted if it dies, as it would with
/etc/ttys, but you can't have everything.  You could always run a
cronjob to restart it if it dies, but I don't see why it would die
anyway.  Another method would be to write a wrapper around grdc which
opened the TTY appropriately.

-- 
Ben Smithurst / ben@scientia.demon.co.uk / PGP: 0x99392F7D

--45Z9DzgjV8m4Oswq
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="runontty.c"

static const char rcsid[] =
	"$Id: runontty.c,v 1.3 2000/03/04 00:04:52 ben Exp $";

#include <sys/param.h>
#include <sys/ioctl.h>

#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*
 * usage: runontty tty command ...
 * run "command ..." attached to "tty"
 */

int
main(int argc, char *argv[]) {
	int fd;
	char ttyname[MAXPATHLEN];
#ifdef __FreeBSD__
	int errfd;
	FILE *errfp;
#endif

	if (argc < 3) {
		fprintf(stderr, "usage: runontty tty command [arg ...]\n");
		exit(EXIT_FAILURE);
	}

	if (*argv[1] != '/') {
		if (strncmp(argv[1], "tty", 3) == 0)
			snprintf(ttyname, sizeof ttyname,
			  "/dev/%s", argv[1]);
		else
			snprintf(ttyname, sizeof ttyname,
			  "/dev/tty%s", argv[1]);
	} else
		snprintf(ttyname, sizeof ttyname, "%s", argv[1]);

	fd = open(ttyname, O_RDWR);
	if (fd < 0)
		err(1, "%s", ttyname);

#ifdef __FreeBSD__
	/* make a copy of the user's stderr before closing descriptors, and
	 * redirect {err,warn} output there.
	 */
	if ((errfd = dup(2)) < 0 || (errfp = fdopen(errfd, "w")) == NULL)
		err(1, "can't open errfp stream");
	fcntl(errfd, F_SETFD, 1); /* set close-on-exec */
	err_set_file(errfp);
#endif

	/* don't do chdir("/") since that would cause trouble if a relative
	 * path to a command was used.
	 */
	if (daemon(1, 0) < 0)
		err(1, "daemon");

	dup2(fd, 0);
	dup2(fd, 1);
	dup2(fd, 2);
	if (fd > 2)
		close(fd);

	if (ioctl(0, TIOCSCTTY) == -1)
		err(1, "ioctl TIOCSCTTY on stdin");

	execvp(argv[2], &argv[2]);
	err(1, "execvp %s", argv[2]);
}

--45Z9DzgjV8m4Oswq--


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000517194534.D21557>