solve a intermittent hang with pulse audio+alsa, solve an occassional segfault during shutdown - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
---
(DIR) commit 1eaeca87fc11414300b9cb17737cde857145d9b5
(DIR) parent 24678be5de812202bd8b96babaac256a95bb668f
(HTM) Author: HD Moore <hd_moore@rapid7.com>
Date: Fri, 15 May 2009 02:49:31 +0000
solve a intermittent hang with pulse audio+alsa, solve an occassional segfault during shutdown
Diffstat:
M src/iaxrecord/iaxrecord.c | 148 ++++++++++++++++++++-----------
1 file changed, 98 insertions(+), 50 deletions(-)
---
(DIR) diff --git a/src/iaxrecord/iaxrecord.c b/src/iaxrecord/iaxrecord.c
@@ -25,6 +25,7 @@
int initialized = 0;
int debug = 0;
+int audio = 0;
int busy = 0;
int fail = 1;
@@ -42,8 +43,7 @@ void cleanup(void) {
reg_id = 0;
}
if ( initialized ) {
- iaxc_stop_processing_thread();
- iaxc_shutdown();
+ iaxc_stop_processing_thread();
initialized = 0;
}
}
@@ -56,7 +56,7 @@ void signal_handler(int signum) {
}
void usage(char **argv) {
- fprintf(stdout, "Usage: %s [server] [user] [pass] [cid] [output] [number] <seconds>\n", argv[0]);
+ fprintf(stdout, "Usage: %s -s [server] -u [user] -p <pass> -o [output] -n [number] -c <callerid> -l <seconds> [-D]\n", argv[0]);
exit(1);
}
@@ -64,36 +64,37 @@ int state_event_callback(struct iaxc_ev_call_state call) {
if(call.state & IAXC_CALL_STATE_BUSY) busy = 1;
if(call.state & IAXC_CALL_STATE_COMPLETE) fail = 0;
call_state = call.state;
-
/*
- fprintf(stdout, "STATE: ");
- if(call.state & IAXC_CALL_STATE_FREE)
- fprintf(stdout, "F");
-
- if(call.state & IAXC_CALL_STATE_ACTIVE)
- fprintf(stdout, "A");
+ if(debug) {
+ fprintf(stdout, "STATE: ");
+ if(call.state & IAXC_CALL_STATE_FREE)
+ fprintf(stdout, "F");
+
+ if(call.state & IAXC_CALL_STATE_ACTIVE)
+ fprintf(stdout, "A");
+
+ if(call.state & IAXC_CALL_STATE_OUTGOING)
+ fprintf(stdout, "O");
+
+ if(call.state & IAXC_CALL_STATE_RINGING)
+ fprintf(stdout, "R");
- if(call.state & IAXC_CALL_STATE_OUTGOING)
- fprintf(stdout, "O");
+ if(call.state & IAXC_CALL_STATE_COMPLETE)
+ fprintf(stdout, "C");
- if(call.state & IAXC_CALL_STATE_RINGING)
- fprintf(stdout, "R");
-
- if(call.state & IAXC_CALL_STATE_COMPLETE)
- fprintf(stdout, "C");
-
- if(call.state & IAXC_CALL_STATE_SELECTED)
- fprintf(stdout, "S");
+ if(call.state & IAXC_CALL_STATE_SELECTED)
+ fprintf(stdout, "S");
+
+ if(call.state & IAXC_CALL_STATE_BUSY)
+ fprintf(stdout, "B");
- if(call.state & IAXC_CALL_STATE_BUSY)
- fprintf(stdout, "B");
-
- if(call.state & IAXC_CALL_STATE_TRANSFER)
- fprintf(stdout, "T");
-
- fprintf(stdout, "\n");
- fflush(stdout);
-*/
+ if(call.state & IAXC_CALL_STATE_TRANSFER)
+ fprintf(stdout, "T");
+
+ fprintf(stdout, "\n");
+ fflush(stdout);
+ }
+*/
return 0;
}
@@ -130,25 +131,60 @@ int iaxc_callback(iaxc_event e) {
int main(int argc, char **argv) {
- char *iax_host;
- char *iax_user;
- char *iax_pass;
- char *iax_num;
- char *iax_cid;
+ char *iax_host = NULL;
+ char *iax_user = NULL;
+ char *iax_pass = "";
+ char *iax_num = NULL;
+ char *iax_cid = "15555555555";
+ char *iax_name = "";
int iax_sec = 20;
int call_id = 0;
char dest[1024];
time_t stime, etime;
- 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];
+ int c;
+ extern char *optarg;
+ extern int optind, optopt;
+
+ while ((c = getopt(argc, argv, ":hs:u:p:c:o:n:l:N:DA")) != -1) {
+ switch(c) {
+ case 'h':
+ usage(argv);
+ break;
+ case 's':
+ iax_host = optarg;
+ break;
+ case 'u':
+ iax_user = optarg;
+ break;
+ case 'p':
+ iax_pass = optarg;
+ break;
+ case 'c':
+ iax_cid = optarg;
+ break;
+ case 'o':
+ iax_out = optarg;
+ break;
+ case 'n':
+ iax_num = optarg;
+ break;
+ case 'l':
+ iax_sec = atoi(optarg);
+ break;
+ case 'N':
+ iax_name = optarg;
+ break;
+ case 'D':
+ debug = 1;
+ break;
+ case 'A':
+ audio = 1;
+ break;
+ }
+ }
- if(argc > 7) iax_sec = atoi(argv[7]);
+ if(! (iax_host && iax_user && iax_num && iax_out)) usage(argv);
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);
@@ -167,35 +203,45 @@ int main(int argc, char **argv) {
/* install signal handler to catch CRTL-Cs */
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
-
+
+ /* forcible disable pulse audio if the audio flag is not set (-A) */
+ if(! audio) setenv("PULSE_SERVER", "0.0.0.0", 1);
+
+ if(debug) fprintf(stderr, ">> INITIALIZING\n");
if ( iaxc_initialize(1) ) {
fprintf(stdout, "error: Could not initialize iaxclient!\n");
exit(0);
}
initialized = 1;
-
- iaxc_set_callerid ("", iax_cid);
+ if(debug) fprintf(stderr, ">> INITIALIZED\n");
+
+ iaxc_set_audio_output(audio ? 0 : 1);
+ iaxc_set_callerid (iax_name, iax_cid);
iaxc_set_formats(IAXC_FORMAT_ULAW | IAXC_FORMAT_ALAW, IAXC_FORMAT_ULAW | IAXC_FORMAT_ALAW);
// Causes problems for some asterix servers, not sure why yet
// iaxc_set_silence_threshold(silence_threshold);
+ if(debug) fprintf(stderr, ">> STARTING PROCESSING THREAD\n");
iaxc_set_event_callback(iaxc_callback);
iaxc_start_processing_thread();
- iaxc_set_audio_output(debug ? 0 : 1);
-
+ if(debug) fprintf(stderr, ">> STARTED PROCESSING THREAD\n");
+
iaxc_set_audio_prefs(IAXC_AUDIO_PREF_RECV_REMOTE_RAW);
-
+
+ if(debug) fprintf(stderr, ">> REGISTERING\n") ;
reg_id = iaxc_register(iax_user, iax_pass, iax_host);
- if(debug) fprintf(stderr, " RegID: %d\n", reg_id);
+ if(debug) fprintf(stderr, ">> REGISTERED: %d\n", reg_id);
+ if(debug) fprintf(stderr, ">> CALLING\n");
call_id = iaxc_call(dest);
- if(debug) fprintf(stderr, "CallID: %d\n", call_id);
+ if(debug) fprintf(stderr, ">> CALLED: %d\n", call_id);
stime = time(NULL);
etime = 0;
+ if(debug) fprintf(stderr, ">> WAITING\n");
if(call_id >= 0) {
iaxc_select_call(call_id);
while( (unsigned int)(time(NULL))-(unsigned int)stime < iax_sec) {
@@ -208,6 +254,8 @@ int main(int argc, char **argv) {
fail = 1;
}
+ if(debug) fprintf(stderr, ">> DONE\n");
+
if(! etime) time(&etime);
fprintf(stdout, "COMPLETED %s BYTES=%d FILE=%s FAIL=%d BUSY=%d RINGTIME=%d\n",