ifapi_macros.h
/* SPDX-License-Identifier: BSD-2-Clause */
/*******************************************************************************
* Copyright 2018-2019, Fraunhofer SIT sponsored by Infineon Technologies AG
* All rights reserved.
*******************************************************************************/
#ifndef IFAPI_MACROS_H
#define IFAPI_MACROS_H
#define strdup_check(dest, str, r, label) \
if (str) { \
dest = strdup(str); \
if (!dest) { \
r = TSS2_FAPI_RC_MEMORY; \
LOG_ERROR("Out of memory."); \
goto label; \
} \
} else { \
dest = NULL; \
}
#define calloc_check(dest, size, r, label) \
{ \
dest = callock(size,1); \
if (!dest) { \
r = TSS2_FAPI_RC_MEMORY; \
LOG_ERROR("Out of memory."); \
goto label; \
} \
}
#define goto_if_null2(p,msg, r, ec, label, ...) \
if ((p) == NULL) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(ec), ## __VA_ARGS__); \
r = (ec); \
goto label; \
}
#define goto_if_error2(r,msg,label, ...) \
if (r != TSS2_RC_SUCCESS) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
goto label; \
}
#define return_if_error2(r,msg, ...) \
if (r != TSS2_RC_SUCCESS) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
return r; \
}
#define try_again_or_error(r,msg, ...) \
if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) \
return TSS2_FAPI_RC_TRY_AGAIN; \
if (r != TSS2_RC_SUCCESS) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
return r; \
}
#define try_again_or_error_goto(r,msg, label, ...) \
if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) \
return TSS2_FAPI_RC_TRY_AGAIN; \
if (r != TSS2_RC_SUCCESS) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
goto label; \
}
#define return_error2(r,msg, ...) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
return (r); }
#define return_if_error_reset_state(r,msg, ...) \
if (r != TSS2_RC_SUCCESS) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
context->state = _FAPI_STATE_INIT; \
return r; \
}
#define goto_if_error_reset_state(r,msg,label, ...) \
if (r != TSS2_RC_SUCCESS) { \
LOG_ERROR(TPM2_ERROR_FORMAT " " msg, TPM2_ERROR_TEXT(r), ## __VA_ARGS__); \
context->state = _FAPI_STATE_INIT; \
goto label; \
}
#define goto_error_reset_state(r,v,msg,label) { \
r = v; \
LOG_ERROR("%s " TPM2_ERROR_FORMAT, msg, TPM2_ERROR_TEXT(r)); \
context->state = _FAPI_STATE_INIT; \
goto label; }
#define goto_if_null_reset_state(p,msg,r,ec,label) \
if ((p) == NULL) { \
LOG_ERROR("%s ", (msg)); \
context->state = _FAPI_STATE_INIT; \
(r) = (ec); \
goto label; \
}
#define return_try_again(r) \
if (base_rc(r) == TSS2_BASE_RC_TRY_AGAIN) { \
LOG_TRACE("Received TRY_AGAIN; returning TRY_AGAIN"); \
return TSS2_FAPI_RC_TRY_AGAIN; \
}
#define check_not_null(X) \
if (X == NULL) { \
LOG_ERROR(str(X) " is NULL: BAD_REFERENCE"); \
return TSS2_FAPI_RC_BAD_REFERENCE; \
}
#define check_oom(X) \
if (X == NULL) { \
LOG_ERROR("Out of memory"); \
return TSS2_FAPI_RC_MEMORY; \
}
#if defined __GNUC__ && __GNUC__ < 7
#define fallthrough { }
#else
#define fallthrough __attribute__((fallthrough))
#endif
#define statecase(VAR, STATE) \
case STATE: \
LOG_TRACE("State " str(VAR) " reached " str(STATE)); \
VAR=STATE;
#define general_failure(VAR) \
default: \
LOG_ERROR("Bad state for " str(VAR)); \
return TSS2_FAPI_RC_GENERAL_FAILURE;
#define statecasedefault(VAR) \
default: \
LOG_ERROR("Bad state for " str(VAR)); \
return TSS2_FAPI_RC_BAD_SEQUENCE;
#define statecasedefault_error(VAR, r, label) \
default: \
LOG_ERROR("Bad state for " str(VAR)); \
r = TSS2_FAPI_RC_BAD_SEQUENCE; \
goto label;
#endif /* IFAPI_MACROS_H */