diff --git a/client/SDL/SDL3/sdl_freerdp.cpp b/client/SDL/SDL3/sdl_freerdp.cpp index aa6166d72..3be30a6bf 100644 --- a/client/SDL/SDL3/sdl_freerdp.cpp +++ b/client/SDL/SDL3/sdl_freerdp.cpp @@ -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), diff --git a/client/X11/xf_client.c b/client/X11/xf_client.c index cd2f27eaa..854404e0e 100644 --- a/client/X11/xf_client.c +++ b/client/X11/xf_client.c @@ -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) diff --git a/client/X11/xfreerdp.h b/client/X11/xfreerdp.h index 1babfb30b..2ae744f33 100644 --- a/client/X11/xfreerdp.h +++ b/client/X11/xfreerdp.h @@ -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, }; diff --git a/include/freerdp/error.h b/include/freerdp/error.h index 58f931624..0b64c9ddc 100644 --- a/include/freerdp/error.h +++ b/include/freerdp/error.h @@ -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 } diff --git a/libfreerdp/core/errconnect.c b/libfreerdp/core/errconnect.c index 5fc62748f..333f0fa50 100644 --- a/libfreerdp/core/errconnect.c +++ b/libfreerdp/core/errconnect.c @@ -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) }; diff --git a/libfreerdp/core/gateway/arm.c b/libfreerdp/core/gateway/arm.c index 69f0548dd..3f9ad014d 100644 --- a/libfreerdp/core/gateway/arm.c +++ b/libfreerdp/core/gateway/arm.c @@ -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 { diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index b3ab34e82..9b2a529f3 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -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);