X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=debian%2Fpatches%2F06_event-option;fp=debian%2Fpatches%2F06_event-option;h=e96c093012304d12901aa92f00effe961b386449;hb=66999915b78ac05671fbadae5acd7be710cf2773;hp=0000000000000000000000000000000000000000;hpb=11c8159d307fbde222e528ea93fc21eafb0e2f9d;p=pkg%2Fbeep.git diff --git a/debian/patches/06_event-option b/debian/patches/06_event-option new file mode 100644 index 0000000..e96c093 --- /dev/null +++ b/debian/patches/06_event-option @@ -0,0 +1,151 @@ +Index: beep-1.2.2/beep.c +=================================================================== +--- beep-1.2.2.orig/beep.c ++++ beep-1.2.2/beep.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + /* I don't know where this number comes from, I admit that freely. A + wonderful human named Raine M. Ekman used it in a program that played +@@ -87,18 +88,48 @@ typedef struct beep_parms_t { + struct beep_parms_t *next; /* in case -n/--new is used. */ + } beep_parms_t; + ++enum { BEEP_TYPE_CONSOLE, BEEP_TYPE_EVDEV }; ++ + /* Momma taught me never to use globals, but we need something the signal + handlers can get at.*/ + int console_fd = -1; ++int console_type = BEEP_TYPE_CONSOLE; ++char *console_device = NULL; ++ ++ ++void do_beep(int freq) { ++ if (console_type == BEEP_TYPE_CONSOLE) { ++ if(ioctl(console_fd, KIOCSOUND, freq != 0 ++ ? (int)(CLOCK_TICK_RATE/freq) ++ : freq) < 0) { ++ printf("\a"); /* Output the only beep we can, in an effort to fall back on usefulness */ ++ perror("ioctl"); ++ } ++ } else { ++ /* BEEP_TYPE_EVDEV */ ++ struct input_event e; ++ ++ e.type = EV_SND; ++ e.code = SND_TONE; ++ e.value = freq; ++ ++ write(console_fd, &e, sizeof(struct input_event)); ++ } ++} ++ + + /* If we get interrupted, it would be nice to not leave the speaker beeping in + perpetuity. */ + void handle_signal(int signum) { ++ ++ if(console_device) ++ free(console_device); ++ + switch(signum) { + case SIGINT: + if(console_fd >= 0) { + /* Kill the sound, quit gracefully */ +- ioctl(console_fd, KIOCSOUND, 0); ++ do_beep(0); + close(console_fd); + exit(signum); + } else { +@@ -111,7 +142,7 @@ void handle_signal(int signum) { + /* print usage and exit */ + void usage_bail(const char *executable_name) { + printf("Usage:\n%s [-f freq] [-l length] [-r reps] [-d delay] " +- "[-D delay] [-s] [-c] [--verbose | --debug]\n", ++ "[-D delay] [-s] [-c] [--verbose | --debug] [-e device]\n", + executable_name); + printf("%s [Options...] [-n] [--new] [Options...] ... \n", executable_name); + printf("%s [-h] [--help]\n", executable_name); +@@ -143,13 +174,14 @@ void usage_bail(const char *executable_n + void parse_command_line(int argc, char **argv, beep_parms_t *result) { + int c; + +- struct option opt_list[6] = {{"help", 0, NULL, 'h'}, ++ struct option opt_list[7] = {{"help", 0, NULL, 'h'}, + {"version", 0, NULL, 'V'}, + {"new", 0, NULL, 'n'}, + {"verbose", 0, NULL, 'X'}, + {"debug", 0, NULL, 'X'}, ++ {"device", 1, NULL, 'e'}, + {0,0,0,0}}; +- while((c = getopt_long(argc, argv, "f:l:r:d:D:schvVn", opt_list, NULL)) ++ while((c = getopt_long(argc, argv, "f:l:r:d:D:schvVne:", opt_list, NULL)) + != EOF) { + int argval = -1; /* handle parsed numbers for various arguments */ + float argfreq = -1; +@@ -220,6 +252,9 @@ void parse_command_line(int argc, char * + case 'X' : /* --debug / --verbose */ + result->verbose = 1; + break; ++ case 'e' : /* also --device */ ++ console_device = strdup(optarg); ++ break; + case 'h' : /* notice that this is also --help */ + default : + usage_bail(argv[0]); +@@ -238,24 +273,31 @@ void play_beep(beep_parms_t parms) { + parms.reps, parms.length, parms.delay, parms.end_delay, parms.freq); + + /* try to snag the console */ +- if((console_fd = open("/dev/tty0", O_WRONLY)) == -1) { +- if((console_fd = open("/dev/vc/0", O_WRONLY)) == -1) { +- fprintf(stderr, "Could not open /dev/tty0 or /dev/vc/0 for writing.\n"); +- printf("\a"); /* Output the only beep we can, in an effort to fall back on usefulness */ +- perror("open"); +- exit(1); +- } ++ if(console_device) ++ console_fd = open(console_device, O_WRONLY); ++ else ++ if((console_fd = open("/dev/tty0", O_WRONLY)) == -1) ++ console_fd = open("/dev/vc/0", O_WRONLY); ++ ++ if(console_fd == -1) { ++ fprintf(stderr, "Could not open %s for writing\n", ++ console_device != NULL ? console_device : "/dev/tty0 or /dev/vc/0"); ++ printf("\a"); /* Output the only beep we can, in an effort to fall back on usefulness */ ++ perror("open"); ++ exit(1); + } ++ ++ if (ioctl(console_fd, EVIOCGSND(0)) != -1) ++ console_type = BEEP_TYPE_EVDEV; ++ else ++ console_type = BEEP_TYPE_CONSOLE; + + /* Beep */ + for (i = 0; i < parms.reps; i++) { /* start beep */ +- if(ioctl(console_fd, KIOCSOUND, (int)(CLOCK_TICK_RATE/parms.freq)) < 0) { +- printf("\a"); /* Output the only beep we can, in an effort to fall back on usefulness */ +- perror("ioctl"); +- } ++ do_beep(parms.freq); + /* Look ma, I'm not ansi C compatible! */ + usleep(1000*parms.length); /* wait... */ +- ioctl(console_fd, KIOCSOUND, 0); /* stop beep */ ++ do_beep(0); /* stop beep */ + if(parms.end_delay || (i+1 < parms.reps)) + usleep(1000*parms.delay); /* wait... */ + } /* repeat. */ +@@ -318,5 +360,8 @@ int main(int argc, char **argv) { + parms = next; + } + ++ if(console_device) ++ free(console_device); ++ + return EXIT_SUCCESS; + }