/* takes care of replies in the usrloc mode */ void handle_usrloc() { char *crlf; char ruri[11+12+20]; //FIXME: username length 20 should be dynamic if (regexec(&(regexps.proexp), rec, 0, 0, 0) == REG_NOERROR) { if (verbose > 2) { print_message_line(rec); printf("ignoring provisional response\n\n"); } if (inv_trans) { delays.retryAfter = timer_final; } else { delays.retryAfter = timer_t2; } cdata.dontsend = 1; } else { switch (usrlocstep) { case REG_REP: /* we have sent a register and look at the response now */ if (regexec(&(regexps.okexp), rec, 0, 0, 0) == REG_NOERROR) { if (verbose > 1) { printf ("\tOK\n"); } if (verbose > 2) { printf("\n%s\n", rec); } } else { fprintf(stderr, "received:\n%s\nerror: didn't " "received '200 OK' on register (see " "above). aborting\n", rec); log_message(req); exit_code(1, __PRETTY_FUNCTION__, "received non-2xx reply for REGISTER"); } if (invite == 0 && message == 0) { if (namebeg==nameend) { if (verbose>0) { printf("\nAll usrloc tests" " completed successful.\nreceived" " last message %.3f ms after first" " request (test duration).\n", deltaT(&(timers.firstsendt), &(timers.recvtime))); } if (delays.big_delay>0 && verbose>0) { printf("biggest delay between " "request and response was %.3f" " ms\n", delays.big_delay); } if (counters.retrans_r_c>0 && verbose>0) { printf("%i retransmission(s) received from server.\n", counters.retrans_r_c); } if (counters.retrans_s_c>0 && verbose>0) { printf("%i time(s) the timeout of " "%i ms exceeded and request was" " retransmitted.\n", counters.retrans_s_c, delays.retryAfter); if (counters.retrans_s_c > nagios_warn) { log_message(req); exit_code(4, __PRETTY_FUNCTION__, "#retransmissions above nagios warn level"); } } if (timing) { printf("%.3f ms\n", deltaT(&(timers.firstsendt), &(timers.recvtime))); } on_success(rec); } /* namebeg == nameend */ /* lets see if we deceid to remove a binding (case 6)*/ if ( ((float)rand()/RAND_MAX)*100 > rand_rem) { namebeg++; cseq_counter++; create_usern(usern, username, namebeg); create_msg(REQ_REG, req, NULL, usern, cseq_counter); } else { /* to prevent only removing of low user numbers new random number*/ cseq_counter++; create_usern(usern, username, ((float)rand()/RAND_MAX) * namebeg); create_msg(REQ_REM, req, NULL, usern, cseq_counter); usrlocstep=UNREG_REP; } } /* invite == 0 && message == 0 */ else if (invite == 1) { cseq_counter++; create_msg(REQ_INV, req, rep, usern, cseq_counter); inv_trans = 1; usrlocstep=INV_RECV; } else if (message == 1) { cseq_counter++; create_msg(REQ_MES, req, rep, usern, cseq_counter); inv_trans = 0; usrlocstep=MES_RECV; } break; case INV_RECV: /* see if we received our invite */ sprintf(ruri, "%s sip:%s", INV_STR, usern); if (!STRNCASECMP(rec, ruri, strlen(ruri))) { if (verbose > 1) { printf("\t\treceived invite\n"); } if (verbose > 2) { printf("\n%s\n", rec); } cpy_vias(rec, rep); cpy_rr(rec, rep, 0); swap_ptr(&req, &rep); usrlocstep=INV_OK_RECV; inv_trans = 0; } else { fprintf(stderr, "received:\n%s\nerror: did not " "received the INVITE that was sent " "(see above). aborting\n", rec); log_message(req); exit_code(1, __PRETTY_FUNCTION__, "did not received our own INVITE request"); } break; case INV_OK_RECV: /* did we received our ok ? */ if (STRNCASECMP(rec, INV_STR, INV_STR_LEN)==0) { if (verbose>0) { printf("ignoring INVITE retransmission\n"); } counters.retrans_r_c++; cdata.dontsend=1; return; } if (regexec(&(regexps.okexp), rec, 0, 0, 0) == REG_NOERROR) { if (verbose > 1) { printf("\t200 OK received\n"); } if (verbose > 2) { printf("\n%s\n", rec); } /* ACK was send already earlier generically */ usrlocstep=INV_ACK_RECV; cdata.dontsend=1; } else { fprintf(stderr, "received:\n%s\nerror: did not " "received the '200 OK' that was sent " "as the reply on the INVITE (see " "above). aborting\n", rec); log_message(req); exit_code(1, __PRETTY_FUNCTION__, "did not received our own 200 reply"); } break; case INV_ACK_RECV: /* did we received our ack */ if (STRNCASECMP(rec, SIP200_STR, SIP200_STR_LEN)==0) { if (verbose>0) { printf("ignoring 200 OK retransmission\n"); } counters.retrans_r_c++; cdata.dontsend=1; return; } sprintf(ruri, "%s sip:sipsak_conf@", ACK_STR); if (STRNCASECMP(rec, ruri, strlen(ruri))==0) { if (verbose > 1) { printf("\tACK received\n"); } if (verbose > 2) { printf("\n%s\n", rec); } if (verbose>0 && nameend>0) { printf("usrloc for %s%i completed " "successful\n", username, namebeg); } else if (verbose>0) { printf("usrloc for %s completed successful\n", username); } if (namebeg==nameend) { if (verbose>0) { printf("\nAll usrloc tests completed " "successful.\nreceived last message" " %.3f ms after first request (test" " duration).\n", deltaT(&(timers.firstsendt), &(timers.recvtime))); } if (delays.big_delay>0) { printf("biggest delay between " "request and response was %.3f" " ms\n", delays.big_delay); } if (counters.retrans_r_c>0) { printf("%i retransmission(s) received from server.\n", counters.retrans_r_c); } if (counters.retrans_s_c>0) { printf("%i time(s) the timeout of " "%i ms exceeded and request was" " retransmitted.\n", counters.retrans_s_c, delays.retryAfter); if (counters.retrans_s_c > nagios_warn) { log_message(req); exit_code(4, __PRETTY_FUNCTION__, "#retransmissions above nagios warn level"); } } on_success(rec); } /* namebeg == nameend */ if (usrloc == 1) { /* lets see if we deceid to remove a binding (case 6)*/ if (((float)rand()/RAND_MAX) * 100 > rand_rem) { namebeg++; cseq_counter++; create_usern(usern, username, namebeg); create_msg(REQ_REG, req, NULL, usern, cseq_counter); usrlocstep=REG_REP; } else { /* to prevent only removing of low user numbers new random number*/ cseq_counter++; create_usern(usern, username, ((float)rand()/RAND_MAX) * namebeg); create_msg(REQ_REM, req, NULL, usern, cseq_counter); usrlocstep=UNREG_REP; } } /* usrloc == 1 */ else { namebeg++; cseq_counter++; create_usern(usern, username, namebeg); create_msg(REQ_INV, req, rep, usern, cseq_counter); inv_trans = 1; usrlocstep=INV_RECV; } } /* STRNCASECMP */ else { fprintf(stderr, "received:\n%s\nerror: did not " "received the 'ACK' that was sent " "as the reply on the '200 OK' (see " "above). aborting\n", rec); log_message(req); exit_code(1, __PRETTY_FUNCTION__, "missing ACK that was send by myself"); } break; case MES_RECV: /* we sent the message and look if its forwarded to us */ sprintf(ruri, "%s sip:%s", MES_STR, usern); if (!STRNCASECMP(rec, ruri, strlen(ruri))) { if (verbose > 1) { crlf=STRCASESTR(rec, "\r\n\r\n"); crlf=crlf+4; printf(" received message\n '%s'\n", crlf); } if (verbose > 2) { printf("\n%s\n", rec); } cpy_vias(rec, rep); swap_ptr(&req, &rep); usrlocstep=MES_OK_RECV; } else { fprintf(stderr, "received:\n%s\nerror: did not " "received the 'MESSAGE' that was sent " "(see above). aborting\n", rec); log_message(req); exit_code(1, __PRETTY_FUNCTION__, "did not received my own MESSAGE request"); } break; case MES_OK_RECV: /* we sent our reply on the message and look if this is also forwarded to us */ if (STRNCASECMP(rec, MES_STR, MES_STR_LEN)==0) { if (verbose>0) { printf("ignoring MESSAGE retransmission\n"); } counters.retrans_r_c++; cdata.dontsend=1; return; } if (regexec(&(regexps.okexp), rec, 0, 0, 0) == REG_NOERROR) { if (verbose > 1) { printf(" reply received\n\n"); } else if (verbose>0 && nameend>0) { printf("usrloc for %s%i completed " "successful\n", username, namebeg); } else if (verbose>0) { printf("usrloc for %s completed successful\n", username); } if (namebeg==nameend) { if (verbose>0) { printf("\nAll usrloc tests completed " "successful.\nreceived last message" " %.3f ms after first request (test" " duration).\n", deltaT(&(timers.firstsendt), &(timers.recvtime))); } if (delays.big_delay>0) { printf("biggest delay between " "request and response was %.3f" " ms\n", delays.big_delay); } if (counters.retrans_r_c>0) { printf("%i retransmission(s) " "received from server.\n", counters.retrans_r_c); } if (counters.retrans_s_c>0) { printf("%i time(s) the timeout of " "%i ms exceeded and request was" " retransmitted.\n", counters.retrans_s_c, delays.retryAfter); if (counters.retrans_s_c > nagios_warn) { log_message(req); exit_code(4, __PRETTY_FUNCTION__, "#retransmissions above nagios warn level"); } } on_success(rec); } /* namebeg == nameend */ if (usrloc == 1) { /* lets see if we deceid to remove a binding (case 6)*/ if (((float)rand()/RAND_MAX) * 100 > rand_rem) { namebeg++; cseq_counter++; create_usern(usern, username, namebeg); create_msg(REQ_REG, req, NULL, usern, cseq_counter); usrlocstep=REG_REP; } else { /* to prevent only removing of low user numbers new random number*/ cseq_counter++; create_usern(usern, username, ((float)rand()/RAND_MAX) * namebeg); create_msg(REQ_REM, req, NULL, usern, cseq_counter); usrlocstep=UNREG_REP; } } /* usrloc == 1 */ else { namebeg++; cseq_counter++; create_usern(usern, username, namebeg); create_msg(REQ_MES, req, NULL, usern, cseq_counter); usrlocstep=MES_RECV; } } /* regexec */ else { if (verbose>0) { if (mes_body) { fprintf(stderr, "received:\n%s\nerror: did" " not received 200 for the " "MESSAGE (see above)\n", rec); } else { fprintf(stderr, "received:\n%s\nerror: did" " not received the '200 OK' " "that was sent as the reply on" " the MESSAGE (see above). " "aborting\n", rec); } } log_message(req); exit_code(1, __PRETTY_FUNCTION__, "received non-2xx reply for MESSAGE request"); } break; case UNREG_REP: if (STRNCASECMP(rec, MES_STR, MES_STR_LEN)==0) { if (verbose>0) { printf("ignoring MESSAGE retransmission\n"); } counters.retrans_r_c++; cdata.dontsend=1; return; } if (regexec(&(regexps.okexp), rec, 0, 0, 0) == REG_NOERROR) { if (verbose > 1) { printf(" OK\n\n"); } else if (verbose>0 && nameend>0) { printf("Binding removal for %s%i " "successful\n", username, namebeg); } else if (verbose>0) { printf("Binding removal for %s successful\n", username); } namebeg++; cseq_counter++; create_usern(usern, username, namebeg); create_msg(REQ_REG, req, NULL, usern, cseq_counter); usrlocstep=REG_REP; } else { fprintf(stderr, "received:\n%s\nerror: did not " "received the expected 200 on the " "remove bindings request for %s%i (see" " above). aborting\n", rec, username, namebeg); log_message(req); exit_code(1, __PRETTY_FUNCTION__, "received non-2xx reply for de-register request"); } break; default: fprintf(stderr, "error: unknown step in usrloc\n"); exit_code(2, __PRETTY_FUNCTION__, "unknown step in usrloc"); break; } /* switch */ } /* regexec proexp */ }
/* takes care of replies in the trace route mode */ void trace_reply() { char *contact; if (regexec(&(regexps.tmhexp), rec, 0, 0, 0) == REG_NOERROR) { /* we received 483 to many hops */ printf("%i: ", namebeg); if (verbose > 2) { printf("(%.3f ms)\n%s\n", deltaT(&(timers.sendtime), &(timers.recvtime)), rec); } else { warning_extract(rec); printf("(%.3f ms) ", deltaT(&(timers.sendtime), &(timers.recvtime))); print_message_line(rec); } namebeg++; cseq_counter++; create_msg(REQ_OPT, req, NULL, usern, cseq_counter); set_maxforw(req, namebeg); return; } else if (regexec(&(regexps.proexp), rec, 0, 0, 0) == REG_NOERROR) { /* we received a provisional response */ printf("%i: ", namebeg); if (verbose > 2) { printf("(%.3f ms)\n%s\n", deltaT(&(timers.sendtime), &(timers.recvtime)), rec); } else { warning_extract(rec); printf("(%.3f ms) ", deltaT(&(timers.sendtime), &(timers.recvtime))); print_message_line(rec); } delays.retryAfter = timer_t2; cdata.dontsend=1; return; } else { /* anything else then 483 or provisional will be treated as final */ printf("%i: ", namebeg); warning_extract(rec); printf("(%.3f ms) ", deltaT(&(timers.sendtime), &(timers.recvtime))); print_message_line(rec); if ((contact = STRCASESTR(rec, CONT_STR)) != NULL || (contact = STRCASESTR(rec, CONT_SHORT_STR)) != NULL) { if (*contact == '\n') { contact++; } printf("\t"); print_message_line(contact); } else { printf("\twithout Contact header\n"); } if (regexec(&(regexps.okexp), rec, 0, 0, 0) == REG_NOERROR) { on_success(rec); } else { log_message(req); exit_code(1, __PRETTY_FUNCTION__, "received final non-2xx reply"); } } }
/* takes care of replies in the default mode */ void handle_default() { /* in the normal send and reply case anything other then 1xx will be treated as final response*/ if (regexec(&(regexps.proexp), rec, 0, 0, 0) == REG_NOERROR) { if (verbose > 1) { printf("%s\n\n", rec); printf("** reply received "); if ((counters.send_counter == 1) || (STRNCASECMP(req, ACK_STR, ACK_STR_LEN) == 0)) { printf("after %.3f ms **\n", deltaT(&(timers.firstsendt), &(timers.recvtime))); } else { printf("%.3f ms after first send\n and " "%.3f ms after last send **\n", deltaT(&(timers.firstsendt), &(timers.recvtime)), deltaT(&(timers.sendtime), &(timers.recvtime))); } printf(" "); print_message_line(rec); printf(" provisional received; still" " waiting for a final response\n"); } if (inv_trans) { delays.retryAfter = timer_final; } else { delays.retryAfter = timer_t2; } cdata.dontsend = 1; return; } else { if (verbose > 1) { printf("%s\n\n", rec); printf("** reply received "); if ((counters.send_counter == 1) || (STRNCASECMP(req, ACK_STR, ACK_STR_LEN) == 0)){ printf("after %.3f ms **\n", deltaT(&(timers.firstsendt), &(timers.recvtime))); } else { printf("%.3f ms after first send\n and " "%.3f ms after last send **\n", deltaT(&(timers.firstsendt), &(timers.recvtime)), deltaT(&(timers.sendtime), &(timers.recvtime))); } printf(" "); print_message_line(rec); printf(" final received\n"); } else if (verbose>0) { printf("%s\n", rec); } if (timing > 0) { timing--; if (timing == 0) { if (counters.run == 0) { counters.run++; } printf("%.3f/%.3f/%.3f ms\n", delays.small_delay, delays.all_delay / counters.run, delays.big_delay); } else { counters.run++; new_transaction(req, rep); delays.retryAfter = timer_t1; } } if (timing == 0) { if (regexec(&(regexps.okexp), rec, 0, 0, 0) == REG_NOERROR) { on_success(rec); } else { log_message(req); exit_code(1, __PRETTY_FUNCTION__, "received final non-2xx reply"); } } } }
int main(int argc, char **argv) { const bool display_help = get_option(argc, argv, "--help"); if (display_help) { show_help(); return EXIT_SUCCESS; } const bool display_all = get_option(argc, argv, "-v") || get_option(argc, argv, "--verbose"); MEMORYSTATUSEX status; status.dwLength = sizeof(status); const BOOL success = GlobalMemoryStatusEx(&status); if (!success) { const DWORD error = GetLastError(); print_message_line("******************************************"); print_message_line("Error getting memory information", error); print_message_line("******************************************"); return EXIT_FAILURE; } const DWORD load = status.dwMemoryLoad; const DWORDLONG physical = status.ullTotalPhys / KB_DIV; const DWORDLONG free_physical = status.ullAvailPhys / KB_DIV; const DWORDLONG page = status.ullTotalPageFile / KB_DIV; const DWORDLONG free_page = status.ullAvailPageFile / KB_DIV; const DWORDLONG virtual_memory = status.ullTotalVirtual / KB_DIV; const DWORDLONG free_virtual = status.ullAvailVirtual / KB_DIV; const DWORDLONG free_extended = status.ullAvailExtendedVirtual / KB_DIV; print_message_line("******************************************"); print_message_line("Percent of memory in use", load); print_message_line("KB of physical memory", physical); print_message_line("KB of free physical memory", free_physical); if (display_all) { print_message_line("KB of paging file", page); print_message_line("KB of free paging file", free_page); print_message_line("KB of virtual memory", virtual_memory); print_message_line("KB of free virtual memory", free_virtual); print_message_line("KB of free extended memory", free_extended); } print_message_line("******************************************"); return EXIT_SUCCESS; }