| Intro | |
| ----- | |
| I just got so tired of being limited to printf("\a"); when I wanted a terminal | |
| beep. This program isn't supposed to be anything stupendous, it's just | |
| supposed to get the job done. Its intended purpose in life is to live inside | |
| shell/perl scripts, and allow a little more granularity than you get with the | |
| default terminal bell. Maybe I'm the only one who thinks this is useful. :) | |
| If for any reason you decide you need to, contact me: | |
| johnath@johnath.com | |
| http://johnath.com/ | |
| And beep can generally be found at: | |
| http://johnath.com/beep/ | |
| For installation instructions, see INSTALL. | |
| For copying and (non-)warranty information, see COPYING. | |
| For usage information, check the man page. | |
| There is a github repository of this code at: git://github.com/johnath/beep.git | |
| A note about ioctl | |
| ------------------ | |
| As noted in the man page, some users are running into a situation where beep | |
| dies with a complaint from ioctl(). The reason for this, as Peter Tirsek was | |
| nice enough to point out to me, stems from how the kernel handles beep's | |
| attempt to poke at (for non-programmers: ioctl is a sort of catch-all function | |
| that lets you poke at things that have no other predefined poking-at mechanism) | |
| the tty, which is how it beeps. The short story is, the kernel checks that | |
| either: | |
| - you are the superuser | |
| - you own the current tty | |
| What this means is that root can always make beep work (to the best of my | |
| knowledge!), and that any local user can make beep work, BUT a non-root remote | |
| user cannot use beep in it's natural state. What's worse, an xterm, or other | |
| x-session counts, as far as the kernel is concerned, as 'remote', so beep | |
| won't work from a non-priviledged xterm either. I had originally chalked this | |
| up to a bug, but there's actually nothing I can do about it, and it really is | |
| a Good Thing that the kernel does things this way. There is also a solution. | |
| By default beep is not installed with the suid bit set, because that would | |
| just be zany. On the other hand, if you do make it suid root, all your | |
| problems with beep bailing on ioctl calls will magically vanish, which is | |
| pleasant, and the only reason not to is that any suid program is a potential | |
| security hole. Conveniently, beep is very short, so auditing it is pretty | |
| straightforward. | |
| Decide for yourself, of course, but it looks safe to me - there's only one | |
| buffer and fgets doesn't let it overflow, there's only one file opening, and | |
| while there is a potential race condition there, it's with /dev/console. If | |
| someone can exploit this race by replacing /dev/console, you've got bigger | |
| problems. :) | |
| So the quick solution is beep is not beeping when you want it to is: | |
| $ su | |
| Password: | |
| # chmod 4755 /usr/bin/beep | |
| (or wherever you put it) | |
| The one snag is that this will give any little nitwit the ability to run beep | |
| successfully - make sure this is what you want. If it isn't, a slightly more | |
| complex fix would be something like: | |
| # chgrp beep /usr/bin/beep | |
| # chmod 4750 /usr/bin/beep | |
| and then add only beep-worthy users to the 'beep' group. | |
| Playing Songs | |
| ------------- | |
| A surprising number of people have sent in requests, or even patches, to help | |
| beep play multiple, different sounds off a single invocation. I had always | |
| thought that if people wanted a more complex melody, they would just do | |
| something like: | |
| $ cat << EOF > song.sh | |
| #!/bin/sh | |
| beep <first beep's options> | |
| beep <second beep's options> | |
| etc... | |
| EOF | |
| Nevertheless, because of repeated and vociferous demand, version 1.2 (and | |
| presumably all later versions) include the -n/--new switch which allows you to | |
| use one command line to create multiple beeps. Check the man page for | |
| details. I have also had a couple people suggest that I encourage the | |
| development of such shell scripts/command lines, even collect the particularly | |
| melodious ones. Certainly if anyone feels like sending some to me, I will put | |
| them somewhere visible, or even include them as a sample. I think Dvorak's New | |
| World Symphony, 4th Movement, for example, would make a lovely shell script. | |
| I also wouldn't mind a rendition of BNL's If I had a million dollars. But by | |
| all means, be creative. | |
| All files copyright (C) Johnathan Nightingale, 2002. | |
| All files distributed under the GNU general public license. | |