/* * Ceph - scalable distributed file system * * Copyright (C) 2020 SUSE LINUX GmbH * Copyright (C) 2023 Cloudbase Solutions * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software * Foundation. See file COPYING. * */ #include "rbd_mapping_config.h" #include "common/debug.h" #include "common/dout.h" #include "common/win32/registry.h" #define dout_context g_ceph_context #define dout_subsys ceph_subsys_rbd #undef dout_prefix #define dout_prefix *_dout << "rbd-wnbd: " int construct_devpath_if_missing(Config* cfg) { // Windows doesn't allow us to request specific disk paths when mapping an // image. This will just be used by rbd-wnbd and wnbd as an identifier. if (cfg->devpath.empty()) { if (cfg->imgname.empty()) { derr << "Missing image name." << dendl; return -EINVAL; } if (!cfg->poolname.empty()) { cfg->devpath += cfg->poolname; cfg->devpath += '/'; } if (!cfg->nsname.empty()) { cfg->devpath += cfg->nsname; cfg->devpath += '/'; } cfg->devpath += cfg->imgname; if (!cfg->snapname.empty()) { cfg->devpath += '@'; cfg->devpath += cfg->snapname; } } return 0; } int save_config_to_registry(Config* cfg) { std::string strKey{ SERVICE_REG_KEY }; strKey.append("\\"); strKey.append(cfg->devpath); auto reg_key = RegistryKey( g_ceph_context, HKEY_LOCAL_MACHINE, strKey.c_str(), true); if (!reg_key.hKey) { return -EINVAL; } int ret_val = 0; // Registry writes are immediately available to other processes. // Still, we'll do a flush to ensure that the mapping can be // recreated after a system crash. if (reg_key.set("pid", getpid()) || reg_key.set("devpath", cfg->devpath) || reg_key.set("poolname", cfg->poolname) || reg_key.set("nsname", cfg->nsname) || reg_key.set("imgname", cfg->imgname) || reg_key.set("snapname", cfg->snapname) || reg_key.set("command_line", cfg->command_line) || reg_key.set("persistent", cfg->persistent) || reg_key.set("admin_sock_path", g_conf()->admin_socket) || reg_key.flush()) { ret_val = -EINVAL; } return ret_val; } int remove_config_from_registry(Config* cfg) { std::string strKey{ SERVICE_REG_KEY }; strKey.append("\\"); strKey.append(cfg->devpath); return RegistryKey::remove( g_ceph_context, HKEY_LOCAL_MACHINE, strKey.c_str()); } int load_mapping_config_from_registry(std::string devpath, Config* cfg) { std::string strKey{ SERVICE_REG_KEY }; strKey.append("\\"); strKey.append(devpath); auto reg_key = RegistryKey( g_ceph_context, HKEY_LOCAL_MACHINE, strKey.c_str(), false); if (!reg_key.hKey) { if (reg_key.missingKey) return -ENOENT; else return -EINVAL; } reg_key.get("devpath", cfg->devpath); reg_key.get("poolname", cfg->poolname); reg_key.get("nsname", cfg->nsname); reg_key.get("imgname", cfg->imgname); reg_key.get("snapname", cfg->snapname); reg_key.get("command_line", cfg->command_line); reg_key.get("persistent", cfg->persistent); reg_key.get("admin_sock_path", cfg->admin_sock_path); return 0; }