ftp.nice.ch/pub/next/developer/objc/appkit/darken.NIHS.bs.tar.gz#/darken/VidLev.c

This is VidLev.c in view mode; [Download] [Up]

/*
 *	VidLev.c - get/set display's video level
 */

/*
 * Copyright 1991 Purdue Research Foundation, West Lafayette, Indiana
 * 47907.  All rights reserved.
 *
 * Written by Vic Abell, Purdue University Computing Center.
 *
 * This software is not subject to any license of the American Telephone
 * and Telegraph Company or the Regents of the University of California.
 *
 * Permission is granted to anyone to use this software for any purpose on
 * any computer system, and to alter it and redistribute it freely, subject
 * to the following restrictions:
 *
 * 1. Neither the author nor Purdue University are responsible for any
 *    consequences of the use of this software.
 *
 * 2. The origin of this software must not be misrepresented, either by
 *    explicit claim or by omission.  Credit to the author and Purdue
 *    University must appear in documentation and sources.
 *
 * 3. Altered versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 *
 * 4. This notice may not be removed or altered.
 */

#ifndef lint
static char copyright[] =
"@(#) Copyright 1991 Purdue Research Foundation.\nAll rights reserved.\n";
#endif

/*
 *	Usage:
 *
 *	VidLev [-b|-h|-r{a|e|r}|-s{a|e|r}] [-t] [-p path] [value(s)]
 *
 *	    where:
 *
 *		-b	Blank and repeatedly reblank the screen until stopped.
 *			If stopped with a SIGHUP, the pre-blanking EVS and 
 *			NVRAM brightness values are restored.  The process
 *			ID is written to a file at the path specified with
 *			the -p option (default = BIN/VidLev.pid).
 *
 *			The value parameters specify the initial and subsequent
 *			reblanking intervals in seconds (defaults = 45 and 600).
 *
 *			NOTE: requires root (or NOBODY) permission.
 *
 *		-h	Display help.
 *
 *		-p path	Specify the path to the file to which the process ID
 *			is written.  This option is only legitimate if the
 *			the -b option is specified.  The default process ID
 *			file path is BIN/VidLev.pid.
 *
 *		-ra	Report EVS and NVRAM brightness values to STDOUT.
 *			This is the default action for a root (or NOBODY)
 *			caller.
 *		-re	Report the event driver (EVS) brightness to STDOUT.
 *			This is the default action for a non-root caller.
 *		-rr	Report the NVRAM brightness to STDOUT.
 *
 *		-sa	Set EVS and NVRAM brightness values. 
 *		-se	Set the event driver (EVS) brightness.
 *		-sr	set the NVRAM brightness.
 *		
 *		-t	Set terse reporting -- no titles.
 *
 *		value	This optional parameter specifies:
 *
 *			-b	   reblanking intervale in seconds
 *			-s[a|e|r]  brightness value:
 *				   0 or dim	 darkest
 *				   61 or bright	 brightest
 *				   1 - 59	 relative brightness between
 *						 darkest (0) and brightest (61)
 *
 *	Note:	The default action for a root (or NOBODY) caller is "-ra";
 *		non-root, "-re".
 */

#include <c.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include "missing.h"
#include <dev/m68k/evsio.h>
#include <dev/m68k/video.h>

#if	!defined(BIN)
#define	BIN		"/usr/local/etc"
#endif
#define	EDEVICE		"/dev/evs0"
#define	EVS		1
#define	IREPEAT		45
#define	NVRAM		2
#define PIDDIGITS	6
#define	REPEAT		600
#define VIDLEVPID	"/VidLev.pid"
#define	VDEVICE		"/dev/vid0"

extern int errno;
extern char *sys_errlist[];
extern char *optarg;
extern int optind;

int Efd = -1;				/* EVS file descriptor */
int Evsval;				/* original EVS value */
struct nvram_info Nvram;		/* NVRAM information */
int Pfd = -1;				/* PID file descriptor */
char *Pidpath = BIN VIDLEVPID;		/* PID file path */
char *Pn;				/* program name */
int Vfd = -1;				/* video (NVRAM) file descriptor */

