14 static unsigned char *cmap;
16 /* Standard VGA terminal colors, matching those hardcoded in the Linux kernel's
19 unsigned char vga_colors[] = {
38 static void __attribute__ ((noreturn))
42 _("Usage: %s vga|FILE|-\n"
44 "If you use the FILE parameter, FILE should be exactly 3 lines of\n"
45 "comma-separated decimal values for RED, GREEN, and BLUE.\n"
47 "To seed a valid FILE:\n"
48 " cat /sys/module/vt/parameters/default_{red,grn,blu} > FILE\n"
50 "and then edit the values in FILE.\n"
57 set_colormap(unsigned char *colormap)
61 /* Apply the color map to the tty via ioctl */
62 if (ioctl(fd, PIO_CMAP, colormap) == -1)
63 error(EXIT_FAILURE, errno, "ioctl");
69 parse_file(FILE *fd, const char *filename)
72 unsigned int rows, cols, val;
74 if ((cmap = calloc(3 * 16, sizeof(unsigned char))) == NULL)
75 error(EXIT_FAILURE, errno, "calloc");
77 for (rows = 0; rows < 3; rows++) {
81 if ((c = fscanf(fd, "%u", &val)) != 1) {
83 error(EXIT_FAILURE, errno, "fscanf");
85 error(EXIT_FAILURE, 0, _("Error: %s: Invalid value in field %u in line %u."),
86 filename, rows + 1, cols + 1);
89 cmap[rows + cols * 3] = (unsigned char) val;
91 if (cols < 15 && fgetc(fd) != ',')
92 error(EXIT_FAILURE, 0, _("Error: %s: Insufficient number of fields in line %u."),
97 if ((c = fgetc(fd)) == EOF)
98 error(EXIT_FAILURE, 0, _("Error: %s: Line %u has ended unexpectedly.\n"),
102 error(EXIT_FAILURE, 0, _("Error: %s: Line %u is too long.\n"),
108 main(int argc, char **argv) {
113 set_progname(argv[0]);
115 setlocale(LC_ALL, "");
116 bindtextdomain(PACKAGE_NAME, LOCALEDIR);
117 textdomain(PACKAGE_NAME);
119 while ((c = getopt(argc, argv, "hV")) != EOF) {
122 print_version_and_exit();
135 if (!strcmp(file, "vga")) {
136 set_colormap(vga_colors);
139 } else if (!strcmp(file, "-")) {
140 parse_file(stdin, "stdin");
143 if ((fd = fopen(file, "r")) == NULL)
144 error(EXIT_FAILURE, errno, "fopen");
146 parse_file(fd, file);