Merge pull request #5973 from BOINC/dpa_wsl7

Client: add some error reporting to WSL detection
This commit is contained in:
Vitalii Koshura 2024-12-26 05:58:33 +01:00 committed by GitHub
commit a97c1afd16
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 14 deletions

View File

@ -48,6 +48,7 @@ int get_all_distros(WSL_DISTROS& distros) {
lxss_path.c_str(), 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hKey
);
if (lRet != ERROR_SUCCESS) {
msg_printf(0, MSG_INFO, "WSL: registry open failed");
return -1;
}
@ -59,6 +60,7 @@ int get_all_distros(WSL_DISTROS& distros) {
(LPBYTE)default_wsl_guid, &default_wsl_guid_len
);
if ((lRet != ERROR_SUCCESS) || (default_wsl_guid_len > buf_len)) {
msg_printf(0, MSG_INFO, "WSL: registry query failed");
return -1;
}
@ -179,10 +181,12 @@ int get_wsl_information(WSL_DISTROS &distros) {
WSL_DISTROS all_distros;
int retval = get_all_distros(all_distros);
if (retval) return retval;
string err_msg;
WSL_CMD rs;
if (rs.setup()) {
if (rs.setup(err_msg)) {
msg_printf(0, MSG_INFO, "WSL setup error: %s", err_msg.c_str());
return -1;
}

View File

@ -704,9 +704,10 @@ string parse_ldd_libc(const char* input) {
#ifdef _WIN32
int DOCKER_CONN::init(DOCKER_TYPE docker_type, string distro_name, bool _verbose) {
string err_msg;
cli_prog = docker_cli_prog(docker_type);
if (docker_type == DOCKER) {
int retval = ctl_wc.setup();
int retval = ctl_wc.setup(err_msg);
if (retval) return retval;
retval = ctl_wc.run_program_in_wsl(distro_name, "", true);
if (retval) return retval;

View File

@ -199,7 +199,7 @@ typedef HRESULT(WINAPI *PWslLaunch)(
static PWslLaunch pWslLaunch = NULL;
static HINSTANCE wsl_lib = NULL;
int WSL_CMD::setup() {
int WSL_CMD::setup(string &err_msg) {
in_read = NULL;
in_write = NULL;
out_read = NULL;
@ -207,9 +207,15 @@ int WSL_CMD::setup() {
if (!pWslLaunch) {
wsl_lib = LoadLibraryA("wslapi.dll");
if (!wsl_lib) return -1;
if (!wsl_lib) {
err_msg = "Can't load wslapi.dll";
return -1;
}
pWslLaunch = (PWslLaunch)GetProcAddress(wsl_lib, "WslLaunch");
if (!pWslLaunch) return -1;
if (!pWslLaunch) {
err_msg = "WslLaunch not in wslapi.dll";
return -1;
}
}
SECURITY_ATTRIBUTES sa;
@ -217,10 +223,22 @@ int WSL_CMD::setup() {
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
if (!CreatePipe(&out_read, &out_write, &sa, 0)) return -1;
if (!SetHandleInformation(out_read, HANDLE_FLAG_INHERIT, 0)) return -1;
if (!CreatePipe(&in_read, &in_write, &sa, 0)) return -1;
if (!SetHandleInformation(in_write, HANDLE_FLAG_INHERIT, 0)) return -1;
if (!CreatePipe(&out_read, &out_write, &sa, 0)) {
err_msg = "Can't create out pipe";
return -1;
}
if (!SetHandleInformation(out_read, HANDLE_FLAG_INHERIT, 0)) {
err_msg = "Can't inherit out pipe";
return -1;
}
if (!CreatePipe(&in_read, &in_write, &sa, 0)) {
err_msg = "Can't create in pipe";
return -1;
}
if (!SetHandleInformation(in_write, HANDLE_FLAG_INHERIT, 0)) {
err_msg = "Can't inherit in pipe";
return -1;
}
return 0;
}

View File

@ -53,7 +53,7 @@ struct WSL_CMD {
// Use WslLaunch() to run a shell in the WSL container
// The shell will run as the default user
//
int setup();
int setup(std::string&);
// Use wsl.exe to run a shell as root in the WSL container
//

View File

@ -97,9 +97,10 @@ int error(const char* where, int retval) {
//
int launch(const char* distro, const char* cmd) {
char launch_cmd[256];
string err_msg;
sprintf(launch_cmd, "echo $$; %s; touch boinc_job_done\n", cmd);
int retval = app_wc.setup();
if (retval) return error("app setup", retval);
int retval = app_wc.setup(err_msg);
if (retval) return error(err_msg.c_str(), retval);
retval = app_wc.run_program_in_wsl(distro, launch_cmd, true);
if (retval) return error("app run_program_in_wsl", retval);
@ -117,8 +118,8 @@ int launch(const char* distro, const char* cmd) {
// set up control channel
//
retval = ctl_wc.setup();
if (retval) return error("ctl setup", retval);
retval = ctl_wc.setup(err_msg);
if (retval) return error(err_msg.c_str(), retval);
retval = ctl_wc.run_program_in_wsl(distro, "", true);
// empty string means run shell
if (retval) return error("ctl run_program_in_wsl", retval);