Asterisk applications register themselves with ast_application_register. They should have a short, unique name, and an exec function which takes as its arguments a channel and some data that might be useful for callback stuff. Remember to keep track of how many and which channels are using your application so that should the module need to be unloaded (particularly force unloaded), you will be able to ast_softhangup all the channels. An application should *never* call ast_hangup on the channel that it is running on (although it could conceivably hang up other channels that it allocates). See app_playback.c as an example of a simple application.