/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Spielen mit den Tastatur-LEDs unter Linux
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 * Das Programm schaltet die Tastatur-LEDs für eine
 * vorgegebene Zeit (Angabe in ms) an oder aus
 *
 * Aufruf:   leds [value duration]
 *
 * 'value' muss zwischen 0 und 7 liegen:
 *      Keyboard layout:    [NUM]   [CAP]   [SCR]
 *      Value:                2       4       1
 *
 * Beim Aufruf ohne Parameter werden alle Leds 1 Sekunde
 * eingeschaltet.
 *
 * Wegen des Zugriffs auf /dev/console (wahlweise /dev/tty0)
 * und der ioctl-Aufrufe kann das Programm nur von root 
 * aufgerufen werden (ggf. mit 'chmod 4711 beep' SUD-root setzen)
 * Für eine Produktiv-Version sollte noch eine Fehlerbehandlung
 * hinzugefügt werden.
 *
 * JPL 10.11.04
 */

#include <sys/types.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/kd.h>
#include <unistd.h>
#include <stdlib.h>

#define SCRLED 1
#define NUMLED 2
#define CAPLED 4

int main(int argc, char *argv[]) 
  {
  int fd, time;
  char leds, oldleds;
  fd = open("/dev/console",O_RDONLY);
  if (argc > 2)
    {
    leds = atoi(argv[1]);
    time = atoi(argv[2]);
    }
  else
    {
    leds = SCRLED|NUMLED|CAPLED;
    time = 1000;
    }
  leds = leds%8;  /* zur Sicherheit */
  ioctl(fd, KDGETLED, &oldleds); /* alten Wert merken */
  ioctl(fd, KDSETLED, leds);     /* Ausgabe */
  usleep(1000*time);             
  ioctl(fd, KDSETLED, oldleds);  /* alten Wert restaurieren */
  close(fd);
  return(0);
  }

