URI: 
       Track ring time, busy signals, and enforce the timeout better - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit b99f2cf35da070c8d767310bf30a24808bf788e4
   DIR parent f14b18b5e2ce57fe083dabef02a6eebb905d6c28
  HTML Author: HD Moore <hd_moore@rapid7.com>
       Date:   Sat, 28 Feb 2009 19:48:25 +0000
       
       Track ring time, busy signals, and enforce the timeout better
       
       
       Diffstat:
         M src/iaxrecord/iaxrecord.c           |      71 ++++++++++++++++++++++++++++---
       
       1 file changed, 65 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/src/iaxrecord/iaxrecord.c b/src/iaxrecord/iaxrecord.c
       @@ -18,12 +18,14 @@
        #include <unistd.h>
        #include <sys/stat.h>
        #include <fcntl.h>
       +#include <time.h>
        #include <signal.h>
        
        #include <iaxclient.h>
        
        int initialized = 0;
        int debug       = 0;
       +int busy        = 0;
        
        float silence_threshold = 0.0f;
        int call_state  = 0;
       @@ -58,7 +60,37 @@ void usage(char **argv) {
        }
         
        int state_event_callback(struct iaxc_ev_call_state call) {
       +        if(call.state & IAXC_CALL_STATE_BUSY) busy = 1;
                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(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_COMPLETE)
       +                fprintf(stdout, "C");        
       +
       +        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_TRANSFER)
       +                fprintf(stdout, "T");                
       +                        
       +        fprintf(stdout, "\n");
       +        fflush(stdout);
       +*/                                                                
            return 0;
        }
        
       @@ -101,8 +133,8 @@ int main(int argc, char **argv) {
                char *iax_cid;
                int iax_sec = 20;
                int call_id = 0;
       -        int i;
                char dest[1024];
       +        time_t stime, etime;
                
                if(argc < 7) usage(argv);
                iax_host = argv[1];
       @@ -153,18 +185,45 @@ int main(int argc, char **argv) {
                
                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);
                
       +        stime = time(NULL);
       +        etime = 0;
       +        
                if(call_id >= 0) {
                        iaxc_select_call(call_id);
       -                for(i=0; i< (iax_sec*1000*2); i+= 500) {
       +                while( (unsigned int)(time(NULL))-(unsigned int)stime < iax_sec) {
       +                        if(call_state & IAXC_CALL_STATE_COMPLETE && ! etime) etime = time(NULL);
       +                        if(call_state & IAXC_CALL_STATE_BUSY) break;
                                if(iaxc_first_free_call() == call_id) break;
       -                        iaxc_millisleep(500);
       +                        iaxc_millisleep(250);
                        }
                }
       -
       -        fprintf(stdout, "COMPLETED %s BYTES=%d FILE=%s\n", iax_num, call_bytes, iax_out);
       +        if(! etime) time(&etime);
       +        
       +        fprintf(stdout, "COMPLETED %s BYTES=%d FILE=%s BUSY=%d RINGTIME=%d\n", 
       +                iax_num, 
       +                call_bytes,
       +                iax_out,
       +                busy,
       +                (unsigned int)(etime) - (unsigned int)(stime)
       +        );
                return(0);
        }
       +
       +/*
       +
       +Note about ring times vs ring counts: 
       +  http://en.wikipedia.org/wiki/Ringtone#Ringing_signal
       +        The ringing pattern is known as ring cadence. This only applies to POTS fixed phones, where 
       +        the high voltage ring signal is switched on and off to create the ringing pattern. In North
       +        America, the standard ring cadence is "2-4", or two seconds of ringing followed by four 
       +        seconds of silence. In Australia and the UK, the standard ring cadence is 400 ms on, 200 ms
       +        off, 400 ms on, 2000 ms off. These patterns may vary from region to region, and other 
       +        patterns are used in different countries around the world.
       +
       +ring count US = ringtime / 6.0 
       +ring count UK = ringtime / 3.0
       +*/