void setevs(), setnvram(), sighup();




main(argc, argv)
	int argc;
	char *argv[];
{
	int c;				/* character buffer */
	int err = 0;			/* argument error count */
	unsigned int ireblank = IREPEAT;
					/* initial reblank interval */
	int mblank = 0;			/* blank mode */
	int mhelp = 0;			/* help mode */
	int mread = 0;			/* read mode */
	int mset = 0;			/* set mode */
	int mterse = 0;			/* terse mode */
	int mtype = EVS;		/* mode type */
	char pid[PIDDIGITS+2];		/* process ID */
	unsigned int reblank = REPEAT;	/* reblanking interval */
	unsigned int sleeptm;		/* sleep time */
	uid_t uid;			/* user ID */
	int val = -1;			/* value paramter */
/*
 * Save program name.
 */
	if ((Pn = strrchr(argv[0], '/')) != NULL)
		Pn++;
	else
		Pn = argv[0];
/*
 * Process arguments.
 */
	while ((c = getopt(argc, argv, "bhp:r:s:t")) != EOF) {
		switch (c) {

		case 'b':
			mblank = 1;
			break;
		case 'h':
			mhelp = 1;
			break;
		case 'p':
			Pidpath = optarg;
			break;
		case 'r':
		case 's':
			if (c == 'r')
				mread = 1;
			else
				mset = 1;
			switch (*optarg) {

			case 'a':
				mtype = EVS | NVRAM;
				break;
			case 'e':
				mtype = EVS;
				break;
			case 'r':
				mtype = NVRAM;
				break;
			default:
				(void) fprintf(stderr,
					"%s: illegal -r/-s option (%c)\n",
					Pn, *optarg);
				err++;
			}
			break;
		
		case 't':
			mterse = 1;
			break;

		case '?':
			err++;
			break;
		default:
			(void) fprintf(stderr, "%s: unknown option (%c)\n",
				Pn, c);
			err++;
		}
	}
/*
 * Process value argument.
 */
	if (optind <= (argc - 1)) {
		if (mblank) {
			ireblank = atoi(argv[optind++]);
			if (optind <= (argc - 1))
				reblank = atoi(argv[optind++]);
			else {
				(void) fprintf(stderr,
					"%s: no reblank interval specified\n",
					Pn);
				err++;
			}
			val = BRIGHT_MIN;
		} else if (mset) {
			if (strcmp(argv[optind], "dim") == 0) {
				val = BRIGHT_MIN;
				optind++;
			} else if (strcmp(argv[optind], "bright") == 0) {
				val = BRIGHT_MAX;
				optind++;
			} else {
				val = atoi(argv[optind]);
				optind++;
			}
		}
	}
	if (optind < argc) {
		(void) fprintf(stderr, "%s: extra (unknown) options\n", Pn);
		err++;
	}
/*
 * Check for sensible arguments.  Set the default if no modes specified.
 */
	uid = getuid();
	if ((c = mblank + mset + mread + mhelp) == 0) {
		mread = 1;

#if	defined(NOBODY)
		mtype = (uid == 0 || uid == NOBODY) ? (EVS | NVRAM) : EVS;
#else
		mtype = getuid() ? EVS : (EVS | NVRAM);
#endif

	} else if (c != 1) {
		(void) fprintf(stderr, "%s: use only one of -b, -h, -r, -s\n",
			Pn);
		err++;
	}

#if	defined(NOBODY)
	if (mblank && uid != 0 && uid != NOBODY)
#else
	if (mblank && getuid() != 0)
#endif

	{

#if	defined(NOBODY)
		(void) fprintf(stderr, "%s: must be UID 0 or %d to use -b\n",
			Pn, NOBODY);
#else
		(void) fprintf(stderr, "%s: must be root to use -b\n", Pn);
#endif

		err++;
	}

#if	defined(NOBODY)
	if (((mread || mset) && (mtype & NVRAM)) && uid != 0 && uid != NOBODY)
#else
	if (((mread || mset) && (mtype & NVRAM)) && getuid() != 0)
#endif

	{
		(void) fprintf(stderr,

#if	defined(NOBODY)
			"%s: must be UID 0 or %d to read or set NVRAM\n",
				Pn, NOBODY);
#else
			"%s: must be root to read or set NVRAM\n", Pn);
#endif

		err++;
	}
