libes@nbs-amrf.UUCP (Don Libes) (05/16/86)
To summarize: There are times when it would be useful to have a crt (for editing) on the console, and the rest of the time it would be useful to have a printer (for information and error logging). In case I wasn't clear before, let me restate: It is not true that the online files keep accurate logs of what has printed on the console. An excellent example is if a user halts the systems (or the system bops out on its own like Sun's infamous "watchdog reset"). A power outage and return could reboot the system, and all the log would show was that the system was booted - no reason and no record of it having been halted. I got some real good responses. Both Jack Jansen <mcvax!jack> and Rich Zellich <zellich@ALMSA-1.ARPA> suggested hooking up a Decwriter to the printer port on the VT100. You may have to run the VT100 at 1200 baud in order not to overflow the printer's buffer, but it's a small price to pay. Just turn off the printer while editing. As for my suggestion of a PC console, John Sellens <watdragon!jmsellens> tells me that the VAX 8500 uses a DEC PC as the console (and DEC explicitly suggests adding a printer to the PC). Ken Lalonde <watmath!kwlalonde> sent me what looks to be like a real useful program. "/etc/fork" starts up a shell on a nearby CRT while in single-user mode. Unfortunately, it looks like it requires the source to getty (4.2BSD). Thanks for all your responses. I hope this helps others. Don Libes {seismo,umcp-cs}!nbs-amrf!libes /etc/fork is reproduced below: #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # Makefile # fork.8 # fork.c # This archive created: Tue May 13 15:10:47 1986 # By: watmath!root (Ken Lalonde) export PATH; PATH=/bin:$PATH if test -f 'Makefile' then echo shar: over-writing existing file "'Makefile'" fi cat << \SHAR_EOF > 'Makefile' CFLAGS=-O -I/usr/src/etc/getty fork: fork.o gettytab.o subr.o init.o cc fork.o gettytab.o subr.o init.o -o fork gettytab.o: /usr/src/etc/getty/gettytab.c cc -c $(CFLAGS) /usr/src/etc/getty/gettytab.c subr.o: /usr/src/etc/getty/subr.c cc -c $(CFLAGS) /usr/src/etc/getty/subr.c init.o: /usr/src/etc/getty/init.c cc -c $(CFLAGS) /usr/src/etc/getty/init.c install: fork install fork /etc clean: rm -f fork *.o SHAR_EOF if test -f 'fork.8' then echo shar: over-writing existing file "'fork.8'" fi cat << \SHAR_EOF > 'fork.8' .TH FORK 8 LOCAL .SH NAME fork \- create a login shell while in single-user mode .SH SYNOPSIS .B /etc/fork /dev/ttyxx .SH DESCRIPTION .B Fork is used to create an instance of /bin/csh on the named terminal while in single-user mode. The named terminal must be hardwired. .B Fork is typically used when editing on a hardcopy console becomes too frustrating. .SH FILES /etc/ttys for the terminal speed SHAR_EOF if test -f 'fork.c' then echo shar: over-writing existing file "'fork.c'" fi cat << \SHAR_EOF > 'fork.c' /* * fork tty * Simulate some of the actions of getty and start csh * on the named line. Makes sense only in single user * mode, and only on hardwired lines. */ #include <sys/ioctl.h> #include <stdio.h> #include <ctype.h> #include "gettytab.h" char tabent[512]; char tabstrs[512]; char hostname[] = "jello pudding"; /* for the loader, never used */ struct sgttyb tmode = { 0, 0, CERASE, CKILL, 0 }; struct tchars tc = { CINTR, CQUIT, CSTART, CSTOP, CEOF, CBRK, }; struct ltchars ltc = { CSUSP, CDSUSP, CRPRNT, CFLUSH, CWERASE, CLNEXT }; int upper, lower, allflags; main(argc, argv) char **argv; { int fd; char *c, *getletter(); if(argc != 2) { fprintf(stderr, "Usage: fork ttyxx\n"); exit(1); } c = getletter(argv[1]); if((fd = open("/dev/tty", 2)) < 0) { perror("/dev/tty"); exit(1); } if(ioctl(fd, TIOCNOTTY, 0) < 0) { perror("ioctl (TIOCNOTTY)"); exit(1); } for (fd = getdtablesize(); --fd >= 0; ) close(fd); if((fd = open(argv[1], 2)) != 0) { perror(argv[1]); /* useless */ exit(1); } dup(fd); dup(fd); gettable(c, tabent, tabstrs); if (IS) tmode.sg_ispeed = speed(IS); else if (SP) tmode.sg_ispeed = speed(SP); if (OS) tmode.sg_ospeed = speed(OS); else if (SP) tmode.sg_ospeed = speed(SP); tmode.sg_flags = setflags(2) & 0xffff; tmode.sg_flags &= ~LCASE; tmode.sg_flags |= ECHO|CRMOD; ioctl(0, TIOCSETP, &tmode); if(fork() == 0) { execl("/bin/csh", "-csh", 0); perror("/bin/csh"); _exit(1); } exit(0); } char * getletter(s) char *s; { FILE *fd; char line[256]; char *p; static char x[2]; char *rindex(); if((fd = fopen("/etc/ttys", "r")) == NULL) return "default"; if (p = rindex(s, '/')) s = p+1; while(fgets(line, sizeof(line), fd) != NULL) { if (line[0] != '1') continue; p = line+1; while(isalnum(*++p)) ; *p = 0; if(strcmp(s, line+2) == 0) { x[0] = line[1]; x[1] = 0; fclose(fd); return x; } } fclose(fd); return "default"; } SHAR_EOF # End of shell archive exit 0