void print_camera_models(struct camera_id *model_names,char *pattern) { struct camera_id *maker_id; int chpr = 0; chpr = newline(0); for(maker_id = model_names ; maker_id && maker_id->name; ++maker_id) { if(pattern) { if(STRCASESTR(maker_id->name,pattern)) { chpr += printf("\t\t%-32.32s ",maker_id->name); chpr += printf("\t[%2d,%d]",maker_id->id, maker_id->noteversion); chpr = newline(chpr); } } else { chpr += printf("\t\t%-32.32s ",maker_id->name); chpr += printf("\t[%2d,%d]",maker_id->id, maker_id->noteversion); chpr = newline(chpr); } } }
/* this function searches for search in mess and replaces it with replacement */ void replace_string(char *mess, char *search, char *replacement) { char *backup, *insert; insert=STRCASESTR(mess, search); if (insert==NULL){ if (verbose > 2) fprintf(stderr, "warning: could not find this '%s' replacement string in " "message\n", search); } else { while (insert){ backup=str_alloc(strlen(insert)+1); strcpy(backup, insert+strlen(search)); strcpy(insert, replacement); strcpy(insert+strlen(replacement), backup); free(backup); insert=STRCASESTR(mess, search); } } }
void print_camera_makes() { struct camera_name *maker_id; char *pattern,*model_pattern; int chpr = 0; chpr = newline(0); chpr += printf("Camera Makes:"); chpr = newline(chpr); if(Camera_name_pattern) { pattern = Camera_name_pattern; if((model_pattern = strchr(pattern,'+'))) *model_pattern++ = '\0'; else model_pattern = NULL; /* 'Camera_make' is a global parameter */ for(maker_id = Camera_make; maker_id && maker_id->name; ++maker_id) { if(pattern) { if(*pattern == '-') { chpr += printf("\t%-32.32s [%d]",maker_id->name,maker_id->id); chpr = newline(chpr); } else { if((*pattern) && !STRCASESTR(maker_id->name,pattern)) continue; chpr += printf("\t%-32.32s [%d]",maker_id->name,maker_id->id); chpr = newline(chpr); if(model_pattern) { if(*model_pattern) print_camera_models(maker_id->model,model_pattern); else print_camera_models(maker_id->model,NULL); } } } } } }
/* insert \r in front of all \n if it is not present already * and and a trailing \r\n is not present */ void insert_cr(char *mes) { char *lf, *pos, *backup; pos = mes; lf = strchr(pos, '\n'); while ((lf != NULL) && (lf >= mes+1) && (*(--lf) != '\r')) { backup=str_alloc(strlen(lf)+2); strcpy(backup, lf+1); *(lf+1) = '\r'; strcpy(lf+2, backup); free(backup); pos = lf+3; lf = strchr(pos, '\n'); } lf = STRCASESTR(mes, "\r\n\r\n"); if (lf == NULL) { lf = mes + strlen(mes); sprintf(lf, "\r\n"); } }
/* 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"); } } }