/*
 * Display help and exit if help requested or if errors detected.
 */
	if (err || mhelp) {
	    (void) fprintf(stderr,
	      "%s usage: [-b|-h|-r{a|e|r}|-s{a|e|r}] [-t] [-p path]", Pn);
	    (void) fprintf(stderr, " [value(s)]\n");
	    (void) fprintf(stderr,

#if	defined(NOBODY)
	      "  -b       blank mode (must be UID 0 or %d)\n", NOBODY);
#else
	      "  -b       blank mode (must be root)\n");
#endif

	    (void) fprintf(stderr,
	      "           value1 = initial repeat seconds (default = %d)\n",
		IREPEAT);
	    (void) fprintf(stderr,
	      "           value2 = subsequent repeat seconds (default = %d)\n",
		REPEAT);
	    (void) fprintf(stderr,
	      "  -h       display help\n");
	    (void) fprintf(stderr,
	      "  -p path  specify PID file path, default = %s\n",
			BIN VIDLEVPID);
	    (void) fprintf(stderr,
	      "  -ra      report EVS and NVRAM brightnesses to STDOUT\n");
	    (void) fprintf(stderr,

#if	defined(NOBODY)
	      "           (must be UID 0 or %d) (their default action)\n",
			NOBODY);
#else
	      "           (must be root) (root default action)\n");
#endif

	    (void) fprintf(stderr,
	      "  -re      report EVS brightness to STDOUT");
	    (void) fprintf(stderr,
	      " (non-root default action)\n");
	    (void) fprintf(stderr,

#if	defined(NOBODY)
	      "  -rr      report NVRAM brightness to STDOUT (must be UID 0 or %d)\n", NOBODY);
#else
	      "  -rr      report NVRAM brightness to STDOUT (must be root)\n");
#endif

	    (void) fprintf(stderr,
	      "  -sa      set EVS and NVRAM brightnesses from value");
	    (void) fprintf(stderr,

#if	defined(NOBODY)
	      " (must be UID 0 or %d)\n", NOBODY);
#else
	      " (must be root)\n");
#endif

	    (void) fprintf(stderr,
	      "  -se      set EVS brightness from value\n");
	    (void) fprintf(stderr,

#if	defined(NOBODY)
	      "  -sr      set NVRAM brightness from value (must be UID 0 or %d)\n", NOBODY);
#else
	      "  -sr      set NVRAM brightness from value (must be root)\n");
#endif

	    (void) fprintf(stderr,
	      "  -t       terse output\n");
	    (void) fprintf(stderr,
	      "  value    optional value(s) for -b and -s[a|e|r]\n");
	    if (err)
		exit(1);
	    exit(0);
	}
/*
 * Open EVS device.
 */
	if (mblank || ((mset || mread) && (mtype & EVS))) {
		if ((Efd = open(EDEVICE, O_RDWR, 0)) == CERROR) {
			(void) fprintf(stderr, "%s: can't open %s: %s\n",
				Pn, EDEVICE, sys_errlist[errno]);
			exit(1);
		}
	}
/*
 * Open video (NVRAM) device.
 */
	if (mblank || ((mset || mread) && (mtype & NVRAM))) {
		if ((Vfd = open(VDEVICE, O_RDWR, 0)) == CERROR) {
			(void) fprintf(stderr, "%s: can't open %s: %s\n",
				Pn, VDEVICE, sys_errlist[errno]);
			close_exit(1);
		}
	}
