static int linphonec_main_loop (LinphoneCore * opm) { char *input; print_prompt(opm); while (linphonec_running && (input=linphonec_readline(prompt))) { char *iptr; /* input and input pointer */ size_t input_len; /* Strip blanks */ iptr=lpc_strip_blanks(input); input_len = strlen(iptr); /* * Do nothing but release memory * if only blanks are read */ if ( ! input_len ) { free(input); continue; } #ifdef HAVE_READLINE /* * Only add to history if not already * last item in it, and only if the command * doesn't start with a space (to allow for * hiding passwords) */ if ( iptr == input && strcmp(last_in_history, iptr) ) { strncpy(last_in_history,iptr,sizeof(last_in_history)); last_in_history[sizeof(last_in_history)-1]='\0'; add_history(iptr); } #endif linphonec_parse_command_line(linphonec, iptr); linphonec_command_finished(); free(input); } return 0; }
/* * This is called from idle_call() whenever * pending_auth != NULL. * * It prompts user for a password. * Hitting ^D (EOF) would make this function * return 0 (Cancel). * Any other input would try to set linphone core * auth_password for the pending_auth, add the auth_info * and return 1. */ int linphonec_prompt_for_auth_final(LinphoneCore *lc) { char *input, *iptr; char auth_prompt[256]; rl_hook_func_t *old_event_hook; LinphoneAuthInfo *pending_auth=auth_stack.elem[auth_stack.nitems-1]; snprintf(auth_prompt, 256, "Password for %s on %s: ", pending_auth->username, pending_auth->realm); printf("\n"); /* * Disable event hook to avoid entering an * infinite loop. This would prevent idle_call * from being called during authentication reads. * Note that it might be undesiderable... */ old_event_hook=rl_event_hook; rl_event_hook=NULL; while (1) { input=readline(auth_prompt); /* * If EOF (^D) is sent you probably don't want * to provide an auth password... should give up * the operation, but there's no mechanism to * send this info back to caller currently... */ if ( ! input ) { printf("Cancel requested, but not implemented.\n"); continue; } /* Strip blanks */ iptr=lpc_strip_blanks(input); /* * Only blanks, continue asking */ if ( ! *iptr ) { free(input); continue; } /* Something typed, let's try */ break; } /* * No check is done here to ensure password is correct. * I guess password will be asked again later. */ linphone_auth_info_set_passwd(pending_auth, input); linphone_core_add_auth_info(lc, pending_auth); --(auth_stack.nitems); /* * Reset line_buffer, to avoid the password * to be used again from outer readline */ rl_line_buffer[0]='\0'; rl_event_hook=old_event_hook; return 1; }