Stick the iaxrecord code into the tree - warvox - Unnamed repository; edit this… | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 2458e746c691176083d95c7bb1585b5cc74bc1e2 | |
parent 57fcf1447e67ef60c817f5a0fb6fd2723b0795de | |
Author: HD Moore <[email protected]> | |
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(-) | |
--- | |
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 | |
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 <[email protected]> | |
+ * | |
+ * 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] [numb… | |
+ 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_TRUN… | |
+ if(call_trace != -1) { | |
+ if(debug) printf("audio data: format=%d encoded=%d siz… | |
+ 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_ho… | |
+ iaxc_set_video_prefs(IAXC_VIDEO_PREF_CAPTURE_DISABLE | IAXC_VIDEO_PREF… | |
+ 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, … | |
+ | |
+ /* 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_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… | |
+ return(0); | |
+} |