예제 #1
0
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);
}
예제 #2
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));
}