int ipmi_oem_check_response_and_completion_code (ipmi_oem_state_data_t *state_data, uint8_t *bytes_rs, unsigned int bytes_rs_len, unsigned int expected_bytes_rs_len, uint8_t cmd, uint8_t netfn) { assert (state_data); assert (bytes_rs); if (bytes_rs_len < expected_bytes_rs_len) { if (bytes_rs_len >= 2 && bytes_rs[1] != IPMI_COMP_CODE_COMMAND_SUCCESS) goto output_comp_code_error; pstdout_fprintf (state_data->pstate, stderr, "%s:%s invalid response length: %u, expected %u\n", state_data->prog_data->args->oem_id, state_data->prog_data->args->oem_command, bytes_rs_len, expected_bytes_rs_len); return (-1); } output_comp_code_error: if (bytes_rs[1] != IPMI_COMP_CODE_COMMAND_SUCCESS) { char errbuf[IPMI_OEM_ERR_BUFLEN]; memset (errbuf, '\0', IPMI_OEM_ERR_BUFLEN); if (ipmi_completion_code_strerror_r (cmd, /* cmd */ netfn, /* network function */ bytes_rs[1], /* completion code */ errbuf, IPMI_OEM_ERR_BUFLEN) < 0) { pstdout_perror (state_data->pstate, "ipmi_completion_code_strerror_r"); snprintf (errbuf, IPMI_OEM_ERR_BUFLEN, "completion-code = 0x%X", bytes_rs[1]); } pstdout_fprintf (state_data->pstate, stderr, "%s:%s failed: %s\n", state_data->prog_data->args->oem_id, state_data->prog_data->args->oem_command, errbuf); return (-1); } return (0); }
int ipmi_completion_code_strerror_cmd_r (fiid_obj_t obj_cmd, uint8_t netfn, char *errstr, size_t len) { uint8_t cmd, comp_code; uint64_t val; /* The netfn need not be valid */ if (!fiid_obj_valid (obj_cmd) || !errstr) { SET_ERRNO (EINVAL); return (-1); } if (FIID_OBJ_FIELD_LOOKUP (obj_cmd, "cmd") < 0) { FIID_OBJECT_ERROR_TO_ERRNO (obj_cmd); return (-1); } if (FIID_OBJ_FIELD_LOOKUP (obj_cmd, "comp_code") < 0) { FIID_OBJECT_ERROR_TO_ERRNO (obj_cmd); return (-1); } if (FIID_OBJ_GET (obj_cmd, "cmd", &val) < 0) { FIID_OBJECT_ERROR_TO_ERRNO (obj_cmd); return (-1); } cmd = val; if (FIID_OBJ_GET (obj_cmd, "comp_code", &val) < 0) { FIID_OBJECT_ERROR_TO_ERRNO (obj_cmd); return (-1); } comp_code = val; return (ipmi_completion_code_strerror_r (cmd, netfn, comp_code, errstr, len)); }