[core,arm] add TARGET_BOOTING error code

Propagate the error code for a VM still booting to client.
This commit is contained in:
akallabeth
2025-09-26 09:27:52 +02:00
parent f070c87d75
commit 53d63b3120
7 changed files with 27 additions and 6 deletions

View File

@@ -139,6 +139,7 @@ enum SDL_EXIT_CODE
SDL_EXIT_CONNECT_ACCOUNT_EXPIRED = 157,
SDL_EXIT_CONNECT_LOGON_TYPE_NOT_GRANTED = 158,
SDL_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS = 159,
SDL_EXIT_CONNECT_TARGET_BOOTING = 160,
SDL_EXIT_UNKNOWN = 255,
};
@@ -188,6 +189,7 @@ static const struct sdl_exit_code_map_t sdl_exit_code_map[] = {
ENTRY(FREERDP_ERROR_AUTHENTICATION_FAILED, SDL_EXIT_AUTH_FAILURE),
ENTRY(FREERDP_ERROR_SECURITY_NEGO_CONNECT_FAILED, SDL_EXIT_NEGO_FAILURE),
ENTRY(FREERDP_ERROR_CONNECT_LOGON_FAILURE, SDL_EXIT_LOGON_FAILURE),
ENTRY(FREERDP_ERROR_CONNECT_TARGET_BOOTING, SDL_EXIT_CONNECT_TARGET_BOOTING),
ENTRY(FREERDP_ERROR_CONNECT_ACCOUNT_LOCKED_OUT, SDL_EXIT_ACCOUNT_LOCKED_OUT),
ENTRY(FREERDP_ERROR_PRE_CONNECT_FAILED, SDL_EXIT_PRE_CONNECT_FAILED),
ENTRY(FREERDP_ERROR_CONNECT_UNDEFINED, SDL_EXIT_CONNECT_UNDEFINED),

View File

@@ -145,7 +145,8 @@ static const struct xf_exit_code_map_t xf_exit_code_map[] = {
{ FREERDP_ERROR_CONNECT_ACCOUNT_RESTRICTION, XF_EXIT_CONNECT_ACCOUNT_RESTRICTION },
{ FREERDP_ERROR_CONNECT_ACCOUNT_EXPIRED, XF_EXIT_CONNECT_ACCOUNT_EXPIRED },
{ FREERDP_ERROR_CONNECT_LOGON_TYPE_NOT_GRANTED, XF_EXIT_CONNECT_LOGON_TYPE_NOT_GRANTED },
{ FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS, XF_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS }
{ FREERDP_ERROR_CONNECT_NO_OR_MISSING_CREDENTIALS, XF_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS },
{ FREERDP_ERROR_CONNECT_TARGET_BOOTING, XF_EXIT_CONNECT_TARGET_BOOTING }
};
static BOOL xf_setup_x11(xfContext* xfc);
@@ -1708,8 +1709,7 @@ end:
int xf_exit_code_from_disconnect_reason(DWORD reason)
{
if (reason == 0 ||
(reason >= XF_EXIT_PARSE_ARGUMENTS && reason <= XF_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS))
if ((reason == 0) || ((reason >= XF_EXIT_PARSE_ARGUMENTS) && (reason <= XF_EXIT_CODE_LAST)))
return WINPR_ASSERTING_INT_CAST(int, reason);
/* License error set */
else if (reason >= 0x100 && reason <= 0x10A)

View File

@@ -393,7 +393,8 @@ enum XF_EXIT_CODE
XF_EXIT_CONNECT_ACCOUNT_EXPIRED = 157,
XF_EXIT_CONNECT_LOGON_TYPE_NOT_GRANTED = 158,
XF_EXIT_CONNECT_NO_OR_MISSING_CREDENTIALS = 159,
XF_EXIT_CONNECT_TARGET_BOOTING = 160,
XF_EXIT_CODE_LAST = XF_EXIT_CONNECT_TARGET_BOOTING,
XF_EXIT_UNKNOWN = 255,
};

View File

@@ -270,6 +270,7 @@ extern "C"
#define ERRCONNECT_LOGON_TYPE_NOT_GRANTED 0x0000001A
#define ERRCONNECT_NO_OR_MISSING_CREDENTIALS 0x0000001B
#define ERRCONNECT_ACTIVATION_TIMEOUT 0x0000001C
#define ERRCONNECT_TARGET_BOOTING 0x0000001D
#define ERRCONNECT_SUCCESS ERRINFO_SUCCESS
#define ERRCONNECT_NONE ERRINFO_NONE
@@ -352,6 +353,7 @@ extern "C"
#define FREERDP_ERROR_CONNECT_ACTIVATION_TIMEOUT \
MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_ACTIVATION_TIMEOUT)
#define FREERDP_ERROR_CONNECT_TARGET_BOOTING MAKE_FREERDP_ERROR(CONNECT, ERRCONNECT_TARGET_BOOTING)
#ifdef __cplusplus
}

View File

@@ -94,6 +94,8 @@
#define ERRCONNECT_ACTIVATION_TIMEOUT_STRING "Timeout waiting for activation."
#define ERRCONNECT_TARGET_BOOTING_STRING "Starting your VM. It may take up to 5 minutes."
/* Special codes */
#define ERRCONNECT_SUCCESS_STRING "Success."
#define ERRCONNECT_NONE_STRING ""
@@ -129,6 +131,7 @@ static const ERRINFO ERRCONNECT_CODES[] = {
ERRCONNECT_DEFINE(LOGON_TYPE_NOT_GRANTED, CAT_ADMIN),
ERRCONNECT_DEFINE(NO_OR_MISSING_CREDENTIALS, CAT_USE),
ERRCONNECT_DEFINE(ACTIVATION_TIMEOUT, CAT_PROTOCOL),
ERRCONNECT_DEFINE(TARGET_BOOTING, CAT_ADMIN),
ERRCONNECT_DEFINE(NONE, CAT_NONE)
};

View File

@@ -1049,6 +1049,7 @@ static BOOL arm_handle_bad_request(rdpArm* arm, const HttpResponse* response, BO
WLog_WARN(TAG, "Starting your VM. It may take up to 5 minutes");
else
WLog_WARN(TAG, "%s", msgstr);
freerdp_set_last_error_if_not(arm->context, FREERDP_ERROR_CONNECT_TARGET_BOOTING);
}
else
{

View File

@@ -478,6 +478,17 @@ BOOL transport_connect_aad(rdpTransport* transport)
return rdp_client_transition_to_state(rdp, CONNECTION_STATE_AAD);
}
static BOOL transport_can_retry(const rdpContext* context, BOOL status)
{
switch (freerdp_get_last_error(context))
{
case FREERDP_ERROR_CONNECT_TARGET_BOOTING:
return FALSE;
default:
return status;
}
}
BOOL transport_connect(rdpTransport* transport, const char* hostname, UINT16 port, DWORD timeout)
{
BOOL status = FALSE;
@@ -519,7 +530,7 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, UINT16 por
transport->wst = NULL;
}
}
if (!status && settings->GatewayHttpTransport)
if (transport_can_retry(transport->context, status) && settings->GatewayHttpTransport)
{
WINPR_ASSERT(!transport->rdg);
transport->rdg = rdg_new(context);
@@ -544,7 +555,8 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, UINT16 por
}
}
if (!status && settings->GatewayRpcTransport && rpcFallback)
if (transport_can_retry(transport->context, status) && settings->GatewayRpcTransport &&
rpcFallback)
{
WINPR_ASSERT(!transport->tsg);
transport->tsg = tsg_new(transport);