Stick the iaxrecord code into the tree - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 2458e746c691176083d95c7bb1585b5cc74bc1e2
 (DIR) parent 57fcf1447e67ef60c817f5a0fb6fd2723b0795de
 (HTM) Author: HD Moore <hd_moore@rapid7.com>
       Date:   Fri, 13 Feb 2009 04:24:52 +0000
       
       Stick the iaxrecord code into the tree
       
       
       Diffstat:
         A src/iaxrecord/Makefile              |       4 ++++
         A src/iaxrecord/iaxrecord.c           |     168 +++++++++++++++++++++++++++++++
       
       2 files changed, 172 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/src/iaxrecord/Makefile b/src/iaxrecord/Makefile
       @@ -0,0 +1,4 @@
       +all:
       +        gcc -Wall -o iaxrecord iaxrecord.c -liaxclient
       +clean:
       +        rm -f iaxrecord *.o
 (DIR) diff --git a/src/iaxrecord/iaxrecord.c b/src/iaxrecord/iaxrecord.c
       @@ -0,0 +1,168 @@
       +/*
       + * IAXRecord: a utility for recording audio on an outbound IAX call
       + *
       + * Copyright (C) 2009, H D Moore <hdm[at]metasploit.com>
       + *
       + * Based on simpleclient from the IAXClient distribution
       + *
       + * Copyright (C) 1999, Linux Support Services, Inc.
       + *
       + * Mark Spencer <markster@linux-support.net>
       + *
       + * This program is free software, distributed under the terms of
       + * the GNU General Public License
       + */
       +
       +#include <stdio.h>
       +#include <stdlib.h>
       +#include <unistd.h>
       +#include <sys/stat.h>
       +#include <fcntl.h>
       +#include <signal.h>
       +
       +#include <iaxclient.h>
       +
       +int initialized = 0;
       +int debug       = 0;
       +
       +float silence_threshold = 0.0f;
       +int call_state  = 0;
       +int call_trace  = -1;
       +int call_done   = 0;
       +int call_bytes  = 0;
       +char *iax_out;
       +int reg_id;
       +
       +void cleanup(void) {
       +        if ( reg_id ) {
       +                iaxc_unregister(reg_id);
       +                reg_id = 0;
       +        }
       +        if ( initialized ) {
       +                iaxc_stop_processing_thread();                
       +                iaxc_shutdown();
       +                initialized = 0;
       +        }
       +}
       +
       +void signal_handler(int signum) {
       +        if ( signum == SIGTERM || signum == SIGINT ) {
       +                cleanup();
       +                exit(0);
       +        }
       +}
       +
       +void usage(char **argv) {
       +        fprintf(stdout, "Usage: %s [server] [user] [pass] [cid] [output] [number] <seconds>\n", argv[0]);
       +        exit(1);
       +}
       + 
       +int state_event_callback(struct iaxc_ev_call_state call) {
       +        call_state = call.state;
       +    return 0;
       +}
       +
       +int audio_event_callback( struct iaxc_ev_audio audio) {
       +        if(call_state & IAXC_CALL_STATE_COMPLETE) {
       +                if(call_trace == -1) call_trace = open(iax_out, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
       +                if(call_trace != -1) {
       +                        if(debug) printf("audio data: format=%d encoded=%d size=%d state=%d\n", audio.format, audio.encoded, audio.size, call_state);
       +                        write(call_trace, audio.data, audio.size);
       +                        call_bytes += audio.size;
       +                }
       +        }
       +        return 0;
       +}
       +
       +int iaxc_callback(iaxc_event e) {
       +    switch(e.type) {
       +                case IAXC_EVENT_TEXT:
       +                        return ( debug ? 0 : 1 );
       +                        break;
       +        case IAXC_EVENT_STATE:
       +            return state_event_callback(e.ev.call);
       +                        break;
       +                case IAXC_EVENT_AUDIO:
       +                        return audio_event_callback(e.ev.audio);
       +                        break;
       +        default:
       +            return 0;
       +                        break;
       +    }
       +}
       +
       +                
       +int main(int argc, char **argv) {
       +
       +        char *iax_host;
       +        char *iax_user;
       +        char *iax_pass;
       +        char *iax_num;
       +        char *iax_cid;
       +        int iax_sec = 20;
       +        int call_id = 0;
       +        int i;
       +        char dest[1024];
       +        
       +        if(argc < 7) usage(argv);
       +        iax_host = argv[1];
       +        iax_user = argv[2];
       +        iax_pass = argv[3];
       +        iax_cid  = argv[4];
       +        iax_out  = argv[5];
       +        iax_num  = argv[6];
       +        
       +        if(argc > 7) iax_sec = atoi(argv[7]);
       +
       +        snprintf(dest, sizeof(dest), "%s:%s@%s/%s", iax_user, iax_pass, iax_host, iax_num);
       +        iaxc_set_video_prefs(IAXC_VIDEO_PREF_CAPTURE_DISABLE | IAXC_VIDEO_PREF_SEND_DISABLE);
       +        iaxc_set_audio_prefs(IAXC_AUDIO_PREF_SEND_DISABLE);
       +
       +        if(! debug) {
       +                fclose(stderr);
       +                stderr = fopen("/dev/null", "w");
       +        }
       +        
       +        fprintf(stdout, "STARTED %s BYTES=%d FILE=%s\n", iax_num, call_bytes, iax_out);
       +                
       +        /* activate the exit handler */
       +        atexit(cleanup);
       +
       +        /* install signal handler to catch CRTL-Cs */
       +        signal(SIGINT, signal_handler);
       +        signal(SIGTERM, signal_handler);
       +                        
       +        if ( iaxc_initialize(1) ) {
       +                fprintf(stdout, "error: Could not initialize iaxclient!\n");
       +                exit(0);
       +        }
       +        
       +        initialized = 1;
       +
       +        iaxc_set_callerid ("", iax_cid);
       +        iaxc_set_formats(IAXC_FORMAT_ULAW | IAXC_FORMAT_ALAW, IAXC_FORMAT_ULAW | IAXC_FORMAT_ALAW);
       +        iaxc_set_silence_threshold(silence_threshold);
       +
       +        iaxc_set_event_callback(iaxc_callback);        
       +        iaxc_start_processing_thread();
       +        iaxc_set_audio_output(debug ? 0 : 1);
       +        
       +        iaxc_set_audio_prefs(IAXC_AUDIO_PREF_RECV_REMOTE_RAW);
       +        
       +        reg_id  = iaxc_register(iax_user, iax_pass, iax_host);
       +        if(debug) fprintf(stderr, " RegID: %d\n", reg_id);
       +        
       +        call_id = iaxc_call(dest);
       +        if(debug) fprintf(stderr, "CallID: %d\n", call_id);
       +        
       +        if(call_id >= 0) {
       +                iaxc_select_call(call_id);
       +                for(i=0; i< (iax_sec*1000*2); i+= 500) {
       +                        if(iaxc_first_free_call() == call_id) break;
       +                        iaxc_millisleep(500);
       +                }
       +        }
       +
       +        fprintf(stdout, "COMPLETED %s BYTES=%d FILE=%s\n", iax_num, call_bytes, iax_out);
       +        return(0);
       +}