/*
 * Read current values.
 */
	if (mblank || mread) {
		if (mblank || (mtype & EVS)) {
			if (ioctl(Efd, EVSIOCB, &Evsval) == CERROR) {
				(void) fprintf(stderr,
					"%s: can't EVSIOCB %s: $s\n",
					Pn, EDEVICE, sys_errlist[errno]);
				close_exit(1);
			}
		}
		if (mblank || (mtype & NVRAM)) {
			if (ioctl(Vfd, DKIOCGNVRAM, &Nvram) == CERROR) {
				(void) fprintf(stderr,
					"%s: can't DKIOCGNVRAM %s: $s\n",
					Pn, VDEVICE, sys_errlist[errno]);
				close_exit(1);
			}
		}
	}
/*
 * Print values.
 */
	if (mread) {
		if (mtype & EVS) {
			if (mterse)
				(void) printf("%d\n", Evsval);
			else
				(void) printf("%s: EVS brightness = %d\n",
					Pn, Evsval);
		}
		if (mtype & NVRAM) {
			if (mterse)
				(void) printf("%d\n", Nvram.ni_brightness);
			else
				(void) printf("%s: NVRAM brightness = %d\n",
					Pn, Nvram.ni_brightness);
		}
		close_exit(0);
	}
/*
 * Set new values.
 */
	if (mset) {
		if (mtype & EVS)
			setevs(val);
		if (mtype & NVRAM)
			(void) setnvram(val);
		close_exit(0);
	}
/*
 * Perform blank function:
 *
 *	1.  Isolate from parent process.
 *	2.  Record process ID in Pidpath[].
 *	3.  Enable SIGHUP interrupt.
 *	4.  Reduce NVRAM brightness to BRIGHT_MIN.
 *	5.  Repeat step 2 every reblank seconds, because loginwindow
 *	    changes the brightness 30 minutes after logout.
 */
	if (mblank) {
		if (fork())
			close_exit(0);
		if ((Pfd = open(Pidpath, O_RDWR|O_CREAT|O_TRUNC, 0644)) < 0) {
			(void) printf("%s: can't open %s: %s\n",
				Pn, Pidpath, sys_errlist[errno]);
			close_exit(1);
		}
		(void) sprintf(pid, "%*d\n", PIDDIGITS, getpid());
		(void) write(Pfd, pid, strlen(pid));
		(void) close(Pfd);
		Pfd = -1;
		(void) signal(SIGHUP, sighup);
		for (sleeptm = ireblank;; sleeptm = reblank) {
			(void) setnvram(val);
			(void) sleep(sleeptm);
		}
/* NOTREACHED */
	}
	(void) fprintf(stderr, "%s: no action to perform\n", Pn);
	exit(1);
}


/*
 * close_exit(v) - close all files and exit(v)
 */

close_exit(v)
{
	if (Efd >= 0) {
		(void) close(Efd);
		Efd = -1;
	}
	if (Pfd >= 0) {
		(void) close(Pfd);
		Pfd = -1;
	}
	if (Vfd >= 0) {
		(void) close(Vfd);
		Vfd = -1;
	}
	exit(v);
}


/*
 * setevs(val) set EVS brightness to val
 */

void
setevs(val)
	int val;
{
	if (ioctl(Efd, EVSIOSB, &val) == CERROR) {
		(void) fprintf(stderr, "%s: can't EVSIOSB %s: $s\n",
			Pn, EDEVICE, sys_errlist[errno]);
		close_exit(1);
	}
}


/*
 * setnvram(val) - set NVRAM brightness to val
 */

void
setnvram(val)
	int val;
{
	if (ioctl(Vfd, DKIOCBRIGHT, &val) == CERROR) {
		(void) fprintf(stderr, "%s: can't DKIOCBRIGHT %s: %s",
			Pn, VDEVICE, sys_errlist[errno]);
		close_exit(1);
	}
}


/*
 * sighup() - process SIGHUP
 */

void
sighup()
{
	int val;
	
	(void) setevs(Evsval);
	val = Nvram.ni_brightness;
	(void) setnvram(val);
	(void) unlink(Pidpath);
	close_exit(0);
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.