static void xlsx_info_free (xlsx_info *xinfo) { if (xinfo != NULL) { strings_array_free(xinfo->sheetnames, xinfo->n_sheets); strings_array_free(xinfo->filenames, xinfo->n_sheets); strings_array_free(xinfo->strings, xinfo->n_strings); destroy_dataset(xinfo->dset); } }
void series_table_destroy (series_table *st) { if (st != NULL) { strings_array_free(st->strs, st->n_strs); if (st->ht != NULL) { g_hash_table_destroy(st->ht); } free(st); } }
static void command_history_destroy (void) { if (cmd_history != NULL) { strings_array_free(cmd_history, hlines); cmd_history = NULL; } g_free(hist0); hist0 = NULL; hlines = hpos = 0; }
int ril_request_get_sim_status(void *data, size_t size, RIL_Token token) { void *card_status_data; size_t card_status_size; #if RIL_VERSION >= 6 RIL_CardStatus_v6 *card_status; #else RIL_CardStatus *card_status; #endif struct ril_request *request; int rc; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_GET_SIM_STATUS, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; card_status_size = ril_request_data_size_get(RIL_REQUEST_GET_SIM_STATUS); card_status_data = ril_request_data_get(RIL_REQUEST_GET_SIM_STATUS); #if RIL_VERSION >= 6 if (card_status_data != NULL && card_status_size >= sizeof(RIL_CardStatus_v6)) { card_status = (RIL_CardStatus_v6 *) ril_request_data_get(RIL_REQUEST_GET_SIM_STATUS); #else if (card_status_data != NULL && card_status_size >= sizeof(RIL_CardStatus)) { card_status = (RIL_CardStatus *) ril_request_data_get(RIL_REQUEST_GET_SIM_STATUS); #endif ril_request_complete(token, RIL_E_SUCCESS, card_status_data, card_status_size); free(card_status_data); return RIL_REQUEST_COMPLETED; } else { rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, IPC_TYPE_GET, NULL, 0); if (rc < 0) { ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); return RIL_REQUEST_COMPLETED; } return RIL_REQUEST_HANDLED; } } int ipc_sec_phone_lock(struct ipc_message *message) { struct ipc_sec_phone_lock_response_data *data; int active; if (message == NULL || message->data == NULL || message->size < sizeof(struct ipc_sec_phone_lock_response_data)) return -1; if (message->type != IPC_TYPE_RESP || !ipc_seq_valid(message->aseq)) return 0; data = (struct ipc_sec_phone_lock_response_data *) message->data; active = !!data->active; ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_SUCCESS, &active, sizeof(active)); return 0; } int ril_request_query_facility_lock(void *data, size_t size, RIL_Token token) { struct ipc_sec_phone_lock_request_get_data request_data; char **values = NULL; int rc; if (data == NULL || size < 4 * sizeof(char *)) goto error; rc = ril_radio_state_check(RADIO_STATE_SIM_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; values = (char **) data; request_data.facility_type = ril2ipc_sec_facility_type(values[0]); if (request_data.facility_type == 0) goto error; strings_array_free(values, size); values = NULL; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PHONE_LOCK, IPC_TYPE_GET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ipc_sec_callback(struct ipc_message *message) { struct ipc_sec_lock_infomation_request_data request_data; struct ipc_gen_phone_res_data *data; struct ril_request *request = NULL; void *request_complete_data; size_t request_complete_size; unsigned char facility_type; char **values; int retry_count; int rc; if (message == NULL || message->data == NULL || message->size < sizeof(struct ipc_gen_phone_res_data)) return -1; data = (struct ipc_gen_phone_res_data *) message->data; request = ril_request_find_token(ipc_fmt_request_token(message->aseq)); if (request == NULL) goto error; if (request->request == RIL_REQUEST_ENTER_SIM_PIN || request->request == RIL_REQUEST_CHANGE_SIM_PIN) { // Grab the count of remaining tries before completing the request ril_request_data_set_uniq(request->request, (void *) data, sizeof(struct ipc_gen_phone_res_data)); rc = ipc_sec_lock_infomation_setup(&request_data, IPC_SEC_PIN_TYPE_PIN1); if (rc < 0) { ril_request_data_free(request->request); goto error; } rc = ipc_fmt_send(message->aseq, IPC_SEC_LOCK_INFOMATION, IPC_TYPE_GET, (void *) &request_data, sizeof(request_data)); if (rc < 0) { ril_request_data_free(request->request); goto error; } } else if (request->request == RIL_REQUEST_ENTER_SIM_PIN2 || request->request == RIL_REQUEST_CHANGE_SIM_PIN2) { // Grab the count of remaining tries before completing the request ril_request_data_set_uniq(request->request, (void *) data, sizeof(struct ipc_gen_phone_res_data)); rc = ipc_sec_lock_infomation_setup(&request_data, IPC_SEC_PIN_TYPE_PIN2); if (rc < 0) { ril_request_data_free(request->request); goto error; } rc = ipc_fmt_send(message->aseq, IPC_SEC_LOCK_INFOMATION, IPC_TYPE_GET, (void *) &request_data, sizeof(request_data)); if (rc < 0) { ril_request_data_free(request->request); goto error; } } else if (request->request == RIL_REQUEST_SET_FACILITY_LOCK) { values = (char **) request->data; request_complete_size = ril_request_data_size_get(RIL_REQUEST_SET_FACILITY_LOCK); request_complete_data = ril_request_data_get(RIL_REQUEST_SET_FACILITY_LOCK); rc = ipc_gen_phone_res_check(data); if (request_complete_data != NULL && request_complete_size > 0 && rc >= 0) { rc = ipc_gen_phone_res_expect_callback(message->aseq, IPC_SEC_PHONE_LOCK, ipc_sec_callback); if (rc < 0) { strings_array_free(values, request->size); goto error; } rc = ipc_fmt_send(message->aseq, IPC_SEC_PHONE_LOCK, IPC_TYPE_SET, request_complete_data, request_complete_size); if (rc < 0) { strings_array_free(values, request->size); goto error; } } else { // When FD facility PIN2 unlock failed, ask the count of remaining tries directly facility_type = ril2ipc_sec_facility_type(values[0]); strings_array_free(values, request->size); // Grab the count of remaining tries before completing the request ril_request_data_set_uniq(RIL_REQUEST_SET_FACILITY_LOCK, (void *) data, sizeof(struct ipc_gen_phone_res_data)); if (facility_type == IPC_SEC_FACILITY_TYPE_FD) { rc = ipc_sec_lock_infomation_setup(&request_data, IPC_SEC_PIN_TYPE_PIN2); if (rc < 0) { ril_request_data_free(request->request); goto error; } } else { rc = ipc_sec_lock_infomation_setup(&request_data, IPC_SEC_PIN_TYPE_PIN1); if (rc < 0) { ril_request_data_free(request->request); goto error; } } rc = ipc_fmt_send(message->aseq, IPC_SEC_LOCK_INFOMATION, IPC_TYPE_GET, (void *) &request_data, sizeof(request_data)); if (rc < 0) { ril_request_data_free(request->request); goto error; } } } else if (request->request == RIL_REQUEST_SIM_IO) { request_complete_size = ril_request_data_size_get(RIL_REQUEST_SIM_IO); request_complete_data = ril_request_data_get(RIL_REQUEST_SIM_IO); rc = ipc_gen_phone_res_check(data); if (rc < 0) { ril_request_complete(request->token, RIL_E_SIM_PIN2, NULL, 0); goto complete; } if (request_complete_data != NULL && request_complete_size > 0) { rc = ipc_fmt_send(message->aseq, IPC_SEC_RSIM_ACCESS, IPC_TYPE_GET, request_complete_data, request_complete_size); if (rc < 0) goto error; } else { goto error; } } else { retry_count = -1; rc = ipc_gen_phone_res_check(data); if (rc < 0) { if ((data->code & 0xff) == 0x10) { RIL_LOGE("%s: Wrong password", __func__); ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_PASSWORD_INCORRECT, &retry_count, sizeof(retry_count)); } else if ((data->code & 0xff) == 0x0c) { RIL_LOGE("%s: Wrong password and no attempts left", __func__); retry_count = 0; ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_PASSWORD_INCORRECT, &retry_count, sizeof(retry_count)); } else { ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_GENERIC_FAILURE, &retry_count, sizeof(retry_count)); } } else { ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_SUCCESS, &retry_count, sizeof(retry_count)); } } if (request->request == RIL_REQUEST_ENTER_SIM_PUK || request->request == RIL_REQUEST_ENTER_SIM_PUK2) ril_request_unsolicited(RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED, NULL, 0); goto complete; error: if (request != NULL) ril_request_complete(request->token, RIL_E_GENERIC_FAILURE, NULL, 0); complete: return 0; } int ril_request_set_facility_lock(void *data, size_t size, RIL_Token token) { struct ipc_sec_phone_lock_request_set_data request_data; struct ipc_sec_pin_status_request_data pin_request_data; struct ril_request *request; unsigned char facility_type; unsigned char active; char **values = NULL; int rc; if (data == NULL || size < 4 * sizeof(char *)) goto error; rc = ril_radio_state_check(RADIO_STATE_SIM_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_SET_FACILITY_LOCK, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; values = (char **) data; facility_type = ril2ipc_sec_facility_type(values[0]); if (facility_type == 0) goto error; active = values[1][0] == '1'; rc = ipc_sec_phone_lock_request_set_setup(&request_data, facility_type, active, values[2]); if (rc < 0) goto error; if (facility_type == IPC_SEC_FACILITY_TYPE_FD) { // FD facility requires PIN2 unlock first rc = ipc_sec_pin_status_setup(&pin_request_data, IPC_SEC_PIN_TYPE_PIN2, values[2], NULL); if (rc < 0) goto error; ril_request_data_set_uniq(RIL_REQUEST_SET_FACILITY_LOCK, &request_data, sizeof(request_data)); rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, ipc_sec_callback); if (rc < 0) { ril_request_data_free(RIL_REQUEST_SET_FACILITY_LOCK); goto error; } rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, IPC_TYPE_SET, (void *) &pin_request_data, sizeof(pin_request_data)); if (rc < 0) { ril_request_data_free(RIL_REQUEST_SET_FACILITY_LOCK); goto error; } rc = RIL_REQUEST_HANDLED; goto complete; } rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_PHONE_LOCK, ipc_sec_callback); if (rc < 0) goto error; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PHONE_LOCK, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ril_request_enter_sim_pin(void *data, size_t size, RIL_Token token) { struct ipc_sec_pin_status_request_data request_data; struct ril_request *request; char **values = NULL; int rc; if (data == NULL || size < 2 * sizeof(char *) || ril_data == NULL) goto error; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_ENTER_SIM_PIN, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; values = (char **) data; if (values[0] == NULL) goto error; if (ril_data->sim_pin != NULL) free(ril_data->sim_pin); ril_data->sim_pin = strdup(values[0]); rc = ipc_sec_pin_status_setup(&request_data, IPC_SEC_PIN_TYPE_PIN1, values[0], NULL); if (rc < 0) goto error; strings_array_free(values, size); values = NULL; rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, ipc_sec_callback); if (rc < 0) goto error; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ril_request_enter_sim_puk(void *data, size_t size, RIL_Token token) { struct ipc_sec_pin_status_request_data request_data; struct ril_request *request; char **values = NULL; int rc; if (data == NULL || size < 2 * sizeof(char *)) goto error; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_ENTER_SIM_PUK, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; values = (char **) data; rc = ipc_sec_pin_status_setup(&request_data, IPC_SEC_PIN_TYPE_PIN1, values[1], values[0]); if (rc < 0) goto error; strings_array_free(values, size); values = NULL; rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, ipc_sec_callback); if (rc < 0) goto error; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ril_request_enter_sim_pin2(void *data, size_t size, RIL_Token token) { struct ipc_sec_pin_status_request_data request_data; struct ril_request *request; char **values = NULL; int rc; if (data == NULL || size < 2 * sizeof(char *)) goto error; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_ENTER_SIM_PIN2, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; values = (char **) data; rc = ipc_sec_pin_status_setup(&request_data, IPC_SEC_PIN_TYPE_PIN2, values[0], NULL); if (rc < 0) goto error; strings_array_free(values, size); values = NULL; rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, ipc_sec_callback); if (rc < 0) goto error; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ril_request_enter_sim_puk2(void *data, size_t size, RIL_Token token) { struct ipc_sec_pin_status_request_data request_data; struct ril_request *request; char **values = NULL; int rc; if (data == NULL || size < 2 * sizeof(char *)) goto error; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_ENTER_SIM_PUK2, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; values = (char **) data; rc = ipc_sec_pin_status_setup(&request_data, IPC_SEC_PIN_TYPE_PIN2, values[1], values[0]); if (rc < 0) goto error; strings_array_free(values, size); values = NULL; rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, ipc_sec_callback); if (rc < 0) goto error; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ril_request_change_sim_pin(void *data, size_t size, RIL_Token token) { struct ipc_sec_change_locking_pw_data request_data; struct ril_request *request; char **values = NULL; int rc; if (data == NULL || size < 3 * sizeof(char *)) goto error; request = ril_request_find_request_status(RIL_REQUEST_CHANGE_SIM_PIN, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; rc = ril_radio_state_check(RADIO_STATE_SIM_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; values = (char **) data; rc = ipc_sec_change_locking_pw_setup(&request_data, IPC_SEC_FACILITY_TYPE_SC, values[0], values[1]); if (rc < 0) goto error; strings_array_free(values, size); values = NULL; rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_CHANGE_LOCKING_PW, ipc_sec_callback); if (rc < 0) goto error; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_CHANGE_LOCKING_PW, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ril_request_change_sim_pin2(void *data, size_t size, RIL_Token token) { struct ipc_sec_change_locking_pw_data request_data; struct ril_request *request; char **values = NULL; int rc; if (data == NULL || size < 3 * sizeof(char *)) goto error; request = ril_request_find_request_status(RIL_REQUEST_CHANGE_SIM_PIN, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; rc = ril_radio_state_check(RADIO_STATE_SIM_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; values = (char **) data; rc = ipc_sec_change_locking_pw_setup(&request_data, IPC_SEC_FACILITY_TYPE_FD, values[0], values[1]); if (rc < 0) goto error; strings_array_free(values, size); values = NULL; rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_CHANGE_LOCKING_PW, ipc_sec_callback); if (rc < 0) goto error; rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_CHANGE_LOCKING_PW, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (values != NULL) strings_array_free(values, size); ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: return rc; } int ipc_sec_rsim_access(struct ipc_message *message) { struct ipc_sec_rsim_access_response_header *header; struct ipc_sec_rsim_access_usim_response_header *usim_header; struct sim_file_response sim_file_response; struct ril_request *request; struct ril_client *client; struct ipc_fmt_data *ipc_fmt_data; RIL_SIM_IO_Response response; #if RIL_VERSION >= 6 RIL_SIM_IO_v6 *sim_io; #else RIL_SIM_IO *sim_io; #endif unsigned char *p; unsigned int offset; unsigned int i; void *data; size_t size; if (message == NULL || message->data == NULL || message->size < sizeof(struct ipc_sec_rsim_access_response_header)) return -1; client = ril_client_find_id(RIL_CLIENT_IPC_FMT); if (client == NULL || client->data == NULL) return 0; if (message->type != IPC_TYPE_RESP || !ipc_seq_valid(message->aseq)) return 0; ipc_fmt_data = (struct ipc_fmt_data *) client->data; header = (struct ipc_sec_rsim_access_response_header *) message->data; size = ipc_sec_rsim_access_size_extract(message->data, message->size); data = ipc_sec_rsim_access_extract(message->data, message->size); request = ril_request_find_token(ipc_fmt_request_token(message->aseq)); #if RIL_VERSION >= 6 if (request == NULL || request->data == NULL || request->size < sizeof(RIL_SIM_IO_v6)) #else if (request == NULL || request->data == NULL || request->size < sizeof(RIL_SIM_IO)) #endif return 0; #if RIL_VERSION >= 6 sim_io = (RIL_SIM_IO_v6 *) request->data; #else sim_io = (RIL_SIM_IO *) request->data; #endif memset(&response, 0, sizeof(response)); response.sw1 = header->sw1; response.sw2 = header->sw2; switch (sim_io->command) { case SIM_COMMAND_READ_BINARY: case SIM_COMMAND_READ_RECORD: if (header->length == 0) break; response.simResponse = data2string(data, header->length); break; case SIM_COMMAND_GET_RESPONSE: if (header->length == 0) break; if (ipc_fmt_data->sim_icc_type_data.type == 0x01) { response.simResponse = data2string(data, header->length); break; } if (header->length < sizeof(struct ipc_sec_rsim_access_usim_response_header)) break; usim_header = (struct ipc_sec_rsim_access_usim_response_header *) data; memset(&sim_file_response, 0, sizeof(sim_file_response)); offset = sizeof(struct ipc_sec_rsim_access_usim_response_header) + usim_header->offset; if (offset > header->length) break; offset = usim_header->offset - 2; p = (unsigned char *) usim_header + offset; sim_file_response.file_id[0] = p[0]; sim_file_response.file_id[1] = p[1]; offset = header->length - 2; p = (unsigned char *) usim_header; while (offset > 2) { if (p[offset] == 0x88) { offset -= 2; break; } offset--; } if (offset <= 2) break; p = (unsigned char *) usim_header + offset; sim_file_response.file_size[0] = p[0]; sim_file_response.file_size[1] = p[1]; // Fallback to EF sim_file_response.file_type = SIM_FILE_TYPE_EF; for (i = 0; i < sim_file_ids_count; i++) { if (sim_io->fileid == sim_file_ids[i].file_id) { sim_file_response.file_type = sim_file_ids[i].type; break; } } sim_file_response.access_condition[0] = 0x00; sim_file_response.access_condition[1] = 0xff; sim_file_response.access_condition[2] = 0xff; sim_file_response.file_status = 0x01; sim_file_response.file_length = 0x02; switch (usim_header->file_structure) { case IPC_SEC_RSIM_FILE_STRUCTURE_TRANSPARENT: sim_file_response.file_structure = SIM_FILE_STRUCTURE_TRANSPARENT; break; case IPC_SEC_RSIM_FILE_STRUCTURE_LINEAR_FIXED: default: sim_file_response.file_structure = SIM_FILE_STRUCTURE_LINEAR_FIXED; break; } sim_file_response.record_length = usim_header->length; response.simResponse = data2string((void *) &sim_file_response, sizeof(sim_file_response)); break; case SIM_COMMAND_UPDATE_BINARY: case SIM_COMMAND_UPDATE_RECORD: case SIM_COMMAND_SEEK: default: response.simResponse = NULL; break; } ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_SUCCESS, (void *) &response, sizeof(response)); if (response.simResponse != NULL) free(response.simResponse); return 0; } int ril_request_sim_io(void *data, size_t size, RIL_Token token) { struct ipc_sec_rsim_access_request_header request_header; struct ipc_sec_pin_status_request_data pin_request_data; struct ril_request *request; #if RIL_VERSION >= 6 RIL_SIM_IO_v6 *sim_io = NULL; #else RIL_SIM_IO *sim_io = NULL; #endif void *sim_io_data = NULL; size_t sim_io_size = 0; void *request_data = NULL; size_t request_size = 0; int pin_request = 0; int rc; #if RIL_VERSION >= 6 if (data == NULL || size < sizeof(RIL_SIM_IO_v6)) #else if (data == NULL || size < sizeof(RIL_SIM_IO)) #endif goto error; rc = ril_radio_state_check(RADIO_STATE_SIM_READY); if (rc < 0) return RIL_REQUEST_UNHANDLED; request = ril_request_find_request_status(RIL_REQUEST_SIM_IO, RIL_REQUEST_HANDLED); if (request != NULL) return RIL_REQUEST_UNHANDLED; #if RIL_VERSION >= 6 sim_io = (RIL_SIM_IO_v6 *) data; #else sim_io = (RIL_SIM_IO *) data; #endif if (sim_io->data != NULL) { sim_io_size = string2data_size(sim_io->data); if (sim_io_size == 0) goto error; sim_io_data = string2data(sim_io->data); if (sim_io_data == NULL) goto error; } if (sim_io->pin2 != NULL) { // PIN2 unlock first pin_request = 1; rc = ipc_sec_pin_status_setup(&pin_request_data, IPC_SEC_PIN_TYPE_PIN2, sim_io->pin2, NULL); if (rc < 0) goto error; } if (sim_io->path != NULL) free(sim_io->path); if (sim_io->data != NULL) free(sim_io->data); if (sim_io->pin2 != NULL) free(sim_io->pin2); #if RIL_VERSION >= 6 if (sim_io->aidPtr != NULL) free(sim_io->aidPtr); #endif memset(&request_header, 0, sizeof(request_header)); request_header.command = sim_io->command; request_header.file_id = sim_io->fileid; request_header.p1 = sim_io->p1; request_header.p2 = sim_io->p2; request_header.p3 = sim_io->p3; sim_io = NULL; request_size = ipc_sec_rsim_access_size_setup(&request_header, sim_io_data, sim_io_size); if (request_size == 0) goto error; request_data = ipc_sec_rsim_access_setup(&request_header, sim_io_data, sim_io_size); if (request_data == NULL) goto error; if (pin_request) { // PIN2 unlock first ril_request_data_set_uniq(RIL_REQUEST_SIM_IO, request_data, request_size); rc = ipc_gen_phone_res_expect_callback(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, ipc_sec_callback); if (rc < 0) { ril_request_data_free(RIL_REQUEST_SIM_IO); goto error; } rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_PIN_STATUS, IPC_TYPE_SET, (void *) &pin_request_data, sizeof(pin_request_data)); if (rc < 0) { ril_request_data_free(RIL_REQUEST_SIM_IO); goto error; } rc = RIL_REQUEST_HANDLED; goto complete; } rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SEC_RSIM_ACCESS, IPC_TYPE_GET, request_data, request_size); if (rc < 0) goto error; rc = RIL_REQUEST_HANDLED; goto complete; error: if (sim_io != NULL) { if (sim_io->path != NULL) free(sim_io->path); if (sim_io->data != NULL) free(sim_io->data); if (sim_io->pin2 != NULL) free(sim_io->pin2); #if RIL_VERSION >= 6 if (sim_io->aidPtr != NULL) free(sim_io->aidPtr); #endif } ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); rc = RIL_REQUEST_COMPLETED; complete: if (sim_io_data != NULL && sim_io_size > 0) free(sim_io_data); if (request_data != NULL && request_size > 0) free(request_data); return rc; } int ipc_sec_sim_icc_type(struct ipc_message *message) { struct ipc_sec_sim_icc_type_data *data; struct ril_client *client; struct ipc_fmt_data *ipc_fmt_data; if (message == NULL || message->data == NULL || message->size < sizeof(struct ipc_sec_sim_icc_type_data)) return -1; client = ril_client_find_id(RIL_CLIENT_IPC_FMT); if (client == NULL || client->data == NULL) return 0; ipc_fmt_data = (struct ipc_fmt_data *) client->data; data = (struct ipc_sec_sim_icc_type_data *) message->data; if (ipc_fmt_data->sim_icc_type_data.type != data->type) ipc_fmt_data->sim_icc_type_data.type = data->type; return 0; } int ipc_sec_lock_infomation(struct ipc_message *message) { struct ipc_sec_lock_infomation_response_data *data; struct ipc_gen_phone_res_data *gen_phone_res; int requests[] = { RIL_REQUEST_ENTER_SIM_PIN, RIL_REQUEST_CHANGE_SIM_PIN, RIL_REQUEST_ENTER_SIM_PIN2, RIL_REQUEST_CHANGE_SIM_PIN2, RIL_REQUEST_SET_FACILITY_LOCK }; void *gen_phone_res_data = NULL; size_t gen_phone_res_size = 0; int retry_count; unsigned int count; unsigned int i; int rc; if (message == NULL || message->data == NULL || message->size < sizeof(struct ipc_sec_lock_infomation_response_data)) return -1; rc = ril_radio_state_check(RADIO_STATE_SIM_NOT_READY); if (rc < 0) return 0; if (message->type != IPC_TYPE_RESP || !ipc_seq_valid(message->aseq)) return 0; data = (struct ipc_sec_lock_infomation_response_data *) message->data; if (data->type != IPC_SEC_PIN_TYPE_PIN1 && data->type != IPC_SEC_PIN_TYPE_PIN2) return 0; count = sizeof(requests) / sizeof(int); for (i = 0; i < count; i++) { gen_phone_res_size = ril_request_data_size_get(requests[i]); if (gen_phone_res_size < sizeof(struct ipc_gen_phone_res_data)) continue; gen_phone_res_data = ril_request_data_get(requests[i]); if (gen_phone_res_data == NULL) continue; break; } if (gen_phone_res_data == NULL || gen_phone_res_size < sizeof(struct ipc_gen_phone_res_data)) return 0; gen_phone_res = (struct ipc_gen_phone_res_data *) gen_phone_res_data; retry_count = data->retry_count; rc = ipc_gen_phone_res_check(gen_phone_res); if (rc < 0) { if ((gen_phone_res->code & 0xff) == 0x10) { RIL_LOGE("%s: Wrong password and %d attempts left", __func__, retry_count); ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_PASSWORD_INCORRECT, &retry_count, sizeof(retry_count)); } else if ((gen_phone_res->code & 0xff) == 0x0c) { RIL_LOGE("%s: Wrong password and no attempts left", __func__); retry_count = 0; ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_PASSWORD_INCORRECT, &retry_count, sizeof(retry_count)); } else { ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_GENERIC_FAILURE, &retry_count, sizeof(retry_count)); } } else { ril_request_complete(ipc_fmt_request_token(message->aseq), RIL_E_SUCCESS, &retry_count, sizeof(retry_count)); } free(gen_phone_res_data); return 0; }
void output_lang2_file (void) { char **strs; int nopts; int i, n; puts("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); puts("<language id=\"gretl\" _name=\"gretl\" version=\"2.0\" _section=\"Scripts\">"); puts("<metadata>"); puts(" <property name=\"mimetypes\">application/x-gretlscript</property>"); puts(" <property name=\"globs\">*.inp</property>"); puts("</metadata>"); puts("<styles>"); puts(" <style id=\"comment\" _name=\"Comment\" map-to=\"def:comment\"/>"); puts(" <style id=\"function\" _name=\"Function\" map-to=\"def:function\"/>"); puts(" <style id=\"data-type\" _name=\"Data Type\" map-to=\"def:type\"/>"); puts(" <style id=\"string\" _name=\"String\" map-to=\"def:string\"/>"); puts(" <style id=\"keyword\" _name=\"Keyword\" map-to=\"def:keyword\"/>"); puts("</styles>"); puts("<definitions>"); puts(" <context id=\"line-comment\" style-ref=\"comment\" end-at-line-end=\"true\">"); puts(" <start>#</start>"); puts(" <include>"); puts(" <context ref=\"def:escape\"/>"); puts(" <context ref=\"def:line-continue\"/>"); puts(" </include>"); puts(" </context>"); puts(" <context id=\"block-comment\" style-ref=\"comment\">"); puts(" <start>/\\*</start>"); puts(" <end>\\*/</end>"); puts(" <include>"); puts(" <context ref=\"def:escape\"/>"); puts(" <context ref=\"def:line-continue\"/>"); puts(" </include>"); puts(" </context>"); puts(" <context id=\"string\" style-ref=\"string\" end-at-line-end=\"true\">"); puts(" <start>\"</start>"); puts(" <end>\"</end>"); puts(" <include>"); puts(" <context ref=\"def:escape\"/>"); puts(" <context ref=\"def:line-continue\"/>"); puts(" </include>"); puts(" </context>"); #if 0 /* not yet */ puts(" <context id=\"foreign\" style-inside=\"true\" style-ref=\"comment\">"); puts(" <start>(?<=foreign language)</start>"); puts(" <end>(?=end foreign)</end>"); puts(" </context>"); #endif /* gretl data types */ puts(" <context id=\"gretl-types\" style-ref=\"data-type\">"); for (i=0; gretl_data_types[i] != NULL; i++) { printf(" <keyword>%s</keyword>\n", gretl_data_types[i]); } puts(" </context>"); /* gretl functions */ puts(" <context id=\"genr-functions\" style-ref=\"function\">"); n = gen_func_count(); for (i=0; i<n; i++) { printf(" <keyword>%s</keyword>\n", gen_func_name(i)); } printf(" <keyword>catch</keyword>\n"); puts(" </context>"); /* gretl commands */ puts(" <context id=\"commands\" style-ref=\"keyword\">"); puts(" <prefix>(^|\\040|\\011)</prefix>"); puts(" <suffix>(?![\\w\\-\\.\\(])</suffix>"); for (i=1; i<NC; i++) { printf(" <keyword>%s</keyword>\n", gretl_command_word(i)); } /* plus a few specials */ for (i=0; special_keyword[i] != NULL; i++) { printf(" <keyword>%s</keyword>\n", special_keyword[i]); } puts(" </context>"); /* command option strings */ strs = get_all_option_strings(&nopts); qsort(strs, nopts, sizeof *strs, compare_options); if (strs != NULL) { puts(" <context id=\"options\" style-ref=\"data-type\">"); puts(" <prefix>--</prefix>"); for (i=1; i<nopts; i++) { printf(" <keyword>%s</keyword>\n", strs[i]); } puts(" </context>"); strings_array_free(strs, nopts); } /* dollar variables */ puts(" <context id=\"internalvars\" style-ref=\"data-type\">"); puts(" <prefix>\\$</prefix>"); puts(" <suffix></suffix>"); strs = make_var_name_list(&n); if (strs != NULL) { for (i=0; i<n; i++) { printf(" <keyword>%s</keyword>\n", strs[i]); } strings_array_free(strs, n); } puts(" </context>"); puts(" <context id=\"gretl\">"); puts(" <include>"); puts(" <context ref=\"line-comment\"/>"); puts(" <context ref=\"block-comment\"/>"); puts(" <context ref=\"string\"/>"); puts(" <context ref=\"gretl-types\"/>"); puts(" <context ref=\"commands\"/>"); puts(" <context ref=\"genr-functions\"/>"); puts(" <context ref=\"options\"/>"); puts(" <context ref=\"internalvars\"/>"); puts(" </include>"); puts(" </context>"); puts("</definitions>"); puts("</language>"); }
void output_emacs_block (void) { char **strs; int nopts; int i, n; /* gretl commands */ n = 1; fputs("(defvar gretl-command-words\n '(", stdout); for (i=1; i<NC; i++) { printf("\"%s\"", gretl_command_word(i)); if (n % 8 == 0) { fputs("\n ", stdout); } else { putchar(' '); } n++; } for (i=0; special_keyword[i] != NULL; i++) { printf("\"%s\"", special_keyword[i]); if (special_keyword[i+1] != NULL) { if (n % 8 == 0) { fputs("\n ", stdout); } else { putchar(' '); } } n++; } puts(")\n \"Commands in Gretl (these names are also reserved).\")\n"); /* functions in "genr" command */ fputs("(defvar gretl-genr-functions\n '(", stdout); n = gen_func_count(); for (i=0; i<n; i++) { printf("\"%s\"", gen_func_name(i)); if (i < n-1) { if ((i+1) % 8 == 0) { fputs("\n ", stdout); } else { putchar(' '); } } } puts(")\n \"Builtin functions for Gretl's genr command.\")\n"); /* option strings */ strs = get_all_option_strings(&nopts); if (strs != NULL) { n = 1; fputs("(defvar gretl-option-flags\n '(", stdout); for (i=1; i<nopts; i++) { printf("\"%s\"", strs[i]); if (i < nopts-1) { if (n % 4 == 0) { fputs("\n ", stdout); } else { putchar(' '); } } n++; } puts(")\n \"Gretl option flags.\")\n"); strings_array_free(strs, nopts); } /* internal "dollar" variables */ fputs("(defvar gretl-internal-vars\n '(", stdout); strs = make_var_name_list(&n); if (strs != NULL) { for (i=0; i<n; i++) { printf("\"%s\"", strs[i]); if ((i+1) % 7 == 0) { fputs("\n ", stdout); } else { putchar(' '); } } strings_array_free(strs, n); } puts(")\n \"Model- and dataset-related variables.\")\n"); }
static int arma_get_nls_model (MODEL *amod, arma_info *ainfo, int narmax, const double *coeff, DATASET *dset, PRN *prn) { gretlopt nlsopt = OPT_A; char fnstr[MAXLINE]; char term[32]; nlspec *spec; double *parms = NULL; char **pnames = NULL; double *b0 = NULL, *by1 = NULL; int nparam, lag; int i, j, k, err = 0; spec = nlspec_new(NLS, dset); if (spec == NULL) { return E_ALLOC; } if (arma_least_squares(ainfo)) { /* respect verbose option */ if (prn != NULL) { nlsopt |= OPT_V; } } else { #if AINIT_DEBUG nlsopt |= OPT_V; #else /* don't bother with standard errors */ nlsopt |= OPT_C; #endif } nlspec_set_t1_t2(spec, 0, ainfo->T - 1); nparam = ainfo->ifc + ainfo->np + ainfo->P + ainfo->nexo; if (ainfo->misslist != NULL) { nparam += ainfo->misslist[0]; } parms = malloc(nparam * sizeof *parms); if (parms == NULL) { err = E_ALLOC; goto bailout; } pnames = strings_array_new_with_length(nparam, VNAMELEN); if (pnames == NULL) { err = E_ALLOC; goto bailout; } /* make names for the parameters; construct the param list; and do some rudimentary fall-back initialization */ for (i=0; i<nparam; i++) { parms[i] = 0.0; } k = 0; if (ainfo->ifc) { if (coeff != NULL) { parms[k] = coeff[k]; } else { parms[k] = gretl_mean(0, dset->n - 1, dset->Z[1]); } b0 = &parms[k]; strcpy(pnames[k++], "_b0"); } for (i=0; i<ainfo->p; i++) { if (AR_included(ainfo, i)) { if (by1 == NULL) { by1 = &parms[k]; if (coeff == NULL) { parms[k] = 0.1; } } if (coeff != NULL) { parms[k] = coeff[k]; } sprintf(pnames[k++], "_phi%d", i+1); } } for (i=0; i<ainfo->P; i++) { if (by1 == NULL) { by1 = &parms[k]; if (coeff == NULL) { parms[k] = 0.1; } } if (coeff != NULL) { parms[k] = coeff[k]; } sprintf(pnames[k++], "_Phi%d", i+1); } for (i=0; i<ainfo->nexo; i++) { if (coeff != NULL) { parms[k] = coeff[k]; } sprintf(pnames[k++], "_b%d", i+1); } if (ainfo->misslist != NULL) { for (i=1; i<=ainfo->misslist[0]; i++) { j = ainfo->misslist[i]; parms[k] = dset->Z[1][j]; sprintf(pnames[k++], "_c%d", i); } } /* construct NLS specification string */ strcpy(fnstr, "y="); if (ainfo->ifc) { strcat(fnstr, "_b0"); } else { strcat(fnstr, "0"); } for (i=0; i<ainfo->p && !err; i++) { if (AR_included(ainfo, i)) { lag = i + 1; sprintf(term, "+_phi%d*", lag); err = add_to_spec(fnstr, term); if (!err) { err = y_Xb_at_lag(fnstr, ainfo, narmax, lag); } } } for (j=0; j<ainfo->P && !err; j++) { sprintf(term, "+_Phi%d*", j+1); strcat(fnstr, term); lag = (j + 1) * ainfo->pd; y_Xb_at_lag(fnstr, ainfo, narmax, lag); for (i=0; i<ainfo->p; i++) { if (AR_included(ainfo, i)) { sprintf(term, "-_phi%d*_Phi%d*", i+1, j+1); err = add_to_spec(fnstr, term); if (!err) { lag = (j+1) * ainfo->pd + (i+1); y_Xb_at_lag(fnstr, ainfo, narmax, lag); } } } } for (i=0; i<ainfo->nexo && !err; i++) { sprintf(term, "+_b%d*x%d", i+1, i+1); err = add_to_spec(fnstr, term); } if (!err && ainfo->misslist != NULL) { for (i=1; i<=ainfo->misslist[0]; i++) { sprintf(term, "+_c%d*d%d", i, i); err = add_to_spec(fnstr, term); } } if (!err) { if (coeff == NULL) { nls_kickstart(amod, dset, b0, by1); } #if AINIT_DEBUG fprintf(stderr, "initting using NLS spec:\n %s\n", fnstr); for (i=0; i<nparam; i++) { fprintf(stderr, "initial NLS b[%d] = %g (%s)\n", i, parms[i], pnames[i]); } #endif err = nlspec_set_regression_function(spec, fnstr, dset); } if (!err) { set_auxiliary_scalars(); err = aux_nlspec_add_param_list(spec, nparam, parms, pnames); if (!err) { *amod = model_from_nlspec(spec, dset, nlsopt, prn); err = amod->errcode; #if AINIT_DEBUG if (!err) { printmodel(amod, dset, OPT_NONE, prn); } #endif } unset_auxiliary_scalars(); } bailout: nlspec_destroy(spec); free(parms); strings_array_free(pnames, nparam); return err; }
static int xlsx_read_shared_strings (xlsx_info *xinfo, PRN *prn) { xmlDocPtr doc = NULL; xmlNodePtr cur = NULL; xmlNodePtr val; char *tmp; int i, n = 0; int err = 0; err = gretl_xml_open_doc_root(xinfo->stringsfile, "sst", &doc, &cur); if (err) { pprintf(prn, "Couldn't find shared strings table\n"); pprintf(prn, "%s", gretl_errmsg_get()); return err; } tmp = (char *) xmlGetProp(cur, (XUC) "uniqueCount"); if (tmp == NULL) { tmp = (char *) xmlGetProp(cur, (XUC) "count"); } if (tmp == NULL) { pprintf(prn, "didn't get sst count\n"); err = E_DATA; } else { n = atoi(tmp); if (n <= 0) { pprintf(prn, "didn't get valid sst count\n"); err = E_DATA; } free(tmp); } if (!err) { xinfo->strings = strings_array_new(n); if (xinfo->strings == NULL) { err = E_ALLOC; } } cur = cur->xmlChildrenNode; /* The strings in an <sst> are mostly set up as <si><t>XXX</t></si> <si><t>YYY</t></si> ... But there are also weird cases where junk is interposed and the structure becomes <si><r>...<t>XXX</t></r><r>...<t>YYY</t></r></si> ... That is, an <si> element may contain more than one <r> element, which embeds a <t> along with formatting crap. */ i = 0; while (cur != NULL && !err) { if (!xmlStrcmp(cur->name, (XUC) "si")) { int gotstr = 0; val = cur->xmlChildrenNode; while (val != NULL && !err && !gotstr) { if (!xmlStrcmp(val->name, (XUC) "t")) { /* got a regular <t> element */ tmp = (char *) xmlNodeGetContent(val); if (tmp == NULL) { pprintf(prn, "failed reading string %d\n", i); err = E_DATA; } else { xinfo->strings[i++] = tmp; gotstr = 1; } } else if (!xmlStrcmp(val->name, (XUC) "r")) { /* hunt for <t> inside an <r> element */ xmlNodePtr sub = val->xmlChildrenNode; while (sub != NULL && !err && i < n) { if (!xmlStrcmp(sub->name, (XUC) "t")) { tmp = (char *) xmlNodeGetContent(sub); if (tmp == NULL) { pprintf(prn, "failed reading string %d\n", i); err = E_DATA; } else { xinfo->strings[i++] = tmp; gotstr = 1; } } sub = sub->next; } } val = val->next; } } if (i == n) { break; } cur = cur->next; } if (!err && i < n) { pprintf(prn, "expected %d shared strings but only found %d\n", n, i); err = E_DATA; } if (!err) { xinfo->n_strings = i; } else if (xinfo->strings != NULL) { strings_array_free(xinfo->strings, n); xinfo->strings = NULL; } xmlFreeDoc(doc); return err; }