/*
 * make this setuid root or 
 * at least setgid to the group /dev/console (mode 660) belongs to
 */
#include <sys/fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <linux/kd.h>

int fd;

void die(char *msg)
{
    fprintf(stderr, msg);
    exit(1);
}

void usage()
{
    die("usage: tones frequency,tone_length,pause_after ...\n"
	"  lengths in milli-seconds, frequency in Hz\n");
}

void stoppen(/*int sig*/)
{
    ioctl(fd, KIOCSOUND, 0);
    exit(0);
}

int main(int argc, char **argv)
{
    int i, f, l, p;

    if (argc < 2)
	usage();
    fd = open("/dev/console", O_WRONLY);
    if (fd < 0)
	die("cannot open console\n");
    signal(SIGTERM, stoppen);
    signal(SIGINT, stoppen);
    for (i = 1; i < argc; i++) {
	if (sscanf(argv[i], "%d,%d,%d", &f, &l, &p) != 3)
	    usage();
	if (ioctl(fd, KDMKTONE, 1193180 / f + (l << 16)) < 0)
	    die("IOCTL failed. Not a VT?\n");
	usleep((l + p) * 1000);
    }
    return 0;
}

