// Copyright (c) 2023 Yuki Kimoto
// MIT License
#include "spvm_native.h"
#include "spvm_socket_util.h"
int32_t spvm_socket_errno (void) {
#ifdef _WIN32
return WSAGetLastError();
#else
return errno;
#endif
}
#ifdef _WIN32
static void* spvm_socket_strerror_string_win (SPVM_ENV* env, SPVM_VALUE* stack, int32_t error_number, int32_t length) {
char* error_message = NULL;
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, error_number,
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
(LPSTR)&error_message, length, NULL);
void* obj_error_message = env->new_string(env, stack, error_message, strlen(error_message));
LocalFree(error_message);
return obj_error_message;
}
#endif
void* spvm_socket_strerror_string (SPVM_ENV* env, SPVM_VALUE* stack, int32_t error_number, int32_t length) {
void*
#ifdef _WIN32
obj_strerror_value = spvm_socket_strerror_string_win(env, stack, error_number, length);
#else
obj_strerror_value = env->strerror_string(env, stack, error_number, length);
#endif
return obj_strerror_value;
}
const char* spvm_socket_strerror(SPVM_ENV* env, SPVM_VALUE* stack, int32_t error_number, int32_t length) {
void* obj_socket_strerror = spvm_socket_strerror_string(env, stack, error_number, length);
const char* ret_socket_strerror = NULL;
if (obj_socket_strerror) {
ret_socket_strerror = env->get_chars(env, stack, obj_socket_strerror);
}
return ret_socket_strerror;
}
const char* spvm_socket_strerror_nolen(SPVM_ENV* env, SPVM_VALUE* stack, int32_t error_number) {
return spvm_socket_strerror(env, stack, error_number, 0);
}