summaryrefslogtreecommitdiff
path: root/usr.bin/syscons/syscons.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/syscons/syscons.c')
-rw-r--r--usr.bin/syscons/syscons.c545
1 files changed, 0 insertions, 545 deletions
diff --git a/usr.bin/syscons/syscons.c b/usr.bin/syscons/syscons.c
deleted file mode 100644
index 9637d7b6add3..000000000000
--- a/usr.bin/syscons/syscons.c
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright (c) 1993 Christoph M. Robitschko
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 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 Christoph M. Robitschko
- * 4. The name of the author may not be used to endorse or promote products
- * derived from this software withough specific prior written permission
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 SUCH DAMAGE.
- */
-
-#include <sys/types.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-#include <machine/console.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/errno.h>
-
-#include "syscons.h"
-
-int verbose = 0;
-char *prgname;
-
-
-__BEGIN_DECLS
-int is_syscons __P((int));
-void screensaver __P((char *));
-void screensavertype __P((char *));
-void linemode __P((char *));
-void keyrate __P((char *));
-void keymap __P((char *));
-void mapscr __P((char *));
-void loadfont __P((char *, char *));
-void switchto __P((char *));
-void setfkey __P((char *, char *));
-void displayit __P((void));
-void usage __P((void));
-char *mkfullname __P((const char *, const char *, const char *));
-char *nextarg __P((int, char **, int *, int));
-__END_DECLS
-
-
-
-void
-main(argc, argv)
-int argc;
-char **argv;
-{
-extern char *optarg;
-extern int optind;
-int opt;
-
-
- prgname = argv[0];
- if (!is_syscons(0))
- exit(1);
- while((opt = getopt(argc, argv, "s:S:m:r:k:f:t:F:V:vd")) != -1)
- switch(opt) {
- case 's':
- screensaver(optarg);
- break;
- case 'V':
- screensavertype(optarg);
- break;
- case 'm':
- linemode(optarg);
- break;
- case 'r':
- keyrate(optarg);
- break;
- case 'k':
- keymap(optarg);
- break;
- case 'S':
- mapscr(optarg);
- break;
- case 'f':
- loadfont(optarg, nextarg(argc, argv, &optind, 'f'));
- break;
- case 't':
- switchto(optarg);
- break;
- case 'F':
- setfkey(optarg, nextarg(argc, argv, &optind, 'F'));
- break;
- case 'v':
- verbose ++;
- break;
- case 'd':
- displayit();
- break;
- default:
- usage();
- exit(1);
- }
- if ((optind != argc) || (argc == 1)) {
- usage();
- exit(1);
- }
- exit(0);
-}
-
-
-int
-is_syscons(fd)
-int fd;
-{
-vtmode_t mode;
-
- /* Try to find out if we are running on a syscons VT */
- if (ioctl(fd, VT_GETMODE, &mode) == 0)
- return(1);
- if (errno == ENOTTY) {
- printf("You must be running this from a syscons vty for it to work.\n\n");
- printf("If you are currently using pccons (default) and wish to have virtual\n");
- printf("consoles, then rebuild your kernel after replacing the line:\n\n");
- printf("\tdevice pc0 at isa? port \042IO_KBD\042 tty irq 1 vector pcrint\n");
- printf("\nwith:\n\n");
- printf("\tdevice sc0 at isa? port \042IO_KBD\042 tty irq 1 vector scintr\n");
- printf("\n(Then install the new kernel and reboot your system)\n");
- }
- else
- perror("getting console state");
- return(0);
-}
-
-
-
-void
-usage(void)
-{
-const char usagestr[] = {"\
-Usage: syscons -v (be verbose)\n\
- -s {TIME|off} (set screensaver timeout to TIME seconds)\n\
- -V {NAME|list} (set screensaver type or list available types\n\
- -m {80x25|80x50} (set screen to 25 or 50 lines)\n\
- -r DELAY.REPEAT (set keyboard delay & repeat rate)\n\
- -r fast (set keyboard delay & repeat to fast)\n\
- -r slow (set keyboard delay & repeat to slow)\n\
- -r normal (set keyboard delay & repeat to normal)\n\
- -k MAPFILE (load keyboard map file)\n\
- -f SIZE FILE (load font file of size 8, 14 or 16)\n\
- -t SCRNUM (switch to specified VT)\n\
- -F NUM STRING (set function key NUM to send STRING)\n\
- -S SCRNMAP (load screen map file)\n\
-"};
- fprintf(stderr, usagestr);
-}
-
-
-char *
-nextarg(ac, av, indp, oc)
-int ac;
-char **av;
-int *indp;
-int oc;
-{
- if (*indp < ac)
- return(av[(*indp)++]);
- fprintf(stderr, "%s: option requires two arguments -- %c\n", av[0], oc);
- usage();
- exit(1);
- return("");
-}
-
-
-
-char *
-mkfullname(s1, s2, s3)
-const char *s1, *s2, *s3;
-{
-static char *buf = NULL;
-static int bufl = 0;
-int f;
-
-
- f = strlen(s1) + strlen(s2) + strlen(s3) + 1;
- if (f > bufl)
- if (buf)
- buf = (char *)realloc(buf, f);
- else
- buf = (char *)malloc(f);
- if (!buf) {
- bufl = 0;
- return(NULL);
- }
-
- bufl = f;
- strcpy(buf, s1);
- strcat(buf, s2);
- strcat(buf, s3);
- return(buf);
-}
-
-
-void
-screensaver(opt)
-char *opt;
-{
-int nsec;
-char *s1;
-
-
- if (!strcmp(opt, "off"))
- nsec = 0;
- else {
- nsec = strtol(opt, &s1, 0);
- if ((nsec < 0) || (*opt == '\0') || (*s1 != '\0')) {
- fprintf(stderr, "argument to -s must be a positive integer.\n");
- return;
- }
- }
-
- if (ioctl(0, CONS_BLANKTIME, &nsec) == -1)
- perror("setting screensaver period");
-}
-
-
-void
-screensavertype(opt)
-char *opt;
-{
-ssaver_t shaver;
-int i, e;
-
-
- if (!strcmp(opt, "list")) {
- i = 0;
- printf("available screen saver types:\n");
- do {
- shaver.num = i;
- e = ioctl(0, CONS_GSAVER, &shaver);
- i ++;
- if (e == 0)
- printf("\t%d\t%s\n", shaver.num, shaver.name);
- } while (e == 0);
- if (e == -1 && errno != EIO)
- perror("getting screensaver info");
- } else {
- i = 0;
- do {
- shaver.num = i;
- e = ioctl(0, CONS_GSAVER, &shaver);
- i ++;
- if (e == 0 && !strcmp(opt, shaver.name)) {
- if (ioctl(0, CONS_SSAVER, &shaver) == -1)
- perror("setting screensaver type");
- return;
- }
- } while (e == 0);
- if (e == -1 && errno != EIO)
- perror("getting screensaver info");
- else
- fprintf(stderr, "%s: No such screensaver\n", opt);
- }
-}
-
-
-void
-linemode(opt)
-char *opt;
-{
-unsigned long req;
-
- if (!strcmp(opt, "80x25"))
- req = CONS_80x25TEXT;
- else if (!strcmp(opt, "80x50"))
- req = CONS_80x50TEXT;
- else {
- fprintf(stderr, "Unknown mode to -m: %s\n", opt);
- return;
- }
-
- if (ioctl(0, req, NULL) == -1)
- perror("Setting line mode");
-}
-
-
-void
-keyrate(opt)
-char *opt;
-{
-const int delays[] = {250, 500, 750, 1000};
-const int repeats[] = { 34, 38, 42, 46, 50, 55, 59, 63,
- 68, 76, 84, 92, 100, 110, 118, 126,
- 136, 152, 168, 184, 200, 220, 236, 252,
- 272, 304, 336, 368, 400, 440, 472, 504};
-const int ndelays = (sizeof(delays) / sizeof(int));
-const int nrepeats = (sizeof(repeats) / sizeof(int));
-struct {
- int rep:5;
- int del:2;
- int pad:1;
- } rate;
-
- if (!strcmp(opt, "slow"))
- rate.del = 3, rate.rep = 31;
- else if (!strcmp(opt, "normal"))
- rate.del = 1, rate.rep = 15;
- else if (!strcmp(opt, "fast"))
- rate.del = rate.rep = 0;
- else {
- int n;
- int delay, repeat;
- char *v1;
-
-
- delay = strtol(opt, &v1, 0);
- if ((delay < 0) || (*v1 != '.'))
- goto badopt;
- opt = ++v1;
- repeat = strtol(opt, &v1, 0);
- if ((repeat < 0) || (*opt == '\0') || (*v1 != '\0')) {
-badopt:
- fprintf(stderr, "argument to -r must be DELAY.REPEAT\n");
- return;
- }
- for (n = 0; n < ndelays - 1; n++)
- if (delay <= delays[n])
- break;
- rate.del = n;
- for (n = 0; n < nrepeats - 1; n++)
- if (repeat <= repeats[n])
- break;
- rate.rep = n;
- }
-
- if (verbose)
- fprintf(stderr, "setting keyboard rate to %d.%d\n", delays[rate.del], repeats[rate.rep]);
- if (ioctl(0, KDSETRAD, rate) == -1)
- perror("setting keyboard rate");
-}
-
-
-void
-keymap(opt)
-char *opt;
-{
-char *mapfn;
-int mapfd;
-keymap_t map;
-int f;
-const char *prefix[] = {"", "", KEYMAP_PATH, NULL};
-const char *postfix[] = {"", ".map", ".map"};
-
-
- mapfd = -1;
- for (f = 0; prefix[f]; f++) {
- mapfn = mkfullname(prefix[f], opt, postfix[f]);
- mapfd = open(mapfn, O_RDONLY, 0);
- if (verbose)
- fprintf(stderr, "trying to open keymap file %s ... %s\n", mapfn, (mapfd==-1?"failed":"OK"));
- if (mapfd >= 0)
- break;
- }
- if (mapfd == -1) {
- perror("Keymap file not found");
- return;
- }
- if ((read(mapfd, &map, sizeof(map)) != sizeof(map)) ||
- (read(mapfd, &map, 1) != 0)) {
- fprintf(stderr, "\"%s\" is not in keymap format.\n", opt);
- (void) close(mapfd);
- return;
- }
- (void) close(mapfd);
- if (ioctl(0, PIO_KEYMAP, &map) == -1)
- perror("setting keyboard map");
-}
-
-void
-mapscr(opt)
-char *opt;
-{
-char *mapfn;
-int mapfd;
-scrmap_t map;
-int f;
-const char *prefix[] = {"", "", SCRNMAP_PATH, NULL};
-const char *postfix[] = {"", ".scr", ".scr"};
-
-
- mapfd = -1;
- for (f = 0; prefix[f]; f++) {
- mapfn = mkfullname(prefix[f], opt, postfix[f]);
- mapfd = open(mapfn, O_RDONLY, 0);
- if (verbose)
- fprintf(stderr, "trying to open scrnmap file %s ... %s\n", mapfn, (mapfd==-1?"failed":"OK"));
- if (mapfd >= 0)
- break;
- }
- if (mapfd == -1) {
- perror("Scrnmap file not found");
- return;
- }
- if ((read(mapfd, &map, sizeof(map)) != sizeof(map)) ||
- (read(mapfd, &map, 1) != 0)) {
- fprintf(stderr, "\"%s\" is not in scrnmap format.\n", opt);
- (void) close(mapfd);
- return;
- }
- (void) close(mapfd);
- if (ioctl(0, PIO_SCRNMAP, &map) == -1)
- perror("setting screen map");
-}
-
-void
-loadfont(sizec, fname)
-char *sizec;
-char *fname;
-{
-char *fontfn;
-int fontfd;
-void *font;
-char *v1;
-int ind, f;
-const struct {
- int fsize;
- int msize;
- unsigned long req;
- } fontinfo[] = {
- { 8, sizeof(fnt8_t), PIO_FONT8x8},
- { 14, sizeof(fnt14_t), PIO_FONT8x14},
- { 16, sizeof(fnt16_t), PIO_FONT8x16},
- { 0 }};
-const char *prefix[] = {"", "", FONT_PATH, FONT_PATH, NULL};
-const char *postfix[] = {"", ".fnt", "", ".fnt"};
-
-
-
- f = strtol(sizec, &v1, 0);
- for (ind = 0; fontinfo[ind].fsize; ind++)
- if (fontinfo[ind].fsize == f)
- break;
- if ((fontinfo[ind].fsize == 0) || (*v1 != '\0')) {
- fprintf(stderr, "%s is an unsupported font size.\n", sizec);
- return;
- }
- font = (void *)malloc(fontinfo[ind].msize);
- if (!font) {
- fprintf(stderr, "loading font: Out of memory.\n");
- return;
- }
-
- fontfd = -1; fontfn = "";
- for (f = 0; prefix[f]; f++) {
- fontfn = mkfullname(prefix[f], fname, postfix[f]);
- fontfd = open(fontfn, O_RDONLY, 0);
- if (verbose)
- fprintf(stderr, "trying to open font file %s ... %s\n", fontfn, (fontfd==-1?"failed":"OK"));
- if (fontfd >= 0)
- break;
- }
- if (fontfd == -1) {
- perror("Font file not found");
- return;
- }
- if ((read(fontfd, font, fontinfo[ind].msize) != fontinfo[ind].msize) ||
- (read(fontfd, font, 1) != 0)) {
- fprintf(stderr, "\"%s\" is not a font with size %s.\n", fontfn, sizec);
- (void) close(fontfd);
- return;
- }
-
- if (ioctl(0, fontinfo[ind].req, font) == -1)
- perror("Setting font");
-}
-
-
-void
-switchto(opt)
-char *opt;
-{
-int scrno;
-char *v1;
-
-
- scrno = strtol(opt, &v1, 0);
- if ((scrno < 1) || (scrno > 12) || (*v1 != '\0')) {
- fprintf(stderr, "argument to -t must be between 1 and 12.\n");
- return;
- }
- if (ioctl(0, VT_ACTIVATE, scrno) == -1)
- perror("switching to new VT");
-}
-
-
-void
-setfkey(knumc, str)
-char *knumc;
-char *str;
-{
-fkeyarg_t fkey;
-char *v1;
-long keynum;
-
- keynum = strtol(knumc, &v1, 0);
- if (keynum < 0 || keynum > 59 || *v1 != '\0') {
- fprintf(stderr, "function key number must be between 0 and 59.\n");
- return;
- }
- fkey.keynum = keynum;
- if ((fkey.flen = strlen(str)) > MAXFK) {
- fprintf(stderr, "function key string too long (%d > %d)\n", fkey.flen, MAXFK);
- return;
- }
- strcpy(fkey.keydef, str);
- if (verbose)
- fprintf(stderr, "setting F%d to \"%s\"\n", fkey.keynum, str);
- fkey.keynum--;
- if (ioctl(0, SETFKEY, &fkey) == -1)
- perror("setting function key");
-}
-
-
-
-void
-displayit(void)
-{
- if (verbose)
- printf("absolutely ");
- printf("nothing to display.\n");
-}