SUN screensaver source
Clyde W. Hoover
clyde at ut-ngp.UTEXAS
Tue Oct 15 12:53:35 AEST 1985
Here is a package to make a screensaver version
of /etc/getty that I made to keep our SUN workstation screens from
burning out.
Share and Enjoy
-Clyde Hoover
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
-----cut here-----cut here-----cut here-----cut here-----
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# README The explination
# getty.diffs Diffs for /usr/src/etc/getty/...
# gettytab Example /etc/gettytab entries
# holdscreen.1 Man page for screen holder program
# holdscreen.c Source for screen holder program
# This archive created: Mon Oct 14 21:34:45 1985
cat << \SHAR_EOF > README
This is the kit to create a screensaver version of /etc/getty so your
SUN workstation screen don't fry. The screensaver is composed
of two parts:
Mods to /etc/getty to specify a 'greeting program' to be executed
before any prompts are issued. An example /etc/gettytab entry
is included.
A screenholder program that runs the acutal screensaver program
until interrupted by keyboard input. A simple manual page
is included.
While this was done for a SUN workstation, it is trivially portable to
any 4.2BSD-based U-Know-What* and should be easily portable (at least
holdscreen) to most U-Know-What systems.
* Not a trademark of anybody I know of (yet).
SHAR_EOF
cat << \SHAR_EOF > getty.diffs
Apply these diffs to your VAX source for /etc/getty to get the
screensaver version for the SUN
*** gettytab.h Mon Oct 14 21:11:52 1985
--- ../gettytab.h Wed Jul 24 11:28:49 1985
***************
***
#define DS gettystrs[19].value
#define RP gettystrs[20].value
#define FL gettystrs[21].value
#define WE gettystrs[22].value
#define LN gettystrs[23].value
---
#define DS gettystrs[19].value
#define RP gettystrs[20].value
#define FL gettystrs[21].value
#define WE gettystrs[22].value
#define LN gettystrs[23].value
+ #define GP gettystrs[24].value
*** init.c Mon Oct 14 21:11:53 1985
--- ../init.c Wed Jul 24 11:28:49 1985
***************
*** 38
{ "ds", <c.t_dsuspc }, /* delayed suspend */
{ "rp", <c.t_rprntc }, /* reprint char */
{ "fl", <c.t_flushc }, /* flush output */
{ "we", <c.t_werasc }, /* word erase */
{ "ln", <c.t_lnextc }, /* literal next */
{ 0 }
};
--- 38
{ "ds", <c.t_dsuspc }, /* delayed suspend */
{ "rp", <c.t_rprntc }, /* reprint char */
{ "fl", <c.t_flushc }, /* flush output */
{ "we", <c.t_werasc }, /* word erase */
{ "ln", <c.t_lnextc }, /* literal next */
+ { "gp" }, /* greeting program */
{ 0 }
};
*** main.c Mon Oct 14 21:11:55 1985
--- ../main.c Mon Oct 14 21:07:13 1985
***************
*** 90,99
main(argc, argv)
char *argv[];
{
char *tname;
long allflags;
signal(SIGINT, SIG_IGN);
/*
signal(SIGQUIT, SIG_DFL);
*/
--- 90,100 -----
main(argc, argv)
char *argv[];
{
char *tname;
long allflags;
+ int gprun = 0;
signal(SIGINT, SIG_IGN);
/*
signal(SIGQUIT, SIG_DFL);
*/
***************
*** 133
continue;
}
if (CL && *CL)
putpad(CL);
edithost(HE);
if (IM && *IM)
putf(IM);
--- 134
continue;
}
if (CL && *CL)
putpad(CL);
edithost(HE);
+ if (GP && *GP && gprun == 0) {
+ rung(GP);
+ gprun++;
+ }
if (IM && *IM)
putf(IM);
*** subr.c Mon Oct 14 21:11:57 1985
--- ../subr.c Wed Jul 24 11:28:50 1985
***************
*** 355,364
*ep++ = p;
}
*ep = (char *)0;
}
# ifdef DEVELCON
/*
* This speed select mechanism is written for the Develcon DATASWITCH.
* The Develcon sends a string of the form "B{speed}\n" at a predefined
* baud rate. This string indicates the user's actual speed.
--- 355,381 -----
*ep++ = p;
}
*ep = (char *)0;
}
+ rung(prog)
+ char *prog;
+ {
+ register int child,
+ waitpid;
+
+ if ((child = vfork()) == 0) {
+ setuid(1); /* Don't run greeter as SU */
+ execl("/bin/sh","sh","-c", prog, (char *)0);
+ /* execl(prog, prog, (char *)0); */ /* Is an alternative */
+ _exit(0);
+ }
+ if (child < 0)
+ return;
+ while ((waitpid = wait(0)) != child && waitpid != -1);
+ }
+
# ifdef DEVELCON
/*
* This speed select mechanism is written for the Develcon DATASWITCH.
* The Develcon sends a string of the form "B{speed}\n" at a predefined
* baud rate. This string indicates the user's actual speed.
SHAR_EOF
#
# An example from a workstation /etc/gettytab showing how the
# screensaver feature is specified
#
cat << \SHAR_EOF > gettytab
2|std.9600|9600-baud:\
:sp#9600:
C|SUN console:\
:gp=/usr/local/holdscreen /usr/demo/stringart:to#60:tc=std.9600:
#
# I use 'stringart' for my screensaver. Any program you wish can
# be substituted here. FULL PATH NAMES MUST BE USED for the 'gp'
# entry.
#
SHAR_EOF
cat << \SHAR_EOF > holdscreen.1
.TH HOLDSCREEN 1 LOCAL
.SH NAME
holdscreen \- screen locker
.SH SYNOPSIS
.B holdscreen command
.SH DESCRIPTION
.I Holdscreen
executes its arguments as a child process
and waits until standard input is ready
to read.
.I Holdscreen
then kills the screen holder process, clears the screen and exits.
This is usually done by pressing a key on the terminal keyboard.
Since
.I holdscreen
runs in RAW mode, any key may be pressed.
.SH BUGS
.I Holdscreen
was developed for use on SUN workstation displays, so the screen clear
sequence is coded in. For more general usage,
.IR termcap (5)
should be used.
.SH AUTHOR
Clyde Hoover @ Computation Center, The University of Texas at Austin
.br
clyde at ngp.UTEXAS.EDU, !seismo!ut-ngp!clyde
SHAR_EOF
cat << \SHAR_EOF > holdscreen.c
/*
* holdscreen - run arbitrary screen saver.
*
* Holdscreen runs the rest of its arguments as a subprocess, and
* waits for keyboard activity. On the SUN console, mouse activity
* is also waited for. When a key is pressed, the subprocesses
* are killed and the screen cleared.
*
* Written by Clyde Hoover, UTexas Computation Center, July 1985
*
* Usage: holdscreen program program-args
*
* Compliation: cc -o holdscreen -O holdscreen.c
* Libraries: std
* Binary: /usr/local/holdscreen
* Mode: 0555
* Ownership: ?/?
*/
#include <stdio.h>
#include <signal.h>
#include <setjmp.h>
#include <sgtty.h>
char *clear = "\014"; /* SUN console screen clear */
jmp_buf ping; /* Longjmp buffer */
struct sgttyb oldmodes; /* TTY mode buf */
/*
* holdscreen - screen saver exec
*/
main(argc,argv)
int argc;
char **argv;
{
int pgrp; /* Subprocess process group */
setbuf(stderr, (char *)NULL); /* No error message buffering */
pgrp = execargs (argc,argv); /* Exec screen saver */
waitforevent (); /* Wait for human interaction */
killoff (pgrp); /* Kill off children */
/* init (pid 1) will inherit them */
cleanup (); /* Reset TTY modes */
(void) write (1, clear, 1); /* Clear screen */
exit (0);
}
/*
* catchsig - catch signals
*/
catchsig(sig)
int sig; /* Signal that got us here */
{
(void) signal(sig, SIG_IGN);
longjmp(ping,1);
}
/*
* cleanup - tidy up
*/
cleanup()
{
(void) ioctl (0, TIOCSETP, &oldmodes);
}
/*
* execargs - fork off command line
*
* Returns: process group number of the subprocess tree
*/
execargs(c,v)
int c;
char **v;
{
int pid; /* process id */
c--;
v++;
if (c <= 0) /* No args */
exit (0);
pid = fork ();
if (pid < 0)
exit (1);
if (pid == 0) {
(void) setpgrp (0, getpid());
(void) close (0); /* Redirect stdin */
(void) open ("/dev/null",0);
(void) execv (v[0], v, 0);
_exit (0);
}
return (pid);
}
/*
* killoff - kill subprocess tree.
*/
killoff (pg)
int pg; /* Subprocess process group */
{
if (vfork () == 0) {
if (setpgrp(0, pg) < 0) /* Put self in childs pgrp */
perror("\r\nsetpgrp");
if (kill (0, SIGKILL) < 0) /* Shoot us all in head */
perror ("\r\nkillpg");
_exit (0);
}
(void) wait(0);
}
/*
* waitforevent - wait for human-genereated event (hitting a key or
* or mouse button)
*/
waitforevent()
{
int (*catchsig)(); /* SIGCHLD catcher */
int imask; /* Select mask */
struct sgttyb sx; /* TTY RAW mode */
int x;
/*
* Set RAW if needed. Do this because I want select
* to return if any key on the keyboard is pressed, and
* I don't want to catch tty signals.
*/
(void) ioctl(0, TIOCGETP, &sx);
oldmodes = sx;
if ((sx.sg_flags & RAW) == 0) {
sx.sg_flags |= RAW; /* RAW on */
sx.sg_flags &= ~ECHO; /* ECHO off */
(void) ioctl(0, TIOCSETP, &sx);
}
/*
* Arrange for SIGCHLD to be caught
*/
(void) signal(SIGCHLD, catchsig);
if (x = setjmp(ping))
goto restore;
/*
* If on SUN console, turn mouse on (N/A)
*
*if (strcmp(ttyname(0),"/dev/console") == 0)
* enable_mouse();
*/
/*
* Wait for stdin to become readable (tty input).
* This won't work quite the same with the mouse enabled.
*/
(void) ioctl (0, TIOCFLUSH, 0);
imask = 1;
(void) select(20,&imask,(int *)0,(int *)0,(struct timeval *)0);
restore:
(void) signal(SIGCHLD, SIG_DFL);
}
SHAR_EOF
# End of shell archive
exit 0
--
Shouter-To-Dead-Parrots @ Univ. of Texas Computation Center; Austin, Texas
"All life is a blur of Republicans and meat." -Zippy the Pinhead
clyde at ngp.UTEXAS.EDU, clyde at sally.UTEXAS.EDU
...!ihnp4!ut-ngp!clyde, ...!allegra!ut-ngp!clyde
More information about the Comp.sources.unix
mailing list